[gnome-control-center] sharing: add helper application to enable or disable remote login
- From: Thomas Wood <thos src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] sharing: add helper application to enable or disable remote login
- Date: Fri, 18 Jan 2013 18:26:40 +0000 (UTC)
commit 0999c4a0e6e3fc153d60c3621ba5c6a570d26c96
Author: Thomas Wood <thomas wood intel com>
Date: Fri Jan 18 17:15:33 2013 +0000
sharing: add helper application to enable or disable remote login
Add a helper application and PolicyKit action to enable and disable the
remote login service.
https://bugzilla.gnome.org/show_bug.cgi?id=691962
configure.ac | 1 +
panels/sharing/Makefile.am | 17 ++-
panels/sharing/cc-remote-login-helper.c | 167 ++++++++++++++++++++
panels/sharing/cc-remote-login.c | 63 +++++++-
panels/sharing/cc-remote-login.h | 2 +-
panels/sharing/cc-sharing-panel.c | 2 +-
....controlcenter.remote-login-helper.policy.in.in | 21 +++
7 files changed, 262 insertions(+), 11 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 7dfd55b..ef2a6d1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -166,6 +166,7 @@ PKG_CHECK_MODULES(USER_ACCOUNTS_PANEL, $COMMON_MODULES
pwquality
accountsservice >= $ACCOUNTSSERVICE_REQUIRED_VERSION)
PKG_CHECK_MODULES(SHARING_PANEL, $COMMON_MODULES egg-list-box)
+PKG_CHECK_MODULES(REMOTE_LOGIN_HELPER, glib-2.0 >= $GLIB_REQUIRED_VERSION gio-2.0)
PKG_CHECK_MODULES(GVC, gobject-2.0 libpulse libpulse-mainloop-glib)
AM_CONDITIONAL(HAVE_INTROSPECTION, false)
diff --git a/panels/sharing/Makefile.am b/panels/sharing/Makefile.am
index db0f50e..d9ac3fa 100644
--- a/panels/sharing/Makefile.am
+++ b/panels/sharing/Makefile.am
@@ -6,6 +6,7 @@ uidir = $(pkgdatadir)/ui/sharing
AM_CPPFLAGS = \
$(PANEL_CFLAGS) \
$(SHARING_PANEL_CFLAGS) \
+ -DLIBEXECDIR=\"$(libexecdir)\" \
$(NULL)
noinst_LTLIBRARIES = libsharing.la
@@ -40,8 +41,22 @@ cc-sharing-resources.h: sharing.gresource.xml $(resource_files)
libsharing_la_LIBADD = $(PANEL_LIBS) $(SHARING_PANEL_LIBS)
libsharing_la_LDFLAGS = $(PANEL_LDFLAGS)
- INTLTOOL_DESKTOP_RULE@
+libexec_PROGRAMS = cc-remote-login-helper
+
+cc_remote_login_helper_SOURCES = cc-remote-login-helper.c
+cc_remote_login_helper_LDADD = $(REMOTE_LOGIN_HELPER_LIBS)
+cc_remote_login_helper_CFLAGS = $(REMOTE_LOGIN_HELPER_CFLAGS)
+
+org.gnome.controlcenter.remote-login-helper.policy.in: org.gnome.controlcenter.remote-login-helper.policy.in.in Makefile
+ $(AM_V_GEN) sed -e "s|\ libexecdir\@|$(libexecdir)|" $< > $@
+ INTLTOOL_POLICY_RULE@
+polkit_policydir = $(datadir)/polkit-1/actions
+polkit_policy_in_files = org.gnome.controlcenter.remote-login-helper.policy.in
+polkit_policy_DATA = $(polkit_policy_in_files:.policy.in=.policy)
+
+
+ INTLTOOL_DESKTOP_RULE@
desktopdir = $(datadir)/applications
desktop_in_files = gnome-sharing-panel.desktop.in
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
diff --git a/panels/sharing/cc-remote-login-helper.c b/panels/sharing/cc-remote-login-helper.c
new file mode 100644
index 0000000..6eb88db
--- /dev/null
+++ b/panels/sharing/cc-remote-login-helper.c
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2013 Intel, Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Author: Thomas Wood <thomas wood intel com>
+ *
+ */
+
+#include <gio/gio.h>
+#define SSHD_SERVICE "sshd.service"
+
+static const gchar *service_list[] = { SSHD_SERVICE, NULL };
+
+static gint
+enable_ssh_service ()
+{
+ GDBusConnection *connection;
+ GError *error = NULL;
+ GVariant *temp_variant;
+
+ connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+ if (!connection)
+ {
+ g_critical ("Error connecting to D-Bus system bus: %s", error->message);
+ g_clear_error (&error);
+ return 1;
+ }
+
+ temp_variant = g_dbus_connection_call_sync (connection,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "StartUnit",
+ g_variant_new ("(ss)",
+ SSHD_SERVICE,
+ "replace"),
+ (GVariantType *) "(o)",
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!temp_variant)
+ {
+ g_critical ("Error starting " SSHD_SERVICE ": %s", error->message);
+ g_clear_error (&error);
+ return 1;
+ }
+
+ g_variant_unref (temp_variant);
+
+ temp_variant = g_dbus_connection_call_sync (connection,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "EnableUnitFiles",
+ g_variant_new ("(^asbb)",
+ service_list,
+ FALSE, FALSE),
+ (GVariantType *) "(ba(sss))",
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!temp_variant)
+ {
+ g_critical ("Error enabling " SSHD_SERVICE ": %s", error->message);
+ g_clear_error (&error);
+ return 1;
+ }
+
+ g_variant_unref (temp_variant);
+
+ return 0;
+}
+
+static gint
+disable_ssh_service ()
+{
+ GDBusConnection *connection;
+ GError *error = NULL;
+ GVariant *temp_variant;
+
+ connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+ if (!connection)
+ {
+ g_critical ("Error connecting to D-Bus system bus: %s", error->message);
+ g_clear_error (&error);
+ return 1;
+ }
+
+ temp_variant = g_dbus_connection_call_sync (connection,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "StopUnit",
+ g_variant_new ("(ss)", SSHD_SERVICE, "replace"),
+ (GVariantType *) "(o)",
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (!temp_variant)
+ {
+ g_critical ("Error stopping " SSHD_SERVICE ": %s", error->message);
+ g_clear_error (&error);
+ return 1;
+ }
+
+ g_variant_unref (temp_variant);
+
+ temp_variant = g_dbus_connection_call_sync (connection,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "DisableUnitFiles",
+ g_variant_new ("(^asb)", service_list, FALSE,
+ FALSE),
+ (GVariantType *) "(a(sss))",
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!temp_variant)
+ {
+ g_critical ("Error disabling " SSHD_SERVICE ": %s", error->message);
+ g_clear_error (&error);
+ return 1;
+ }
+
+ g_variant_unref (temp_variant);
+
+ return 0;
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ if (argc < 2)
+ return 1;
+
+ if (argv[1] == NULL)
+ return 1;
+
+ if (g_str_equal (argv[1], "enable"))
+ return enable_ssh_service ();
+ else if (g_str_equal (argv[1], "disable"))
+ return disable_ssh_service ();
+
+ return 1;
+}
diff --git a/panels/sharing/cc-remote-login.c b/panels/sharing/cc-remote-login.c
index 0d04604..d9f7aca 100644
--- a/panels/sharing/cc-remote-login.c
+++ b/panels/sharing/cc-remote-login.c
@@ -52,10 +52,9 @@ active_state_ready_callback (GObject *source_object,
g_variant_unref (tmp_variant);
/* set the switch to the correct state */
+ g_object_set_data (G_OBJECT (gtkswitch), "set-from-dbus", GINT_TO_POINTER (1));
gtk_switch_set_active (gtkswitch, active);
-
- /* TODO: enable the switch when cc_remote_login_set_enabled is implemented */
- /* gtk_widget_set_sensitive (gtkswitch, TRUE); */
+ gtk_widget_set_sensitive (gtkswitch, TRUE);
}
static void
@@ -135,14 +134,62 @@ void
cc_remote_login_get_enabled (GtkSwitch *gtkswitch)
{
/* disable the switch until the current state is known */
- gtk_widget_set_sensitive (gtkswitch, FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (gtkswitch), FALSE);
g_bus_get (G_BUS_TYPE_SYSTEM, NULL, bus_ready_callback, gtkswitch);
}
-gboolean
-cc_remote_login_set_enabled (gboolean enabled)
+
+static gint std_err;
+
+static void
+child_watch_func (GPid pid,
+ gint status,
+ gpointer gtkswitch)
{
- /* not implemented yet */
- return FALSE;
+ if (status != 0)
+ {
+ g_warning ("Error enabling or disabling remote login service");
+
+ /* make sure the switch reflects the current status */
+ cc_remote_login_get_enabled (GTK_SWITCH (gtkswitch));
+ }
+ g_spawn_close_pid (pid);
+
+ gtk_widget_set_sensitive (GTK_WIDGET (gtkswitch), TRUE);
+}
+
+void
+cc_remote_login_set_enabled (GtkSwitch *gtkswitch)
+{
+ gchar *command[] = { "pkexec", LIBEXECDIR "/cc-remote-login-helper", NULL,
+ NULL };
+ GError *error = NULL;
+ GPid pid;
+
+
+ if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (gtkswitch), "set-from-dbus")) == 1)
+ {
+ g_object_set_data (G_OBJECT (gtkswitch), "set-from-dbus", NULL);
+ return;
+ }
+
+ if (gtk_switch_get_active (gtkswitch))
+ command[2] = "enable";
+ else
+ command[2] = "disable";
+
+ gtk_widget_set_sensitive (GTK_WIDGET (gtkswitch), FALSE);
+
+ g_spawn_async_with_pipes (NULL, command, NULL,
+ G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL,
+ NULL, &pid, NULL, NULL, &std_err, &error);
+
+ g_child_watch_add (pid, child_watch_func, gtkswitch);
+
+ if (error)
+ {
+ g_error ("Error running cc-remote-login-helper: %s", error->message);
+ g_clear_error (&error);
+ }
}
diff --git a/panels/sharing/cc-remote-login.h b/panels/sharing/cc-remote-login.h
index fe6b6d2..64bcf2e 100644
--- a/panels/sharing/cc-remote-login.h
+++ b/panels/sharing/cc-remote-login.h
@@ -25,6 +25,6 @@
#include <gtk/gtk.h>
void cc_remote_login_get_enabled (GtkSwitch *gtkswitch);
-gboolean cc_remote_login_set_enabled (gboolean enabled);
+void cc_remote_login_set_enabled (GtkSwitch *gtkswitch);
#endif /* __CC_REMOTE_LOGIN_H__ **/
diff --git a/panels/sharing/cc-sharing-panel.c b/panels/sharing/cc-sharing-panel.c
index 0b53683..ec6073f 100644
--- a/panels/sharing/cc-sharing-panel.c
+++ b/panels/sharing/cc-sharing-panel.c
@@ -591,7 +591,7 @@ static void
remote_login_switch_activate (GtkSwitch *remote_login_switch,
CcSharingPanel *self)
{
- cc_remote_login_set_enabled (gtk_switch_get_active (remote_login_switch));
+ cc_remote_login_set_enabled (remote_login_switch);
}
static void
diff --git a/panels/sharing/org.gnome.controlcenter.remote-login-helper.policy.in.in b/panels/sharing/org.gnome.controlcenter.remote-login-helper.policy.in.in
new file mode 100644
index 0000000..6eeeb51
--- /dev/null
+++ b/panels/sharing/org.gnome.controlcenter.remote-login-helper.policy.in.in
@@ -0,0 +1,21 @@
+<!DOCTYPE policyconfig PUBLIC
+ "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
+<policyconfig>
+
+ <vendor>The GNOME Project</vendor>
+ <vendor_url>http://www.gnome.org/</vendor_url>
+
+ <action id="org.gnome.controlcenter.remote-login-helper">
+ <_description>Enable or disable remote login</_description>
+ <_message>Authentication is required to enable or disable remote login</_message>
+ <defaults>
+ <allow_any>no</allow_any>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>auth_admin_keep</allow_active>
+ </defaults>
+ <annotate key="org.freedesktop.policykit.exec.path">@libexecdir@/cc-remote-login-helper</annotate>
+ </action>
+
+</policyconfig>
+
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]