want to initiate one pthread with root previliges

Lokesh Chakka lvenkatakumarchakka at gmail.com
Fri Nov 3 14:31:01 UTC 2017


Hello,

I am writing one GTK application where I want to run GUI as normal user and
issue one pthread with root privileges.

I have kept the following as policy file

=====================
$ cat /usr/share/polkit-1/actions/Myappln.policy
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
 "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
  "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
    <vendor>Company Name</vendor>
    <vendor_url>http://www.website.com/</vendor_url>
    <action id="Myappln">
        <description>Policy Kit for Myappln</description>
        <message>Administrator Authentication is required to run
Myappln</message>
        <icon_name>audio-x-generic</icon_name>
        <defaults>
            <allow_any>no</allow_any>
            <allow_inactive>no</allow_inactive>
            <allow_active>auth_admin</allow_active>
        </defaults>
        <annotate
key="org.freedesktop.policykit.exec.path">/usr/local/bin/Myappln</annotate>
    </action>
</policyconfig>

=====================

I have written one small C function as follows:

=====================
static void check_authorization_cb(PolkitAuthority *authority, GAsyncResult
*res, GMainLoop *loop)
{
    PolkitAuthorizationResult *result;
    GError *error = NULL;

    result = polkit_authority_check_authorization_finish(authority, res,
&error);
    if (error)
    {
        append_gui_log( ERRNO_ERROR_MSG, "Error checking authorization:
%s\n", error->message);
    }
    if( polkit_authorization_result_get_is_authorized(result) )
    {
        fprintf( stderr, "Authorization Success\n" );
    }
    else
    {
        fprintf( stderr, "Unable to get authorization. Exiting...\n" );
        exit(1);
    }
    if( socket( PF_PACKET, SOCK_RAW|SOCK_NONBLOCK, htons( ETH_P_ALL ) ) ==
-1 )
    {
        fprintf( stderr, "%s %d Unable to create socket\n", __func__,
__LINE__ );
        char error_string[200] = "";
        strerror_r( errno, error_string, 200 );
        fprintf( stderr, "Message indicated by errno(%d) : %s\n", errno,
error_string );
    }
    else
    {
        fprintf( stderr, "%s %d success\n", __func__, __LINE__ );
    }
    g_main_loop_quit(loop);
}

void get_authorization_to_proceed()
{
    PolkitAuthority *authority;
    PolkitSubject *subject;
    GMainLoop *loop;

    loop = g_main_loop_new(NULL, FALSE);
    authority = polkit_authority_get_sync(NULL, NULL);
    subject = polkit_unix_process_new_for_owner( getpid(), 0, -1 );
    polkit_authority_check_authorization(    authority,
                                    subject,
                                    "Myappln",
                                    NULL,

POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION,
                                    NULL,
                                    (GAsyncReadyCallback)
check_authorization_cb,
                                    loop);
    g_main_loop_run(loop);
    g_object_unref(authority);
    g_object_unref(subject);
    g_main_loop_unref(loop);
}
=====================

I am seeing the "Authorization Success" message and "Unable to create
socket".
Actually to create socket, root previliges are required.
I am not able to understand what mistake I am doing.
Can someone help me how to spawn pthread with root privileges ?

Complete Code is in C Language.

Thanks & Regards
--
Lokesh Chakka,
Mobile: 9731023458
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/polkit-devel/attachments/20171103/b6da3d48/attachment.html>


More information about the polkit-devel mailing list