diff options
-rw-r--r-- | docs/libnm-glib/Makefile.am | 3 | ||||
-rw-r--r-- | docs/libnm-glib/libnm-glib-docs.sgml | 2 | ||||
-rw-r--r-- | introspection/Makefile.am | 2 | ||||
-rw-r--r-- | introspection/all.xml | 2 | ||||
-rw-r--r-- | introspection/nm-sysconfig-connection.xml (renamed from introspection/nm-exported-connection.xml) | 8 | ||||
-rw-r--r-- | libnm-glib/Makefile.am | 16 | ||||
-rw-r--r-- | libnm-glib/libnm-glib.ver | 3 | ||||
-rw-r--r-- | libnm-glib/nm-exported-connection.c | 277 | ||||
-rw-r--r-- | libnm-glib/nm-exported-connection.h | 75 | ||||
-rw-r--r-- | libnm-glib/nm-remote-connection.c | 2 | ||||
-rw-r--r-- | src/system-settings/Makefile.am | 6 | ||||
-rw-r--r-- | src/system-settings/nm-sysconfig-connection.c | 216 | ||||
-rw-r--r-- | src/system-settings/nm-sysconfig-connection.h | 22 | ||||
-rw-r--r-- | src/system-settings/nm-sysconfig-settings.c | 6 | ||||
-rw-r--r-- | system-settings/plugins/ifupdown/nm-ifupdown-connection.c | 6 | ||||
-rw-r--r-- | system-settings/plugins/ifupdown/plugin.c | 2 |
16 files changed, 251 insertions, 397 deletions
diff --git a/docs/libnm-glib/Makefile.am b/docs/libnm-glib/Makefile.am index b12e730a4c..f3665f2bcd 100644 --- a/docs/libnm-glib/Makefile.am +++ b/docs/libnm-glib/Makefile.am @@ -45,8 +45,7 @@ IGNORE_HFILES= \ nm-device-wifi-bindings.h \ nm-dhcp4-config-bindings.h \ nm-dhcp6-config-bindings.h \ - nm-exported-connection-bindings.h \ - nm-exported-connection-glue.h \ + nm-sysconfig-connection-glue.h \ nm-ip4-config-bindings.h \ nm-ip6-config-bindings.h \ nm-settings-bindings.h \ diff --git a/docs/libnm-glib/libnm-glib-docs.sgml b/docs/libnm-glib/libnm-glib-docs.sgml index 87e6b40d0c..c730710ba0 100644 --- a/docs/libnm-glib/libnm-glib-docs.sgml +++ b/docs/libnm-glib/libnm-glib-docs.sgml @@ -27,7 +27,7 @@ <xi:include href="xml/nm-ip6-config.xml"/> <xi:include href="xml/nm-dhcp4-config.xml"/> <xi:include href="xml/nm-dhcp6-config.xml"/> - <xi:include href="xml/nm-exported-connection.xml"/> + <xi:include href="xml/nm-sysconfig-connection.xml"/> <xi:include href="xml/nm-object.xml"/> <xi:include href="xml/nm-remote-connection.xml"/> <xi:include href="xml/nm-remote-settings.xml"/> diff --git a/introspection/Makefile.am b/introspection/Makefile.am index 212da3ab93..a2667ca7fc 100644 --- a/introspection/Makefile.am +++ b/introspection/Makefile.am @@ -18,7 +18,7 @@ EXTRA_DIST = \ nm-manager-client.xml \ nm-settings.xml \ nm-settings-system.xml \ - nm-exported-connection.xml \ + nm-sysconfig-connection.xml \ nm-vpn-plugin.xml \ nm-vpn-connection.xml \ nm-ppp-manager.xml \ diff --git a/introspection/all.xml b/introspection/all.xml index d6b2f23674..1f33708e53 100644 --- a/introspection/all.xml +++ b/introspection/all.xml @@ -40,7 +40,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</ <xi:include href="nm-dhcp4-config.xml"/> <xi:include href="nm-dhcp6-config.xml"/> <xi:include href="nm-settings.xml"/> -<xi:include href="nm-exported-connection.xml"/> +<xi:include href="nm-sysconfig-connection.xml"/> <xi:include href="nm-active-connection.xml"/> <xi:include href="nm-vpn-connection.xml"/> <xi:include href="nm-vpn-plugin.xml"/> diff --git a/introspection/nm-exported-connection.xml b/introspection/nm-sysconfig-connection.xml index 46907c05e9..aae08e06fb 100644 --- a/introspection/nm-exported-connection.xml +++ b/introspection/nm-sysconfig-connection.xml @@ -11,7 +11,7 @@ <tp:docstring> Update the connection with new settings and properties, replacing all previous settings and properties. </tp:docstring> - <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_exported_connection_update"/> + <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_sysconfig_connection_update"/> <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> <arg name="properties" type="a{sa{sv}}" direction="in"> <tp:docstring> @@ -24,7 +24,7 @@ <tp:docstring> Delete the connection. </tp:docstring> - <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_exported_connection_delete"/> + <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_sysconfig_connection_delete"/> <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> </method> @@ -32,7 +32,7 @@ <tp:docstring> Get the settings maps describing this object. </tp:docstring> - <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_exported_connection_get_settings"/> + <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_sysconfig_connection_get_settings"/> <arg name="settings" type="a{sa{sv}}" direction="out" tp:type="String_String_Variant_Map_Map"> <tp:docstring> The nested settings maps describing this object. @@ -68,7 +68,7 @@ <tp:docstring> Get the secrets encapsulated in this object. </tp:docstring> - <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_exported_connection_get_secrets"/> + <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_sysconfig_connection_get_secrets"/> <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> <arg name="setting_name" type="s" direction="in"> <tp:docstring> diff --git a/libnm-glib/Makefile.am b/libnm-glib/Makefile.am index 388ab54027..bff10862c0 100644 --- a/libnm-glib/Makefile.am +++ b/libnm-glib/Makefile.am @@ -10,8 +10,7 @@ BUILT_SOURCES = \ nm-device-ethernet-bindings.h \ nm-device-wifi-bindings.h \ nm-device-bt-bindings.h \ - nm-exported-connection-glue.h \ - nm-exported-connection-bindings.h \ + nm-sysconfig-connection-bindings.h \ nm-settings-bindings.h \ nm-vpn-connection-bindings.h \ nm-vpn-plugin-glue.h \ @@ -79,8 +78,7 @@ libnminclude_HEADERS = \ nm-remote-connection.h \ nm-settings-interface.h \ nm-remote-settings.h \ - nm-settings-connection-interface.h \ - nm-exported-connection.h + nm-settings-connection-interface.h libnm_glib_la_SOURCES = \ nm-object.c \ @@ -111,8 +109,7 @@ libnm_glib_la_SOURCES = \ nm-remote-connection-private.h \ nm-settings-interface.c \ nm-remote-settings.c \ - nm-settings-connection-interface.c \ - nm-exported-connection.c + nm-settings-connection-interface.c libnm_glib_la_LIBADD = \ $(top_builddir)/libnm-util/libnm-util.la \ @@ -161,11 +158,8 @@ nm-access-point-bindings.h: $(top_srcdir)/introspection/nm-access-point.xml nm-settings-bindings.h: $(top_srcdir)/introspection/nm-settings.xml $(AM_V_GEN) dbus-binding-tool --prefix=nm_settings --mode=glib-client --output=$@ $< -nm-exported-connection-glue.h: $(top_srcdir)/introspection/nm-exported-connection.xml - $(AM_V_GEN) dbus-binding-tool --prefix=nm_exported_connection --mode=glib-server --output=$@ $< - -nm-exported-connection-bindings.h: $(top_srcdir)/introspection/nm-exported-connection.xml - $(AM_V_GEN) dbus-binding-tool --prefix=nm_exported_connection --mode=glib-client --output=$@ $< +nm-sysconfig-connection-bindings.h: $(top_srcdir)/introspection/nm-sysconfig-connection.xml + $(AM_V_GEN) dbus-binding-tool --prefix=nm_sysconfig_connection --mode=glib-client --output=$@ $< nm-vpn-connection-bindings.h: $(top_srcdir)/introspection/nm-vpn-connection.xml $(AM_V_GEN) dbus-binding-tool --prefix=nm_vpn_connection --mode=glib-client --output=$@ $< diff --git a/libnm-glib/libnm-glib.ver b/libnm-glib/libnm-glib.ver index 2dc9783cc8..ce10de2168 100644 --- a/libnm-glib/libnm-glib.ver +++ b/libnm-glib/libnm-glib.ver @@ -93,9 +93,6 @@ global: nm_dhcp4_config_get_options; nm_dhcp4_config_get_type; nm_dhcp4_config_new; - nm_exported_connection_export; - nm_exported_connection_get_type; - nm_exported_connection_new; nm_gsm_device_get_type; nm_gsm_device_new; nm_ip4_config_get_addresses; diff --git a/libnm-glib/nm-exported-connection.c b/libnm-glib/nm-exported-connection.c deleted file mode 100644 index 6fda1b553a..0000000000 --- a/libnm-glib/nm-exported-connection.c +++ /dev/null @@ -1,277 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* NetworkManager system settings service - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * (C) Copyright 2008 Novell, Inc. - * (C) Copyright 2008 - 2009 Red Hat, Inc. - */ - -#include <NetworkManager.h> -#include <dbus/dbus-glib-lowlevel.h> -#include <nm-setting-connection.h> - -#include "nm-exported-connection.h" -#include "nm-settings-interface.h" -#include "nm-settings-connection-interface.h" - -static gboolean impl_exported_connection_get_settings (NMExportedConnection *connection, - GHashTable **settings, - GError **error); - -static void impl_exported_connection_update (NMExportedConnection *connection, - GHashTable *new_settings, - DBusGMethodInvocation *context); - -static void impl_exported_connection_delete (NMExportedConnection *connection, - DBusGMethodInvocation *context); - -static void impl_exported_connection_get_secrets (NMExportedConnection *connection, - const gchar *setting_name, - const gchar **hints, - gboolean request_new, - DBusGMethodInvocation *context); - -#include "nm-exported-connection-glue.h" - -static void settings_connection_interface_init (NMSettingsConnectionInterface *class); - -G_DEFINE_TYPE_EXTENDED (NMExportedConnection, nm_exported_connection, NM_TYPE_CONNECTION, 0, - G_IMPLEMENT_INTERFACE (NM_TYPE_SETTINGS_CONNECTION_INTERFACE, - settings_connection_interface_init)) - -#define NM_EXPORTED_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ - NM_TYPE_EXPORTED_CONNECTION, \ - NMExportedConnectionPrivate)) - -typedef struct { - gboolean foo; -} NMExportedConnectionPrivate; - - -/**************************************************************/ - -static GHashTable * -real_get_settings (NMExportedConnection *self, GError **error) -{ - NMConnection *no_secrets; - GHashTable *settings; - - /* Secrets should *never* be returned by the GetSettings method, they - * get returned by the GetSecrets method which can be better - * protected against leakage of secrets to unprivileged callers. - */ - no_secrets = nm_connection_duplicate (NM_CONNECTION (self)); - g_assert (no_secrets); - nm_connection_clear_secrets (no_secrets); - settings = nm_connection_to_hash (no_secrets); - g_assert (settings); - g_object_unref (no_secrets); - - return settings; -} - -/**************************************************************/ - -static gboolean -check_writable (NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - - g_return_val_if_fail (connection != NULL, FALSE); - g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE); - - s_con = (NMSettingConnection *) nm_connection_get_setting (connection, - NM_TYPE_SETTING_CONNECTION); - if (!s_con) { - g_set_error_literal (error, - NM_SETTINGS_INTERFACE_ERROR, - NM_SETTINGS_INTERFACE_ERROR_INVALID_CONNECTION, - "Connection did not have required 'connection' setting"); - return FALSE; - } - - /* If the connection is read-only, that has to be changed at the source of - * the problem (ex a system settings plugin that can't write connections out) - * instead of over D-Bus. - */ - if (nm_setting_connection_get_read_only (s_con)) { - g_set_error_literal (error, - NM_SETTINGS_INTERFACE_ERROR, - NM_SETTINGS_INTERFACE_ERROR_READ_ONLY_CONNECTION, - "Connection is read-only"); - return FALSE; - } - - return TRUE; -} - -static gboolean -impl_exported_connection_get_settings (NMExportedConnection *self, - GHashTable **settings, - GError **error) -{ - /* Must always be implemented */ - g_assert (NM_EXPORTED_CONNECTION_GET_CLASS (self)->get_settings); - *settings = NM_EXPORTED_CONNECTION_GET_CLASS (self)->get_settings (self, error); - return *settings ? TRUE : FALSE; -} - -static gboolean -update (NMSettingsConnectionInterface *connection, - NMSettingsConnectionInterfaceUpdateFunc callback, - gpointer user_data) -{ - g_object_ref (connection); - nm_settings_connection_interface_emit_updated (connection); - callback (connection, NULL, user_data); - g_object_unref (connection); - return TRUE; -} - -static void -impl_exported_connection_update (NMExportedConnection *self, - GHashTable *new_settings, - DBusGMethodInvocation *context) -{ - NMConnection *tmp; - GError *error = NULL; - - /* If the connection is read-only, that has to be changed at the source of - * the problem (ex a system settings plugin that can't write connections out) - * instead of over D-Bus. - */ - if (!check_writable (NM_CONNECTION (self), &error)) { - dbus_g_method_return_error (context, error); - g_error_free (error); - return; - } - - /* Check if the settings are valid first */ - tmp = nm_connection_new_from_hash (new_settings, &error); - if (!tmp) { - g_assert (error); - dbus_g_method_return_error (context, error); - g_error_free (error); - return; - } - g_object_unref (tmp); - - if (NM_EXPORTED_CONNECTION_GET_CLASS (self)->update) - NM_EXPORTED_CONNECTION_GET_CLASS (self)->update (self, new_settings, context); - else { - error = g_error_new (NM_SETTINGS_INTERFACE_ERROR, - NM_SETTINGS_INTERFACE_ERROR_INTERNAL_ERROR, - "%s: %s:%d update() unimplemented", __func__, __FILE__, __LINE__); - dbus_g_method_return_error (context, error); - g_error_free (error); - } -} - -static gboolean -do_delete (NMSettingsConnectionInterface *connection, - NMSettingsConnectionInterfaceDeleteFunc callback, - gpointer user_data) -{ - g_object_ref (connection); - g_signal_emit_by_name (connection, "removed"); - callback (connection, NULL, user_data); - g_object_unref (connection); - return TRUE; -} - -static void -impl_exported_connection_delete (NMExportedConnection *self, - DBusGMethodInvocation *context) -{ - GError *error = NULL; - - if (!check_writable (NM_CONNECTION (self), &error)) { - dbus_g_method_return_error (context, error); - g_error_free (error); - return; - } - - if (NM_EXPORTED_CONNECTION_GET_CLASS (self)->delete) - NM_EXPORTED_CONNECTION_GET_CLASS (self)->delete (self, context); - else { - error = g_error_new (NM_SETTINGS_INTERFACE_ERROR, - NM_SETTINGS_INTERFACE_ERROR_INTERNAL_ERROR, - "%s: %s:%d delete() unimplemented", __func__, __FILE__, __LINE__); - dbus_g_method_return_error (context, error); - g_error_free (error); - } -} - -static void -impl_exported_connection_get_secrets (NMExportedConnection *self, - const gchar *setting_name, - const gchar **hints, - gboolean request_new, - DBusGMethodInvocation *context) -{ - GError *error = NULL; - - if (NM_EXPORTED_CONNECTION_GET_CLASS (self)->get_secrets) - NM_EXPORTED_CONNECTION_GET_CLASS (self)->get_secrets (self, setting_name, hints, request_new, context); - else { - error = g_error_new (NM_SETTINGS_INTERFACE_ERROR, - NM_SETTINGS_INTERFACE_ERROR_INTERNAL_ERROR, - "%s: %s:%d get_secrets() unimplemented", __func__, __FILE__, __LINE__); - dbus_g_method_return_error (context, error); - g_error_free (error); - } -} - -/**************************************************************/ - -static void -settings_connection_interface_init (NMSettingsConnectionInterface *iface) -{ - iface->update = update; - iface->delete = do_delete; -} - -/** - * nm_exported_connection_new: - * - * Creates a new object representing the remote connection. - * - * Returns: the new exported connection object on success, or %NULL on failure - **/ -NMExportedConnection * -nm_exported_connection_new () -{ - return (NMExportedConnection *) g_object_new (NM_TYPE_EXPORTED_CONNECTION, - NULL); -} - -static void -nm_exported_connection_init (NMExportedConnection *self) -{ -} - -static void -nm_exported_connection_class_init (NMExportedConnectionClass *class) -{ - g_type_class_add_private (class, sizeof (NMExportedConnectionPrivate)); - - /* Virtual methods */ - class->get_settings = real_get_settings; - - dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (class), - &dbus_glib_nm_exported_connection_object_info); -} diff --git a/libnm-glib/nm-exported-connection.h b/libnm-glib/nm-exported-connection.h deleted file mode 100644 index e2bf649aa6..0000000000 --- a/libnm-glib/nm-exported-connection.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* NetworkManager system settings service - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * (C) Copyright 2009 Red Hat, Inc. - */ - -#ifndef NM_EXPORTED_CONNECTION_H -#define NM_EXPORTED_CONNECTION_H - -#include <nm-connection.h> -#include <dbus/dbus-glib.h> - -G_BEGIN_DECLS - -#define NM_TYPE_EXPORTED_CONNECTION (nm_exported_connection_get_type ()) -#define NM_EXPORTED_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_EXPORTED_CONNECTION, NMExportedConnection)) -#define NM_EXPORTED_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_EXPORTED_CONNECTION, NMExportedConnectionClass)) -#define NM_IS_EXPORTED_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_EXPORTED_CONNECTION)) -#define NM_IS_EXPORTED_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NM_TYPE_EXPORTED_CONNECTION)) -#define NM_EXPORTED_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_EXPORTED_CONNECTION, NMExportedConnectionClass)) - -typedef struct { - NMConnection parent; -} NMExportedConnection; - -typedef struct { - NMConnectionClass parent; - - GHashTable * (*get_settings) (NMExportedConnection *self, - GError **error); - - void (*update) (NMExportedConnection *self, - GHashTable *new_settings, - DBusGMethodInvocation *context); - - void (*delete) (NMExportedConnection *self, - DBusGMethodInvocation *context); - - void (*get_secrets) (NMExportedConnection *self, - const gchar *setting_name, - const gchar **hints, - gboolean request_new, - DBusGMethodInvocation *context); - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMExportedConnectionClass; - -GType nm_exported_connection_get_type (void); - -NMExportedConnection *nm_exported_connection_new (void); - -G_END_DECLS - -#endif /* NM_EXPORTED_CONNECTION_H */ diff --git a/libnm-glib/nm-remote-connection.c b/libnm-glib/nm-remote-connection.c index 2775329f9b..8b96b56cb5 100644 --- a/libnm-glib/nm-remote-connection.c +++ b/libnm-glib/nm-remote-connection.c @@ -29,7 +29,7 @@ #include "nm-remote-connection.h" #include "nm-remote-connection-private.h" #include "nm-dbus-glib-types.h" -#include "nm-exported-connection-bindings.h" +#include "nm-sysconfig-connection-bindings.h" #include "nm-settings-connection-interface.h" #define NM_REMOTE_CONNECTION_BUS "bus" diff --git a/src/system-settings/Makefile.am b/src/system-settings/Makefile.am index 0544c6e867..67980767c6 100644 --- a/src/system-settings/Makefile.am +++ b/src/system-settings/Makefile.am @@ -9,7 +9,8 @@ INCLUDES = -I${top_srcdir} \ noinst_LTLIBRARIES = libsystem-settings.la BUILT_SOURCES = \ - nm-settings-glue.h + nm-settings-glue.h \ + nm-sysconfig-connection-glue.h libsystem_settings_la_SOURCES = \ nm-sysconfig-settings.c \ @@ -57,6 +58,9 @@ libsystem_settings_la_LDFLAGS = -rdynamic nm-settings-glue.h: $(top_srcdir)/introspection/nm-settings.xml $(AM_V_GEN) dbus-binding-tool --prefix=nm_settings --mode=glib-server --output=$@ $< +nm-sysconfig-connection-glue.h: $(top_srcdir)/introspection/nm-sysconfig-connection.xml + $(AM_V_GEN) dbus-binding-tool --prefix=nm_sysconfig_connection --mode=glib-server --output=$@ $< + CLEANFILES = \ $(BUILT_SOURCES) diff --git a/src/system-settings/nm-sysconfig-connection.c b/src/system-settings/nm-sysconfig-connection.c index f46895accc..bc173779c0 100644 --- a/src/system-settings/nm-sysconfig-connection.c +++ b/src/system-settings/nm-sysconfig-connection.c @@ -21,6 +21,7 @@ #include <NetworkManager.h> #include <dbus/dbus-glib-lowlevel.h> +#include <nm-setting-connection.h> #include "nm-sysconfig-connection.h" #include "nm-system-config-error.h" @@ -30,10 +31,28 @@ #include "nm-polkit-helpers.h" #include "nm-logging.h" +static gboolean impl_sysconfig_connection_get_settings (NMSysconfigConnection *connection, + GHashTable **settings, + GError **error); + +static void impl_sysconfig_connection_update (NMSysconfigConnection *connection, + GHashTable *new_settings, + DBusGMethodInvocation *context); + +static void impl_sysconfig_connection_delete (NMSysconfigConnection *connection, + DBusGMethodInvocation *context); + +static void impl_sysconfig_connection_get_secrets (NMSysconfigConnection *connection, + const gchar *setting_name, + const gchar **hints, + gboolean request_new, + DBusGMethodInvocation *context); + +#include "nm-sysconfig-connection-glue.h" static void settings_connection_interface_init (NMSettingsConnectionInterface *klass); -G_DEFINE_TYPE_EXTENDED (NMSysconfigConnection, nm_sysconfig_connection, NM_TYPE_EXPORTED_CONNECTION, 0, +G_DEFINE_TYPE_EXTENDED (NMSysconfigConnection, nm_sysconfig_connection, NM_TYPE_CONNECTION, 0, G_IMPLEMENT_INTERFACE (NM_TYPE_SETTINGS_CONNECTION_INTERFACE, settings_connection_interface_init)) @@ -49,6 +68,27 @@ typedef struct { /**************************************************************/ +static GHashTable * +get_settings (NMSysconfigConnection *self, GError **error) +{ + NMConnection *no_secrets; + GHashTable *settings; + + /* Secrets should *never* be returned by the GetSettings method, they + * get returned by the GetSecrets method which can be better + * protected against leakage of secrets to unprivileged callers. + */ + no_secrets = nm_connection_duplicate (NM_CONNECTION (self)); + g_assert (no_secrets); + nm_connection_clear_secrets (no_secrets); + settings = nm_connection_to_hash (no_secrets); + g_assert (settings); + g_object_unref (no_secrets); + + return settings; +} + + static void ignore_cb (NMSettingsConnectionInterface *connection, GError *error, @@ -102,6 +142,30 @@ nm_sysconfig_connection_update (NMSysconfigConnection *self, /**************************************************************/ +static gboolean +update (NMSettingsConnectionInterface *connection, + NMSettingsConnectionInterfaceUpdateFunc callback, + gpointer user_data) +{ + g_object_ref (connection); + nm_settings_connection_interface_emit_updated (connection); + callback (connection, NULL, user_data); + g_object_unref (connection); + return TRUE; +} + +static gboolean +do_delete (NMSettingsConnectionInterface *connection, + NMSettingsConnectionInterfaceDeleteFunc callback, + gpointer user_data) +{ + g_object_ref (connection); + g_signal_emit_by_name (connection, "removed"); + callback (connection, NULL, user_data); + g_object_unref (connection); + return TRUE; +} + static GValue * string_to_gvalue (const char *str) { @@ -235,6 +299,134 @@ get_secrets (NMSettingsConnectionInterface *connection, /**************************************************************/ +static gboolean +check_writable (NMConnection *connection, GError **error) +{ + NMSettingConnection *s_con; + + g_return_val_if_fail (connection != NULL, FALSE); + g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE); + + s_con = (NMSettingConnection *) nm_connection_get_setting (connection, + NM_TYPE_SETTING_CONNECTION); + if (!s_con) { + g_set_error_literal (error, + NM_SETTINGS_INTERFACE_ERROR, + NM_SETTINGS_INTERFACE_ERROR_INVALID_CONNECTION, + "Connection did not have required 'connection' setting"); + return FALSE; + } + + /* If the connection is read-only, that has to be changed at the source of + * the problem (ex a system settings plugin that can't write connections out) + * instead of over D-Bus. + */ + if (nm_setting_connection_get_read_only (s_con)) { + g_set_error_literal (error, + NM_SETTINGS_INTERFACE_ERROR, + NM_SETTINGS_INTERFACE_ERROR_READ_ONLY_CONNECTION, + "Connection is read-only"); + return FALSE; + } + + return TRUE; +} + +static gboolean +impl_sysconfig_connection_get_settings (NMSysconfigConnection *self, + GHashTable **settings, + GError **error) +{ + /* Must always be implemented */ + g_assert (NM_SYSCONFIG_CONNECTION_GET_CLASS (self)->get_settings); + *settings = NM_SYSCONFIG_CONNECTION_GET_CLASS (self)->get_settings (self, error); + return *settings ? TRUE : FALSE; +} + +static void +impl_sysconfig_connection_update (NMSysconfigConnection *self, + GHashTable *new_settings, + DBusGMethodInvocation *context) +{ + NMConnection *tmp; + GError *error = NULL; + + /* If the connection is read-only, that has to be changed at the source of + * the problem (ex a system settings plugin that can't write connections out) + * instead of over D-Bus. + */ + if (!check_writable (NM_CONNECTION (self), &error)) { + dbus_g_method_return_error (context, error); + g_error_free (error); + return; + } + + /* Check if the settings are valid first */ + tmp = nm_connection_new_from_hash (new_settings, &error); + if (!tmp) { + g_assert (error); + dbus_g_method_return_error (context, error); + g_error_free (error); + return; + } + g_object_unref (tmp); + + if (NM_SYSCONFIG_CONNECTION_GET_CLASS (self)->update) + NM_SYSCONFIG_CONNECTION_GET_CLASS (self)->update (self, new_settings, context); + else { + error = g_error_new (NM_SETTINGS_INTERFACE_ERROR, + NM_SETTINGS_INTERFACE_ERROR_INTERNAL_ERROR, + "%s: %s:%d update() unimplemented", __func__, __FILE__, __LINE__); + dbus_g_method_return_error (context, error); + g_error_free (error); + } +} + +static void +impl_sysconfig_connection_delete (NMSysconfigConnection *self, + DBusGMethodInvocation *context) +{ + GError *error = NULL; + + if (!check_writable (NM_CONNECTION (self), &error)) { + dbus_g_method_return_error (context, error); + g_error_free (error); + return; + } + + if (NM_SYSCONFIG_CONNECTION_GET_CLASS (self)->delete) + NM_SYSCONFIG_CONNECTION_GET_CLASS (self)->delete (self, context); + else { + error = g_error_new (NM_SETTINGS_INTERFACE_ERROR, + NM_SETTINGS_INTERFACE_ERROR_INTERNAL_ERROR, + "%s: %s:%d delete() unimplemented", __func__, __FILE__, __LINE__); + dbus_g_method_return_error (context, error); + g_error_free (error); + } +} + +static void +impl_sysconfig_connection_get_secrets (NMSysconfigConnection *self, + const gchar *setting_name, + const gchar **hints, + gboolean request_new, + DBusGMethodInvocation *context) +{ + GError *error = NULL; + + if (NM_SYSCONFIG_CONNECTION_GET_CLASS (self)->get_secrets) + NM_SYSCONFIG_CONNECTION_GET_CLASS (self)->get_secrets (self, setting_name, hints, request_new, context); + else { + error = g_error_new (NM_SETTINGS_INTERFACE_ERROR, + NM_SETTINGS_INTERFACE_ERROR_INTERNAL_ERROR, + "%s: %s:%d get_secrets() unimplemented", __func__, __FILE__, __LINE__); + dbus_g_method_return_error (context, error); + g_error_free (error); + } +} + +/**************************************************************/ + typedef struct { NMSysconfigConnection *self; DBusGMethodInvocation *context; @@ -379,11 +571,10 @@ out: } static void -dbus_update (NMExportedConnection *exported, +dbus_update (NMSysconfigConnection *self, GHashTable *new_settings, DBusGMethodInvocation *context) { - NMSysconfigConnection *self = NM_SYSCONFIG_CONNECTION (exported); NMSysconfigConnectionPrivate *priv = NM_SYSCONFIG_CONNECTION_GET_PRIVATE (self); PolkitCall *call; NMConnection *tmp; @@ -482,10 +673,9 @@ out: } static void -dbus_delete (NMExportedConnection *exported, +dbus_delete (NMSysconfigConnection *self, DBusGMethodInvocation *context) { - NMSysconfigConnection *self = NM_SYSCONFIG_CONNECTION (exported); NMSysconfigConnectionPrivate *priv = NM_SYSCONFIG_CONNECTION_GET_PRIVATE (self); PolkitCall *call; @@ -577,7 +767,7 @@ out: } static void -dbus_get_secrets (NMExportedConnection *exported, +dbus_get_secrets (NMSysconfigConnection *exported, const gchar *setting_name, const gchar **hints, gboolean request_new, @@ -605,6 +795,8 @@ dbus_get_secrets (NMExportedConnection *exported, static void settings_connection_interface_init (NMSettingsConnectionInterface *iface) { + iface->update = update; + iface->delete = do_delete; iface->get_secrets = get_secrets; } @@ -646,13 +838,17 @@ static void nm_sysconfig_connection_class_init (NMSysconfigConnectionClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); - NMExportedConnectionClass *ec_class = NM_EXPORTED_CONNECTION_CLASS (class); g_type_class_add_private (class, sizeof (NMSysconfigConnectionPrivate)); /* Virtual methods */ object_class->dispose = dispose; - ec_class->update = dbus_update; - ec_class->delete = dbus_delete; - ec_class->get_secrets = dbus_get_secrets; + class->get_settings = get_settings; + class->update = dbus_update; + class->delete = dbus_delete; + class->get_secrets = dbus_get_secrets; + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (class), + &dbus_glib_nm_sysconfig_connection_object_info); + } diff --git a/src/system-settings/nm-sysconfig-connection.h b/src/system-settings/nm-sysconfig-connection.h index 0431dc95c2..f8cecce0fb 100644 --- a/src/system-settings/nm-sysconfig-connection.h +++ b/src/system-settings/nm-sysconfig-connection.h @@ -22,7 +22,7 @@ #define NM_SYSCONFIG_CONNECTION_H #include <nm-connection.h> -#include <nm-exported-connection.h> +#include <dbus/dbus-glib.h> G_BEGIN_DECLS @@ -34,11 +34,27 @@ G_BEGIN_DECLS #define NM_SYSCONFIG_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SYSCONFIG_CONNECTION, NMSysconfigConnectionClass)) typedef struct { - NMExportedConnection parent; + NMConnection parent; } NMSysconfigConnection; typedef struct { - NMExportedConnectionClass parent; + NMConnectionClass parent; + + GHashTable * (*get_settings) (NMSysconfigConnection *self, + GError **error); + + void (*update) (NMSysconfigConnection *self, + GHashTable *new_settings, + DBusGMethodInvocation *context); + + void (*delete) (NMSysconfigConnection *self, + DBusGMethodInvocation *context); + + void (*get_secrets) (NMSysconfigConnection *self, + const gchar *setting_name, + const gchar **hints, + gboolean request_new, + DBusGMethodInvocation *context); } NMSysconfigConnectionClass; GType nm_sysconfig_connection_get_type (void); diff --git a/src/system-settings/nm-sysconfig-settings.c b/src/system-settings/nm-sysconfig-settings.c index 0dff2285a2..253c2a264d 100644 --- a/src/system-settings/nm-sysconfig-settings.c +++ b/src/system-settings/nm-sysconfig-settings.c @@ -183,7 +183,7 @@ list_connections (NMSettingsInterface *settings) g_hash_table_iter_init (&iter, priv->connections); while (g_hash_table_iter_next (&iter, &key, NULL)) - list = g_slist_prepend (list, NM_EXPORTED_CONNECTION (key)); + list = g_slist_prepend (list, NM_SYSCONFIG_CONNECTION (key)); return g_slist_reverse (list); } @@ -207,13 +207,13 @@ impl_settings_list_connections (NMSysconfigSettings *self, static NMSettingsConnectionInterface * get_connection_by_path (NMSettingsInterface *settings, const char *path) { - NMExportedConnection *connection = NULL; + NMSysconfigConnection *connection = NULL; GSList *list = NULL, *iter; list = list_connections (settings); for (iter = list; iter; iter = g_slist_next (iter)) { if (!strcmp (nm_connection_get_path (NM_CONNECTION (iter->data)), path)) { - connection = NM_EXPORTED_CONNECTION (iter->data); + connection = NM_SYSCONFIG_CONNECTION (iter->data); break; } } diff --git a/system-settings/plugins/ifupdown/nm-ifupdown-connection.c b/system-settings/plugins/ifupdown/nm-ifupdown-connection.c index ad9a479a6a..3a7e266ea6 100644 --- a/system-settings/plugins/ifupdown/nm-ifupdown-connection.c +++ b/system-settings/plugins/ifupdown/nm-ifupdown-connection.c @@ -58,7 +58,7 @@ nm_ifupdown_connection_new (if_block *block) } static void -get_secrets (NMExportedConnection *exported, +get_secrets (NMSysconfigConnection *exported, const gchar *setting_name, const gchar **hints, gboolean request_new, @@ -81,7 +81,7 @@ get_secrets (NMExportedConnection *exported, return; } - NM_EXPORTED_CONNECTION_CLASS (nm_ifupdown_connection_parent_class)->get_secrets (exported, setting_name, hints, request_new, context); + NM_SYSCONFIG_CONNECTION_CLASS (nm_ifupdown_connection_parent_class)->get_secrets (exported, setting_name, hints, request_new, context); } static void @@ -165,7 +165,7 @@ static void nm_ifupdown_connection_class_init (NMIfupdownConnectionClass *ifupdown_connection_class) { GObjectClass *object_class = G_OBJECT_CLASS (ifupdown_connection_class); - NMExportedConnectionClass *connection_class = NM_EXPORTED_CONNECTION_CLASS (ifupdown_connection_class); + NMSysconfigConnectionClass *connection_class = NM_SYSCONFIG_CONNECTION_CLASS (ifupdown_connection_class); g_type_class_add_private (ifupdown_connection_class, sizeof (NMIfupdownConnectionPrivate)); diff --git a/system-settings/plugins/ifupdown/plugin.c b/system-settings/plugins/ifupdown/plugin.c index e2358b9f51..4a07022c4c 100644 --- a/system-settings/plugins/ifupdown/plugin.c +++ b/system-settings/plugins/ifupdown/plugin.c @@ -458,7 +458,7 @@ SCPluginIfupdown_init (NMSystemConfigInterface *config) for (cl_iter = con_list; cl_iter; cl_iter = g_list_next (cl_iter)) { g_signal_emit_by_name (self, NM_SYSTEM_CONFIG_INTERFACE_CONNECTION_ADDED, - NM_EXPORTED_CONNECTION (cl_iter->data)); + NM_SYSCONFIG_CONNECTION (cl_iter->data)); } g_list_free (con_list); } |