finish remaining hostnamed method handlers
[systembsd.git] / src / polkit-auth.c
index 2e4178f0e7ca9b7575280b520c153acb31fd9c0d..f967cd07026257267297eb21a2311830118e23d1 100644 (file)
 
 #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;
 }