X-Git-Url: https://uglyman.kremlin.cc/gitweb/gitweb.cgi?a=blobdiff_plain;f=src%2Fpolkit-auth.c;h=f967cd07026257267297eb21a2311830118e23d1;hb=933f62bb9d7127306739e057a81a48d6424102a4;hp=2e4178f0e7ca9b7575280b520c153acb31fd9c0d;hpb=483e90b704090617eba8bf030d23eca616063b21;p=systembsd.git diff --git a/src/polkit-auth.c b/src/polkit-auth.c index 2e4178f..f967cd0 100644 --- a/src/polkit-auth.c +++ b/src/polkit-auth.c @@ -24,6 +24,81 @@ #include "polkit-auth.h" -void test_func() { - g_printf("test!\n"); +static gboolean is_valid_action(GList *action_list, const gchar *action) { + + PolkitActionDescription *action_descr; + const gchar *action_descr_id; + GList *cur; + gboolean ret; + + ret = FALSE; + cur = g_list_first(action_list); + + while(cur && (action_descr = ((PolkitActionDescription *)(cur->data))) && (action_descr_id = polkit_action_description_get_action_id(action_descr))) { + + if(!g_strcmp0(action, action_descr_id)) { + ret = TRUE; + break; + } + + cur = cur->next; + } + + g_list_free(action_list); + + return ret; +} + +check_auth_result polkit_try_auth(const gchar *bus, const gchar *action, gboolean prompt) { + + GList *valid_actions; + PolkitAuthority *auth; + PolkitSubject *subj; + PolkitAuthorizationResult *result; + PolkitCheckAuthorizationFlags prompt_flag; + gboolean authorized, challenge; + + auth = NULL; + subj = NULL; + result = NULL; + valid_actions = NULL; + authorized = challenge = FALSE; + prompt_flag = prompt ? POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION : POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE; + + auth = polkit_authority_get_sync(NULL, NULL); /* TODO timeout for this */ + subj = polkit_system_bus_name_new(bus); + valid_actions = polkit_authority_enumerate_actions_sync(auth, NULL, NULL); + + if(!auth || !valid_actions) + return ERROR_GENERIC; /* extremely unlikely */ + else if(!subj) + return ERROR_BADBUS; + else if(!is_valid_action(valid_actions, action)) + return ERROR_BADACTION; + + if(!(result = polkit_authority_check_authorization_sync(auth, subj, action, NULL, prompt_flag, NULL, NULL))) + return ERROR_GENERIC; /* TODO pass, check gerror and return more relevant error */ + + authorized = polkit_authorization_result_get_is_authorized(result); + challenge = polkit_authorization_result_get_is_challenge(result); + + /* free()'s before return */ + if(auth) + g_object_unref(auth); + if(subj) + g_object_unref(subj); + if(result) + g_object_unref(result); + + if(authorized) { + + if(challenge) + return AUTHORIZED_BY_PROMPT; + + return AUTHORIZED_NATIVELY; + + } else if(challenge) + return UNAUTHORIZED_FAILED_PROMPT; + + return UNAUTHORIZED_NATIVELY; }