Merge lp:~khurshid-alam/unity-settings-daemon/sharing-plugin-test into lp:unity-settings-daemon

Proposed by Khurshid Alam
Status: Merged
Merge reported by: Jeremy Bícha
Merged at revision: not available
Proposed branch: lp:~khurshid-alam/unity-settings-daemon/sharing-plugin-test
Merge into: lp:unity-settings-daemon
Diff against target: 1130 lines (+1029/-1)
11 files modified
configure.ac (+21/-0)
debian/control (+1/-0)
debian/rules (+1/-1)
plugins/Makefile.am (+1/-0)
plugins/sharing/Makefile.am (+49/-0)
plugins/sharing/gsd-sharing-enums.h (+34/-0)
plugins/sharing/gsd-sharing-manager.c (+822/-0)
plugins/sharing/gsd-sharing-manager.h (+56/-0)
plugins/sharing/gsd-sharing-plugin.c (+28/-0)
plugins/sharing/sharing.gnome-settings-plugin.in (+9/-0)
plugins/sharing/test-sharing.c (+7/-0)
To merge this branch: bzr merge lp:~khurshid-alam/unity-settings-daemon/sharing-plugin-test
Reviewer Review Type Date Requested Status
Jeremy Bícha Pending
Review via email: mp+339446@code.launchpad.net

Commit message

Add sharing plugin

we are importing sharing panel from gnome-control-center as the old screen-sharing panel does not work anymore due to a gsettings key removal from vino. Our new sharing panel will use this plugin. This plugin is a direct port from gnome-settings-daemon 3.22.

Description of the change

To post a comment you must log in.
Revision history for this message
Jeremy Bícha (jbicha) wrote :

I am closing this merge proposal since I believe this feature was already uploaded with a different merge proposal.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'configure.ac'
2--- configure.ac 2017-03-24 03:49:07 +0000
3+++ configure.ac 2018-02-24 12:26:52 +0000
4@@ -58,6 +58,7 @@
5 GSETTINGS_DESKTOP_SCHEMAS_REQUIRED_VERSION=3.7.2.1
6 XRANDR_REQUIRED_VERSION=1.3
7 XEXT_REQUIRED_VERSION=1.1
8+NM_REQUIRED_VERSION=1.0
9
10 EXTRA_COMPILE_WARNINGS(yes)
11
12@@ -376,6 +377,24 @@
13
14 AC_SUBST(NSS_DATABASE)
15
16+dnl ---------------------------------------------------------------------------
17+dnl Sharing plugin
18+dnl ---------------------------------------------------------------------------
19+
20+AC_ARG_ENABLE(network-manager,
21+ AS_HELP_STRING([--disable-network-manager],
22+ [Disable NetworkManager support]),
23+ enable_network_manager=$enableval,
24+ enable_network_manager=yes)
25+
26+if test "x$enable_network_manager" = "xyes" ; then
27+ NM_MODULE="libnm >= $NM_REQUIRED_VERSION"
28+ AC_DEFINE(HAVE_NETWORK_MANAGER, 1, [Defined if NetworkManager support is enabled])
29+else
30+ NM_MODULE=
31+fi
32+
33+PKG_CHECK_MODULES(SHARING, gio-2.0 $NM_MODULE)
34
35 # ---------------------------------------------------------------------------
36 # Enable Profiling
37@@ -497,6 +516,7 @@
38 plugins/orientation/Makefile
39 plugins/remote-display/Makefile
40 plugins/screensaver-proxy/Makefile
41+plugins/sharing/Makefile
42 plugins/smartcard/Makefile
43 plugins/sound/Makefile
44 plugins/updates/Makefile
45@@ -537,6 +557,7 @@
46
47 Session tracking: ${SESSION_TRACKING}
48 LCMS DICT support: ${have_new_lcms}
49+ NetworkManager support: ${enable_network_manager}
50 IBus support: ${enable_ibus}
51 Fcitx support: ${enable_fcitx}
52 Libnotify support: ${have_libnotify}
53
54=== modified file 'debian/control'
55--- debian/control 2017-09-22 00:32:24 +0000
56+++ debian/control 2018-02-24 12:26:52 +0000
57@@ -12,6 +12,7 @@
58 libdbus-glib-1-dev (>= 0.74),
59 libglib2.0-dev (>= 2.35.3),
60 libgtk-3-dev (>= 3.7.8),
61+ libnm-dev (>= 1.0) [linux-any],
62 libnotify-dev (>= 0.7.0),
63 libxt-dev,
64 libxi-dev,
65
66=== modified file 'debian/rules'
67--- debian/rules 2018-02-14 12:40:59 +0000
68+++ debian/rules 2018-02-24 12:26:52 +0000
69@@ -8,7 +8,7 @@
70
71 DEB_DH_MAKESHLIBS_ARGS_ALL += -X/usr/lib/unity-settings-daemon-1.0
72 DEB_CONFIGURE_SCRIPT := ./autogen.sh
73-DEB_CONFIGURE_EXTRA_FLAGS = --disable-packagekit --enable-ibus --enable-fcitx
74+DEB_CONFIGURE_EXTRA_FLAGS = --disable-packagekit --enable-ibus --enable-fcitx --enable-network-manager
75
76 build/unity-settings-daemon::
77 gcc -o gnome-settings-daemon/gnome-update-wallpaper-cache debian/gnome-update-wallpaper-cache.c `pkg-config --cflags --libs glib-2.0 gdk-3.0 gdk-x11-3.0 gio-2.0 gnome-desktop-3.0`
78
79=== modified file 'plugins/Makefile.am'
80--- plugins/Makefile.am 2017-03-24 03:49:07 +0000
81+++ plugins/Makefile.am 2018-02-24 12:26:52 +0000
82@@ -16,6 +16,7 @@
83 mouse \
84 remote-display \
85 screensaver-proxy \
86+ sharing \
87 sound \
88 xrandr \
89 xsettings \
90
91=== added directory 'plugins/sharing'
92=== added file 'plugins/sharing/Makefile.am'
93--- plugins/sharing/Makefile.am 1970-01-01 00:00:00 +0000
94+++ plugins/sharing/Makefile.am 2018-02-24 12:26:52 +0000
95@@ -0,0 +1,49 @@
96+plugin_name = sharing
97+
98+plugin_LTLIBRARIES = libsharing.la
99+
100+libsharing_la_SOURCES = \
101+ gsd-sharing-manager.c \
102+ gsd-sharing-manager.h \
103+ gsd-sharing-enums.h \
104+ gsd-sharing-plugin.c
105+
106+libsharing_la_CPPFLAGS = \
107+ -I$(top_srcdir)/gnome-settings-daemon \
108+ -I$(top_builddir)/gnome-settings-daemon \
109+ -DGNOME_SETTINGS_LOCALEDIR=\""$(datadir)/locale"\" \
110+ $(AM_CPPFLAGS)
111+
112+libsharing_la_CFLAGS = \
113+ -I$(top_srcdir)/plugins/common \
114+ $(SHARING_CFLAGS) \
115+ $(PLUGIN_CFLAGS) \
116+ $(SETTINGS_PLUGIN_CFLAGS) \
117+ $(AM_CFLAGS)
118+
119+libsharing_la_LDFLAGS = $(GSD_PLUGIN_LDFLAGS)
120+
121+libsharing_la_LIBADD = $(SETTINGS_PLUGIN_LIBS) $(SHARING_LIBS)
122+
123+noinst_PROGRAMS = gsd-test-sharing
124+gsd_test_sharing_SOURCES = \
125+ gsd-sharing-manager.c \
126+ gsd-sharing-manager.h \
127+ test-sharing.c
128+
129+gsd_test_sharing_CFLAGS = $(libsharing_la_CFLAGS)
130+gsd_test_sharing_CPPFLAGS = $(libsharing_la_CPPFLAGS)
131+gsd_test_sharing_LDADD = \
132+ $(top_builddir)/gnome-settings-daemon/libgsd.la \
133+ $(SHARING_LIBS) \
134+ $(SETTINGS_PLUGIN_LIBS)
135+
136+plugin_in_files = sharing.gnome-settings-plugin.in
137+
138+plugin_DATA = $(plugin_in_files:.gnome-settings-plugin.in=.gnome-settings-plugin)
139+
140+EXTRA_DIST = $(plugin_in_files)
141+CLEANFILES = $(plugin_DATA)
142+DISTCLEANFILES = $(plugin_DATA)
143+
144+@GSD_INTLTOOL_PLUGIN_RULE@
145
146=== added file 'plugins/sharing/gsd-sharing-enums.h'
147--- plugins/sharing/gsd-sharing-enums.h 1970-01-01 00:00:00 +0000
148+++ plugins/sharing/gsd-sharing-enums.h 2018-02-24 12:26:52 +0000
149@@ -0,0 +1,34 @@
150+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
151+ *
152+ * Copyright (C) 2014 Bastien Nocera <hadess@hadess.net>
153+ *
154+ * This program is free software; you can redistribute it and/or modify
155+ * it under the terms of the GNU General Public License as published by
156+ * the Free Software Foundation; either version 2 of the License, or
157+ * (at your option) any later version.
158+ *
159+ * This program is distributed in the hope that it will be useful,
160+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
161+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
162+ * GNU General Public License for more details.
163+ *
164+ * You should have received a copy of the GNU General Public License
165+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
166+ *
167+ */
168+
169+#ifndef __GSD_SHARING_ENUMS_H
170+#define __GSD_SHARING_ENUMS_H
171+
172+G_BEGIN_DECLS
173+
174+typedef enum {
175+ GSD_SHARING_STATUS_OFFLINE,
176+ GSD_SHARING_STATUS_DISABLED_MOBILE_BROADBAND,
177+ GSD_SHARING_STATUS_DISABLED_LOW_SECURITY,
178+ GSD_SHARING_STATUS_AVAILABLE
179+} GsdSharingStatus;
180+
181+G_END_DECLS
182+
183+#endif /* __GSD_SHARING_ENUMS_H */
184
185=== added file 'plugins/sharing/gsd-sharing-manager.c'
186--- plugins/sharing/gsd-sharing-manager.c 1970-01-01 00:00:00 +0000
187+++ plugins/sharing/gsd-sharing-manager.c 2018-02-24 12:26:52 +0000
188@@ -0,0 +1,822 @@
189+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
190+ *
191+ * Copyright (C) 2014 Bastien Nocera <hadess@hadess.net>
192+ *
193+ * This program is free software; you can redistribute it and/or modify
194+ * it under the terms of the GNU General Public License as published by
195+ * the Free Software Foundation; either version 2 of the License, or
196+ * (at your option) any later version.
197+ *
198+ * This program is distributed in the hope that it will be useful,
199+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
200+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
201+ * GNU General Public License for more details.
202+ *
203+ * You should have received a copy of the GNU General Public License
204+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
205+ *
206+ */
207+
208+#include "config.h"
209+
210+#include <locale.h>
211+#include <glib.h>
212+#include <gio/gio.h>
213+#include <gio/gdesktopappinfo.h>
214+#include <glib/gstdio.h>
215+
216+#ifdef HAVE_NETWORK_MANAGER
217+#include <NetworkManager.h>
218+#endif /* HAVE_NETWORK_MANAGER */
219+
220+#include "gnome-settings-plugin.h"
221+#include "gnome-settings-profile.h"
222+#include "gsd-sharing-manager.h"
223+#include "gsd-sharing-enums.h"
224+
225+#define GSD_SHARING_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_SHARING_MANAGER, GsdSharingManagerPrivate))
226+
227+typedef struct {
228+ const char *name;
229+ GSettings *settings;
230+ gboolean started;
231+ GSubprocess *process;
232+} ServiceInfo;
233+
234+struct GsdSharingManagerPrivate
235+{
236+ GDBusNodeInfo *introspection_data;
237+ guint name_id;
238+ GDBusConnection *connection;
239+
240+ GCancellable *cancellable;
241+#ifdef HAVE_NETWORK_MANAGER
242+ NMClient *client;
243+#endif /* HAVE_NETWORK_MANAGER */
244+
245+ GHashTable *services;
246+
247+ char *current_network;
248+ char *current_network_name;
249+ char *carrier_type;
250+ GsdSharingStatus sharing_status;
251+};
252+
253+#define GSD_SHARING_DBUS_NAME GSD_DBUS_NAME ".Sharing"
254+#define GSD_SHARING_DBUS_PATH GSD_DBUS_PATH "/Sharing"
255+
256+static const gchar introspection_xml[] =
257+"<node>"
258+" <interface name='org.gnome.SettingsDaemon.Sharing'>"
259+" <annotation name='org.freedesktop.DBus.GLib.CSymbol' value='gsd_sharing_manager'/>"
260+" <property name='CurrentNetwork' type='s' access='read'/>"
261+" <property name='CurrentNetworkName' type='s' access='read'/>"
262+" <property name='CarrierType' type='s' access='read'/>"
263+" <property name='SharingStatus' type='u' access='read'/>"
264+" <method name='EnableService'>"
265+" <arg name='service-name' direction='in' type='s'/>"
266+" </method>"
267+" <method name='DisableService'>"
268+" <arg name='service-name' direction='in' type='s'/>"
269+" <arg name='network' direction='in' type='s'/>"
270+" </method>"
271+" <method name='ListNetworks'>"
272+" <arg name='service-name' direction='in' type='s'/>"
273+" <arg name='networks' direction='out' type='a(sss)'/>"
274+" </method>"
275+" </interface>"
276+"</node>";
277+
278+static void gsd_sharing_manager_class_init (GsdSharingManagerClass *klass);
279+static void gsd_sharing_manager_init (GsdSharingManager *manager);
280+static void gsd_sharing_manager_finalize (GObject *object);
281+
282+G_DEFINE_TYPE (GsdSharingManager, gsd_sharing_manager, G_TYPE_OBJECT)
283+
284+static gpointer manager_object = NULL;
285+
286+static const char * const services[] = {
287+ "rygel",
288+ "vino-server",
289+ "gnome-user-share-webdav"
290+};
291+
292+static void
293+gsd_sharing_manager_start_service (GsdSharingManager *manager,
294+ ServiceInfo *service)
295+{
296+ GDesktopAppInfo *app;
297+ const char *exec;
298+ char *desktop, **argvp;
299+ GError *error = NULL;
300+
301+ if (service->started)
302+ return;
303+ g_debug ("About to start %s", service->name);
304+
305+ desktop = g_strdup_printf ("%s.desktop", service->name);
306+ app = g_desktop_app_info_new (desktop);
307+ g_free (desktop);
308+
309+ if (!app) {
310+ g_warning ("Could not find desktop file for service '%s'", service->name);
311+ return;
312+ }
313+
314+ exec = g_app_info_get_commandline (G_APP_INFO (app));
315+
316+ if (!g_shell_parse_argv (exec, NULL, &argvp, &error)) {
317+ g_warning ("Could not parse command-line '%s': %s", exec, error->message);
318+ g_error_free (error);
319+ g_object_unref (app);
320+ return;
321+ }
322+
323+ service->process = g_subprocess_newv ((const gchar * const*) argvp, G_SUBPROCESS_FLAGS_NONE, &error);
324+
325+ if (!service->process) {
326+ g_warning ("Could not start command-line '%s': %s", exec, error->message);
327+ g_error_free (error);
328+ service->started = FALSE;
329+ } else {
330+ service->started = TRUE;
331+ }
332+
333+ g_strfreev (argvp);
334+ g_object_unref (app);
335+}
336+
337+#ifdef HAVE_NETWORK_MANAGER
338+static gboolean
339+service_is_enabled_on_current_connection (GsdSharingManager *manager,
340+ ServiceInfo *service)
341+{
342+ char **connections;
343+ int j;
344+ gboolean ret;
345+ connections = g_settings_get_strv (service->settings, "enabled-connections");
346+ ret = FALSE;
347+ for (j = 0; connections[j] != NULL; j++) {
348+ if (g_strcmp0 (connections[j], manager->priv->current_network) == 0) {
349+ ret = TRUE;
350+ break;
351+ }
352+ }
353+
354+ g_strfreev (connections);
355+ return ret;
356+}
357+#else
358+static gboolean
359+service_is_enabled_on_current_connection (GsdSharingManager *manager,
360+ ServiceInfo *service)
361+{
362+ return FALSE;
363+}
364+#endif /* HAVE_NETWORK_MANAGER */
365+
366+static void
367+gsd_sharing_manager_stop_service (GsdSharingManager *manager,
368+ ServiceInfo *service)
369+{
370+ if (!service->started ||
371+ service->process == NULL) {
372+ return;
373+ }
374+
375+ g_debug ("About to stop %s", service->name);
376+
377+ g_subprocess_send_signal (service->process, SIGTERM);
378+ g_clear_object (&service->process);
379+ service->started = FALSE;
380+}
381+
382+static void
383+gsd_sharing_manager_sync_services (GsdSharingManager *manager)
384+{
385+ GList *services, *l;
386+
387+ services = g_hash_table_get_values (manager->priv->services);
388+
389+ for (l = services; l != NULL; l = l->next) {
390+ ServiceInfo *service = l->data;
391+ gboolean should_be_started = FALSE;
392+
393+ if (manager->priv->sharing_status == GSD_SHARING_STATUS_AVAILABLE &&
394+ service_is_enabled_on_current_connection (manager, service))
395+ should_be_started = TRUE;
396+
397+ if (service->started != should_be_started) {
398+ if (service->started)
399+ gsd_sharing_manager_stop_service (manager, service);
400+ else
401+ gsd_sharing_manager_start_service (manager, service);
402+ }
403+ }
404+ g_list_free (services);
405+}
406+
407+#ifdef HAVE_NETWORK_MANAGER
408+static void
409+properties_changed (GsdSharingManager *manager)
410+{
411+ GVariantBuilder props_builder;
412+ GVariant *props_changed = NULL;
413+
414+ /* not yet connected to the session bus */
415+ if (manager->priv->connection == NULL)
416+ return;
417+
418+ g_variant_builder_init (&props_builder, G_VARIANT_TYPE ("a{sv}"));
419+
420+ g_variant_builder_add (&props_builder, "{sv}", "CurrentNetwork",
421+ g_variant_new_string (manager->priv->current_network));
422+ g_variant_builder_add (&props_builder, "{sv}", "CurrentNetworkName",
423+ g_variant_new_string (manager->priv->current_network_name));
424+ g_variant_builder_add (&props_builder, "{sv}", "CarrierType",
425+ g_variant_new_string (manager->priv->carrier_type));
426+ g_variant_builder_add (&props_builder, "{sv}", "SharingStatus",
427+ g_variant_new_uint32 (manager->priv->sharing_status));
428+
429+ props_changed = g_variant_new ("(s@a{sv}@as)", GSD_SHARING_DBUS_NAME,
430+ g_variant_builder_end (&props_builder),
431+ g_variant_new_strv (NULL, 0));
432+
433+ g_dbus_connection_emit_signal (manager->priv->connection,
434+ NULL,
435+ GSD_SHARING_DBUS_PATH,
436+ "org.freedesktop.DBus.Properties",
437+ "PropertiesChanged",
438+ props_changed, NULL);
439+}
440+
441+static char **
442+get_connections_for_service (GsdSharingManager *manager,
443+ const char *service_name)
444+{
445+ ServiceInfo *service;
446+
447+ service = g_hash_table_lookup (manager->priv->services, service_name);
448+ return g_settings_get_strv (service->settings, "enabled-connections");
449+}
450+#else
451+static char **
452+get_connections_for_service (GsdSharingManager *manager,
453+ const char *service_name)
454+{
455+ const char * const * connections [] = { NULL };
456+ return g_strdupv ((char **) connections);
457+}
458+#endif /* HAVE_NETWORK_MANAGER */
459+
460+static gboolean
461+check_service (GsdSharingManager *manager,
462+ const char *service_name,
463+ GError **error)
464+{
465+ if (g_hash_table_lookup (manager->priv->services, service_name))
466+ return TRUE;
467+
468+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS,
469+ "Invalid service name '%s'", service_name);
470+ return FALSE;
471+}
472+
473+static gboolean
474+gsd_sharing_manager_enable_service (GsdSharingManager *manager,
475+ const char *service_name,
476+ GError **error)
477+{
478+ ServiceInfo *service;
479+ char **connections;
480+ GPtrArray *array;
481+ guint i;
482+
483+ if (!check_service (manager, service_name, error))
484+ return FALSE;
485+
486+ if (manager->priv->sharing_status != GSD_SHARING_STATUS_AVAILABLE) {
487+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS,
488+ "Sharing cannot be enabled on this network, status is '%d'", manager->priv->sharing_status);
489+ return FALSE;
490+ }
491+
492+ service = g_hash_table_lookup (manager->priv->services, service_name);
493+ connections = g_settings_get_strv (service->settings, "enabled-connections");
494+ array = g_ptr_array_new ();
495+ for (i = 0; connections[i] != NULL; i++) {
496+ if (g_strcmp0 (connections[i], manager->priv->current_network) == 0)
497+ goto bail;
498+ g_ptr_array_add (array, connections[i]);
499+ }
500+ g_ptr_array_add (array, manager->priv->current_network);
501+ g_ptr_array_add (array, NULL);
502+
503+ g_settings_set_strv (service->settings, "enabled-connections", (const gchar *const *) array->pdata);
504+
505+bail:
506+
507+ gsd_sharing_manager_start_service (manager, service);
508+
509+ g_ptr_array_unref (array);
510+ g_strfreev (connections);
511+
512+ return TRUE;
513+}
514+
515+static gboolean
516+gsd_sharing_manager_disable_service (GsdSharingManager *manager,
517+ const char *service_name,
518+ const char *network_name,
519+ GError **error)
520+{
521+ ServiceInfo *service;
522+ char **connections;
523+ GPtrArray *array;
524+ guint i;
525+
526+ if (!check_service (manager, service_name, error))
527+ return FALSE;
528+
529+ service = g_hash_table_lookup (manager->priv->services, service_name);
530+ connections = g_settings_get_strv (service->settings, "enabled-connections");
531+ array = g_ptr_array_new ();
532+ for (i = 0; connections[i] != NULL; i++) {
533+ if (g_strcmp0 (connections[i], network_name) != 0)
534+ g_ptr_array_add (array, connections[i]);
535+ }
536+ g_ptr_array_add (array, NULL);
537+
538+ g_settings_set_strv (service->settings, "enabled-connections", (const gchar *const *) array->pdata);
539+ g_ptr_array_unref (array);
540+ g_strfreev (connections);
541+
542+ if (g_str_equal (network_name, manager->priv->current_network))
543+ gsd_sharing_manager_stop_service (manager, service);
544+
545+ return TRUE;
546+}
547+
548+#ifdef HAVE_NETWORK_MANAGER
549+static const char *
550+get_type_and_name_for_connection_uuid (GsdSharingManager *manager,
551+ const char *uuid,
552+ const char **name)
553+{
554+ NMRemoteConnection *conn;
555+ const char *type;
556+
557+ if (!manager->priv->client)
558+ return NULL;
559+
560+ conn = nm_client_get_connection_by_uuid (manager->priv->client, uuid);
561+ if (!conn)
562+ return NULL;
563+ type = nm_connection_get_connection_type (NM_CONNECTION (conn));
564+ *name = nm_connection_get_id (NM_CONNECTION (conn));
565+
566+ return type;
567+}
568+#else
569+static const char *
570+get_type_and_name_for_connection_uuid (GsdSharingManager *manager,
571+ const char *id,
572+ const char **name)
573+{
574+ return NULL;
575+}
576+#endif /* HAVE_NETWORK_MANAGER */
577+
578+#ifdef HAVE_NETWORK_MANAGER
579+static gboolean
580+connection_is_low_security (GsdSharingManager *manager,
581+ const char *uuid)
582+{
583+ NMRemoteConnection *conn;
584+
585+ if (!manager->priv->client)
586+ return TRUE;
587+
588+ conn = nm_client_get_connection_by_uuid (manager->priv->client, uuid);
589+ if (!conn)
590+ return TRUE;
591+
592+ /* Disable sharing on open Wi-Fi
593+ * XXX: Also do this for WEP networks? */
594+ return (nm_connection_get_setting_wireless_security (NM_CONNECTION (conn)) == NULL);
595+}
596+#endif /* HAVE_NETWORK_MANAGER */
597+
598+static GVariant *
599+gsd_sharing_manager_list_networks (GsdSharingManager *manager,
600+ const char *service_name,
601+ GError **error)
602+{
603+ char **connections;
604+ GVariantBuilder builder;
605+ guint i;
606+
607+ if (!check_service (manager, service_name, error))
608+ return NULL;
609+
610+#ifdef HAVE_NETWORK_MANAGER
611+ if (!manager->priv->client) {
612+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Not ready yet");
613+ return NULL;
614+ }
615+#endif /* HAVE_NETWORK_MANAGER */
616+
617+ connections = get_connections_for_service (manager, service_name);
618+
619+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("(a(sss))"));
620+ g_variant_builder_open (&builder, G_VARIANT_TYPE ("a(sss)"));
621+
622+ for (i = 0; connections[i] != NULL; i++) {
623+ const char *type, *name;
624+
625+ type = get_type_and_name_for_connection_uuid (manager, connections[i], &name);
626+ if (!type)
627+ continue;
628+
629+ g_variant_builder_add (&builder, "(sss)", connections[i], name, type);
630+ }
631+ g_strfreev (connections);
632+
633+ g_variant_builder_close (&builder);
634+
635+ return g_variant_builder_end (&builder);
636+}
637+
638+static GVariant *
639+handle_get_property (GDBusConnection *connection,
640+ const gchar *sender,
641+ const gchar *object_path,
642+ const gchar *interface_name,
643+ const gchar *property_name,
644+ GError **error,
645+ gpointer user_data)
646+{
647+ GsdSharingManager *manager = GSD_SHARING_MANAGER (user_data);
648+
649+ /* Check session pointer as a proxy for whether the manager is in the
650+ start or stop state */
651+ if (manager->priv->connection == NULL)
652+ return NULL;
653+
654+ if (g_strcmp0 (property_name, "CurrentNetwork") == 0) {
655+ return g_variant_new_string (manager->priv->current_network);
656+ }
657+
658+ if (g_strcmp0 (property_name, "CurrentNetworkName") == 0) {
659+ return g_variant_new_string (manager->priv->current_network_name);
660+ }
661+
662+ if (g_strcmp0 (property_name, "CarrierType") == 0) {
663+ return g_variant_new_string (manager->priv->carrier_type);
664+ }
665+
666+ if (g_strcmp0 (property_name, "SharingStatus") == 0) {
667+ return g_variant_new_uint32 (manager->priv->sharing_status);
668+ }
669+
670+ return NULL;
671+}
672+
673+static void
674+handle_method_call (GDBusConnection *connection,
675+ const gchar *sender,
676+ const gchar *object_path,
677+ const gchar *interface_name,
678+ const gchar *method_name,
679+ GVariant *parameters,
680+ GDBusMethodInvocation *invocation,
681+ gpointer user_data)
682+{
683+ GsdSharingManager *manager = (GsdSharingManager *) user_data;
684+
685+ g_debug ("Calling method '%s' for sharing", method_name);
686+
687+ /* Check session pointer as a proxy for whether the manager is in the
688+ start or stop state */
689+ if (manager->priv->connection == NULL)
690+ return;
691+
692+ if (g_strcmp0 (method_name, "EnableService") == 0) {
693+ const char *service;
694+ GError *error = NULL;
695+
696+ g_variant_get (parameters, "(&s)", &service);
697+ if (!gsd_sharing_manager_enable_service (manager, service, &error))
698+ g_dbus_method_invocation_take_error (invocation, error);
699+ else
700+ g_dbus_method_invocation_return_value (invocation, NULL);
701+ } else if (g_strcmp0 (method_name, "DisableService") == 0) {
702+ const char *service;
703+ const char *network_name;
704+ GError *error = NULL;
705+
706+ g_variant_get (parameters, "(&s&s)", &service, &network_name);
707+ if (!gsd_sharing_manager_disable_service (manager, service, network_name, &error))
708+ g_dbus_method_invocation_take_error (invocation, error);
709+ else
710+ g_dbus_method_invocation_return_value (invocation, NULL);
711+ } else if (g_strcmp0 (method_name, "ListNetworks") == 0) {
712+ const char *service;
713+ GError *error = NULL;
714+ GVariant *variant;
715+
716+ g_variant_get (parameters, "(&s)", &service);
717+ variant = gsd_sharing_manager_list_networks (manager, service, &error);
718+ if (!variant)
719+ g_dbus_method_invocation_take_error (invocation, error);
720+ else
721+ g_dbus_method_invocation_return_value (invocation, variant);
722+ }
723+}
724+
725+static const GDBusInterfaceVTable interface_vtable =
726+{
727+ handle_method_call,
728+ handle_get_property,
729+ NULL
730+};
731+
732+static void
733+on_bus_gotten (GObject *source_object,
734+ GAsyncResult *res,
735+ GsdSharingManager *manager)
736+{
737+ GDBusConnection *connection;
738+ GError *error = NULL;
739+
740+ connection = g_bus_get_finish (res, &error);
741+ if (connection == NULL) {
742+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
743+ g_warning ("Could not get session bus: %s", error->message);
744+ g_error_free (error);
745+ return;
746+ }
747+ manager->priv->connection = connection;
748+
749+ g_dbus_connection_register_object (connection,
750+ GSD_SHARING_DBUS_PATH,
751+ manager->priv->introspection_data->interfaces[0],
752+ &interface_vtable,
753+ manager,
754+ NULL,
755+ NULL);
756+
757+ manager->priv->name_id = g_bus_own_name_on_connection (connection,
758+ GSD_SHARING_DBUS_NAME,
759+ G_BUS_NAME_OWNER_FLAGS_NONE,
760+ NULL,
761+ NULL,
762+ NULL,
763+ NULL);
764+}
765+
766+#ifdef HAVE_NETWORK_MANAGER
767+static void
768+primary_connection_changed (GObject *gobject,
769+ GParamSpec *pspec,
770+ gpointer user_data)
771+{
772+ GsdSharingManager *manager = user_data;
773+ NMActiveConnection *a_con;
774+
775+ a_con = nm_client_get_primary_connection (manager->priv->client);
776+
777+ g_clear_pointer (&manager->priv->current_network, g_free);
778+ g_clear_pointer (&manager->priv->current_network_name, g_free);
779+ g_clear_pointer (&manager->priv->carrier_type, g_free);
780+
781+ if (a_con) {
782+ manager->priv->current_network = g_strdup (nm_active_connection_get_uuid (a_con));
783+ manager->priv->current_network_name = g_strdup (nm_active_connection_get_id (a_con));
784+ manager->priv->carrier_type = g_strdup (nm_active_connection_get_connection_type (a_con));
785+ if (manager->priv->carrier_type == NULL)
786+ manager->priv->carrier_type = g_strdup ("");
787+ } else {
788+ manager->priv->current_network = g_strdup ("");
789+ manager->priv->current_network_name = g_strdup ("");
790+ manager->priv->carrier_type = g_strdup ("");
791+ }
792+
793+ if (!a_con) {
794+ manager->priv->sharing_status = GSD_SHARING_STATUS_OFFLINE;
795+ } else if (*(manager->priv->carrier_type) == '\0') {
796+ /* Missing carrier type information? */
797+ manager->priv->sharing_status = GSD_SHARING_STATUS_OFFLINE;
798+ } else if (g_str_equal (manager->priv->carrier_type, "bluetooth") ||
799+ g_str_equal (manager->priv->carrier_type, "gsm") ||
800+ g_str_equal (manager->priv->carrier_type, "cdma")) {
801+ manager->priv->sharing_status = GSD_SHARING_STATUS_DISABLED_MOBILE_BROADBAND;
802+ } else if (g_str_equal (manager->priv->carrier_type, "802-11-wireless")) {
803+ if (connection_is_low_security (manager, manager->priv->current_network))
804+ manager->priv->sharing_status = GSD_SHARING_STATUS_DISABLED_LOW_SECURITY;
805+ else
806+ manager->priv->sharing_status = GSD_SHARING_STATUS_AVAILABLE;
807+ } else {
808+ manager->priv->sharing_status = GSD_SHARING_STATUS_AVAILABLE;
809+ }
810+
811+ g_debug ("current network: %s", manager->priv->current_network);
812+ g_debug ("current network name: %s", manager->priv->current_network_name);
813+ g_debug ("conn type: %s", manager->priv->carrier_type);
814+ g_debug ("status: %d", manager->priv->sharing_status);
815+
816+ properties_changed (manager);
817+ gsd_sharing_manager_sync_services (manager);
818+}
819+
820+static void
821+nm_client_ready (GObject *source_object,
822+ GAsyncResult *res,
823+ gpointer user_data)
824+{
825+ GsdSharingManager *manager = user_data;
826+ GError *error = NULL;
827+ NMClient *client;
828+
829+ client = nm_client_new_finish (res, &error);
830+ if (!client) {
831+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
832+ g_warning ("Couldn't get NMClient: %s", error->message);
833+ g_error_free (error);
834+ return;
835+ }
836+ manager->priv->client = client;
837+
838+ g_signal_connect (G_OBJECT (client), "notify::primary-connection",
839+ G_CALLBACK (primary_connection_changed), manager);
840+
841+ primary_connection_changed (NULL, NULL, manager);
842+}
843+
844+#endif /* HAVE_NETWORK_MANAGER */
845+
846+#define RYGEL_BUS_NAME "org.gnome.Rygel1"
847+#define RYGEL_OBJECT_PATH "/org/gnome/Rygel1"
848+#define RYGEL_INTERFACE_NAME "org.gnome.Rygel1"
849+
850+static void
851+gsd_sharing_manager_disable_rygel (void)
852+{
853+ GDBusConnection *connection;
854+ gchar *path;
855+
856+ path = g_build_filename (g_get_user_config_dir (), "autostart",
857+ "rygel.desktop", NULL);
858+ if (!g_file_test (path, G_FILE_TEST_IS_SYMLINK | G_FILE_TEST_IS_REGULAR))
859+ goto out;
860+
861+ g_unlink (path);
862+
863+ connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
864+ if (connection) {
865+ g_dbus_connection_call (connection, RYGEL_BUS_NAME, RYGEL_OBJECT_PATH, RYGEL_INTERFACE_NAME,
866+ "Shutdown", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1,
867+ NULL, NULL, NULL);
868+ }
869+ g_object_unref (connection);
870+
871+ out:
872+ g_free (path);
873+}
874+
875+gboolean
876+gsd_sharing_manager_start (GsdSharingManager *manager,
877+ GError **error)
878+{
879+ g_debug ("Starting sharing manager");
880+ gnome_settings_profile_start (NULL);
881+
882+ manager->priv->introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
883+ g_assert (manager->priv->introspection_data != NULL);
884+
885+ gsd_sharing_manager_disable_rygel ();
886+
887+ manager->priv->cancellable = g_cancellable_new ();
888+#ifdef HAVE_NETWORK_MANAGER
889+ nm_client_new_async (manager->priv->cancellable, nm_client_ready, manager);
890+#endif /* HAVE_NETWORK_MANAGER */
891+
892+ /* Start process of owning a D-Bus name */
893+ g_bus_get (G_BUS_TYPE_SESSION,
894+ manager->priv->cancellable,
895+ (GAsyncReadyCallback) on_bus_gotten,
896+ manager);
897+
898+ gnome_settings_profile_end (NULL);
899+ return TRUE;
900+}
901+
902+void
903+gsd_sharing_manager_stop (GsdSharingManager *manager)
904+{
905+ g_debug ("Stopping sharing manager");
906+
907+ manager->priv->sharing_status = GSD_SHARING_STATUS_OFFLINE;
908+ gsd_sharing_manager_sync_services (manager);
909+
910+ if (manager->priv->cancellable) {
911+ g_cancellable_cancel (manager->priv->cancellable);
912+ g_clear_object (&manager->priv->cancellable);
913+ }
914+
915+#ifdef HAVE_NETWORK_MANAGER
916+ g_clear_object (&manager->priv->client);
917+#endif /* HAVE_NETWORK_MANAGER */
918+
919+ if (manager->priv->name_id != 0) {
920+ g_bus_unown_name (manager->priv->name_id);
921+ manager->priv->name_id = 0;
922+ }
923+
924+ g_clear_pointer (&manager->priv->introspection_data, g_dbus_node_info_unref);
925+ g_clear_object (&manager->priv->connection);
926+
927+ g_clear_pointer (&manager->priv->current_network, g_free);
928+ g_clear_pointer (&manager->priv->current_network_name, g_free);
929+ g_clear_pointer (&manager->priv->carrier_type, g_free);
930+}
931+
932+static void
933+gsd_sharing_manager_class_init (GsdSharingManagerClass *klass)
934+{
935+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
936+
937+ object_class->finalize = gsd_sharing_manager_finalize;
938+
939+ g_type_class_add_private (klass, sizeof (GsdSharingManagerPrivate));
940+}
941+
942+static void
943+service_free (gpointer pointer)
944+{
945+ ServiceInfo *service = pointer;
946+
947+ g_clear_object (&service->settings);
948+ g_free (service);
949+}
950+
951+static void
952+gsd_sharing_manager_init (GsdSharingManager *manager)
953+{
954+ guint i;
955+
956+ manager->priv = GSD_SHARING_MANAGER_GET_PRIVATE (manager);
957+ manager->priv->services = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, service_free);
958+
959+ /* Default state */
960+ manager->priv->current_network = g_strdup ("");
961+ manager->priv->current_network_name = g_strdup ("");
962+ manager->priv->carrier_type = g_strdup ("");
963+ manager->priv->sharing_status = GSD_SHARING_STATUS_OFFLINE;
964+
965+ for (i = 0; i < G_N_ELEMENTS (services); i++) {
966+ ServiceInfo *service;
967+ char *path;
968+
969+ service = g_new0 (ServiceInfo, 1);
970+ service->name = services[i];
971+ path = g_strdup_printf ("/org/gnome/settings-daemon/plugins/sharing/%s/", services[i]);
972+ service->settings = g_settings_new_with_path ("org.gnome.settings-daemon.plugins.sharing.service", path);
973+ g_free (path);
974+
975+ g_hash_table_insert (manager->priv->services, (gpointer) services[i], service);
976+ }
977+}
978+
979+static void
980+gsd_sharing_manager_finalize (GObject *object)
981+{
982+ GsdSharingManager *manager;
983+
984+ g_return_if_fail (object != NULL);
985+ g_return_if_fail (GSD_IS_SHARING_MANAGER (object));
986+
987+ manager = GSD_SHARING_MANAGER (object);
988+
989+ g_return_if_fail (manager->priv != NULL);
990+
991+ gsd_sharing_manager_stop (manager);
992+
993+ g_hash_table_unref (manager->priv->services);
994+
995+ G_OBJECT_CLASS (gsd_sharing_manager_parent_class)->finalize (object);
996+}
997+
998+GsdSharingManager *
999+gsd_sharing_manager_new (void)
1000+{
1001+ if (manager_object != NULL) {
1002+ g_object_ref (manager_object);
1003+ } else {
1004+ manager_object = g_object_new (GSD_TYPE_SHARING_MANAGER, NULL);
1005+ g_object_add_weak_pointer (manager_object,
1006+ (gpointer *) &manager_object);
1007+ }
1008+
1009+ return GSD_SHARING_MANAGER (manager_object);
1010+}
1011
1012=== added file 'plugins/sharing/gsd-sharing-manager.h'
1013--- plugins/sharing/gsd-sharing-manager.h 1970-01-01 00:00:00 +0000
1014+++ plugins/sharing/gsd-sharing-manager.h 2018-02-24 12:26:52 +0000
1015@@ -0,0 +1,56 @@
1016+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
1017+ *
1018+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
1019+ *
1020+ * This program is free software; you can redistribute it and/or modify
1021+ * it under the terms of the GNU General Public License as published by
1022+ * the Free Software Foundation; either version 2 of the License, or
1023+ * (at your option) any later version.
1024+ *
1025+ * This program is distributed in the hope that it will be useful,
1026+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1027+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1028+ * GNU General Public License for more details.
1029+ *
1030+ * You should have received a copy of the GNU General Public License
1031+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
1032+ *
1033+ */
1034+
1035+#ifndef __GSD_SHARING_MANAGER_H
1036+#define __GSD_SHARING_MANAGER_H
1037+
1038+#include <glib-object.h>
1039+
1040+G_BEGIN_DECLS
1041+
1042+#define GSD_TYPE_SHARING_MANAGER (gsd_sharing_manager_get_type ())
1043+#define GSD_SHARING_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSD_TYPE_SHARING_MANAGER, GsdSharingManager))
1044+#define GSD_SHARING_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GSD_TYPE_SHARING_MANAGER, GsdSharingManagerClass))
1045+#define GSD_IS_SHARING_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSD_TYPE_SHARING_MANAGER))
1046+#define GSD_IS_SHARING_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSD_TYPE_SHARING_MANAGER))
1047+#define GSD_SHARING_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSD_TYPE_SHARING_MANAGER, GsdSharingManagerClass))
1048+
1049+typedef struct GsdSharingManagerPrivate GsdSharingManagerPrivate;
1050+
1051+typedef struct
1052+{
1053+ GObject parent;
1054+ GsdSharingManagerPrivate *priv;
1055+} GsdSharingManager;
1056+
1057+typedef struct
1058+{
1059+ GObjectClass parent_class;
1060+} GsdSharingManagerClass;
1061+
1062+GType gsd_sharing_manager_get_type (void);
1063+
1064+GsdSharingManager * gsd_sharing_manager_new (void);
1065+gboolean gsd_sharing_manager_start (GsdSharingManager *manager,
1066+ GError **error);
1067+void gsd_sharing_manager_stop (GsdSharingManager *manager);
1068+
1069+G_END_DECLS
1070+
1071+#endif /* __GSD_SHARING_MANAGER_H */
1072
1073=== added file 'plugins/sharing/gsd-sharing-plugin.c'
1074--- plugins/sharing/gsd-sharing-plugin.c 1970-01-01 00:00:00 +0000
1075+++ plugins/sharing/gsd-sharing-plugin.c 2018-02-24 12:26:52 +0000
1076@@ -0,0 +1,28 @@
1077+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
1078+ *
1079+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
1080+ *
1081+ * This program is free software; you can redistribute it and/or modify
1082+ * it under the terms of the GNU General Public License as published by
1083+ * the Free Software Foundation; either version 2, or (at your option)
1084+ * any later version.
1085+ *
1086+ * This program is distributed in the hope that it will be useful,
1087+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1088+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1089+ * GNU General Public License for more details.
1090+ *
1091+ * You should have received a copy of the GNU General Public License
1092+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
1093+ *
1094+ */
1095+
1096+#include "config.h"
1097+
1098+#include <glib/gi18n-lib.h>
1099+#include <gmodule.h>
1100+
1101+#include "gnome-settings-plugin.h"
1102+#include "gsd-sharing-manager.h"
1103+
1104+GNOME_SETTINGS_PLUGIN_REGISTER (GsdSharing, gsd_sharing)
1105
1106=== added file 'plugins/sharing/sharing.gnome-settings-plugin.in'
1107--- plugins/sharing/sharing.gnome-settings-plugin.in 1970-01-01 00:00:00 +0000
1108+++ plugins/sharing/sharing.gnome-settings-plugin.in 2018-02-24 12:26:52 +0000
1109@@ -0,0 +1,9 @@
1110+[GNOME Settings Plugin]
1111+Module=sharing
1112+IAge=0
1113+# 100 is the default load Priority
1114+Priority=100
1115+Name=Sharing
1116+Description=Sharing plugin
1117+Authors=Bastien Nocera <hadess@hadess.net>
1118+Copyright=Copyright © 2014 AUTHOR
1119
1120=== added file 'plugins/sharing/test-sharing.c'
1121--- plugins/sharing/test-sharing.c 1970-01-01 00:00:00 +0000
1122+++ plugins/sharing/test-sharing.c 2018-02-24 12:26:52 +0000
1123@@ -0,0 +1,7 @@
1124+#define NEW gsd_sharing_manager_new
1125+#define START gsd_sharing_manager_start
1126+#define STOP gsd_sharing_manager_stop
1127+#define MANAGER GsdSharingManager
1128+#include "gsd-sharing-manager.h"
1129+
1130+#include "test-plugin.h"

Subscribers

People subscribed via source and target branches