PolicyKit: Branch 'master'

David Zeuthen david at kemper.freedesktop.org
Wed May 13 09:23:02 PDT 2009


 data/org.freedesktop.PolicyKit1.Authority.xml   |   24 ++-
 docs/polkit/polkit-docs.xml                     |    1 
 docs/polkit/polkit-sections.txt                 |   27 ++--
 src/polkit/polkitauthority.c                    |   25 ++-
 src/polkit/polkitauthority.h                    |    4 
 src/polkit/polkitauthorizationresult.c          |  155 +++++++++++++++++++++++-
 src/polkit/polkitauthorizationresult.h          |   36 +++--
 src/polkit/polkitprivate.h                      |    4 
 src/polkit/polkittypes.h                        |    3 
 src/polkitbackend/polkitbackendauthority.c      |   13 +-
 src/polkitbackend/polkitbackendauthority.h      |   12 -
 src/polkitbackend/polkitbackendlocalauthority.c |   66 +++++-----
 12 files changed, 276 insertions(+), 94 deletions(-)

New commits:
commit 7a9f7c1389befed09abc9d2187c213868f638c43
Author: David Zeuthen <davidz at redhat.com>
Date:   Wed May 13 12:20:16 2009 -0400

    Change the PolkitAuthorizationResult enumeration into an object

diff --git a/data/org.freedesktop.PolicyKit1.Authority.xml b/data/org.freedesktop.PolicyKit1.Authority.xml
index da2fe59..abe0d3f 100644
--- a/data/org.freedesktop.PolicyKit1.Authority.xml
+++ b/data/org.freedesktop.PolicyKit1.Authority.xml
@@ -109,18 +109,20 @@
     <!-- ---------------------------------------------------------------------------------------------------- -->
 
     <!-- An enumeration for results when checking for an authorization -->
-    <annotation name="org.gtk.EggDBus.DeclareEnum" value="AuthorizationResult">
-      <annotation name="org.gtk.EggDBus.DocString.Summary" value="Possible results for checking authorizations"/>
-      <annotation name="org.gtk.EggDBus.DocString" value="Possible results that the org.freedesktop.PolicyKit1.Authority.CheckAuthorization() method can return."/>
+    <annotation name="org.gtk.EggDBus.DeclareStruct" value="AuthorizationResult">
+      <annotation name="org.gtk.EggDBus.DocString.Summary" value="Authorization Results"/>
+      <annotation name="org.gtk.EggDBus.DocString" value="Describes the result of calling org.freedesktop.PolicyKit1.Authority.CheckAuthorization()."/>
 
-      <annotation name="org.gtk.EggDBus.Enum.Member" value="NotAuthorized">
-        <annotation name="org.gtk.EggDBus.DocString" value="The given #Subject is not authorized for the specified action."/>
+      <annotation name="org.gtk.EggDBus.Struct.Member"  value="Boolean:is_authorized">
+        <annotation name="org.gtk.EggDBus.DocString" value="#TRUE if the given #Subject is authorized for the given action."/>
       </annotation>
-      <annotation name="org.gtk.EggDBus.Enum.Member" value="Authorized">
-        <annotation name="org.gtk.EggDBus.DocString" value="The given #Subject is authorized for the specified action."/>
+
+      <annotation name="org.gtk.EggDBus.Struct.Member"  value="Boolean:is_challenge">
+        <annotation name="org.gtk.EggDBus.DocString" value="#TRUE if the given #Subject could be authorized if more information was provided, and %CheckAuthorizationFlags.AllowUserInteraction wasn't passed."/>
       </annotation>
-      <annotation name="org.gtk.EggDBus.Enum.Member" value="Challenge">
-        <annotation name="org.gtk.EggDBus.DocString" value="The given #Subject is authorized if more information is provided."/>
+
+      <annotation name="org.gtk.EggDBus.Struct.Member"  value="Dict<String,String>:details">
+        <annotation name="org.gtk.EggDBus.DocString" value="Details for the result or empty if not authorized."/>
       </annotation>
     </annotation>
 
@@ -226,9 +228,9 @@
         <annotation name="org.gtk.EggDBus.DocString" value="A unique id used to cancel the the authentication check via org.freedesktop.PolicyKit1.Authority.CancelCheckAuthorization() or the empty string if cancellation is not needed."/>
       </arg>
 
-      <arg name="result" direction="out" type="u">
+      <arg name="result" direction="out" type="(bba{ss})">
         <annotation name="org.gtk.EggDBus.Type" value="AuthorizationResult"/>
-        <annotation name="org.gtk.EggDBus.DocString" value="A value from the #AuthorizationResult enumeration."/>
+        <annotation name="org.gtk.EggDBus.DocString" value="An #AuthorizationResult structure."/>
       </arg>
     </method>
 
diff --git a/docs/polkit/polkit-docs.xml b/docs/polkit/polkit-docs.xml
index e9c4af4..c2da1ea 100644
--- a/docs/polkit/polkit-docs.xml
+++ b/docs/polkit/polkit-docs.xml
@@ -65,6 +65,7 @@
   <reference id="ref-api">
     <title>Core API Reference</title>
     <xi:include href="xml/polkitauthority.xml"/>
+    <xi:include href="xml/polkitauthorizationresult.xml"/>
     <xi:include href="xml/polkiterror.xml"/>
     <xi:include href="xml/polkitactiondescription.xml"/>
     <xi:include href="xml/polkitauthoritymanager.xml"/>
diff --git a/docs/polkit/polkit-sections.txt b/docs/polkit/polkit-sections.txt
index 2094a3f..2e56a30 100644
--- a/docs/polkit/polkit-sections.txt
+++ b/docs/polkit/polkit-sections.txt
@@ -50,7 +50,6 @@ POLKIT_AUTHORITY_MANAGER_GET_CLASS
 <FILE>polkitauthority</FILE>
 PolkitAuthority
 PolkitCheckAuthorizationFlags
-PolkitAuthorizationResult
 polkit_authority_get
 polkit_authority_enumerate_actions_sync
 polkit_authority_check_authorization_sync
@@ -79,6 +78,24 @@ POLKIT_AUTHORITY_GET_CLASS
 </SECTION>
 
 <SECTION>
+<FILE>polkitauthorizationresult</FILE>
+PolkitAuthorizationResult
+polkit_authorization_result_new
+polkit_authorization_result_get_is_authorized
+polkit_authorization_result_get_is_challenge
+polkit_authorization_result_get_details
+<SUBSECTION Standard>
+PolkitAuthorizationResultClass
+POLKIT_AUTHORIZATION_RESULT
+POLKIT_IS_AUTHORIZATION_RESULT
+POLKIT_TYPE_AUTHORIZATION_RESULT
+polkit_authorization_result_get_type
+POLKIT_AUTHORIZATION_RESULT_CLASS
+POLKIT_IS_AUTHORIZATION_RESULT_CLASS
+POLKIT_AUTHORIZATION_RESULT_GET_CLASS
+</SECTION>
+
+<SECTION>
 <FILE>polkitsystembusname</FILE>
 PolkitSystemBusName
 polkit_system_bus_name_new
@@ -252,11 +269,3 @@ polkit_error_quark
 polkit_error_get_type
 </SECTION>
 
-<SECTION>
-<FILE>polkitauthorizationresult</FILE>
-POLKIT_TYPE_AUTHORIZATION_RESULT
-PolkitAuthorizationResult
-<SUBSECTION Standard>
-polkit_authorization_result_get_type
-</SECTION>
-
diff --git a/src/polkit/polkitauthority.c b/src/polkit/polkitauthority.c
index 041ba7e..5505346 100644
--- a/src/polkit/polkitauthority.c
+++ b/src/polkit/polkitauthority.c
@@ -448,14 +448,15 @@ authorization_check_cancelled_cb (GObject      *source_object,
  *
  * Finishes checking if a subject is authorized for an action.
  *
- * Returns: A #PolkitAuthorizationResult.
+ * Returns: A #PolkitAuthorizationResult or %NULL if @error is set. Free with g_object_unref().
  **/
-PolkitAuthorizationResult
+PolkitAuthorizationResult *
 polkit_authority_check_authorization_finish (PolkitAuthority          *authority,
                                              GAsyncResult             *res,
                                              GError                  **error)
 {
-  _PolkitAuthorizationResult result;
+  PolkitAuthorizationResult *result;
+  _PolkitAuthorizationResult *real_result;
   GSimpleAsyncResult *simple;
   GAsyncResult *real_res;
   GError *local_error;
@@ -465,11 +466,11 @@ polkit_authority_check_authorization_finish (PolkitAuthority          *authority
 
   g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == polkit_authority_check_authorization_async);
 
-  result = _POLKIT_AUTHORIZATION_RESULT_NOT_AUTHORIZED;
+  result = NULL;
 
   local_error = NULL;
   _polkit_authority_check_authorization_finish (authority->real,
-                                                &result,
+                                                &real_result,
                                                 real_res,
                                                 &local_error);
 
@@ -504,8 +505,14 @@ polkit_authority_check_authorization_finish (PolkitAuthority          *authority
           g_propagate_error (error, local_error);
         }
     }
-
   g_object_unref (real_res);
+
+  if (real_result != NULL)
+    {
+      result = polkit_authorization_result_new_for_real (real_result);
+      g_object_unref (real_result);
+    }
+
   return result;
 }
 
@@ -521,9 +528,9 @@ polkit_authority_check_authorization_finish (PolkitAuthority          *authority
  *
  * Checks if @subject is authorized to perform the action represented by @action_id.
  *
- * Returns: A #PolkitAuthorizationResult.
+ * Returns: A #PolkitAuthorizationResult or %NULL if @error is set. Free with g_object_unref().
  */
-PolkitAuthorizationResult
+PolkitAuthorizationResult *
 polkit_authority_check_authorization_sync (PolkitAuthority               *authority,
                                            PolkitSubject                 *subject,
                                            const gchar                   *action_id,
@@ -534,7 +541,7 @@ polkit_authority_check_authorization_sync (PolkitAuthority               *author
 {
   guint call_id;
   GAsyncResult *res;
-  PolkitAuthorizationResult result;
+  PolkitAuthorizationResult *result;
 
   call_id = polkit_authority_check_authorization_async (authority,
                                                         subject,
diff --git a/src/polkit/polkitauthority.h b/src/polkit/polkitauthority.h
index 2aa74ae..642c400 100644
--- a/src/polkit/polkitauthority.h
+++ b/src/polkit/polkitauthority.h
@@ -62,7 +62,7 @@ GList                     *polkit_authority_enumerate_groups_sync (PolkitAuthori
                                                                    GCancellable    *cancellable,
                                                                    GError         **error);
 
-PolkitAuthorizationResult  polkit_authority_check_authorization_sync (PolkitAuthority               *authority,
+PolkitAuthorizationResult *polkit_authority_check_authorization_sync (PolkitAuthority               *authority,
                                                                       PolkitSubject                 *subject,
                                                                       const gchar                   *action_id,
                                                                       GHashTable                    *details,
@@ -109,7 +109,7 @@ void                       polkit_authority_check_authorization (PolkitAuthority
                                                                  GAsyncReadyCallback            callback,
                                                                  gpointer                       user_data);
 
-PolkitAuthorizationResult  polkit_authority_check_authorization_finish (PolkitAuthority          *authority,
+PolkitAuthorizationResult *polkit_authority_check_authorization_finish (PolkitAuthority          *authority,
                                                                         GAsyncResult             *res,
                                                                         GError                  **error);
 
diff --git a/src/polkit/polkitauthorizationresult.c b/src/polkit/polkitauthorizationresult.c
index ad224f3..314c39f 100644
--- a/src/polkit/polkitauthorizationresult.c
+++ b/src/polkit/polkitauthorizationresult.c
@@ -26,18 +26,161 @@
 #include "polkitauthorizationresult.h"
 #include "polkitprivate.h"
 
-
 /**
  * SECTION:polkitauthorizationresult
  * @title: PolkitAuthorizationResult
- * @short_result: Authorization Results
+ * @short_description: Result for checking an authorization
+ * @stability: Stable
  *
- * Results of a check for an claim.
+ * This class represents the result you get when checking for an authorization.
  */
 
-GType
-polkit_authorization_result_get_type (void)
+struct _PolkitAuthorizationResult
+{
+  GObject parent_instance;
+
+  _PolkitAuthorizationResult *real;
+};
+
+struct _PolkitAuthorizationResultClass
+{
+  GObjectClass parent_class;
+};
+
+G_DEFINE_TYPE (PolkitAuthorizationResult, polkit_authorization_result, G_TYPE_OBJECT);
+
+static void
+polkit_authorization_result_init (PolkitAuthorizationResult *authorization_result)
+{
+}
+
+static void
+polkit_authorization_result_finalize (GObject *object)
 {
-  return _polkit_authorization_result_get_type ();
+  PolkitAuthorizationResult *authorization_result;
+
+  authorization_result = POLKIT_AUTHORIZATION_RESULT (object);
+
+  g_object_unref (authorization_result->real);
+
+  if (G_OBJECT_CLASS (polkit_authorization_result_parent_class)->finalize != NULL)
+    G_OBJECT_CLASS (polkit_authorization_result_parent_class)->finalize (object);
 }
 
+static void
+polkit_authorization_result_class_init (PolkitAuthorizationResultClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize = polkit_authorization_result_finalize;
+}
+
+PolkitAuthorizationResult  *
+polkit_authorization_result_new_for_real (_PolkitAuthorizationResult *real)
+{
+  PolkitAuthorizationResult *authorization_result;
+
+  authorization_result = POLKIT_AUTHORIZATION_RESULT (g_object_new (POLKIT_TYPE_AUTHORIZATION_RESULT, NULL));
+
+  authorization_result->real = g_object_ref (real);
+
+  return authorization_result;
+}
+
+_PolkitAuthorizationResult *
+polkit_authorization_result_get_real (PolkitAuthorizationResult  *authorization_result)
+{
+  return g_object_ref (authorization_result->real);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+/**
+ * polkit_authorization_result_new:
+ * @is_authorized:
+ * @is_challenge:
+ * @details:
+ *
+ *
+ *
+ * Returns:
+ **/
+PolkitAuthorizationResult *
+polkit_authorization_result_new (gboolean                   is_authorized,
+                                 gboolean                   is_challenge,
+                                 GHashTable                *details)
+{
+  PolkitAuthorizationResult *authorization_result;
+  _PolkitAuthorizationResult *real;
+  EggDBusHashMap *real_details;
+
+  real_details = egg_dbus_hash_map_new (G_TYPE_STRING, g_free, G_TYPE_STRING, g_free);
+  if (details != NULL)
+    {
+      GHashTableIter iter;
+      gpointer key, value;
+
+      g_hash_table_iter_init (&iter, details);
+      while (g_hash_table_iter_next (&iter, &key, &value))
+        {
+          egg_dbus_hash_map_insert (real_details, g_strdup (key), g_strdup (value));
+        }
+    }
+
+  real = _polkit_authorization_result_new (is_authorized, is_challenge, real_details);
+  g_object_unref (real_details);
+
+  authorization_result = polkit_authorization_result_new_for_real (real);
+
+  g_object_unref (real);
+
+  return authorization_result;
+}
+
+/**
+ * polkit_authorization_result_get_is_authorized:
+ * @result:
+ *
+ *
+ *
+ * Returns:
+ **/
+gboolean
+polkit_authorization_result_get_is_authorized (PolkitAuthorizationResult *result)
+{
+  return _polkit_authorization_result_get_is_authorized (result->real);
+}
+
+/**
+ * polkit_authorization_result_get_is_challenge:
+ * @result:
+ *
+ *
+ *
+ * Returns:
+ **/
+gboolean
+polkit_authorization_result_get_is_challenge (PolkitAuthorizationResult *result)
+{
+  return _polkit_authorization_result_get_is_challenge (result->real);
+}
+
+/**
+ * polkit_authorization_result_get_details:
+ * @result:
+ *
+ *
+ *
+ * Returns:
+ **/
+GHashTable *
+polkit_authorization_result_get_details (PolkitAuthorizationResult *result)
+{
+  EggDBusHashMap *real_details;
+
+  real_details = _polkit_authorization_result_get_details (result->real);
+  if (real_details != NULL)
+    return real_details->data;
+  else
+    return NULL;
+}
diff --git a/src/polkit/polkitauthorizationresult.h b/src/polkit/polkitauthorizationresult.h
index 8458e40..69bec13 100644
--- a/src/polkit/polkitauthorizationresult.h
+++ b/src/polkit/polkitauthorizationresult.h
@@ -27,27 +27,31 @@
 #define __POLKIT_AUTHORIZATION_RESULT_H
 
 #include <glib-object.h>
+#include <polkit/polkittypes.h>
 
 G_BEGIN_DECLS
 
-GType polkit_authorization_result_get_type (void) G_GNUC_CONST;
+#define POLKIT_TYPE_AUTHORIZATION_RESULT          (polkit_authorization_result_get_type())
+#define POLKIT_AUTHORIZATION_RESULT(o)            (G_TYPE_CHECK_INSTANCE_CAST ((o), POLKIT_TYPE_AUTHORIZATION_RESULT, PolkitAuthorizationResult))
+#define POLKIT_AUTHORIZATION_RESULT_CLASS(k)      (G_TYPE_CHECK_CLASS_CAST((k), POLKIT_TYPE_AUTHORIZATION_RESULT, PolkitAuthorizationResultClass))
+#define POLKIT_AUTHORIZATION_RESULT_GET_CLASS(o)  (G_TYPE_INSTANCE_GET_CLASS ((o), POLKIT_TYPE_AUTHORIZATION_RESULT, PolkitAuthorizationResultClass))
+#define POLKIT_IS_AUTHORIZATION_RESULT(o)         (G_TYPE_CHECK_INSTANCE_TYPE ((o), POLKIT_TYPE_AUTHORIZATION_RESULT))
+#define POLKIT_IS_AUTHORIZATION_RESULT_CLASS(k)   (G_TYPE_CHECK_CLASS_TYPE ((k), POLKIT_TYPE_AUTHORIZATION_RESULT))
 
-#define POLKIT_TYPE_AUTHORIZATION_RESULT (polkit_authorization_result_get_type ())
+#if 0
+typedef struct _PolkitAuthorizationResult PolkitAuthorizationResult;
+#endif
+typedef struct _PolkitAuthorizationResultClass PolkitAuthorizationResultClass;
 
-/**
- * PolkitAuthorizationResult:
- * @POLKIT_AUTHORIZATION_RESULT_NOT_AUTHORIZED: The subject is not authorized for the specified action
- * @POLKIT_AUTHORIZATION_RESULT_AUTHORIZED: The subject is authorized for the specified action
- * @POLKIT_AUTHORIZATION_RESULT_CHALLENGE: The subject is authorized if more information is provided
- *
- * Result codes for checking whether a subject is authorized for an action.
- */
-typedef enum
-{
-  POLKIT_AUTHORIZATION_RESULT_NOT_AUTHORIZED = 0,
-  POLKIT_AUTHORIZATION_RESULT_AUTHORIZED = 1,
-  POLKIT_AUTHORIZATION_RESULT_CHALLENGE = 2,
-} PolkitAuthorizationResult;
+GType                      polkit_authorization_result_get_type          (void) G_GNUC_CONST;
+PolkitAuthorizationResult *polkit_authorization_result_new               (gboolean                   is_authorized,
+                                                                          gboolean                   is_challenge,
+                                                                          GHashTable                *details);
+gboolean                   polkit_authorization_result_get_is_authorized (PolkitAuthorizationResult *result);
+gboolean                   polkit_authorization_result_get_is_challenge  (PolkitAuthorizationResult *result);
+GHashTable                *polkit_authorization_result_get_details       (PolkitAuthorizationResult *result);
+
+/* ---------------------------------------------------------------------------------------------------- */
 
 G_END_DECLS
 
diff --git a/src/polkit/polkitprivate.h b/src/polkit/polkitprivate.h
index 88b4b41..64954f0 100644
--- a/src/polkit/polkitprivate.h
+++ b/src/polkit/polkitprivate.h
@@ -25,6 +25,7 @@
 #include "polkitimplicitauthorization.h"
 #include "polkitactiondescription.h"
 #include "polkitsubject.h"
+#include "polkitauthorizationresult.h"
 #include "_polkitbindings.h"
 
 /* notes:
@@ -46,4 +47,7 @@ _PolkitIdentity *polkit_identity_get_real     (PolkitIdentity  *identity);
 PolkitAuthorization  *polkit_authorization_new_for_real (_PolkitAuthorization *real);
 _PolkitAuthorization *polkit_authorization_get_real     (PolkitAuthorization  *authorization);
 
+PolkitAuthorizationResult  *polkit_authorization_result_new_for_real (_PolkitAuthorizationResult *real);
+_PolkitAuthorizationResult *polkit_authorization_result_get_real (PolkitAuthorizationResult *authorization_result);
+
 #endif /* __POLKIT_PRIVATE_H */
diff --git a/src/polkit/polkittypes.h b/src/polkit/polkittypes.h
index 5da914b..47e1f21 100644
--- a/src/polkit/polkittypes.h
+++ b/src/polkit/polkittypes.h
@@ -55,4 +55,7 @@ typedef struct _PolkitUnixGroup PolkitUnixGroup;
 struct _PolkitAuthorization;
 typedef struct _PolkitAuthorization PolkitAuthorization;
 
+struct _PolkitAuthorizationResult;
+typedef struct _PolkitAuthorizationResult PolkitAuthorizationResult;
+
 #endif /* __POLKIT_TYPES_H */
diff --git a/src/polkitbackend/polkitbackendauthority.c b/src/polkitbackend/polkitbackendauthority.c
index b53513f..e0f3a8e 100644
--- a/src/polkitbackend/polkitbackendauthority.c
+++ b/src/polkitbackend/polkitbackendauthority.c
@@ -261,9 +261,9 @@ polkit_backend_authority_check_authorization (PolkitBackendAuthority        *aut
  *
  * Finishes checking if a subject is authorized for an action.
  *
- * Returns: A #PolkitAuthorizationResult.
+ * Returns: A #PolkitAuthorizationResult or %NULL if @error is set. Free with g_object_unref().
  **/
-PolkitAuthorizationResult
+PolkitAuthorizationResult *
 polkit_backend_authority_check_authorization_finish (PolkitBackendAuthority  *authority,
                                                      GAsyncResult            *res,
                                                      GError                 **error)
@@ -276,7 +276,7 @@ polkit_backend_authority_check_authorization_finish (PolkitBackendAuthority  *au
     {
       g_warning ("check_authorization_finish is not implemented (it is not optional)");
       g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error);
-      return POLKIT_AUTHORIZATION_RESULT_NOT_AUTHORIZED;
+      return NULL;
     }
   else
     {
@@ -786,7 +786,7 @@ check_auth_cb (GObject      *source_object,
 {
   EggDBusMethodInvocation *method_invocation = EGG_DBUS_METHOD_INVOCATION (user_data);
   const gchar *full_cancellation_id;
-  PolkitAuthorizationResult result;
+  PolkitAuthorizationResult *result;
   GError *error;
 
   error = NULL;
@@ -809,7 +809,10 @@ check_auth_cb (GObject      *source_object,
     }
   else
     {
-      _polkit_authority_handle_check_authorization_finish (method_invocation, result);
+      _PolkitAuthorizationResult *real_result;
+      real_result = polkit_authorization_result_get_real (result);
+      _polkit_authority_handle_check_authorization_finish (method_invocation, real_result);
+      g_object_unref (result);
     }
 }
 
diff --git a/src/polkitbackend/polkitbackendauthority.h b/src/polkitbackend/polkitbackendauthority.h
index bb9d5e9..9b4acfe 100644
--- a/src/polkitbackend/polkitbackendauthority.h
+++ b/src/polkitbackend/polkitbackendauthority.h
@@ -129,9 +129,9 @@ struct _PolkitBackendAuthorityClass
                                GAsyncReadyCallback            callback,
                                gpointer                       user_data);
 
-  PolkitAuthorizationResult (*check_authorization_finish) (PolkitBackendAuthority  *authority,
-                                                           GAsyncResult            *res,
-                                                           GError                 **error);
+  PolkitAuthorizationResult * (*check_authorization_finish) (PolkitBackendAuthority  *authority,
+                                                             GAsyncResult            *res,
+                                                             GError                 **error);
 
   gboolean (*register_authentication_agent) (PolkitBackendAuthority   *authority,
                                              PolkitSubject            *caller,
@@ -227,9 +227,9 @@ void     polkit_backend_authority_check_authorization       (PolkitBackendAuthor
                                                              GAsyncReadyCallback            callback,
                                                              gpointer                       user_data);
 
-PolkitAuthorizationResult polkit_backend_authority_check_authorization_finish (PolkitBackendAuthority  *authority,
-                                                                               GAsyncResult            *res,
-                                                                               GError                 **error);
+PolkitAuthorizationResult *polkit_backend_authority_check_authorization_finish (PolkitBackendAuthority  *authority,
+                                                                                GAsyncResult            *res,
+                                                                                GError                 **error);
 
 GList   *polkit_backend_authority_enumerate_authorizations  (PolkitBackendAuthority    *authority,
                                                              PolkitSubject             *caller,
diff --git a/src/polkitbackend/polkitbackendlocalauthority.c b/src/polkitbackend/polkitbackendlocalauthority.c
index 74e6b3e..f677fc3 100644
--- a/src/polkitbackend/polkitbackendlocalauthority.c
+++ b/src/polkitbackend/polkitbackendlocalauthority.c
@@ -173,17 +173,17 @@ static void polkit_backend_local_authority_check_authorization (PolkitBackendAut
                                                                 GAsyncReadyCallback            callback,
                                                                 gpointer                       user_data);
 
-static PolkitAuthorizationResult polkit_backend_local_authority_check_authorization_finish (
+static PolkitAuthorizationResult *polkit_backend_local_authority_check_authorization_finish (
                                                                  PolkitBackendAuthority  *authority,
                                                                  GAsyncResult            *res,
                                                                  GError                 **error);
 
-static PolkitAuthorizationResult check_authorization_sync (PolkitBackendAuthority         *authority,
-                                                           PolkitSubject                  *subject,
-                                                           const gchar                    *action_id,
-                                                           PolkitCheckAuthorizationFlags   flags,
-                                                           PolkitImplicitAuthorization    *out_implicit_authorization,
-                                                           GError                        **error);
+static PolkitAuthorizationResult *check_authorization_sync (PolkitBackendAuthority         *authority,
+                                                            PolkitSubject                  *subject,
+                                                            const gchar                    *action_id,
+                                                            PolkitCheckAuthorizationFlags   flags,
+                                                            PolkitImplicitAuthorization    *out_implicit_authorization,
+                                                            GError                        **error);
 
 static GList *polkit_backend_local_authority_enumerate_authorizations (PolkitBackendAuthority   *authority,
                                                                        PolkitSubject            *caller,
@@ -454,9 +454,10 @@ check_authorization_challenge_cb (AuthenticationAgent         *agent,
                                   gpointer                     user_data)
 {
   GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data);
-  PolkitAuthorizationResult result;
+  PolkitAuthorizationResult *result;
   gchar *subject_str;
 
+  result = NULL;
   subject_str = polkit_subject_to_string (subject);
 
   g_debug ("In check_authorization_challenge_cb\n"
@@ -469,7 +470,7 @@ check_authorization_challenge_cb (AuthenticationAgent         *agent,
 
   if (authentication_success)
     {
-      result = POLKIT_AUTHORIZATION_RESULT_AUTHORIZED;
+      result = polkit_authorization_result_new (TRUE, FALSE, NULL);
 
       /* store temporary authorization depending on value of implicit_authorization */
       if (implicit_authorization == POLKIT_IMPLICIT_AUTHORIZATION_AUTHENTICATION_REQUIRED_RETAINED ||
@@ -498,37 +499,37 @@ check_authorization_challenge_cb (AuthenticationAgent         *agent,
     }
   else
     {
-      /* TODO: maybe return FAILED_CHALLENGE instead? */
-      result = POLKIT_AUTHORIZATION_RESULT_NOT_AUTHORIZED;
+      /* TODO: maybe return set is_challenge? */
+      result = polkit_authorization_result_new (FALSE, FALSE, NULL);
     }
 
   g_simple_async_result_set_op_res_gpointer (simple,
-                                             GINT_TO_POINTER ((gint) result),
-                                             NULL);
+                                             result,
+                                             g_object_unref);
   g_simple_async_result_complete (simple);
   g_object_unref (simple);
 
   g_free (subject_str);
 }
 
-static PolkitAuthorizationResult
+static PolkitAuthorizationResult *
 polkit_backend_local_authority_check_authorization_finish (PolkitBackendAuthority  *authority,
                                                            GAsyncResult            *res,
                                                            GError                 **error)
 {
   GSimpleAsyncResult *simple;
-  PolkitAuthorizationResult result;
+  PolkitAuthorizationResult *result;
 
   simple = G_SIMPLE_ASYNC_RESULT (res);
 
   g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == polkit_backend_local_authority_check_authorization);
 
-  result = POLKIT_AUTHORIZATION_RESULT_NOT_AUTHORIZED;
+  result = NULL;
 
   if (g_simple_async_result_propagate_error (simple, error))
     goto out;
 
-  result = (PolkitAuthorizationResult) (GPOINTER_TO_INT (g_simple_async_result_get_op_res_gpointer (simple)));
+  result = g_object_ref (g_simple_async_result_get_op_res_gpointer (simple));
 
  out:
   return result;
@@ -553,7 +554,7 @@ polkit_backend_local_authority_check_authorization (PolkitBackendAuthority
   PolkitIdentity *user_of_subject;
   gchar *user_of_caller_str;
   gchar *user_of_subject_str;
-  PolkitAuthorizationResult result;
+  PolkitAuthorizationResult *result;
   PolkitImplicitAuthorization implicit_authorization;
   GError *error;
   GSimpleAsyncResult *simple;
@@ -568,6 +569,7 @@ polkit_backend_local_authority_check_authorization (PolkitBackendAuthority
   user_of_subject = NULL;
   user_of_caller_str = NULL;
   user_of_subject_str = NULL;
+  result = NULL;
 
   simple = g_simple_async_result_new (G_OBJECT (authority),
                                       callback,
@@ -643,7 +645,7 @@ polkit_backend_local_authority_check_authorization (PolkitBackendAuthority
     }
 
   /* Caller is up for a challenge! With light sabers! Use an authentication agent if one exists... */
-  if ((result == POLKIT_AUTHORIZATION_RESULT_CHALLENGE) &&
+  if (polkit_authorization_result_get_is_challenge (result) &&
       (flags & POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION))
     {
       AuthenticationAgent *agent;
@@ -661,6 +663,9 @@ polkit_backend_local_authority_check_authorization (PolkitBackendAuthority
         }
       else
         {
+          g_object_unref (result);
+          result = NULL;
+
           g_debug (" using authentication agent for challenge");
 
           authentication_agent_initiate_challenge (agent,
@@ -682,8 +687,8 @@ polkit_backend_local_authority_check_authorization (PolkitBackendAuthority
 
   /* Otherwise just return the result */
   g_simple_async_result_set_op_res_gpointer (simple,
-                                             GINT_TO_POINTER ((gint) result),
-                                             NULL);
+                                             result,
+                                             g_object_unref);
   g_simple_async_result_complete (simple);
   g_object_unref (simple);
 
@@ -703,7 +708,7 @@ polkit_backend_local_authority_check_authorization (PolkitBackendAuthority
 
 /* ---------------------------------------------------------------------------------------------------- */
 
-static PolkitAuthorizationResult
+static PolkitAuthorizationResult *
 check_authorization_sync (PolkitBackendAuthority         *authority,
                           PolkitSubject                  *subject,
                           const gchar                    *action_id,
@@ -713,7 +718,7 @@ check_authorization_sync (PolkitBackendAuthority         *authority,
 {
   PolkitBackendLocalAuthority *local_authority;
   PolkitBackendLocalAuthorityPrivate *priv;
-  PolkitAuthorizationResult result;
+  PolkitAuthorizationResult *result;
   PolkitIdentity *user_of_subject;
   PolkitSubject *session_for_subject;
   gchar *subject_str;
@@ -727,7 +732,7 @@ check_authorization_sync (PolkitBackendAuthority         *authority,
   local_authority = POLKIT_BACKEND_LOCAL_AUTHORITY (authority);
   priv = POLKIT_BACKEND_LOCAL_AUTHORITY_GET_PRIVATE (local_authority);
 
-  result = POLKIT_AUTHORIZATION_RESULT_NOT_AUTHORIZED;
+  result = NULL;
 
   user_of_subject = NULL;
   groups_of_user = NULL;
@@ -768,7 +773,7 @@ check_authorization_sync (PolkitBackendAuthority         *authority,
   /* special case: uid 0, root, is _always_ authorized for anything */
   if (POLKIT_IS_UNIX_USER (user_of_subject) && polkit_unix_user_get_uid (POLKIT_UNIX_USER (user_of_subject)) == 0)
     {
-      result = POLKIT_AUTHORIZATION_RESULT_AUTHORIZED;
+      result = polkit_authorization_result_new (TRUE, FALSE, NULL);
       goto out;
     }
 
@@ -807,7 +812,7 @@ check_authorization_sync (PolkitBackendAuthority         *authority,
       g_debug (" is authorized (has implicit authorization local=%d active=%d)",
                session_is_local,
                session_is_active);
-      result = POLKIT_AUTHORIZATION_RESULT_AUTHORIZED;
+      result = polkit_authorization_result_new (TRUE, FALSE, NULL);
       goto out;
     }
 
@@ -815,7 +820,7 @@ check_authorization_sync (PolkitBackendAuthority         *authority,
   if (check_temporary_authorization_for_identity (local_authority, user_of_subject, subject, action_id))
     {
       g_debug (" is authorized (has temporary authorization)");
-      result = POLKIT_AUTHORIZATION_RESULT_AUTHORIZED;
+      result = polkit_authorization_result_new (TRUE, FALSE, NULL);
       goto out;
     }
 
@@ -823,7 +828,7 @@ check_authorization_sync (PolkitBackendAuthority         *authority,
   if (check_authorization_for_identity (local_authority, user_of_subject, action_id))
     {
       g_debug (" is authorized (user identity has authorization)");
-      result = POLKIT_AUTHORIZATION_RESULT_AUTHORIZED;
+      result = polkit_authorization_result_new (TRUE, FALSE, NULL);
       goto out;
     }
 
@@ -836,14 +841,14 @@ check_authorization_sync (PolkitBackendAuthority         *authority,
       if (check_authorization_for_identity (local_authority, group, action_id))
         {
           g_debug (" is authorized (group identity has authorization)");
-          result = POLKIT_AUTHORIZATION_RESULT_AUTHORIZED;
+          result = polkit_authorization_result_new (TRUE, FALSE, NULL);
           goto out;
         }
     }
 
   if (implicit_authorization != POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED)
     {
-      result = POLKIT_AUTHORIZATION_RESULT_CHALLENGE;
+      result = polkit_authorization_result_new (FALSE, TRUE, NULL);
 
       /* return implicit_authorization so the caller can use an authentication agent if applicable */
       if (out_implicit_authorization != NULL)
@@ -854,6 +859,7 @@ check_authorization_sync (PolkitBackendAuthority         *authority,
     }
   else
     {
+      result = polkit_authorization_result_new (FALSE, FALSE, NULL);
       g_debug (" not authorized");
     }
  out:


More information about the hal-commit mailing list