summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Zeuthen <davidz@redhat.com>2009-06-17 19:02:46 -0400
committerDavid Zeuthen <davidz@redhat.com>2009-06-17 19:02:46 -0400
commit433ee3fe61471604e7997183737f6e57474e31aa (patch)
tree7cc2fdf4a0ffef37f3e41f3d666e3156a513907b
parent517ad0fe9caf02f83edd2f95806ccecd019f085c (diff)
Port to polkit-1
-rw-r--r--configure.ac6
-rw-r--r--data/org.freedesktop.Hostname1.service.in2
-rw-r--r--policy/Makefile.am5
-rw-r--r--policy/org.freedesktop.hostname1.policy.in2
-rw-r--r--src/daemon/Makefile.am4
-rw-r--r--src/daemon/xdg-hostname-daemon.c207
-rw-r--r--src/programs/xdg-hostname.c79
-rw-r--r--src/xdg-hostname/xdg-hostname-error.c9
-rw-r--r--src/xdg-hostname/xdg-hostname-error.h2
9 files changed, 107 insertions, 209 deletions
diff --git a/configure.ac b/configure.ac
index 0175b93..7ff9fe9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -134,9 +134,9 @@ PKG_CHECK_MODULES(DBUS_GLIB, [dbus-glib-1 >= 0.73])
AC_SUBST(DBUS_GLIB_CFLAGS)
AC_SUBST(DBUS_GLIB_LIBS)
-PKG_CHECK_MODULES(POLKIT, [polkit-dbus >= 0.9])
-AC_SUBST(POLKIT_CFLAGS)
-AC_SUBST(POLKIT_LIBS)
+PKG_CHECK_MODULES(POLKIT_GOBJECT_1, [polkit-gobject-1 >= 0.92])
+AC_SUBST(POLKIT_GOBJECT_1_CFLAGS)
+AC_SUBST(POLKIT_GOBJECT_1_LIBS)
EXPAT_LIB=""
AC_ARG_WITH(expat, [ --with-expat=<dir> Use expat from here],
diff --git a/data/org.freedesktop.Hostname1.service.in b/data/org.freedesktop.Hostname1.service.in
index 48c8b59..b6d36be 100644
--- a/data/org.freedesktop.Hostname1.service.in
+++ b/data/org.freedesktop.Hostname1.service.in
@@ -1,4 +1,4 @@
[D-BUS Service]
-Name=org.freedesktop.Hostname
+Name=org.freedesktop.Hostname1
Exec=@libexecdir@/xdg-hostname-daemon-1
User=root
diff --git a/policy/Makefile.am b/policy/Makefile.am
index e3447e3..2c7a063 100644
--- a/policy/Makefile.am
+++ b/policy/Makefile.am
@@ -1,14 +1,11 @@
-hostname1_policydir = $(datadir)/PolicyKit/policy
+hostname1_policydir = $(datadir)/polkit-1/actions
dist_hostname1_policy_DATA = \
org.freedesktop.hostname1.policy
@INTLTOOL_POLICY_RULE@
-check:
- polkit-policy-file-validate $(top_srcdir)/policy/$(dist_hostname1_policy_DATA)
-
clean-local :
rm -f *~ *.policy
diff --git a/policy/org.freedesktop.hostname1.policy.in b/policy/org.freedesktop.hostname1.policy.in
index 5832831..68428d4 100644
--- a/policy/org.freedesktop.hostname1.policy.in
+++ b/policy/org.freedesktop.hostname1.policy.in
@@ -20,7 +20,7 @@ Copyright (c) 2008 David Zeuthen <davidz@redhat.com>. Licensed under LGPLv2+.
<defaults>
<allow_any>no</allow_any>
<allow_inactive>no</allow_inactive>
- <allow_active>auth_self</allow_active>
+ <allow_active>auth_admin_keep</allow_active>
</defaults>
</action>
diff --git a/src/daemon/Makefile.am b/src/daemon/Makefile.am
index 40f958a..d4b900f 100644
--- a/src/daemon/Makefile.am
+++ b/src/daemon/Makefile.am
@@ -34,14 +34,14 @@ xdg_hostname_daemon_1_CFLAGS = \
$(DBUS_GLIB_CFLAGS) \
$(GLIB_CFLAGS) \
$(GIO_CFLAGS) \
- $(POLKIT_CFLAGS) \
+ $(POLKIT_GOBJECT_1_CFLAGS) \
$(NULL)
xdg_hostname_daemon_1_LDADD = \
$(DBUS_GLIB_LIBS) \
$(GLIB_LIBS) \
$(GIO_LIBS) \
- $(POLKIT_LIBS) \
+ $(POLKIT_GOBJECT_1_LIBS) \
$(top_builddir)/src/xdg-hostname/libxdg-hostname-gobject-1.la \
$(NULL)
diff --git a/src/daemon/xdg-hostname-daemon.c b/src/daemon/xdg-hostname-daemon.c
index 25f36ad..f10ef2d 100644
--- a/src/daemon/xdg-hostname-daemon.c
+++ b/src/daemon/xdg-hostname-daemon.c
@@ -33,7 +33,7 @@
#include <dbus/dbus-glib.h>
#include <dbus/dbus-glib-lowlevel.h>
-#include <polkit-dbus/polkit-dbus.h>
+#include <polkit/polkit.h>
#include <xdg-hostname/xdg-hostname.h>
@@ -66,7 +66,8 @@ struct _XdgHostnameDaemon
gboolean inhibit_reading;
DBusConnection *system_bus_connection;
- PolKitContext *pk_context;
+
+ PolkitAuthority *authority;
};
struct _XdgHostnameDaemonClass
@@ -195,11 +196,7 @@ xdg_hostname_daemon_constructed (GObject *object)
static void
xdg_hostname_daemon_finalize (GObject *object)
{
- XdgHostnameDaemon *daemon;
-
- g_return_if_fail (XDG_IS_HOSTNAME_DAEMON (object));
-
- daemon = XDG_HOSTNAME_DAEMON (object);
+ XdgHostnameDaemon *daemon = XDG_HOSTNAME_DAEMON (object);
g_free (daemon->display_hostname);
g_free (daemon->hostname);
@@ -213,6 +210,8 @@ xdg_hostname_daemon_finalize (GObject *object)
g_free (daemon->transient_hostname);
g_free (daemon->transient_icon_name);
+ g_object_unref (daemon->authority);
+
G_OBJECT_CLASS (xdg_hostname_daemon_parent_class)->finalize (object);
}
@@ -467,40 +466,6 @@ xdg_hostname_daemon_class_init (XdgHostnameDaemonClass *klass)
dbus_g_object_type_install_info (XDG_TYPE_HOSTNAME_DAEMON, &dbus_glib__xdg_hostname_daemon_object_info);
}
-static gboolean
-pk_io_watch_have_data (GIOChannel *channel, GIOCondition condition, gpointer user_data)
-{
- int fd;
- PolKitContext *pk_context = user_data;
- fd = g_io_channel_unix_get_fd (channel);
- polkit_context_io_func (pk_context, fd);
- return TRUE;
-}
-
-static int
-pk_io_add_watch (PolKitContext *pk_context, int fd)
-{
- guint id = 0;
- GIOChannel *channel;
- channel = g_io_channel_unix_new (fd);
- if (channel == NULL)
- goto out;
- id = g_io_add_watch (channel, G_IO_IN, pk_io_watch_have_data, pk_context);
- if (id == 0) {
- g_io_channel_unref (channel);
- goto out;
- }
- g_io_channel_unref (channel);
-out:
- return id;
-}
-
-static void
-pk_io_remove_watch (PolKitContext *pk_context, int watch_id)
-{
- g_source_remove (watch_id);
-}
-
XdgHostnameDaemon *
xdg_hostname_daemon_new (DBusGConnection *connection,
const char *object_path)
@@ -515,18 +480,9 @@ xdg_hostname_daemon_new (DBusGConnection *connection,
daemon->system_bus_connection = dbus_g_connection_get_connection (connection);
- daemon->pk_context = polkit_context_new ();
- polkit_context_set_io_watch_functions (daemon->pk_context, pk_io_add_watch, pk_io_remove_watch);
- if (!polkit_context_init (daemon->pk_context, NULL)) {
- g_warning ("cannot initialize libpolkit");
- goto error;
- }
+ daemon->authority = polkit_authority_get ();
return daemon;
-
- error:
- g_object_unref (daemon);
- return NULL;
}
/*--------------------------------------------------------------------------------------------------------------*/
@@ -946,64 +902,83 @@ _xdg_hostname_priv_set_data (SetDataFlags flags,
return ret;
}
-static gboolean
-check_polkit_auth (XdgHostnameDaemon *daemon,
- DBusGMethodInvocation *context)
+/* ---------------------------------------------------------------------------------------------------- */
+
+typedef struct {
+ XdgHostnameDaemon *daemon;
+ SetDataFlags flags;
+ gchar *display_hostname;
+ gchar *hostname;
+ gchar *icon_name;
+ gboolean use_transient_data;
+ DBusGMethodInvocation *context;
+} CheckAuthData;
+
+static void
+check_authorization_cb (PolkitAuthority *authority,
+ GAsyncResult *res,
+ gpointer user_data)
{
- gboolean ret;
+ CheckAuthData *data = user_data;
+ PolkitAuthorizationResult *result;
GError *error;
- DBusError d_error;
- PolKitAction *pk_action;
- PolKitCaller *pk_caller;
- PolKitResult pk_result;
- const char *sender;
- ret = FALSE;
- pk_caller = NULL;
- pk_action = NULL;
-
- sender = dbus_g_method_get_sender (context);
-
- dbus_error_init (&d_error);
- pk_caller = polkit_caller_new_from_dbus_name (daemon->system_bus_connection,
- sender,
- &d_error);
- if (pk_caller == NULL) {
- error = NULL;
- dbus_set_g_error (&error, &d_error);
- dbus_g_method_return_error (context, error);
+ error = NULL;
+ result = polkit_authority_check_authorization_finish (authority,
+ res,
+ &error);
+ if (error != NULL) {
+ GError *error2;
+ error2 = g_error_new (XDG_HOSTNAME_ERROR,
+ XDG_HOSTNAME_ERROR_PERMISSION_DENIED,
+ "Authorization check failed: %s",
+ error->message);
+ dbus_g_method_return_error (data->context, error2);
+ g_error_free (error2);
g_error_free (error);
- dbus_error_free (&d_error);
goto out;
}
- pk_action = polkit_action_new ();
- polkit_action_set_action_id (pk_action, "org.freedesktop.hostname1.change");
- pk_result = polkit_context_is_caller_authorized (daemon->pk_context,
- pk_action,
- pk_caller,
- TRUE,
- NULL);
- if (pk_result == POLKIT_RESULT_YES) {
- ret = TRUE;
+ if (polkit_authorization_result_get_is_authorized (result)) {
+ /* explicitly left blank */
+ } else if (polkit_authorization_result_get_is_challenge (result)) {
+ error = g_error_new_literal (XDG_HOSTNAME_ERROR,
+ XDG_HOSTNAME_ERROR_PERMISSION_DENIED,
+ "Authentication is required to perform operation");
+ dbus_g_method_return_error (data->context, error);
+ goto out;
} else {
- dbus_error_init (&d_error);
- polkit_dbus_error_generate (pk_action, pk_result, &d_error);
- error = NULL;
- dbus_set_g_error (&error, &d_error);
- dbus_g_method_return_error (context, error);
+ error = g_error_new_literal (XDG_HOSTNAME_ERROR,
+ XDG_HOSTNAME_ERROR_PERMISSION_DENIED,
+ "Not authorized to perform operation");
+ dbus_g_method_return_error (data->context, error);
+ goto out;
+ }
+ g_object_unref (result);
+
+ error = NULL;
+ if (!_xdg_hostname_priv_set_data (data->flags,
+ data->display_hostname,
+ data->hostname,
+ data->icon_name,
+ data->use_transient_data,
+ &error)) {
+ dbus_g_method_return_error (data->context, error);
g_error_free (error);
- dbus_error_free (&d_error);
+ } else {
+ dbus_g_method_return (data->context);
}
+ update_data (data->daemon, TRUE, &error);
+
out:
- if (pk_caller != NULL)
- polkit_caller_unref (pk_caller);
- if (pk_action != NULL)
- polkit_action_unref (pk_action);
- return ret;
+ g_free (data->display_hostname);
+ g_free (data->hostname);
+ g_free (data->icon_name);
+ g_free (data);
}
+
static gboolean
set_data (XdgHostnameDaemon *daemon,
SetDataFlags flags,
@@ -1013,27 +988,29 @@ set_data (XdgHostnameDaemon *daemon,
gboolean use_transient_data,
DBusGMethodInvocation *context)
{
- GError *error;
-
- if (!check_polkit_auth (daemon, context))
- goto out;
+ CheckAuthData *data;
+ PolkitSubject *subject;
+
+ data = g_new0 (CheckAuthData, 1);
+ data->flags = flags;
+ data->daemon = daemon;
+ data->display_hostname = g_strdup (display_hostname);
+ data->hostname = g_strdup (hostname);
+ data->icon_name = g_strdup (icon_name);
+ data->use_transient_data = use_transient_data;
+ data->context = context;
+
+ subject = polkit_system_bus_name_new (dbus_g_method_get_sender (context));
+ polkit_authority_check_authorization (daemon->authority,
+ subject,
+ "org.freedesktop.hostname1.change",
+ NULL,
+ POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION,
+ NULL,
+ (GAsyncReadyCallback) check_authorization_cb,
+ data);
+ g_object_unref (subject);
- error = NULL;
- if (!_xdg_hostname_priv_set_data (flags,
- display_hostname,
- hostname,
- icon_name,
- use_transient_data,
- &error)) {
- dbus_g_method_return_error (context, error);
- g_error_free (error);
- } else {
- dbus_g_method_return (context);
- }
-
- update_data (daemon, TRUE, &error);
-
- out:
return TRUE;
}
diff --git a/src/programs/xdg-hostname.c b/src/programs/xdg-hostname.c
index c02e2d0..4412522 100644
--- a/src/programs/xdg-hostname.c
+++ b/src/programs/xdg-hostname.c
@@ -26,7 +26,6 @@
#include <unistd.h>
#include <dbus/dbus-glib.h>
#include <dbus/dbus-glib-lowlevel.h>
-#include <polkit-dbus/polkit-dbus.h>
#include <xdg-hostname/xdg-hostname.h>
@@ -134,63 +133,6 @@ monitor_hostname_data (XdgHostnameMonitor *h)
return TRUE;
}
-static gboolean
-polkit_dbus_gerror_parse (GError *error,
- PolKitAction **action,
- PolKitResult *result)
-{
- gboolean ret;
- const char *name;
-
- ret = FALSE;
- if (error->domain != DBUS_GERROR || error->code != DBUS_GERROR_REMOTE_EXCEPTION)
- goto out;
-
- name = dbus_g_error_get_name (error);
-
- ret = polkit_dbus_error_parse_from_strings (name,
- error->message,
- action,
- result);
-out:
- return ret;
-}
-
-static gboolean
-attempt_polkit (GError *error)
-{
- gboolean ret;
- PolKitAction *pk_action;
- PolKitResult pk_result;
-
- ret = FALSE;
-
- if (polkit_dbus_gerror_parse (error,
- &pk_action,
- &pk_result)) {
- char *action_id;
-
- if (polkit_action_get_action_id (pk_action, &action_id)) {
- DBusError d_error;
-
- dbus_error_init (&d_error);
- if (polkit_auth_obtain (action_id,
- 0,
- getpid (),
- &d_error)) {
- ret = TRUE;
- }
- if (dbus_error_is_set (&d_error)) {
- dbus_error_free (&d_error);
- }
- }
-
- polkit_action_unref (pk_action);
- }
-
- return ret;
-}
-
int
main (int argc, char *argv[])
{
@@ -222,16 +164,10 @@ main (int argc, char *argv[])
}
if (opt_set_display_hostname != NULL) {
-
- retry_display_hostname:
if (!xdg_hostname_monitor_set_display_hostname_sync (hostname_monitor,
opt_set_display_hostname,
NULL,
&error)) {
- if (attempt_polkit (error)) {
- g_error_free (error);
- goto retry_display_hostname;
- }
g_printerr ("Error setting display-hostname: %s\n", error->message);
g_error_free (error);
goto out;
@@ -239,15 +175,10 @@ main (int argc, char *argv[])
}
if (opt_set_hostname != NULL) {
- retry_hostname:
if (!xdg_hostname_monitor_set_hostname_sync (hostname_monitor,
opt_set_hostname,
NULL,
&error)) {
- if (attempt_polkit (error)) {
- g_error_free (error);
- goto retry_hostname;
- }
g_printerr ("Error setting hostname: %s\n", error->message);
g_error_free (error);
goto out;
@@ -255,15 +186,10 @@ main (int argc, char *argv[])
}
if (opt_set_icon_name != NULL) {
- retry_icon_name:
if (!xdg_hostname_monitor_set_icon_name_sync (hostname_monitor,
opt_set_icon_name,
NULL,
&error)) {
- if (attempt_polkit (error)) {
- g_error_free (error);
- goto retry_icon_name;
- }
g_printerr ("Error setting icon-name: %s\n", error->message);
g_error_free (error);
goto out;
@@ -279,15 +205,10 @@ main (int argc, char *argv[])
g_ascii_strcasecmp (opt_set_use_transient_data, "yes") == 0)
val = TRUE;
- retry_use_transient_data:
if (!xdg_hostname_monitor_set_use_transient_data_sync (hostname_monitor,
val,
NULL,
&error)) {
- if (attempt_polkit (error)) {
- g_error_free (error);
- goto retry_use_transient_data;
- }
g_printerr ("Error setting use-transient-data: %s\n", error->message);
g_error_free (error);
goto out;
diff --git a/src/xdg-hostname/xdg-hostname-error.c b/src/xdg-hostname/xdg-hostname-error.c
index d6a0313..07de2cb 100644
--- a/src/xdg-hostname/xdg-hostname-error.c
+++ b/src/xdg-hostname/xdg-hostname-error.c
@@ -34,7 +34,7 @@
* @short_description: Error domain for xdg-hostname
* @include: xdghostname/xdghostname.h
*
- * Error domain for xdg-hostname
+ * Error domain for xdg-hostname.
*/
/**
@@ -43,7 +43,7 @@
* Gets the #XdgHostnameError Quark.
*
* Return value: a #GQuark.
- **/
+ */
GQuark
xdg_hostname_error_quark (void)
{
@@ -59,8 +59,9 @@ xdg_hostname_error_get_type (void)
if (etype == 0) {
static const GEnumValue values[] = {
- ENUM_ENTRY (XDG_HOSTNAME_ERROR_FAILED, "Failed"),
- ENUM_ENTRY (XDG_HOSTNAME_ERROR_NOT_SUPPORTED, "NotSupported"),
+ ENUM_ENTRY (XDG_HOSTNAME_ERROR_FAILED, "Failed"),
+ ENUM_ENTRY (XDG_HOSTNAME_ERROR_NOT_SUPPORTED , "NotSupported"),
+ ENUM_ENTRY (XDG_HOSTNAME_ERROR_PERMISSION_DENIED, "PermissionDenied"),
{ 0, 0, 0 }
};
g_assert (XDG_HOSTNAME_ERROR_NUM_ERRORS == G_N_ELEMENTS (values) - 1);
diff --git a/src/xdg-hostname/xdg-hostname-error.h b/src/xdg-hostname/xdg-hostname-error.h
index 723bb5d..7372928 100644
--- a/src/xdg-hostname/xdg-hostname-error.h
+++ b/src/xdg-hostname/xdg-hostname-error.h
@@ -50,12 +50,14 @@ GType xdg_hostname_error_get_type (void) G_GNUC_CONST;
* XdgHostnameErrorEnum:
* @XDG_HOSTNAME_ERROR_FAILED: The operation failed.
* @XDG_HOSTNAME_ERROR_NOT_SUPPORTED: Operation not supported.
+ * @XDG_HOSTNAME_ERROR_PERMISSION_DENIED: Permission denied.
*
* Error codes returned by xdg-hostname functions.
*/
typedef enum {
XDG_HOSTNAME_ERROR_FAILED,
XDG_HOSTNAME_ERROR_NOT_SUPPORTED,
+ XDG_HOSTNAME_ERROR_PERMISSION_DENIED,
XDG_HOSTNAME_ERROR_NUM_ERRORS
} XdgHostnameErrorEnum;