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

Proposed by Khurshid Alam
Status: Merged
Approved by: Marco Trevisan (Treviño)
Approved revision: 4183
Merged at revision: 4185
Proposed branch: lp:~khurshid-alam/unity-settings-daemon/sharing-plugin
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
Reviewer Review Type Date Requested Status
Marco Trevisan (Treviño) Approve
Review via email: mp+355887@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
Marco Trevisan (Treviño) (3v1n0) :
review: Approve

Preview Diff

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

Subscribers

People subscribed via source and target branches