Updating branch refs/heads/master
         to c933b8cfc97a09d788856f175592272da1d09c5d (commit)
       from bcb39852b82c6263a8bbe9312421be3534f5b45a (commit)

commit c933b8cfc97a09d788856f175592272da1d09c5d
Author: Ali Abdallah <[email protected]>
Date:   Wed Feb 3 13:40:35 2010 +0100

    Don't depend on libpolkit-gobject, instead use dbus-glib to get 
authorization information directly from polkitd

 configure.ac.in        |   19 ++-
 src/Makefile.am        |    4 +-
 src/xfpm-console-kit.c |    9 +-
 src/xfpm-disks.c       |   18 +-
 src/xfpm-main.c        |    2 +-
 src/xfpm-polkit.c      |  461 +++++++++++++++++++++++++++++++++++++++++++-----
 src/xfpm-power.c       |   20 +-
 7 files changed, 462 insertions(+), 71 deletions(-)

diff --git a/configure.ac.in b/configure.ac.in
index 19b7f93..2176a20 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -75,8 +75,21 @@ XDT_CHECK_PACKAGE([LIBXFCE4UTIL], 
[libxfce4util-1.0],[libxfce4util_minimum_versi
 XDT_CHECK_PACKAGE([LIBNOTIFY],[libnotify], [libnotify_minimum_version])
 XDT_CHECK_PACKAGE([XRANDR],[xrandr], [xrandr_minimum_version])
 
-POLKIT="no"
-XDT_CHECK_OPTIONAL_PACKAGE([POLKIT], [polkit-gobject-1], 
[polkit_minimum_version], [polkit], [Polkit support])
+#=======================================================#
+#              Polkit?                                 #
+#=======================================================#
+AC_ARG_ENABLE([polkit],
+        [AC_HELP_STRING([--disable-polkit],
+                [Do not enable PolicyKit support (default=enabled)])],
+        [],
+        [ac_cv_enable_polkit=polkit])
+    AC_MSG_CHECKING([whether to build with polkit support])
+if test "x$ac_cv_enable_polkit" = !"xyes"; then
+    AC_MSG_RESULT([no])
+else
+    AC_MSG_RESULT([yes])
+    AC_DEFINE(ENABLE_POLKIT, 1 , [PolicyKit support])
+fi
 
 #=======================================================#
 #              Use HAL?                                        #
@@ -232,7 +245,7 @@ echo "
        prefix:                 ${prefix}
        xdg autostart:          ${sysconfdir/xdg/autostart}
        HAL:                    ${enable_hal}
-       POLKIT:                 ${POLKIT_FOUND}
+       POLKIT:                 ${ac_cv_enable_polkit}
        DPMS:                   ${have_dpms}
        Network manager:        ${ac_network_manager}
        Build panel plugins:    ${build_panel_plugins}
diff --git a/src/Makefile.am b/src/Makefile.am
index 9792b33..8685f8c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -99,6 +99,8 @@ manpage_DATA = xfce4-power-manager.1
 xfpm_glib_headers =                             \
         $(srcdir)/xfpm-enum-glib.h
 
+if MAINTAINER_MODE
+
 BUILT_SOURCES =                                        \
        xfce-power-manager-dbus-server.h        \
        xfce-power-manager-dbus-client.h        \
@@ -109,8 +111,6 @@ BUILT_SOURCES =                                     \
        org.freedesktop.PowerManagement.h       \
        org.freedesktop.PowerManagement.Inhibit.h
 
-if MAINTAINER_MODE
-
 xfpm-enum-types.h: $(xfpm_glib_headers)
        ( cd $(srcdir) && glib-mkenums \
                --fhead "#ifndef _XFPM_ENUM_TYPES_H\n#define 
_XFPM_ENUM_TYPES_H\n#include <glib-object.h>\nG_BEGIN_DECLS\n" \
diff --git a/src/xfpm-console-kit.c b/src/xfpm-console-kit.c
index cffc8b5..775d219 100644
--- a/src/xfpm-console-kit.c
+++ b/src/xfpm-console-kit.c
@@ -140,10 +140,11 @@ xfpm_console_kit_init (XfpmConsoleKit *console)
        goto out;
     }
     
-    console->priv->proxy = dbus_g_proxy_new_for_name (console->priv->bus,
-                                                     
"org.freedesktop.ConsoleKit",
-                                                     
"/org/freedesktop/ConsoleKit/Manager",
-                                                     
"org.freedesktop.ConsoleKit.Manager");
+    console->priv->proxy = dbus_g_proxy_new_for_name_owner (console->priv->bus,
+                                                           
"org.freedesktop.ConsoleKit",
+                                                           
"/org/freedesktop/ConsoleKit/Manager",
+                                                           
"org.freedesktop.ConsoleKit.Manager",
+                                                           NULL);
                                                      
     if ( !console->priv->proxy )
     {
diff --git a/src/xfpm-disks.c b/src/xfpm-disks.c
index dbceaad..e9f36f1 100644
--- a/src/xfpm-disks.c
+++ b/src/xfpm-disks.c
@@ -190,18 +190,20 @@ xfpm_disks_init (XfpmDisks *disks)
        goto out;
     }
     
-    disks->priv->proxy = dbus_g_proxy_new_for_name (disks->priv->bus,
-                                                   "org.freedesktop.UDisks",
-                                                   "/org/freedesktop/UDisks",
-                                                   "org.freedesktop.UDisks");
+    disks->priv->proxy = dbus_g_proxy_new_for_name_owner (disks->priv->bus,
+                                                         
"org.freedesktop.UDisks",
+                                                         
"/org/freedesktop/UDisks",
+                                                         
"org.freedesktop.UDisks",
+                                                         NULL);
     
     if ( !disks->priv->proxy )
     {
        g_message ("UDisks not found, trying devkit-disks");
-       disks->priv->proxy = dbus_g_proxy_new_for_name (disks->priv->bus,
-                                                       
"org.freedesktop.DeviceKit.Disks",
-                                                       
"/org/freedesktop/DeviceKit/Disks",
-                                                       
"org.freedesktop.DeviceKit.Disks");
+       disks->priv->proxy = dbus_g_proxy_new_for_name_owner (disks->priv->bus,
+                                                             
"org.freedesktop.DeviceKit.Disks",
+                                                             
"/org/freedesktop/DeviceKit/Disks",
+                                                             
"org.freedesktop.DeviceKit.Disks",
+                                                             NULL);
     }
     
     if ( !disks->priv->proxy )
diff --git a/src/xfpm-main.c b/src/xfpm-main.c
index 766a001..3caa3da 100644
--- a/src/xfpm-main.c
+++ b/src/xfpm-main.c
@@ -114,7 +114,7 @@ xfpm_dump (GHashTable *hash)
 #else
     g_print (_("Without HAL support\n"));
 #endif
-#ifdef HAVE_POLKIT
+#ifdef ENABLE_POLKIT
     g_print (_("With policykit support\n"));
 #else
     g_print (_("Without policykit support\n"));
diff --git a/src/xfpm-polkit.c b/src/xfpm-polkit.c
index a63e7a9..cfe65aa 100644
--- a/src/xfpm-polkit.c
+++ b/src/xfpm-polkit.c
@@ -26,13 +26,16 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include <dbus/dbus-glib.h>
-
-#ifdef HAVE_POLKIT
-#include <polkit/polkit.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
 #endif
 
+#include <dbus/dbus-glib.h>
+
 #include "xfpm-polkit.h"
+#include "xfpm-debug.h"
+
+#include "xfpm-common.h"
 
 static void xfpm_polkit_finalize   (GObject *object);
 
@@ -42,8 +45,19 @@ static void xfpm_polkit_finalize   (GObject *object);
 struct XfpmPolkitPrivate
 {
     DBusGConnection   *bus;
-#ifdef HAVE_POLKIT
-    PolkitAuthority   *authority;
+
+#ifdef ENABLE_POLKIT
+    DBusGProxy        *proxy;
+    GValueArray       *subject;
+    GHashTable        *details;
+    GHashTable        *subject_hash;
+
+    GType              subject_gtype;
+    GType              details_gtype;
+    GType              result_gtype;
+
+    gulong             destroy_id;
+    gboolean           subject_valid;
 #endif
 };
 
@@ -57,51 +71,353 @@ static guint signals [LAST_SIGNAL] = { 0 };
 
 G_DEFINE_TYPE (XfpmPolkit, xfpm_polkit, G_TYPE_OBJECT)
 
-static gboolean 
-xfpm_polkit_check_auth_intern (XfpmPolkit *polkit, const gchar *action_id)
+#ifdef ENABLE_POLKIT
+#if defined(__FreeBSD__)
+/**
+ * Taken from polkitunixprocess.c code to get process start
+ * time from pid.
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ *
+ **/
+static gboolean
+get_kinfo_proc (pid_t pid, struct kinfo_proc *p)
 {
-#ifdef HAVE_POLKIT
-    PolkitSubject *subj;
-    PolkitAuthorizationResult *res;
-    GError *error = NULL;
-    gboolean ret = FALSE;
+    int mib[4];
+    size_t len;
     
-    subj = polkit_unix_process_new (getpid ());
+    len = 4;
+    sysctlnametomib ("kern.proc.pid", mib, &len);
     
-    res = polkit_authority_check_authorization_sync (polkit->priv->authority, 
-                                                    subj, 
-                                                    action_id,
-                                                    NULL,
-                                                    
POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE,
-                                                    NULL,
-                                                    &error);
+    len = sizeof (struct kinfo_proc);
+    mib[3] = pid;
     
-    if ( error )
+    if (sysctl (mib, 4, p, &len, NULL, 0) == -1)
+       return FALSE;
+
+    return TRUE;
+}
+#endif /*if defined(__FreeBSD__)*/
+
+static guint64
+get_start_time_for_pid (pid_t pid)
+{
+    guint64 start_time;
+#if !defined(__FreeBSD__)
+    gchar *filename;
+    gchar *contents;
+    size_t length;
+    gchar **tokens;
+    guint num_tokens;
+    gchar *p;
+    gchar *endp;
+  
+    start_time = 0;
+    contents = NULL;
+    
+    filename = g_strdup_printf ("/proc/%d/stat", pid);
+    
+    if (!g_file_get_contents (filename, &contents, &length, NULL))
+       goto out;
+
+    /* start time is the token at index 19 after the '(process name)' entry - 
since only this
+     * field can contain the ')' character, search backwards for this to avoid 
malicious
+     * processes trying to fool us
+     */
+    p = strrchr (contents, ')');
+    if (p == NULL)
     {
-       g_warning ("Unable to get authorization result for action :%s : %s", 
action_id, error->message);
-       g_error_free (error);
        goto out;
     }
     
-    if (polkit_authorization_result_get_is_authorized (res))
+    p += 2; /* skip ') ' */
+
+    if (p - contents >= (int) length)
+    {
+       g_warning ("Error parsing file %s", filename);
+       goto out;
+    }
+    
+    tokens = g_strsplit (p, " ", 0);
+    
+    num_tokens = g_strv_length (tokens);
+    
+    if (num_tokens < 20)
+    {
+       g_warning ("Error parsing file %s", filename);
+       goto out;
+    }
+
+    start_time = strtoull (tokens[19], &endp, 10);
+    if (endp == tokens[19])
+    {
+       g_warning ("Error parsing file %s", filename);
+       goto out;
+    }
+    g_strfreev (tokens);
+
+ out:
+    g_free (filename);
+    g_free (contents);
+    
+#else /*if !defined(__FreeBSD__)*/
+
+    struct kinfo_proc p;
+    
+    start_time = 0;
+
+    if (! get_kinfo_proc (pid, &p))
     {
-       ret = TRUE;
+       g_warning ("Error obtaining start time for %d (%s)",
+                  (gint) pid,
+                  g_strerror (errno));
+       goto out;
     }
+
+    start_time = (guint64) p.ki_start.tv_sec;
     
 out:
-    if (res)
-       g_object_unref (res);
+#endif
+    
+    return start_time;
+}
+#endif /*ENABLE_POLKIT*/
+
+
+#ifdef ENABLE_POLKIT
+static gboolean
+xfpm_polkit_free_data (gpointer data)
+{
+    XfpmPolkit *polkit;
+    
+    polkit = XFPM_POLKIT (data);
+
+    g_assert (polkit->priv->subject_valid);
+
+    XFPM_DEBUG ("Destroying Polkit data");
+
+    g_hash_table_destroy (polkit->priv->details);
+    g_hash_table_destroy (polkit->priv->subject_hash);
+    g_value_array_free   (polkit->priv->subject);
+    
+    polkit->priv->details      = NULL;
+    polkit->priv->subject_hash = NULL;
+    polkit->priv->subject      = NULL;
+
+    polkit->priv->destroy_id = 0;
+    polkit->priv->subject_valid = FALSE;
+    
+    return FALSE;
+}
+
+static void
+xfpm_polkit_init_data (XfpmPolkit *polkit)
+{
+    const gchar *consolekit_cookie;
+    GValue hash_elem = { 0 };
+    gboolean subject_created = FALSE;
+
+    if (polkit->priv->subject_valid)
+       return;
+    
+    /**
+     * This variable should be set by the session manager or by 
+     * the login manager (gdm?). under clean Xfce environment
+     * it is set by the session manager (4.8 and above)  
+     * since we don't have a login manager, yet!
+     **/
+    consolekit_cookie = g_getenv ("XDG_SESSION_COOKIE");
+  
+    if ( consolekit_cookie )
+    {
+       DBusGProxy *proxy;
+       GError *error = NULL;
+       gboolean ret;
+       gchar *consolekit_session;
        
-    return ret;
+       proxy  = dbus_g_proxy_new_for_name_owner (polkit->priv->bus,
+                                                 "org.freedesktop.ConsoleKit",
+                                                 
"/org/freedesktop/ConsoleKit/Manager",
+                                                 
"org.freedesktop.ConsoleKit.Manager",
+                                                 NULL);
+       if ( proxy )
+       {
+           ret = dbus_g_proxy_call (proxy, "GetSessionForCookie", &error,
+                                    G_TYPE_STRING, consolekit_cookie,
+                                    G_TYPE_INVALID,
+                                    DBUS_TYPE_G_OBJECT_PATH, 
&consolekit_session,
+                                    G_TYPE_INVALID);
+           
+           if ( G_LIKELY (ret) )
+           {
+               GValue val  = { 0 };
+               
+               polkit->priv->subject = g_value_array_new (2);
+               polkit->priv->subject_hash = g_hash_table_new_full (g_str_hash, 
+                                                                   
g_str_equal, 
+                                                                   g_free, 
+                                                                   NULL);
+               g_value_init (&val, G_TYPE_STRING);
+               g_value_set_string (&val, "unix-session");
+               g_value_array_append (polkit->priv->subject, &val);
+               
+               g_value_unset (&val);
+               g_value_init (&val, G_TYPE_STRING);
+               g_value_set_string (&val, consolekit_session);
+               
+               g_hash_table_insert (polkit->priv->subject_hash, 
+                                    g_strdup ("session-id"), 
+                                    &val);
+               
+               g_free (consolekit_session);
+               XFPM_DEBUG ("Using ConsoleKit session Polkit subject");
+               subject_created = TRUE;
+           }
+           g_object_unref (proxy);
+       }
+       else if (error)
+       {
+           g_warning ("'GetSessionForCookie' failed : %s", error->message);
+           g_error_free (error);
+       }
+    }
+
+    if ( subject_created == FALSE )
+    {
+       gint pid;
+       guint64 start_time;
     
-#endif
+       pid = getpid ();
+       
+       start_time = get_start_time_for_pid (pid);
+       
+       if ( G_LIKELY (start_time != 0 ) )
+       {
+           GValue val = { 0 }, pid_val = { 0 }, start_time_val = { 0 };
+           
+           polkit->priv->subject = g_value_array_new (2);
+           polkit->priv->subject_hash = g_hash_table_new_full (g_str_hash, 
+                                                               g_str_equal, 
+                                                               g_free, 
+                                                               NULL);
+       
+           g_value_init (&val, G_TYPE_STRING);
+           g_value_set_string (&val, "unix-process");
+           g_value_array_append (polkit->priv->subject, &val);
+           
+           g_value_unset (&val);
+           
+           g_value_init (&pid_val, G_TYPE_UINT);
+           g_value_set_uint (&pid_val, pid);
+           g_hash_table_insert (polkit->priv->subject_hash, 
+                                g_strdup ("pid"), &pid_val);
+           
+           g_value_init (&start_time_val, G_TYPE_UINT64);
+           g_value_set_uint64 (&start_time_val, start_time);
+           g_hash_table_insert (polkit->priv->subject_hash, 
+                                g_strdup ("start-time"), &start_time_val);
+           
+           XFPM_DEBUG ("Using unix session polkit subject");
+       }
+       else
+       {
+           g_warning ("Unable to create polkit subject");
+       }
+    }
+    
+    g_value_init (&hash_elem, 
+                 dbus_g_type_get_map ("GHashTable", 
+                                      G_TYPE_STRING, 
+                                      G_TYPE_VALUE));
+    
+    g_value_set_static_boxed (&hash_elem, polkit->priv->subject_hash);
+    g_value_array_append (polkit->priv->subject, &hash_elem);
+    
+    /**
+     * Polkit details, will leave it empty.
+     **/
+    polkit->priv->details = g_hash_table_new_full (g_str_hash, 
+                                                  g_str_equal, 
+                                                  g_free, 
+                                                  g_free);
+
+    
+    /*Clean these data after 2 minutes*/
+    polkit->priv->destroy_id = 
+       g_timeout_add_seconds (2, (GSourceFunc) xfpm_polkit_free_data, polkit);
+    
+    polkit->priv->subject_valid = TRUE;
+}
+#endif /*ENABLE_POLKIT*/
+
+static gboolean
+xfpm_polkit_check_auth_intern (XfpmPolkit *polkit, const gchar *action_id)
+{
+#ifdef ENABLE_POLKIT
+    GValueArray *result;
+    GValue result_val = { 0 };
+    GError *error = NULL;
+    gboolean is_authorized = FALSE;
+    gboolean ret;
+    
+    /**
+     * <method name="CheckAuthorization">      
+     *   <arg type="(sa{sv})" name="subject" direction="in"/>      
+     *   <arg type="s" name="action_id" direction="in"/>           
+     *   <arg type="a{ss}" name="details" direction="in"/>         
+     *   <arg type="u" name="flags" direction="in"/>               
+     *   <arg type="s" name="cancellation_id" direction="in"/>     
+     *   <arg type="(bba{ss})" name="result" direction="out"/>     
+     * </method>
+     *
+     **/
+    
+    g_return_val_if_fail (polkit->priv->proxy != NULL, FALSE);
+    g_return_val_if_fail (polkit->priv->subject_valid, FALSE);
+     
+    result = g_value_array_new (0);
+    
+    ret = dbus_g_proxy_call (polkit->priv->proxy, "CheckAuthorization", &error,
+                            polkit->priv->subject_gtype, polkit->priv->subject,
+                            G_TYPE_STRING, action_id,
+                            polkit->priv->details_gtype, polkit->priv->details,
+                            G_TYPE_UINT, 0, 
+                            G_TYPE_STRING, NULL,
+                            G_TYPE_INVALID,
+                            polkit->priv->result_gtype, &result,
+                            G_TYPE_INVALID);
+    
+    if ( G_LIKELY (ret) )
+    {
+       g_value_init (&result_val, polkit->priv->result_gtype);
+       g_value_set_static_boxed (&result_val, result);
+       
+       dbus_g_type_struct_get (&result_val,
+                               0, &is_authorized,
+                               G_MAXUINT);
+       g_value_unset (&result_val);
+    }
+    else if ( error )
+    {
+       g_warning ("'CheckAuthorization' failed with %s", error->message);
+       g_error_free (error);
+    }
+
+    g_value_array_free (result);
+    
+    XFPM_DEBUG ("Action=%s is authorized=%s", action_id, xfpm_bool_to_string 
(is_authorized));
+    
+    return is_authorized;
+#endif /*ENABLE_POLKIT*/
     return TRUE;
 }
 
-#ifdef HAVE_POLKIT
+#ifdef ENABLE_POLKIT
 static void
-xfpm_polkit_auth_changed_cb (PolkitAuthority *authority, XfpmPolkit *polkit)
+xfpm_polkit_changed_cb (DBusGProxy *proxy, XfpmPolkit *polkit)
 {
+    XFPM_DEBUG ("Auth changed");
+    g_signal_emit (G_OBJECT (polkit), signals [AUTH_CHANGED], 0);
 }
 #endif
 
@@ -130,6 +446,36 @@ xfpm_polkit_init (XfpmPolkit *polkit)
     GError *error = NULL;
     
     polkit->priv = XFPM_POLKIT_GET_PRIVATE (polkit);
+
+#ifdef ENABLE_POLKIT
+    polkit->priv->destroy_id   = 0;
+    polkit->priv->subject_valid   = FALSE;
+    polkit->priv->proxy        = NULL;
+    polkit->priv->subject      = NULL;
+    polkit->priv->details      = NULL;
+    polkit->priv->subject_hash = NULL;
+    
+    polkit->priv->subject_gtype = 
+        dbus_g_type_get_struct ("GValueArray", 
+                                G_TYPE_STRING, 
+                                dbus_g_type_get_map ("GHashTable", 
+                                                     G_TYPE_STRING, 
+                                                     G_TYPE_VALUE),
+                                G_TYPE_INVALID);
+    
+    polkit->priv->details_gtype = dbus_g_type_get_map ("GHashTable", 
+                                                      G_TYPE_STRING, 
+                                                      G_TYPE_STRING);
+    
+    polkit->priv->result_gtype =
+       dbus_g_type_get_struct ("GValueArray", 
+                               G_TYPE_BOOLEAN, 
+                               G_TYPE_BOOLEAN, 
+                               dbus_g_type_get_map ("GHashTable", 
+                                                    G_TYPE_STRING, 
+                                                    G_TYPE_STRING),
+                               G_TYPE_INVALID);
+#endif /*ENABLE_POLKIT*/
     
     polkit->priv->bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
     
@@ -139,16 +485,30 @@ xfpm_polkit_init (XfpmPolkit *polkit)
        g_error_free (error);
        goto out;
     }
-#ifdef HAVE_POLKIT
-    polkit->priv->authority = polkit_authority_get ();
-    g_signal_connect (polkit->priv->authority, "changed",
-                     G_CALLBACK (xfpm_polkit_auth_changed_cb), polkit);
-#endif
-    
+
+#ifdef ENABLE_POLKIT
+    polkit->priv->proxy = 
+       dbus_g_proxy_new_for_name_owner (polkit->priv->bus,
+                                        "org.freedesktop.PolicyKit1",
+                                        
"/org/freedesktop/PolicyKit1/Authority",
+                                        "org.freedesktop.PolicyKit1.Authority",
+                                        &error);
     
+    if (G_LIKELY (polkit->priv->proxy) )
+    {
+       dbus_g_proxy_add_signal (polkit->priv->proxy, "Changed", 
G_TYPE_INVALID);
+       dbus_g_proxy_connect_signal (polkit->priv->proxy, "Changed",
+                                    G_CALLBACK (xfpm_polkit_changed_cb), 
polkit, NULL);
+    }
+    else
+    {
+       g_warning ("Failed to create proxy for 'org.freedesktop.PolicyKit1' : 
%s", error->message);
+       g_error_free (error);
+    }
+#endif /*ENABLE_POLKIT*/
+
 out:
     ;
-    
 }
 
 static void
@@ -157,10 +517,23 @@ xfpm_polkit_finalize (GObject *object)
     XfpmPolkit *polkit;
 
     polkit = XFPM_POLKIT (object);
-#ifdef HAVE_POLKIT
-    if (polkit->priv->authority )
-       g_object_unref (polkit->priv->authority);
-#endif
+
+#ifdef ENABLE_POLKIT
+    if ( polkit->priv->proxy )
+    {
+       dbus_g_proxy_disconnect_signal (polkit->priv->proxy, "Changed",
+                                       G_CALLBACK (xfpm_polkit_changed_cb), 
polkit);
+       g_object_unref (polkit->priv->proxy);
+    }
+
+    if ( polkit->priv->subject_valid )
+    {
+       xfpm_polkit_free_data (polkit);
+       if (polkit->priv->destroy_id != 0 )
+           g_source_remove (polkit->priv->destroy_id);
+    }
+#endif /*ENABLE_POLKIT*/
+
 
     if ( polkit->priv->bus )
        dbus_g_connection_unref (polkit->priv->bus);
@@ -180,6 +553,7 @@ xfpm_polkit_get (void)
     else
     {
        xfpm_polkit_obj = g_object_new (XFPM_TYPE_POLKIT, NULL);
+       g_object_add_weak_pointer (xfpm_polkit_obj, &xfpm_polkit_obj);
     }
     
     return XFPM_POLKIT (xfpm_polkit_obj);
@@ -187,5 +561,6 @@ xfpm_polkit_get (void)
 
 gboolean xfpm_polkit_check_auth        (XfpmPolkit *polkit, const gchar 
*action_id)
 {
+    xfpm_polkit_init_data (polkit);
     return xfpm_polkit_check_auth_intern (polkit, action_id);
 }
diff --git a/src/xfpm-power.c b/src/xfpm-power.c
index c1a5425..116f0f6 100644
--- a/src/xfpm-power.c
+++ b/src/xfpm-power.c
@@ -56,10 +56,10 @@ static const gchar *BACKEND_PATH;
 static const gchar *BACKEND_IFACE;
 static const gchar *BACKEND_IFACE_DEVICE;
 static const gchar *BACKEND_PATH_DEVICE;
-#ifdef HAVE_POLKIT
+#ifdef ENABLE_POLKIT
 static const gchar *POLKIT_AUTH_SUSPEND;
 static const gchar *POLKIT_AUTH_HIBERNATE;
-#endif /*HAVE_POLKIT*/
+#endif /*ENABLE_POLKIT*/
 
 static void xfpm_power_finalize     (GObject *object);
 
@@ -93,7 +93,7 @@ struct XfpmPowerPrivate
     gboolean        inhibited;
     
     XfpmNotify     *notify;
-#ifdef HAVE_POLKIT
+#ifdef ENABLE_POLKIT
     XfpmPolkit             *polkit;
 #endif
     gboolean        auth_suspend;
@@ -146,7 +146,7 @@ static guint signals [LAST_SIGNAL] = { 0 };
 
 G_DEFINE_TYPE (XfpmPower, xfpm_power, G_TYPE_OBJECT)
 
-#ifdef HAVE_POLKIT
+#ifdef ENABLE_POLKIT
 static void
 xfpm_power_check_polkit_auth (XfpmPower *power)
 {
@@ -1079,7 +1079,7 @@ xfpm_power_device_changed_cb (DBusGProxy *proxy, const 
gchar *object_path, XfpmP
     }
 }
 
-#ifdef HAVE_POLKIT
+#ifdef ENABLE_POLKIT
 static void
 xfpm_power_polkit_auth_changed_cb (XfpmPower *power)
 {
@@ -1310,7 +1310,7 @@ xfpm_power_init (XfpmPower *power)
     g_signal_connect_swapped (power->priv->conf, "notify::" SHOW_TRAY_ICON_CFG,
                              G_CALLBACK (xfpm_power_refresh_adaptor_visible), 
power);
     
-#ifdef HAVE_POLKIT
+#ifdef ENABLE_POLKIT
     power->priv->polkit  = xfpm_polkit_get ();
     g_signal_connect_swapped (power->priv->polkit, "auth-changed",
                              G_CALLBACK (xfpm_power_polkit_auth_changed_cb), 
power);
@@ -1343,7 +1343,7 @@ xfpm_power_init (XfpmPower *power)
        BACKEND_IFACE         =  UPOWER_IFACE;
        BACKEND_IFACE_DEVICE  =  UPOWER_IFACE_DEVICE;
        BACKEND_PATH_DEVICE   =  UPOWER_PATH_DEVICE;
-#ifdef HAVE_POLKIT
+#ifdef ENABLE_POLKIT
        POLKIT_AUTH_SUSPEND   = "org.freedesktop.upower.suspend";
        POLKIT_AUTH_HIBERNATE = "org.freedesktop.upower.hibernate";
 #endif
@@ -1366,7 +1366,7 @@ xfpm_power_init (XfpmPower *power)
            BACKEND_IFACE =   DKP_IFACE;
            BACKEND_IFACE_DEVICE =  DKP_IFACE_DEVICE;
            BACKEND_PATH_DEVICE  =  DKP_PATH_DEVICE;
-#ifdef HAVE_POLKIT
+#ifdef ENABLE_POLKIT
            POLKIT_AUTH_SUSPEND = "org.freedesktop.devicekit.power.suspend";
            POLKIT_AUTH_HIBERNATE = "org.freedesktop.devicekit.power.hibernate";
 #endif
@@ -1390,7 +1390,7 @@ xfpm_power_init (XfpmPower *power)
     
     xfpm_power_get_power_devices (power);
     xfpm_power_get_properties (power);
-#ifdef HAVE_POLKIT
+#ifdef ENABLE_POLKIT
     xfpm_power_check_polkit_auth (power);
 #endif
 
@@ -1491,7 +1491,7 @@ xfpm_power_finalize (GObject *object)
 
     g_hash_table_destroy (power->priv->hash);
 
-#ifdef HAVE_POLKIT
+#ifdef ENABLE_POLKIT
     g_object_unref (power->priv->polkit);
 #endif
 
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to