diff --git a/introspection/nm-agent-manager.xml b/introspection/nm-agent-manager.xml
index d10744286..4b53675cf 100644
--- a/introspection/nm-agent-manager.xml
+++ b/introspection/nm-agent-manager.xml
@@ -8,8 +8,6 @@
Called by secret Agents to register their ability to provide and save
network secrets.
-
-
Identifies this agent; only one agent in each user session may use the
@@ -27,8 +25,6 @@
Like Register() but indicates agent capabilities to NetworkManager.
-
-
See the Register() method's identifier argument.
@@ -47,8 +43,6 @@
longer handle requests for network secrets. Agents are automatically
unregistered when they disconnect from D-Bus.
-
-
diff --git a/introspection/nm-settings-connection.xml b/introspection/nm-settings-connection.xml
index b02762d6b..2d919619f 100644
--- a/introspection/nm-settings-connection.xml
+++ b/introspection/nm-settings-connection.xml
@@ -15,8 +15,6 @@
stored in persistent storage or sent to a Secret Agent for storage,
depending on the flags associated with each secret.
-
-
New connection settings, properties, and (optionally) secrets.
@@ -37,8 +35,6 @@
reloaded from disk (either automatically on file change or
due to an explicit ReloadConnections call).
-
-
New connection settings, properties, and (optionally) secrets.
@@ -50,8 +46,6 @@
Delete the connection.
-
-
@@ -61,8 +55,6 @@
to the network, as those are often protected. Secrets must
be requested separately using the GetSecrets() call.
-
-
The nested settings maps describing this object.
@@ -77,8 +69,6 @@
the requestor's session will be returned. The user will never
be prompted for secrets as a result of this request.
-
-
Name of the setting to return secrets for. If empty, all
@@ -97,8 +87,6 @@
Clear the secrets belonging to this network connection profile.
-
-
@@ -106,8 +94,6 @@
Saves a "dirty" connection (that had previously been
updated with UpdateUnsaved) to persistent storage.
-
-
diff --git a/introspection/nm-settings.xml b/introspection/nm-settings.xml
index 3a71959cb..b6ab8260e 100644
--- a/introspection/nm-settings.xml
+++ b/introspection/nm-settings.xml
@@ -10,7 +10,6 @@
List the saved network connections known to NetworkManager.
-
List of connections.
@@ -22,8 +21,6 @@
Retrieve the object path of a connection, given that connection's UUID.
-
-
The UUID to find the connection object path for.
@@ -43,8 +40,6 @@
the network described by the new connection, and (2) the connection
is allowed to be started automatically.
-
-
Connection settings and properties.
@@ -69,8 +64,6 @@
connection is reloaded from disk (either automatically on file
change or due to an explicit ReloadConnections call).
-
-
Connection settings and properties.
@@ -93,8 +86,6 @@
harmless.) As with AddConnection(), this operation does not
necessarily start the network connection.
-
-
Array of paths to on-disk connection profiles in directories
@@ -125,8 +116,6 @@
change, so you only need to use this command if you have set
"monitor-connection-files=false" in NetworkManager.conf.
-
-
Success or failure.
@@ -138,8 +127,6 @@
Save the hostname to persistent configuration.
-
-
The hostname to save to persistent configuration. If blank, the persistent hostname is cleared.
diff --git a/src/settings/nm-agent-manager.c b/src/settings/nm-agent-manager.c
index e1333bab5..087ed5eb1 100644
--- a/src/settings/nm-agent-manager.c
+++ b/src/settings/nm-agent-manager.c
@@ -23,16 +23,11 @@
#include
#include
-#include
-#include
-
#include "nm-default.h"
#include "nm-dbus-interface.h"
#include "nm-agent-manager.h"
#include "nm-secret-agent.h"
#include "nm-auth-utils.h"
-#include "nm-dbus-glib-types.h"
-#include "nm-auth-utils.h"
#include "nm-setting-vpn.h"
#include "nm-setting-connection.h"
#include "nm-enum-types.h"
@@ -41,6 +36,9 @@
#include "nm-session-monitor.h"
#include "nm-simple-connection.h"
#include "NetworkManagerUtils.h"
+#include "nm-core-internal.h"
+
+#include "nmdbus-agent-manager.h"
G_DEFINE_TYPE (NMAgentManager, nm_agent_manager, NM_TYPE_EXPORTED_OBJECT)
@@ -78,20 +76,6 @@ static void request_remove_agent (Request *req, NMSecretAgent *agent, GSList **p
static void request_next_agent (Request *req);
-static void impl_agent_manager_register (NMAgentManager *self,
- const char *identifier,
- DBusGMethodInvocation *context);
-
-static void impl_agent_manager_register_with_capabilities (NMAgentManager *self,
- const char *identifier,
- NMSecretAgentCapabilities capabilities,
- DBusGMethodInvocation *context);
-
-static void impl_agent_manager_unregister (NMAgentManager *self,
- DBusGMethodInvocation *context);
-
-#include "nm-agent-manager-glue.h"
-
/*************************************************************/
static gboolean
@@ -130,6 +114,17 @@ remove_agent (NMAgentManager *self, const char *owner)
return TRUE;
}
+/* Call this *after* calling request_next_agent() */
+static void
+maybe_remove_agent_on_error (NMSecretAgent *agent,
+ GError *error)
+{
+ if ( g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CLOSED)
+ || g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_DISCONNECTED)
+ || g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER))
+ remove_agent (nm_agent_manager_get (), nm_secret_agent_get_dbus_owner (agent));
+}
+
/*************************************************************/
static gboolean
@@ -190,7 +185,7 @@ validate_identifier (const char *identifier, GError **error)
static void
agent_register_permissions_done (NMAuthChain *chain,
GError *error,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
gpointer user_data)
{
NMAgentManager *self = NM_AGENT_MANAGER (user_data);
@@ -211,8 +206,7 @@ agent_register_permissions_done (NMAuthChain *chain,
NM_AGENT_MANAGER_ERROR_PERMISSION_DENIED,
"Failed to request agent permissions: (%d) %s",
error->code, error->message);
- dbus_g_method_return_error (context, local);
- g_error_free (local);
+ g_dbus_method_invocation_take_error (context, local);
} else {
agent = nm_auth_chain_steal_data (chain, "agent");
g_assert (agent);
@@ -229,7 +223,7 @@ agent_register_permissions_done (NMAuthChain *chain,
g_hash_table_insert (priv->agents, g_strdup (sender), agent);
nm_log_dbg (LOGD_AGENTS, "(%s) agent registered",
nm_secret_agent_get_description (agent));
- dbus_g_method_return (context);
+ g_dbus_method_invocation_return_value (context, NULL);
/* Signal an agent was registered */
g_signal_emit (self, signals[AGENT_REGISTERED], 0, agent);
@@ -271,9 +265,9 @@ agent_disconnected_cb (NMSecretAgent *agent, gpointer user_data)
static void
impl_agent_manager_register_with_capabilities (NMAgentManager *self,
+ GDBusMethodInvocation *context,
const char *identifier,
- NMSecretAgentCapabilities capabilities,
- DBusGMethodInvocation *context)
+ guint32 capabilities)
{
NMAgentManagerPrivate *priv = NM_AGENT_MANAGER_GET_PRIVATE (self);
NMAuthSubject *subject;
@@ -334,22 +328,21 @@ impl_agent_manager_register_with_capabilities (NMAgentManager *self,
done:
if (error)
- dbus_g_method_return_error (context, error);
- g_clear_error (&error);
+ g_dbus_method_invocation_take_error (context, error);
g_clear_object (&subject);
}
static void
impl_agent_manager_register (NMAgentManager *self,
- const char *identifier,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context,
+ const char *identifier)
{
- impl_agent_manager_register_with_capabilities (self, identifier, 0, context);
+ impl_agent_manager_register_with_capabilities (self, context, identifier, 0);
}
static void
impl_agent_manager_unregister (NMAgentManager *self,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context)
{
GError *error = NULL;
char *sender = NULL;
@@ -373,19 +366,18 @@ impl_agent_manager_unregister (NMAgentManager *self,
goto done;
}
- dbus_g_method_return (context);
+ g_dbus_method_invocation_return_value (context, NULL);
done:
if (error)
- dbus_g_method_return_error (context, error);
- g_clear_error (&error);
+ g_dbus_method_invocation_take_error (context, error);
g_free (sender);
}
/*************************************************************/
typedef void (*RequestCompleteFunc) (Request *req,
- GHashTable *secrets,
+ GVariant *secrets,
const char *agent_dbus_owner,
const char *agent_username,
GError *error,
@@ -481,7 +473,7 @@ request_free (Request *req)
static void
req_complete_success (Request *req,
- GHashTable *secrets,
+ GVariant *secrets,
const char *agent_dbus_owner,
const char *agent_uname)
{
@@ -658,7 +650,7 @@ typedef struct {
char *setting_name;
char **hints;
- GHashTable *existing_secrets;
+ GVariant *existing_secrets;
NMAgentSecretsResultFunc callback;
gpointer callback_data;
@@ -682,7 +674,7 @@ connection_request_free (gpointer data)
g_free (req->setting_name);
g_strfreev (req->hints);
if (req->existing_secrets)
- g_hash_table_unref (req->existing_secrets);
+ g_variant_unref (req->existing_secrets);
if (req->chain)
nm_auth_chain_unref (req->chain);
}
@@ -710,7 +702,7 @@ connection_request_add_agent (Request *parent, NMSecretAgent *agent)
static ConnectionRequest *
connection_request_new_get (NMConnection *connection,
NMAuthSubject *subject,
- GHashTable *existing_secrets,
+ GVariant *existing_secrets,
const char *setting_name,
const char *verb,
NMSecretAgentGetSecretsFlags flags,
@@ -740,7 +732,7 @@ connection_request_new_get (NMConnection *connection,
req->connection = g_object_ref (connection);
if (existing_secrets)
- req->existing_secrets = g_hash_table_ref (existing_secrets);
+ req->existing_secrets = g_variant_ref (existing_secrets);
req->setting_name = g_strdup (setting_name);
req->hints = g_strdupv ((char **) hints);
req->flags = flags;
@@ -779,13 +771,13 @@ connection_request_new_other (NMConnection *connection,
static void
get_done_cb (NMSecretAgent *agent,
gconstpointer call_id,
- GHashTable *secrets,
+ GVariant *secrets,
GError *error,
gpointer user_data)
{
Request *parent = user_data;
ConnectionRequest *req = user_data;
- GHashTable *setting_secrets;
+ GVariant *setting_secrets;
const char *agent_dbus_owner;
struct passwd *pw;
char *agent_uname = NULL;
@@ -799,7 +791,7 @@ get_done_cb (NMSecretAgent *agent,
error ? error->code : -1,
(error && error->message) ? error->message : "(unknown)");
- if (dbus_g_error_has_name (error, NM_DBUS_INTERFACE_SECRET_AGENT ".UserCanceled")) {
+ if (_nm_dbus_error_has_name (error, NM_DBUS_INTERFACE_SECRET_AGENT ".UserCanceled")) {
error = g_error_new_literal (NM_AGENT_MANAGER_ERROR,
NM_AGENT_MANAGER_ERROR_USER_CANCELED,
"User canceled the secrets request.");
@@ -808,13 +800,14 @@ get_done_cb (NMSecretAgent *agent,
} else {
/* Try the next agent */
request_next_agent (parent);
+ maybe_remove_agent_on_error (agent, error);
}
return;
}
/* Ensure the setting we wanted secrets for got returned and has something in it */
- setting_secrets = g_hash_table_lookup (secrets, req->setting_name);
- if (!setting_secrets || !g_hash_table_size (setting_secrets)) {
+ setting_secrets = g_variant_lookup_value (secrets, req->setting_name, NM_VARIANT_TYPE_SETTING);
+ if (!setting_secrets || !g_variant_n_children (setting_secrets)) {
nm_log_dbg (LOGD_AGENTS, "(%s) agent returned no secrets for request %p/%s/%s",
nm_secret_agent_get_description (agent),
req, parent->detail, req->setting_name);
@@ -841,40 +834,40 @@ get_done_cb (NMSecretAgent *agent,
}
static void
-set_secrets_not_required (NMConnection *connection, GHashTable *hash)
+set_secrets_not_required (NMConnection *connection, GVariant *dict)
{
- GHashTableIter iter, setting_iter;
+ GVariantIter iter, setting_iter;
const char *setting_name = NULL;
- GHashTable *setting_hash = NULL;
+ GVariant *setting_dict = NULL;
- /* Iterate through the settings hashes */
- g_hash_table_iter_init (&iter, hash);
- while (g_hash_table_iter_next (&iter,
- (gpointer *) &setting_name,
- (gpointer *) &setting_hash)) {
+ /* Iterate through the settings dicts */
+ g_variant_iter_init (&iter, dict);
+ while (g_variant_iter_next (&iter, "{&s@a{sv}}", &setting_name, &setting_dict)) {
const char *key_name = NULL;
NMSetting *setting;
- GValue *val;
+ GVariant *val;
setting = nm_connection_get_setting_by_name (connection, setting_name);
if (setting) {
/* Now through each secret in the setting and mark it as not required */
- g_hash_table_iter_init (&setting_iter, setting_hash);
- while (g_hash_table_iter_next (&setting_iter, (gpointer *) &key_name, (gpointer *) &val)) {
+ g_variant_iter_init (&setting_iter, setting_dict);
+ while (g_variant_iter_next (&setting_iter, "{&sv}", &key_name, &val)) {
/* For each secret, set the flag that it's not required; VPN
* secrets need slightly different treatment here since the
- * "secrets" property is actually a hash table of secrets.
+ * "secrets" property is actually a dictionary of secrets.
*/
if ( strcmp (setting_name, NM_SETTING_VPN_SETTING_NAME) == 0
- && strcmp (key_name, NM_SETTING_VPN_SECRETS) == 0) {
- GHashTableIter vpn_secret_iter;
- const char *secret_name;
+ && strcmp (key_name, NM_SETTING_VPN_SECRETS) == 0
+ && g_variant_is_of_type (val, G_VARIANT_TYPE ("a{ss}"))) {
+ GVariantIter vpn_secret_iter;
+ const char *secret_name, *secret;
- g_hash_table_iter_init (&vpn_secret_iter, g_value_get_boxed (val));
- while (g_hash_table_iter_next (&vpn_secret_iter, (gpointer *) &secret_name, NULL))
+ g_variant_iter_init (&vpn_secret_iter, val);
+ while (g_variant_iter_next (&vpn_secret_iter, "{&s&s}", &secret_name, &secret))
nm_setting_set_secret_flags (setting, secret_name, NM_SETTING_SECRET_FLAG_NOT_REQUIRED, NULL);
} else
nm_setting_set_secret_flags (setting, key_name, NM_SETTING_SECRET_FLAG_NOT_REQUIRED, NULL);
+ g_variant_unref (val);
}
}
}
@@ -889,13 +882,8 @@ get_agent_request_secrets (ConnectionRequest *req, gboolean include_system_secre
tmp = nm_simple_connection_new_clone (req->connection);
nm_connection_clear_secrets (tmp);
if (include_system_secrets) {
- if (req->existing_secrets) {
- GVariant *secrets_dict;
-
- secrets_dict = nm_utils_connection_hash_to_dict (req->existing_secrets);
- (void) nm_connection_update_secrets (tmp, req->setting_name, secrets_dict, NULL);
- g_variant_unref (secrets_dict);
- }
+ if (req->existing_secrets)
+ (void) nm_connection_update_secrets (tmp, req->setting_name, req->existing_secrets, NULL);
} else {
/* Update secret flags in the temporary connection to indicate that
* the system secrets we're not sending to the agent aren't required,
@@ -924,7 +912,7 @@ get_agent_request_secrets (ConnectionRequest *req, gboolean include_system_secre
static void
get_agent_modify_auth_cb (NMAuthChain *chain,
GError *error,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
gpointer user_data)
{
Request *parent = user_data;
@@ -1058,19 +1046,18 @@ get_start (gpointer user_data)
{
Request *parent = user_data;
ConnectionRequest *req = user_data;
- GHashTable *setting_secrets = NULL;
+ GVariant *setting_secrets = NULL;
parent->idle_id = 0;
/* Check if there are any existing secrets */
if (req->existing_secrets)
- setting_secrets = g_hash_table_lookup (req->existing_secrets, req->setting_name);
+ setting_secrets = g_variant_lookup_value (req->existing_secrets, req->setting_name, NM_VARIANT_TYPE_SETTING);
- if (setting_secrets && g_hash_table_size (setting_secrets)) {
+ if (setting_secrets && g_variant_n_children (setting_secrets)) {
NMConnection *tmp;
GError *error = NULL;
gboolean new_secrets = (req->flags & NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW);
- GVariant *secrets_dict;
/* The connection already had secrets; check if any more are required.
* If no more are required, we're done. If secrets are still needed,
@@ -1080,8 +1067,7 @@ get_start (gpointer user_data)
tmp = nm_simple_connection_new_clone (req->connection);
g_assert (tmp);
- secrets_dict = nm_utils_connection_hash_to_dict (req->existing_secrets);
- if (!nm_connection_update_secrets (tmp, req->setting_name, secrets_dict, &error)) {
+ if (!nm_connection_update_secrets (tmp, req->setting_name, req->existing_secrets, &error)) {
req_complete_error (parent, error);
g_clear_error (&error);
} else {
@@ -1107,7 +1093,6 @@ get_start (gpointer user_data)
request_next_agent (parent);
}
}
- g_variant_unref (secrets_dict);
g_object_unref (tmp);
} else {
/* Couldn't get secrets from system settings, so now we ask the
@@ -1117,12 +1102,15 @@ get_start (gpointer user_data)
request_next_agent (parent);
}
+ if (setting_secrets)
+ g_variant_unref (setting_secrets);
+
return FALSE;
}
static void
get_complete_cb (Request *parent,
- GHashTable *secrets,
+ GVariant *secrets,
const char *agent_dbus_owner,
const char *agent_username,
GError *error,
@@ -1163,7 +1151,7 @@ guint32
nm_agent_manager_get_secrets (NMAgentManager *self,
NMConnection *connection,
NMAuthSubject *subject,
- GHashTable *existing_secrets,
+ GVariant *existing_secrets,
const char *setting_name,
NMSecretAgentGetSecretsFlags flags,
const char **hints,
@@ -1233,7 +1221,7 @@ nm_agent_manager_cancel_secrets (NMAgentManager *self,
static void
save_done_cb (NMSecretAgent *agent,
gconstpointer call_id,
- GHashTable *secrets,
+ GVariant *secrets,
GError *error,
gpointer user_data)
{
@@ -1251,6 +1239,7 @@ save_done_cb (NMSecretAgent *agent,
(error && error->message) ? error->message : "(unknown)");
/* Try the next agent */
request_next_agent (parent);
+ maybe_remove_agent_on_error (agent, error);
return;
}
@@ -1280,7 +1269,7 @@ save_next_cb (Request *parent)
static void
save_complete_cb (Request *req,
- GHashTable *secrets,
+ GVariant *secrets,
const char *agent_dbus_owner,
const char *agent_username,
GError *error,
@@ -1327,7 +1316,7 @@ nm_agent_manager_save_secrets (NMAgentManager *self,
static void
delete_done_cb (NMSecretAgent *agent,
gconstpointer call_id,
- GHashTable *secrets,
+ GVariant *secrets,
GError *error,
gpointer user_data)
{
@@ -1347,6 +1336,8 @@ delete_done_cb (NMSecretAgent *agent,
/* Tell the next agent to delete secrets */
request_next_agent (req);
+ if (error)
+ maybe_remove_agent_on_error (agent, error);
}
static void
@@ -1367,7 +1358,7 @@ delete_next_cb (Request *parent)
static void
delete_complete_cb (Request *req,
- GHashTable *secrets,
+ GVariant *secrets,
const char *agent_dbus_owner,
const char *agent_username,
GError *error,
@@ -1460,7 +1451,7 @@ nm_agent_manager_all_agents_have_capability (NMAgentManager *manager,
static void
agent_permissions_changed_done (NMAuthChain *chain,
GError *error,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
gpointer user_data)
{
NMAgentManager *self = NM_AGENT_MANAGER (user_data);
@@ -1609,9 +1600,9 @@ nm_agent_manager_class_init (NMAgentManagerClass *agent_manager_class)
G_TYPE_OBJECT);
nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (agent_manager_class),
- &dbus_glib_nm_agent_manager_object_info);
-
- dbus_g_error_domain_register (NM_AGENT_MANAGER_ERROR,
- NM_DBUS_INTERFACE_AGENT_MANAGER,
- NM_TYPE_AGENT_MANAGER_ERROR);
+ NMDBUS_TYPE_AGENT_MANAGER_SKELETON,
+ "Register", impl_agent_manager_register,
+ "RegisterWithCapabilities", impl_agent_manager_register_with_capabilities,
+ "Unregister", impl_agent_manager_unregister,
+ NULL);
}
diff --git a/src/settings/nm-agent-manager.h b/src/settings/nm-agent-manager.h
index 4ece8940e..792ee572d 100644
--- a/src/settings/nm-agent-manager.h
+++ b/src/settings/nm-agent-manager.h
@@ -56,7 +56,7 @@ typedef void (*NMAgentSecretsResultFunc) (NMAgentManager *manager,
gboolean agent_has_modify,
const char *setting_name,
NMSecretAgentGetSecretsFlags flags,
- GHashTable *secrets,
+ GVariant *secrets,
GError *error,
gpointer user_data,
gpointer other_data2,
@@ -65,7 +65,7 @@ typedef void (*NMAgentSecretsResultFunc) (NMAgentManager *manager,
guint32 nm_agent_manager_get_secrets (NMAgentManager *manager,
NMConnection *connection,
NMAuthSubject *subject,
- GHashTable *existing_secrets,
+ GVariant *existing_secrets,
const char *setting_name,
NMSecretAgentGetSecretsFlags flags,
const char **hints,
diff --git a/src/settings/nm-secret-agent.c b/src/settings/nm-secret-agent.c
index 43885fee4..c2c220fd4 100644
--- a/src/settings/nm-secret-agent.c
+++ b/src/settings/nm-secret-agent.c
@@ -23,17 +23,14 @@
#include
#include
-#include
-#include
-
#include "nm-default.h"
#include "nm-dbus-interface.h"
#include "nm-secret-agent.h"
#include "nm-bus-manager.h"
-#include "nm-dbus-glib-types.h"
#include "nm-auth-subject.h"
#include "nm-simple-connection.h"
-#include "NetworkManagerUtils.h"
+
+#include "nmdbus-secret-agent.h"
G_DEFINE_TYPE (NMSecretAgent, nm_secret_agent, G_TYPE_OBJECT)
@@ -52,7 +49,7 @@ typedef struct {
GSList *permissions;
- DBusGProxy *proxy;
+ NMDBusSecretAgent *proxy;
GHashTable *requests;
} NMSecretAgentPrivate;
@@ -68,7 +65,7 @@ static guint signals[LAST_SIGNAL] = { 0 };
typedef struct {
NMSecretAgent *agent;
- DBusGProxyCall *call;
+ GCancellable *cancellable;
char *path;
char *setting_name;
NMSecretAgentCallback callback;
@@ -90,6 +87,7 @@ request_new (NMSecretAgent *agent,
r->setting_name = g_strdup (setting_name);
r->callback = callback;
r->callback_data = callback_data;
+ r->cancellable = g_cancellable_new ();
return r;
}
@@ -98,6 +96,7 @@ request_free (Request *r)
{
g_free (r->path);
g_free (r->setting_name);
+ g_object_unref (r->cancellable);
g_slice_free (Request, r);
}
@@ -258,25 +257,26 @@ nm_secret_agent_has_permission (NMSecretAgent *agent, const char *permission)
/*************************************************************/
static void
-get_callback (DBusGProxy *proxy,
- DBusGProxyCall *call,
- void *user_data)
+get_callback (GObject *proxy,
+ GAsyncResult *result,
+ gpointer user_data)
{
Request *r = user_data;
NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (r->agent);
+ GVariant *secrets = NULL;
GError *error = NULL;
- GHashTable *secrets = NULL;
- g_return_if_fail (call == r->call);
+ if (!g_cancellable_is_cancelled (r->cancellable)) {
+ nmdbus_secret_agent_call_get_secrets_finish (priv->proxy, &secrets, result, &error);
+ if (error)
+ g_dbus_error_strip_remote_error (error);
- dbus_g_proxy_end_call (proxy, call, &error,
- DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, &secrets,
- G_TYPE_INVALID);
- r->callback (r->agent, r->call, secrets, error, r->callback_data);
- if (secrets)
- g_hash_table_unref (secrets);
- g_clear_error (&error);
- g_hash_table_remove (priv->requests, call);
+ r->callback (r->agent, r, secrets, error, r->callback_data);
+ g_clear_pointer (&secrets, g_variant_unref);
+ g_clear_error (&error);
+ }
+
+ g_hash_table_remove (priv->requests, r);
}
gconstpointer
@@ -289,8 +289,8 @@ nm_secret_agent_get_secrets (NMSecretAgent *self,
gpointer callback_data)
{
NMSecretAgentPrivate *priv;
+ static const char *no_hints[] = { NULL };
GVariant *dict;
- GHashTable *hash;
Request *r;
g_return_val_if_fail (self != NULL, NULL);
@@ -301,123 +301,81 @@ nm_secret_agent_get_secrets (NMSecretAgent *self,
g_return_val_if_fail (priv->proxy != NULL, NULL);
dict = nm_connection_to_dbus (connection, NM_CONNECTION_SERIALIZE_ALL);
- hash = nm_utils_connection_dict_to_hash (dict);
- g_variant_unref (dict);
/* Mask off the private flags if present */
flags &= ~NM_SECRET_AGENT_GET_SECRETS_FLAG_ONLY_SYSTEM;
flags &= ~NM_SECRET_AGENT_GET_SECRETS_FLAG_NO_ERRORS;
r = request_new (self, nm_connection_get_path (connection), setting_name, callback, callback_data);
- r->call = dbus_g_proxy_begin_call_with_timeout (priv->proxy,
- "GetSecrets",
- get_callback,
- r,
- NULL,
- 120000, /* 120 seconds */
- DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, hash,
- DBUS_TYPE_G_OBJECT_PATH, nm_connection_get_path (connection),
- G_TYPE_STRING, setting_name,
- G_TYPE_STRV, hints,
- G_TYPE_UINT, flags,
- G_TYPE_INVALID);
- g_hash_table_insert (priv->requests, r->call, r);
+ nmdbus_secret_agent_call_get_secrets (priv->proxy,
+ dict,
+ nm_connection_get_path (connection),
+ setting_name,
+ hints ? hints : no_hints,
+ flags,
+ r->cancellable,
+ get_callback, r);
+ g_hash_table_insert (priv->requests, r, r);
- g_hash_table_destroy (hash);
- return r->call;
+ return r;
}
static void
-cancel_done (DBusGProxy *proxy, DBusGProxyCall *call_id, void *user_data)
+cancel_done (GObject *proxy, GAsyncResult *result, gpointer user_data)
{
+ char *description = user_data;
GError *error = NULL;
- if (!dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID)) {
- nm_log_dbg (LOGD_AGENTS, "(%s): agent failed to cancel secrets: (%d) %s",
- (const char *) user_data,
- error ? error->code : -1,
- error && error->message ? error->message : "(unknown)");
+ if (!nmdbus_secret_agent_call_cancel_get_secrets_finish (NMDBUS_SECRET_AGENT (proxy), result, &error)) {
+ g_dbus_error_strip_remote_error (error);
+ nm_log_dbg (LOGD_AGENTS, "(%s): agent failed to cancel secrets: %s",
+ description, error->message);
g_clear_error (&error);
}
+
+ g_free (description);
}
void
nm_secret_agent_cancel_secrets (NMSecretAgent *self, gconstpointer call)
{
NMSecretAgentPrivate *priv;
- Request *r;
+ Request *r = (gpointer) call;
g_return_if_fail (self != NULL);
priv = NM_SECRET_AGENT_GET_PRIVATE (self);
g_return_if_fail (priv->proxy != NULL);
-
- r = g_hash_table_lookup (priv->requests, call);
g_return_if_fail (r != NULL);
- dbus_g_proxy_cancel_call (priv->proxy, (gpointer) call);
+ g_cancellable_cancel (r->cancellable);
- dbus_g_proxy_begin_call (priv->proxy,
- "CancelGetSecrets",
- cancel_done,
- g_strdup (nm_secret_agent_get_description (self)),
- g_free,
- DBUS_TYPE_G_OBJECT_PATH, r->path,
- G_TYPE_STRING, r->setting_name,
- G_TYPE_INVALID);
- g_hash_table_remove (priv->requests, call);
+ nmdbus_secret_agent_call_cancel_get_secrets (priv->proxy,
+ r->path, r->setting_name,
+ NULL,
+ cancel_done,
+ g_strdup (nm_secret_agent_get_description (self)));
}
/*************************************************************/
static void
-agent_save_delete_cb (DBusGProxy *proxy,
- DBusGProxyCall *call,
- void *user_data)
+agent_save_cb (GObject *proxy,
+ GAsyncResult *result,
+ gpointer user_data)
{
Request *r = user_data;
NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (r->agent);
GError *error = NULL;
- g_return_if_fail (call == r->call);
+ if (!g_cancellable_is_cancelled (r->cancellable)) {
+ nmdbus_secret_agent_call_save_secrets_finish (priv->proxy, result, &error);
+ if (error)
+ g_dbus_error_strip_remote_error (error);
+ r->callback (r->agent, r, NULL, error, r->callback_data);
+ g_clear_error (&error);
+ }
- dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
- r->callback (r->agent, r->call, NULL, error, r->callback_data);
- g_clear_error (&error);
- g_hash_table_remove (priv->requests, call);
-}
-
-static gpointer
-agent_new_save_delete (NMSecretAgent *self,
- NMConnection *connection,
- NMConnectionSerializationFlags flags,
- const char *method,
- NMSecretAgentCallback callback,
- gpointer callback_data)
-{
- NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self);
- GVariant *dict;
- GHashTable *hash;
- Request *r;
- const char *cpath = nm_connection_get_path (connection);
-
- dict = nm_connection_to_dbus (connection, flags);
- hash = nm_utils_connection_dict_to_hash (dict);
- g_variant_unref (dict);
-
- r = request_new (self, cpath, NULL, callback, callback_data);
- r->call = dbus_g_proxy_begin_call_with_timeout (priv->proxy,
- method,
- agent_save_delete_cb,
- r,
- NULL,
- 10000, /* 10 seconds */
- DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, hash,
- DBUS_TYPE_G_OBJECT_PATH, cpath,
- G_TYPE_INVALID);
- g_hash_table_insert (priv->requests, r->call, r);
-
- g_hash_table_destroy (hash);
- return r->call;
+ g_hash_table_remove (priv->requests, r);
}
gconstpointer
@@ -426,16 +384,46 @@ nm_secret_agent_save_secrets (NMSecretAgent *self,
NMSecretAgentCallback callback,
gpointer callback_data)
{
+ NMSecretAgentPrivate *priv;
+ GVariant *dict;
+ Request *r;
+ const char *cpath;
+
g_return_val_if_fail (self != NULL, NULL);
g_return_val_if_fail (connection != NULL, NULL);
+ priv = NM_SECRET_AGENT_GET_PRIVATE (self);
+ cpath = nm_connection_get_path (connection);
+
/* Caller should have ensured that only agent-owned secrets exist in 'connection' */
- return agent_new_save_delete (self,
- connection,
- NM_CONNECTION_SERIALIZE_ALL,
- "SaveSecrets",
- callback,
- callback_data);
+ dict = nm_connection_to_dbus (connection, NM_CONNECTION_SERIALIZE_ALL);
+
+ r = request_new (self, cpath, NULL, callback, callback_data);
+ nmdbus_secret_agent_call_save_secrets (priv->proxy,
+ dict, cpath,
+ NULL,
+ agent_save_cb, r);
+ g_hash_table_insert (priv->requests, r, r);
+
+ return r;
+}
+
+static void
+agent_delete_cb (GObject *proxy,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ Request *r = user_data;
+ NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (r->agent);
+ GError *error = NULL;
+
+ if (!g_cancellable_is_cancelled (r->cancellable)) {
+ nmdbus_secret_agent_call_delete_secrets_finish (priv->proxy, result, &error);
+ r->callback (r->agent, r, NULL, error, r->callback_data);
+ g_clear_error (&error);
+ }
+
+ g_hash_table_remove (priv->requests, r);
}
gconstpointer
@@ -444,54 +432,54 @@ nm_secret_agent_delete_secrets (NMSecretAgent *self,
NMSecretAgentCallback callback,
gpointer callback_data)
{
+ NMSecretAgentPrivate *priv;
+ GVariant *dict;
+ Request *r;
+ const char *cpath;
+
g_return_val_if_fail (self != NULL, NULL);
g_return_val_if_fail (connection != NULL, NULL);
+ priv = NM_SECRET_AGENT_GET_PRIVATE (self);
+ cpath = nm_connection_get_path (connection);
+
/* No secrets sent; agents must be smart enough to track secrets using the UUID or something */
- return agent_new_save_delete (self,
- connection,
- NM_CONNECTION_SERIALIZE_NO_SECRETS,
- "DeleteSecrets",
- callback,
- callback_data);
+ dict = nm_connection_to_dbus (connection, NM_CONNECTION_SERIALIZE_NO_SECRETS);
+
+ r = request_new (self, cpath, NULL, callback, callback_data);
+ nmdbus_secret_agent_call_delete_secrets (priv->proxy,
+ dict, cpath,
+ NULL,
+ agent_delete_cb, r);
+ g_hash_table_insert (priv->requests, r, r);
+
+ return r;
}
-static void proxy_cleanup (NMSecretAgent *self);
-
static void
-name_owner_changed_cb (NMBusManager *dbus_mgr,
- const char *name,
- const char *old_owner,
- const char *new_owner,
+name_owner_changed_cb (GObject *proxy,
+ GParamSpec *pspec,
gpointer user_data)
{
NMSecretAgent *self = NM_SECRET_AGENT (user_data);
NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self);
+ char *owner;
- if (!new_owner && !g_strcmp0 (old_owner, priv->dbus_owner))
- proxy_cleanup (self);
-}
-
-static void
-proxy_cleanup (NMSecretAgent *self)
-{
- NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self);
-
- if (priv->proxy) {
- g_signal_handlers_disconnect_by_func (priv->proxy, proxy_cleanup, self);
+ owner = g_dbus_proxy_get_name_owner (G_DBUS_PROXY (proxy));
+ if (!owner) {
+ g_signal_handlers_disconnect_by_func (priv->proxy, name_owner_changed_cb, self);
g_clear_object (&priv->proxy);
-
- g_signal_handlers_disconnect_by_func (nm_bus_manager_get (), name_owner_changed_cb, self);
g_signal_emit (self, signals[DISCONNECTED], 0);
g_clear_pointer (&priv->dbus_owner, g_free);
- }
+ } else
+ g_free (owner);
}
/*************************************************************/
NMSecretAgent *
-nm_secret_agent_new (DBusGMethodInvocation *context,
+nm_secret_agent_new (GDBusMethodInvocation *context,
NMAuthSubject *subject,
const char *identifier,
NMSecretAgentCapabilities capabilities)
@@ -500,6 +488,7 @@ nm_secret_agent_new (DBusGMethodInvocation *context,
NMSecretAgentPrivate *priv;
char *hash_str;
struct passwd *pw;
+ GDBusProxy *proxy;
g_return_val_if_fail (context != NULL, NULL);
g_return_val_if_fail (NM_IS_AUTH_SUBJECT (subject), NULL);
@@ -523,18 +512,17 @@ nm_secret_agent_new (DBusGMethodInvocation *context,
priv->hash = g_str_hash (hash_str);
g_free (hash_str);
- priv->proxy = nm_bus_manager_new_proxy (nm_bus_manager_get (),
- context,
- priv->dbus_owner,
- NM_DBUS_PATH_SECRET_AGENT,
- NM_DBUS_INTERFACE_SECRET_AGENT);
- g_assert (priv->proxy);
- g_signal_connect_swapped (priv->proxy, "destroy",
- G_CALLBACK (proxy_cleanup), self);
- g_signal_connect (nm_bus_manager_get (),
- NM_BUS_MANAGER_NAME_OWNER_CHANGED,
+ proxy = nm_bus_manager_new_proxy (nm_bus_manager_get (),
+ context,
+ NMDBUS_TYPE_SECRET_AGENT_PROXY,
+ priv->dbus_owner,
+ NM_DBUS_PATH_SECRET_AGENT,
+ NM_DBUS_INTERFACE_SECRET_AGENT);
+ g_assert (proxy);
+ g_signal_connect (proxy, "notify::g-name-owner",
G_CALLBACK (name_owner_changed_cb),
self);
+ priv->proxy = NMDBUS_SECRET_AGENT (proxy);
return self;
}
@@ -553,7 +541,7 @@ dispose (GObject *object)
{
NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (object);
- proxy_cleanup (NM_SECRET_AGENT (object));
+ g_clear_object (&priv->proxy);
g_clear_object (&priv->subject);
G_OBJECT_CLASS (nm_secret_agent_parent_class)->dispose (object);
diff --git a/src/settings/nm-secret-agent.h b/src/settings/nm-secret-agent.h
index aedc3d21f..7883979d5 100644
--- a/src/settings/nm-secret-agent.h
+++ b/src/settings/nm-secret-agent.h
@@ -21,7 +21,6 @@
#ifndef __NETWORKMANAGER_SECRET_AGENT_H__
#define __NETWORKMANAGER_SECRET_AGENT_H__
-
#include
#include "nm-default.h"
@@ -46,7 +45,7 @@ typedef struct {
GType nm_secret_agent_get_type (void);
-NMSecretAgent *nm_secret_agent_new (DBusGMethodInvocation *context,
+NMSecretAgent *nm_secret_agent_new (GDBusMethodInvocation *context,
NMAuthSubject *subject,
const char *identifier,
NMSecretAgentCapabilities capabilities);
@@ -78,7 +77,7 @@ gboolean nm_secret_agent_has_permission (NMSecretAgent *agent,
typedef void (*NMSecretAgentCallback) (NMSecretAgent *agent,
gconstpointer call,
- GHashTable *new_secrets, /* NULL for save & delete */
+ GVariant *new_secrets, /* NULL for save & delete */
GError *error,
gpointer user_data);
diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c
index b4300e02c..af5dbe439 100644
--- a/src/settings/nm-settings-connection.c
+++ b/src/settings/nm-settings-connection.c
@@ -24,12 +24,10 @@
#include
#include
-#include
#include "nm-default.h"
#include "nm-settings-connection.h"
#include "nm-session-monitor.h"
-#include "nm-dbus-glib-types.h"
#include "nm-auth-utils.h"
#include "nm-auth-subject.h"
#include "nm-agent-manager.h"
@@ -37,10 +35,11 @@
#include "nm-core-internal.h"
#include "nm-audit-manager.h"
+#include "nmdbus-settings-connection.h"
+
#define SETTINGS_TIMESTAMPS_FILE NMSTATEDIR "/timestamps"
#define SETTINGS_SEEN_BSSIDS_FILE NMSTATEDIR "/seen-bssids"
-
#define _LOG_DOMAIN LOGD_SETTINGS
#define _LOG_PREFIX_NAME "settings-connection"
@@ -81,33 +80,6 @@
#define _LOGW(...) _LOG (LOGL_WARN , _LOG_DOMAIN, self, __VA_ARGS__)
#define _LOGE(...) _LOG (LOGL_ERR , _LOG_DOMAIN, self, __VA_ARGS__)
-
-static void impl_settings_connection_get_settings (NMSettingsConnection *self,
- DBusGMethodInvocation *context);
-
-static void impl_settings_connection_update (NMSettingsConnection *self,
- GHashTable *new_settings,
- DBusGMethodInvocation *context);
-
-static void impl_settings_connection_update_unsaved (NMSettingsConnection *self,
- GHashTable *new_settings,
- DBusGMethodInvocation *context);
-
-static void impl_settings_connection_save (NMSettingsConnection *self,
- DBusGMethodInvocation *context);
-
-static void impl_settings_connection_delete (NMSettingsConnection *self,
- DBusGMethodInvocation *context);
-
-static void impl_settings_connection_get_secrets (NMSettingsConnection *self,
- const gchar *setting_name,
- DBusGMethodInvocation *context);
-
-static void impl_settings_connection_clear_secrets (NMSettingsConnection *self,
- DBusGMethodInvocation *context);
-
-#include "nm-settings-connection-glue.h"
-
static void nm_settings_connection_connection_interface_init (NMConnectionInterface *iface);
G_DEFINE_TYPE_WITH_CODE (NMSettingsConnection, nm_settings_connection, NM_TYPE_EXPORTED_OBJECT,
@@ -183,88 +155,93 @@ typedef struct {
typedef gboolean (*ForEachSecretFunc) (NMSettingSecretFlags flags,
gpointer user_data);
-static void
+static GVariant *
for_each_secret (NMConnection *self,
- GHashTable *secrets,
+ GVariant *secrets,
gboolean remove_non_secrets,
ForEachSecretFunc callback,
gpointer callback_data)
{
- GHashTableIter iter;
+ GVariantBuilder secrets_builder, setting_builder;
+ GVariantIter secrets_iter, *setting_iter;
const char *setting_name;
- GHashTable *setting_hash;
- /* This function, given a hash of hashes representing new secrets of
- * an NMConnection, walks through each toplevel hash (which represents a
- * NMSetting), and for each setting, walks through that setting hash's
+ /* This function, given a dict of dicts representing new secrets of
+ * an NMConnection, walks through each toplevel dict (which represents a
+ * NMSetting), and for each setting, walks through that setting dict's
* properties. For each property that's a secret, it will check that
* secret's flags in the backing NMConnection object, and call a supplied
* callback.
*
* The one complexity is that the VPN setting's 'secrets' property is
- * *also* a hash table (since the key/value pairs are arbitrary and known
+ * *also* a dict (since the key/value pairs are arbitrary and known
* only to the VPN plugin itself). That means we have three levels of
- * GHashTables that we potentially have to traverse here. When we hit the
+ * dicts that we potentially have to traverse here. When we hit the
* VPN setting's 'secrets' property, we special-case that and iterate over
- * each item in that 'secrets' hash table, calling the supplied callback
+ * each item in that 'secrets' dict, calling the supplied callback
* each time.
*/
- g_return_if_fail (callback);
+ g_return_val_if_fail (callback, NULL);
- /* Walk through the list of setting hashes */
- g_hash_table_iter_init (&iter, secrets);
- while (g_hash_table_iter_next (&iter, (gpointer) &setting_name, (gpointer) &setting_hash)) {
+ g_variant_iter_init (&secrets_iter, secrets);
+ g_variant_builder_init (&secrets_builder, NM_VARIANT_TYPE_CONNECTION);
+ while (g_variant_iter_next (&secrets_iter, "{&sa{sv}}", &setting_name, &setting_iter)) {
NMSetting *setting;
- GHashTableIter secret_iter;
const char *secret_name;
- GValue *val;
+ GVariant *val;
- if (g_hash_table_size (setting_hash) == 0)
- continue;
-
- /* Get the actual NMSetting from the connection so we can get secret flags
- * from the connection data, since flags aren't secrets. What we're
- * iterating here is just the secrets, not a whole connection.
- */
setting = nm_connection_get_setting_by_name (self, setting_name);
- if (setting == NULL)
+ if (setting == NULL) {
+ g_variant_iter_free (setting_iter);
continue;
+ }
- /* Walk through the list of keys in each setting hash */
- g_hash_table_iter_init (&secret_iter, setting_hash);
- while (g_hash_table_iter_next (&secret_iter, (gpointer) &secret_name, (gpointer) &val)) {
+ g_variant_builder_init (&setting_builder, NM_VARIANT_TYPE_SETTING);
+ while (g_variant_iter_next (setting_iter, "{sv}", &secret_name, &val)) {
NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE;
/* VPN secrets need slightly different treatment here since the
* "secrets" property is actually a hash table of secrets.
*/
- if (NM_IS_SETTING_VPN (setting) && (g_strcmp0 (secret_name, NM_SETTING_VPN_SECRETS) == 0)) {
- GHashTableIter vpn_secrets_iter;
+ if (NM_IS_SETTING_VPN (setting) && !g_strcmp0 (secret_name, NM_SETTING_VPN_SECRETS)) {
+ GVariantBuilder vpn_secrets_builder;
+ GVariantIter vpn_secrets_iter;
+ const char *vpn_secret_name, *secret;
- /* Iterate through each secret from the VPN hash in the overall secrets hash */
- g_hash_table_iter_init (&vpn_secrets_iter, g_value_get_boxed (val));
- while (g_hash_table_iter_next (&vpn_secrets_iter, (gpointer) &secret_name, NULL)) {
- secret_flags = NM_SETTING_SECRET_FLAG_NONE;
- if (!nm_setting_get_secret_flags (setting, secret_name, &secret_flags, NULL)) {
- if (remove_non_secrets)
- g_hash_table_iter_remove (&vpn_secrets_iter);
+ /* Iterate through each secret from the VPN dict in the overall secrets dict */
+ g_variant_builder_init (&vpn_secrets_builder, G_VARIANT_TYPE ("a{ss}"));
+ g_variant_iter_init (&vpn_secrets_iter, val);
+ while (g_variant_iter_next (&vpn_secrets_iter, "{&s&s}", &vpn_secret_name, &secret)) {
+ if (!nm_setting_get_secret_flags (setting, vpn_secret_name, &secret_flags, NULL)) {
+ if (!remove_non_secrets)
+ g_variant_builder_add (&vpn_secrets_builder, "{ss}", vpn_secret_name, secret);
continue;
}
- if (!callback (secret_flags, callback_data))
- g_hash_table_iter_remove (&vpn_secrets_iter);
+
+ if (callback (secret_flags, callback_data))
+ g_variant_builder_add (&vpn_secrets_builder, "{ss}", vpn_secret_name, secret);
}
+
+ g_variant_builder_add (&setting_builder, "{sv}",
+ secret_name, g_variant_builder_end (&vpn_secrets_builder));
} else {
if (!nm_setting_get_secret_flags (setting, secret_name, &secret_flags, NULL)) {
- if (remove_non_secrets)
- g_hash_table_iter_remove (&secret_iter);
+ if (!remove_non_secrets)
+ g_variant_builder_add (&setting_builder, "{sv}", secret_name, val);
continue;
}
- if (!callback (secret_flags, callback_data))
- g_hash_table_iter_remove (&secret_iter);
+ if (callback (secret_flags, callback_data))
+ g_variant_builder_add (&setting_builder, "{sv}", secret_name, val);
}
+ g_variant_unref (val);
}
+
+ g_variant_iter_free (setting_iter);
+ g_variant_builder_add (&secrets_builder, "{sa{sv}}", setting_name, &setting_builder);
}
+
+ return g_variant_builder_end (&secrets_builder);
}
typedef gboolean (*FindSecretFunc) (NMSettingSecretFlags flags,
@@ -284,22 +261,24 @@ find_secret_for_each_func (NMSettingSecretFlags flags,
if (!data->found)
data->found = data->find_func (flags, data->find_func_data);
- return TRUE;
+ return FALSE;
}
static gboolean
find_secret (NMConnection *self,
- GHashTable *secrets,
+ GVariant *secrets,
FindSecretFunc callback,
gpointer callback_data)
{
FindSecretData data;
+ GVariant *dummy;
data.find_func = callback;
data.find_func_data = callback_data;
data.found = FALSE;
- for_each_secret (self, secrets, FALSE, find_secret_for_each_func, &data);
+ dummy = for_each_secret (self, secrets, FALSE, find_secret_for_each_func, &data);
+ g_variant_unref (dummy);
return data.found;
}
@@ -836,7 +815,7 @@ agent_secrets_done_cb (NMAgentManager *manager,
gboolean agent_has_modify,
const char *setting_name,
NMSecretAgentGetSecretsFlags flags,
- GHashTable *secrets,
+ GVariant *secrets,
GError *error,
gpointer user_data,
gpointer other_data2,
@@ -925,21 +904,19 @@ agent_secrets_done_cb (NMAgentManager *manager,
| NM_SETTING_SECRET_FLAG_NOT_REQUIRED);
}
- for_each_secret (NM_CONNECTION (self), secrets, TRUE, validate_secret_flags, &cmp_flags);
-
/* Update the connection with our existing secrets from backing storage */
nm_connection_clear_secrets (NM_CONNECTION (self));
dict = nm_connection_to_dbus (priv->system_secrets, NM_CONNECTION_SERIALIZE_ONLY_SECRETS);
if (!dict || nm_connection_update_secrets (NM_CONNECTION (self), setting_name, dict, &local)) {
- GVariant *secrets_dict;
+ GVariant *filtered_secrets;
/* Update the connection with the agent's secrets; by this point if any
* system-owned secrets exist in 'secrets' the agent that provided them
* will have been authenticated, so those secrets can replace the existing
* system secrets.
*/
- secrets_dict = nm_utils_connection_hash_to_dict (secrets);
- if (nm_connection_update_secrets (NM_CONNECTION (self), setting_name, secrets_dict, &local)) {
+ filtered_secrets = for_each_secret (NM_CONNECTION (self), secrets, TRUE, validate_secret_flags, &cmp_flags);
+ if (nm_connection_update_secrets (NM_CONNECTION (self), setting_name, filtered_secrets, &local)) {
/* Now that all secrets are updated, copy and cache new secrets,
* then save them to backing storage.
*/
@@ -962,6 +939,8 @@ agent_secrets_done_cb (NMAgentManager *manager,
setting_name,
call_id);
}
+
+ g_variant_unref (filtered_secrets);
} else {
_LOGD ("(%s:%u) failed to update with agent secrets: (%d) %s",
setting_name,
@@ -969,7 +948,6 @@ agent_secrets_done_cb (NMAgentManager *manager,
local ? local->code : -1,
(local && local->message) ? local->message : "(unknown)");
}
- g_variant_unref (secrets_dict);
} else {
_LOGD ("(%s:%u) failed to update with existing secrets: (%d) %s",
setting_name,
@@ -1012,7 +990,6 @@ nm_settings_connection_get_secrets (NMSettingsConnection *self,
{
NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self);
GVariant *existing_secrets;
- GHashTable *existing_secrets_hash;
guint32 call_id = 0;
gs_free char *joined_hints = NULL;
@@ -1035,11 +1012,12 @@ nm_settings_connection_get_secrets (NMSettingsConnection *self,
}
existing_secrets = nm_connection_to_dbus (priv->system_secrets, NM_CONNECTION_SERIALIZE_ONLY_SECRETS);
- existing_secrets_hash = nm_utils_connection_dict_to_hash (existing_secrets);
+ if (existing_secrets)
+ g_variant_ref_sink (existing_secrets);
call_id = nm_agent_manager_get_secrets (priv->agent_mgr,
NM_CONNECTION (self),
subject,
- existing_secrets_hash,
+ existing_secrets,
setting_name,
flags,
hints,
@@ -1047,8 +1025,6 @@ nm_settings_connection_get_secrets (NMSettingsConnection *self,
self,
callback,
callback_data);
- if (existing_secrets_hash)
- g_hash_table_unref (existing_secrets_hash);
if (existing_secrets)
g_variant_unref (existing_secrets);
@@ -1077,7 +1053,7 @@ nm_settings_connection_cancel_secrets (NMSettingsConnection *self,
/**** User authorization **************************************/
typedef void (*AuthCallback) (NMSettingsConnection *self,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
NMAuthSubject *subject,
GError *error,
gpointer data);
@@ -1085,7 +1061,7 @@ typedef void (*AuthCallback) (NMSettingsConnection *self,
static void
pk_auth_cb (NMAuthChain *chain,
GError *chain_error,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
gpointer user_data)
{
NMSettingsConnection *self = NM_SETTINGS_CONNECTION (user_data);
@@ -1134,7 +1110,7 @@ pk_auth_cb (NMAuthChain *chain,
* Returns: the #NMAuthSubject on success, or %NULL on failure and sets @error
*/
static NMAuthSubject *
-_new_auth_subject (DBusGMethodInvocation *context, GError **error)
+_new_auth_subject (GDBusMethodInvocation *context, GError **error)
{
NMAuthSubject *subject;
@@ -1151,7 +1127,7 @@ _new_auth_subject (DBusGMethodInvocation *context, GError **error)
static void
auth_start (NMSettingsConnection *self,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
NMAuthSubject *subject,
const char *check_permission,
AuthCallback callback,
@@ -1239,16 +1215,15 @@ check_writable (NMConnection *self, GError **error)
static void
get_settings_auth_cb (NMSettingsConnection *self,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
NMAuthSubject *subject,
GError *error,
gpointer data)
{
if (error)
- dbus_g_method_return_error (context, error);
+ g_dbus_method_invocation_return_gerror (context, error);
else {
GVariant *settings;
- GHashTable *settings_hash;
NMConnection *dupl_con;
NMSettingConnection *s_con;
NMSettingWireless *s_wifi;
@@ -1286,17 +1261,15 @@ get_settings_auth_cb (NMSettingsConnection *self,
*/
settings = nm_connection_to_dbus (NM_CONNECTION (dupl_con), NM_CONNECTION_SERIALIZE_NO_SECRETS);
g_assert (settings);
- settings_hash = nm_utils_connection_dict_to_hash (settings);
- dbus_g_method_return (context, settings_hash);
- g_hash_table_destroy (settings_hash);
- g_variant_unref (settings);
+ g_dbus_method_invocation_return_value (context,
+ g_variant_new ("(@a{sa{sv}})", settings));
g_object_unref (dupl_con);
}
}
static void
impl_settings_connection_get_settings (NMSettingsConnection *self,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context)
{
NMAuthSubject *subject;
GError *error = NULL;
@@ -1305,14 +1278,12 @@ impl_settings_connection_get_settings (NMSettingsConnection *self,
if (subject) {
auth_start (self, context, subject, NULL, get_settings_auth_cb, NULL);
g_object_unref (subject);
- } else {
- dbus_g_method_return_error (context, error);
- g_error_free (error);
- }
+ } else
+ g_dbus_method_invocation_take_error (context, error);
}
typedef struct {
- DBusGMethodInvocation *context;
+ GDBusMethodInvocation *context;
NMAgentManager *agent_mgr;
NMAuthSubject *subject;
NMConnection *new_settings;
@@ -1320,7 +1291,7 @@ typedef struct {
} UpdateInfo;
typedef struct {
- DBusGMethodInvocation *context;
+ GDBusMethodInvocation *context;
NMAuthSubject *subject;
} CallbackInfo;
@@ -1384,9 +1355,9 @@ update_complete (NMSettingsConnection *self,
GError *error)
{
if (error)
- dbus_g_method_return_error (info->context, error);
+ g_dbus_method_invocation_return_gerror (info->context, error);
else
- dbus_g_method_return (info->context);
+ g_dbus_method_invocation_return_value (info->context, NULL);
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_UPDATE, NM_CONNECTION (self), !error,
info->subject, error ? error->message : NULL);
@@ -1424,7 +1395,7 @@ con_update_cb (NMSettingsConnection *self,
static void
update_auth_cb (NMSettingsConnection *self,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
NMAuthSubject *subject,
GError *error,
gpointer data)
@@ -1492,8 +1463,8 @@ get_update_modify_permission (NMConnection *old, NMConnection *new)
static void
impl_settings_connection_update_helper (NMSettingsConnection *self,
- GHashTable *new_settings,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
+ GVariant *new_settings,
gboolean save_to_disk)
{
NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self);
@@ -1515,14 +1486,9 @@ impl_settings_connection_update_helper (NMSettingsConnection *self,
/* Check if the settings are valid first */
if (new_settings) {
- GVariant *new_settings_dict = nm_utils_connection_hash_to_dict (new_settings);
-
- tmp = nm_simple_connection_new_from_dbus (new_settings_dict, &error);
- g_variant_unref (new_settings_dict);
- if (!tmp) {
- g_assert (error);
+ tmp = nm_simple_connection_new_from_dbus (new_settings, &error);
+ if (!tmp)
goto error;
- }
}
subject = _new_auth_subject (context, &error);
@@ -1562,37 +1528,34 @@ error:
g_clear_object (&tmp);
g_clear_object (&subject);
- dbus_g_method_return_error (context, error);
- g_clear_error (&error);
+ g_dbus_method_invocation_take_error (context, error);
}
static void
impl_settings_connection_update (NMSettingsConnection *self,
- GHashTable *new_settings,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context,
+ GVariant *new_settings)
{
- g_assert (new_settings);
- impl_settings_connection_update_helper (self, new_settings, context, TRUE);
+ impl_settings_connection_update_helper (self, context, new_settings, TRUE);
}
static void
impl_settings_connection_update_unsaved (NMSettingsConnection *self,
- GHashTable *new_settings,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context,
+ GVariant *new_settings)
{
- g_assert (new_settings);
- impl_settings_connection_update_helper (self, new_settings, context, FALSE);
+ impl_settings_connection_update_helper (self, context, new_settings, FALSE);
}
static void
impl_settings_connection_save (NMSettingsConnection *self,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context)
{
/* Do nothing if the connection is already synced with disk */
if (nm_settings_connection_get_unsaved (self))
- impl_settings_connection_update_helper (self, NULL, context, TRUE);
+ impl_settings_connection_update_helper (self, context, NULL, TRUE);
else
- dbus_g_method_return (context);
+ g_dbus_method_invocation_return_value (context, NULL);
}
static void
@@ -1603,9 +1566,9 @@ con_delete_cb (NMSettingsConnection *self,
CallbackInfo *info = user_data;
if (error)
- dbus_g_method_return_error (info->context, error);
+ g_dbus_method_invocation_return_gerror (info->context, error);
else
- dbus_g_method_return (info->context);
+ g_dbus_method_invocation_return_value (info->context, NULL);
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_DELETE, NM_CONNECTION (self),
!error, info->subject, error ? error->message : NULL);
@@ -1614,7 +1577,7 @@ con_delete_cb (NMSettingsConnection *self,
static void
delete_auth_cb (NMSettingsConnection *self,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
NMAuthSubject *subject,
GError *error,
gpointer data)
@@ -1624,7 +1587,7 @@ delete_auth_cb (NMSettingsConnection *self,
if (error) {
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_DELETE, NM_CONNECTION (self), FALSE, subject,
error->message);
- dbus_g_method_return_error (context, error);
+ g_dbus_method_invocation_return_gerror (context, error);
return;
}
@@ -1654,7 +1617,7 @@ get_modify_permission_basic (NMSettingsConnection *self)
static void
impl_settings_connection_delete (NMSettingsConnection *self,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context)
{
NMAuthSubject *subject = NULL;
GError *error = NULL;
@@ -1671,9 +1634,8 @@ impl_settings_connection_delete (NMSettingsConnection *self,
return;
out_err:
- dbus_g_method_return_error (context, error);
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_DELETE, NM_CONNECTION (self), FALSE, subject, error->message);
- g_error_free (error);
+ g_dbus_method_invocation_take_error (context, error);
}
/**************************************************************/
@@ -1687,14 +1649,13 @@ dbus_get_agent_secrets_cb (NMSettingsConnection *self,
gpointer user_data)
{
NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self);
- DBusGMethodInvocation *context = user_data;
+ GDBusMethodInvocation *context = user_data;
GVariant *dict;
- GHashTable *hash;
priv->reqs = g_slist_remove (priv->reqs, GUINT_TO_POINTER (call_id));
if (error)
- dbus_g_method_return_error (context, error);
+ g_dbus_method_invocation_return_gerror (context, error);
else {
/* Return secrets from agent and backing storage to the D-Bus caller;
* nm_settings_connection_get_secrets() will have updated itself with
@@ -1702,20 +1663,15 @@ dbus_get_agent_secrets_cb (NMSettingsConnection *self,
* by the time we get here.
*/
dict = nm_connection_to_dbus (NM_CONNECTION (self), NM_CONNECTION_SERIALIZE_ONLY_SECRETS);
- if (dict)
- hash = nm_utils_connection_dict_to_hash (dict);
- else
- hash = g_hash_table_new (NULL, NULL);
- dbus_g_method_return (context, hash);
- g_hash_table_destroy (hash);
- if (dict)
- g_variant_unref (dict);
+ if (!dict)
+ dict = g_variant_new_array (G_VARIANT_TYPE ("{sa{sv}}"), NULL, 0);
+ g_dbus_method_invocation_return_value (context, g_variant_new ("(@a{s{a{sv}}})", dict));
}
}
static void
dbus_get_secrets_auth_cb (NMSettingsConnection *self,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
NMAuthSubject *subject,
GError *error,
gpointer user_data)
@@ -1742,7 +1698,7 @@ dbus_get_secrets_auth_cb (NMSettingsConnection *self,
}
if (error || local) {
- dbus_g_method_return_error (context, error ? error : local);
+ g_dbus_method_invocation_return_gerror (context, error ? error : local);
g_clear_error (&local);
}
@@ -1751,8 +1707,8 @@ dbus_get_secrets_auth_cb (NMSettingsConnection *self,
static void
impl_settings_connection_get_secrets (NMSettingsConnection *self,
- const gchar *setting_name,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context,
+ const gchar *setting_name)
{
NMAuthSubject *subject;
GError *error = NULL;
@@ -1766,10 +1722,8 @@ impl_settings_connection_get_secrets (NMSettingsConnection *self,
dbus_get_secrets_auth_cb,
g_strdup (setting_name));
g_object_unref (subject);
- } else {
- dbus_g_method_return_error (context, error);
- g_error_free (error);
- }
+ } else
+ g_dbus_method_invocation_take_error (context, error);
}
static void
@@ -1780,9 +1734,9 @@ clear_secrets_cb (NMSettingsConnection *self,
CallbackInfo *info = user_data;
if (error)
- dbus_g_method_return_error (info->context, error);
+ g_dbus_method_invocation_return_gerror (info->context, error);
else
- dbus_g_method_return (info->context);
+ g_dbus_method_invocation_return_value (info->context, NULL);
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_CLEAR_SECRETS, NM_CONNECTION (self),
!error, info->subject, error ? error->message : NULL);
@@ -1791,7 +1745,7 @@ clear_secrets_cb (NMSettingsConnection *self,
static void
dbus_clear_secrets_auth_cb (NMSettingsConnection *self,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
NMAuthSubject *subject,
GError *error,
gpointer user_data)
@@ -1800,7 +1754,7 @@ dbus_clear_secrets_auth_cb (NMSettingsConnection *self,
CallbackInfo *info;
if (error) {
- dbus_g_method_return_error (context, error);
+ g_dbus_method_invocation_return_gerror (context, error);
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_CLEAR_SECRETS, NM_CONNECTION (self),
FALSE, subject, error->message);
} else {
@@ -1824,7 +1778,7 @@ dbus_clear_secrets_auth_cb (NMSettingsConnection *self,
static void
impl_settings_connection_clear_secrets (NMSettingsConnection *self,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context)
{
NMAuthSubject *subject;
GError *error = NULL;
@@ -1839,10 +1793,9 @@ impl_settings_connection_clear_secrets (NMSettingsConnection *self,
NULL);
g_object_unref (subject);
} else {
- dbus_g_method_return_error (context, error);
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_CLEAR_SECRETS, NM_CONNECTION (self),
FALSE, NULL, error->message);
- g_error_free (error);
+ g_dbus_method_invocation_take_error (context, error);
}
}
@@ -2586,7 +2539,15 @@ nm_settings_connection_class_init (NMSettingsConnectionClass *class)
G_TYPE_NONE, 0);
nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (class),
- &dbus_glib_nm_settings_connection_object_info);
+ NMDBUS_TYPE_SETTINGS_CONNECTION_SKELETON,
+ "Update", impl_settings_connection_update,
+ "UpdateUnsaved", impl_settings_connection_update_unsaved,
+ "Delete", impl_settings_connection_delete,
+ "GetSettings", impl_settings_connection_get_settings,
+ "GetSecrets", impl_settings_connection_get_secrets,
+ "ClearSecrets", impl_settings_connection_clear_secrets,
+ "Save", impl_settings_connection_save,
+ NULL);
}
static void
diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c
index 0988e1cc0..a7b37d5a1 100644
--- a/src/settings/nm-settings.c
+++ b/src/settings/nm-settings.c
@@ -31,8 +31,6 @@
#include
#include
#include
-#include
-#include
#if HAVE_SELINUX
#include
@@ -61,7 +59,6 @@
#include "nm-core-internal.h"
#include "nm-device-ethernet.h"
-#include "nm-dbus-glib-types.h"
#include "nm-settings.h"
#include "nm-settings-connection.h"
#include "nm-system-config-interface.h"
@@ -78,6 +75,8 @@
#include "NetworkManagerUtils.h"
#include "nm-dispatcher.h"
+#include "nmdbus-settings.h"
+
#define LOG(level, ...) \
G_STMT_START { \
nm_log ((level), LOGD_CORE, \
@@ -122,35 +121,6 @@ EXPORT(nm_settings_connection_replace_and_commit)
static void claim_connection (NMSettings *self,
NMSettingsConnection *connection);
-static gboolean impl_settings_list_connections (NMSettings *self,
- GPtrArray **connections,
- GError **error);
-
-static void impl_settings_get_connection_by_uuid (NMSettings *self,
- const char *uuid,
- DBusGMethodInvocation *context);
-
-static void impl_settings_add_connection (NMSettings *self,
- GHashTable *settings,
- DBusGMethodInvocation *context);
-
-static void impl_settings_add_connection_unsaved (NMSettings *self,
- GHashTable *settings,
- DBusGMethodInvocation *context);
-
-static void impl_settings_load_connections (NMSettings *self,
- char **filenames,
- DBusGMethodInvocation *context);
-
-static void impl_settings_reload_connections (NMSettings *self,
- DBusGMethodInvocation *context);
-
-static void impl_settings_save_hostname (NMSettings *self,
- const char *hostname,
- DBusGMethodInvocation *context);
-
-#include "nm-settings-glue.h"
-
static void unmanaged_specs_changed (NMSystemConfigInterface *config, gpointer user_data);
static void unrecognized_specs_changed (NMSystemConfigInterface *config, gpointer user_data);
@@ -161,8 +131,6 @@ G_DEFINE_TYPE_EXTENDED (NMSettings, nm_settings, NM_TYPE_EXPORTED_OBJECT, 0,
typedef struct {
- NMBusManager *dbus_mgr;
-
NMAgentManager *agent_mgr;
NMConfig *config;
@@ -310,20 +278,24 @@ nm_settings_for_each_connection (NMSettings *self,
for_each_func (self, NM_SETTINGS_CONNECTION (data), user_data);
}
-static gboolean
+static void
impl_settings_list_connections (NMSettings *self,
- GPtrArray **connections,
- GError **error)
+ GDBusMethodInvocation *context)
{
NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
+ GPtrArray *connections;
GHashTableIter iter;
gpointer key;
- *connections = g_ptr_array_sized_new (g_hash_table_size (priv->connections) + 1);
+ connections = g_ptr_array_sized_new (g_hash_table_size (priv->connections) + 1);
g_hash_table_iter_init (&iter, priv->connections);
while (g_hash_table_iter_next (&iter, &key, NULL))
- g_ptr_array_add (*connections, g_strdup ((const char *) key));
- return TRUE;
+ g_ptr_array_add (connections, key);
+ g_ptr_array_add (connections, NULL);
+
+ g_dbus_method_invocation_return_value (context,
+ g_variant_new ("(^ao)", connections->pdata));
+ g_ptr_array_unref (connections);
}
NMSettingsConnection *
@@ -349,8 +321,8 @@ nm_settings_get_connection_by_uuid (NMSettings *self, const char *uuid)
static void
impl_settings_get_connection_by_uuid (NMSettings *self,
- const char *uuid,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context,
+ const char *uuid)
{
NMSettingsConnection *connection = NULL;
NMAuthSubject *subject = NULL;
@@ -384,13 +356,14 @@ impl_settings_get_connection_by_uuid (NMSettings *self,
}
g_clear_object (&subject);
- dbus_g_method_return (context, nm_connection_get_path (NM_CONNECTION (connection)));
+ g_dbus_method_invocation_return_value (
+ context,
+ g_variant_new ("(o)", nm_connection_get_path (NM_CONNECTION (connection))));
return;
error:
g_assert (error);
- dbus_g_method_return_error (context, error);
- g_error_free (error);
+ g_dbus_method_invocation_take_error (context, error);
g_clear_object (&subject);
}
@@ -1189,7 +1162,7 @@ send_agent_owned_secrets (NMSettings *self,
static void
pk_add_cb (NMAuthChain *chain,
GError *chain_error,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
gpointer user_data)
{
NMSettings *self = NM_SETTINGS (user_data);
@@ -1277,11 +1250,11 @@ is_adhoc_wpa (NMConnection *connection)
void
nm_settings_add_connection_dbus (NMSettings *self,
- NMConnection *connection,
- gboolean save_to_disk,
- DBusGMethodInvocation *context,
- NMSettingsAddCallback callback,
- gpointer user_data)
+ NMConnection *connection,
+ gboolean save_to_disk,
+ GDBusMethodInvocation *context,
+ NMSettingsAddCallback callback,
+ gpointer user_data)
{
NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
NMSettingConnection *s_con;
@@ -1385,15 +1358,17 @@ static void
impl_settings_add_connection_add_cb (NMSettings *self,
NMSettingsConnection *connection,
GError *error,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
NMAuthSubject *subject,
gpointer user_data)
{
if (error) {
- dbus_g_method_return_error (context, error);
+ g_dbus_method_invocation_return_gerror (context, error);
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ADD, NULL, FALSE, subject, error->message);
} else {
- dbus_g_method_return (context, nm_connection_get_path (NM_CONNECTION (connection)));
+ g_dbus_method_invocation_return_value (
+ context,
+ g_variant_new ("(o)", nm_connection_get_path (NM_CONNECTION (connection))));
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ADD, NM_CONNECTION (connection), TRUE,
subject, NULL);
}
@@ -1401,17 +1376,14 @@ impl_settings_add_connection_add_cb (NMSettings *self,
static void
impl_settings_add_connection_helper (NMSettings *self,
- GHashTable *settings,
- gboolean save_to_disk,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context,
+ GVariant *settings,
+ gboolean save_to_disk)
{
NMConnection *connection;
- GVariant *dict;
GError *error = NULL;
- dict = nm_utils_connection_hash_to_dict (settings);
- connection = nm_simple_connection_new_from_dbus (dict, &error);
- g_variant_unref (dict);
+ connection = nm_simple_connection_new_from_dbus (settings, &error);
if (connection) {
nm_settings_add_connection_dbus (self,
connection,
@@ -1422,30 +1394,29 @@ impl_settings_add_connection_helper (NMSettings *self,
g_object_unref (connection);
} else {
g_assert (error);
- dbus_g_method_return_error (context, error);
- g_error_free (error);
+ g_dbus_method_invocation_take_error (context, error);
}
}
static void
impl_settings_add_connection (NMSettings *self,
- GHashTable *settings,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context,
+ GVariant *settings)
{
- impl_settings_add_connection_helper (self, settings, TRUE, context);
+ impl_settings_add_connection_helper (self, context, settings, TRUE);
}
static void
impl_settings_add_connection_unsaved (NMSettings *self,
- GHashTable *settings,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context,
+ GVariant *settings)
{
- impl_settings_add_connection_helper (self, settings, FALSE, context);
+ impl_settings_add_connection_helper (self, context, settings, FALSE);
}
static gboolean
ensure_root (NMBusManager *dbus_mgr,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context)
{
gulong caller_uid;
GError *error = NULL;
@@ -1454,16 +1425,14 @@ ensure_root (NMBusManager *dbus_mgr,
error = g_error_new_literal (NM_SETTINGS_ERROR,
NM_SETTINGS_ERROR_PERMISSION_DENIED,
"Unable to determine request UID.");
- dbus_g_method_return_error (context, error);
- g_error_free (error);
+ g_dbus_method_invocation_take_error (context, error);
return FALSE;
}
if (caller_uid != 0) {
error = g_error_new_literal (NM_SETTINGS_ERROR,
NM_SETTINGS_ERROR_PERMISSION_DENIED,
"Permission denied");
- dbus_g_method_return_error (context, error);
- g_error_free (error);
+ g_dbus_method_invocation_take_error (context, error);
return FALSE;
}
@@ -1472,15 +1441,15 @@ ensure_root (NMBusManager *dbus_mgr,
static void
impl_settings_load_connections (NMSettings *self,
- char **filenames,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context,
+ char **filenames)
{
NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
GPtrArray *failures;
GSList *iter;
int i;
- if (!ensure_root (priv->dbus_mgr, context))
+ if (!ensure_root (nm_bus_manager_get (), context))
return;
failures = g_ptr_array_new ();
@@ -1501,18 +1470,22 @@ impl_settings_load_connections (NMSettings *self,
}
g_ptr_array_add (failures, NULL);
- dbus_g_method_return (context, failures->len == 1, failures->pdata);
+ g_dbus_method_invocation_return_value (
+ context,
+ g_variant_new ("(b^as)",
+ failures->len == 1,
+ failures->pdata));
g_ptr_array_unref (failures);
}
static void
impl_settings_reload_connections (NMSettings *self,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context)
{
NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
GSList *iter;
- if (!ensure_root (priv->dbus_mgr, context))
+ if (!ensure_root (nm_bus_manager_get (), context))
return;
for (iter = priv->plugins; iter; iter = g_slist_next (iter)) {
@@ -1521,7 +1494,7 @@ impl_settings_reload_connections (NMSettings *self,
nm_system_config_interface_reload_connections (plugin);
}
- dbus_g_method_return (context, TRUE);
+ g_dbus_method_invocation_return_value (context, g_variant_new ("(b)", TRUE));
}
static gboolean
@@ -1594,7 +1567,7 @@ write_hostname (NMSettingsPrivate *priv, const char *hostname)
static void
pk_hostname_cb (NMAuthChain *chain,
GError *chain_error,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
gpointer user_data)
{
NMSettings *self = NM_SETTINGS (user_data);
@@ -1630,11 +1603,10 @@ pk_hostname_cb (NMAuthChain *chain,
}
if (error)
- dbus_g_method_return_error (context, error);
+ g_dbus_method_invocation_take_error (context, error);
else
- dbus_g_method_return (context);
+ g_dbus_method_invocation_return_value (context, NULL);
- g_clear_error (&error);
nm_auth_chain_unref (chain);
}
@@ -1667,8 +1639,8 @@ validate_hostname (const char *hostname)
static void
impl_settings_save_hostname (NMSettings *self,
- const char *hostname,
- DBusGMethodInvocation *context)
+ GDBusMethodInvocation *context,
+ const char *hostname)
{
NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
NMAuthChain *chain;
@@ -1696,8 +1668,7 @@ impl_settings_save_hostname (NMSettings *self,
done:
if (error)
- dbus_g_method_return_error (context, error);
- g_clear_error (&error);
+ g_dbus_method_invocation_take_error (context, error);
}
static void
@@ -2108,7 +2079,6 @@ nm_settings_new (void)
priv = NM_SETTINGS_GET_PRIVATE (self);
priv->config = nm_config_get ();
- priv->dbus_mgr = nm_bus_manager_get ();
nm_exported_object_export (NM_EXPORTED_OBJECT (self));
return self;
@@ -2198,8 +2168,6 @@ dispose (GObject *object)
g_slist_free_full (priv->auths, (GDestroyNotify) nm_auth_chain_unref);
priv->auths = NULL;
- priv->dbus_mgr = NULL;
-
g_object_unref (priv->agent_mgr);
if (priv->hostname.hostnamed_proxy) {
@@ -2255,17 +2223,18 @@ get_property (GObject *object, guint prop_id,
NMSettings *self = NM_SETTINGS (object);
NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
const GSList *specs, *iter;
- GSList *copy = NULL;
GHashTableIter citer;
GPtrArray *array;
const char *path;
switch (prop_id) {
case PROP_UNMANAGED_SPECS:
+ array = g_ptr_array_new ();
specs = nm_settings_get_unmanaged_specs (self);
for (iter = specs; iter; iter = g_slist_next (iter))
- copy = g_slist_append (copy, g_strdup (iter->data));
- g_value_take_boxed (value, copy);
+ g_ptr_array_add (array, g_strdup (iter->data));
+ g_ptr_array_add (array, NULL);
+ g_value_take_boxed (value, (char **) g_ptr_array_free (array, FALSE));
break;
case PROP_HOSTNAME:
g_value_take_string (value, nm_settings_get_hostname (self));
@@ -2278,11 +2247,12 @@ get_property (GObject *object, guint prop_id,
g_value_set_boolean (value, !!get_plugin (self, NM_SYSTEM_CONFIG_INTERFACE_CAP_MODIFY_CONNECTIONS));
break;
case PROP_CONNECTIONS:
- array = g_ptr_array_sized_new (g_hash_table_size (priv->connections));
+ array = g_ptr_array_sized_new (g_hash_table_size (priv->connections) + 1);
g_hash_table_iter_init (&citer, priv->connections);
while (g_hash_table_iter_next (&citer, (gpointer) &path, NULL))
g_ptr_array_add (array, g_strdup (path));
- g_value_take_boxed (value, array);
+ g_ptr_array_add (array, NULL);
+ g_value_take_boxed (value, (char **) g_ptr_array_free (array, FALSE));
break;
case PROP_STARTUP_COMPLETE:
g_value_set_boolean (value, nm_settings_get_startup_complete (self));
@@ -2313,7 +2283,7 @@ nm_settings_class_init (NMSettingsClass *class)
g_object_class_install_property
(object_class, PROP_UNMANAGED_SPECS,
g_param_spec_boxed (NM_SETTINGS_UNMANAGED_SPECS, "", "",
- DBUS_TYPE_G_LIST_OF_STRING,
+ G_TYPE_STRV,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
@@ -2334,7 +2304,7 @@ nm_settings_class_init (NMSettingsClass *class)
g_object_class_install_property
(object_class, PROP_CONNECTIONS,
g_param_spec_boxed (NM_SETTINGS_CONNECTIONS, "", "",
- DBUS_TYPE_G_ARRAY_OF_OBJECT_PATH,
+ G_TYPE_STRV,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
@@ -2346,7 +2316,7 @@ nm_settings_class_init (NMSettingsClass *class)
G_STRUCT_OFFSET (NMSettingsClass, connection_added),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
+ G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
signals[CONNECTION_UPDATED] =
g_signal_new (NM_SETTINGS_SIGNAL_CONNECTION_UPDATED,
@@ -2355,7 +2325,7 @@ nm_settings_class_init (NMSettingsClass *class)
G_STRUCT_OFFSET (NMSettingsClass, connection_updated),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
+ G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
signals[CONNECTION_UPDATED_BY_USER] =
g_signal_new (NM_SETTINGS_SIGNAL_CONNECTION_UPDATED_BY_USER,
@@ -2364,7 +2334,7 @@ nm_settings_class_init (NMSettingsClass *class)
0,
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
+ G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
signals[CONNECTION_REMOVED] =
g_signal_new (NM_SETTINGS_SIGNAL_CONNECTION_REMOVED,
@@ -2373,7 +2343,7 @@ nm_settings_class_init (NMSettingsClass *class)
G_STRUCT_OFFSET (NMSettingsClass, connection_removed),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
+ G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
signals[CONNECTION_VISIBILITY_CHANGED] =
g_signal_new (NM_SETTINGS_SIGNAL_CONNECTION_VISIBILITY_CHANGED,
@@ -2382,7 +2352,7 @@ nm_settings_class_init (NMSettingsClass *class)
G_STRUCT_OFFSET (NMSettingsClass, connection_visibility_changed),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
+ G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
signals[AGENT_REGISTERED] =
g_signal_new (NM_SETTINGS_SIGNAL_AGENT_REGISTERED,
@@ -2391,7 +2361,7 @@ nm_settings_class_init (NMSettingsClass *class)
G_STRUCT_OFFSET (NMSettingsClass, agent_registered),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
+ G_TYPE_NONE, 1, NM_TYPE_SECRET_AGENT);
signals[NEW_CONNECTION] =
@@ -2399,16 +2369,17 @@ nm_settings_class_init (NMSettingsClass *class)
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST, 0, NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
+ G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (class),
- &dbus_glib_nm_settings_object_info);
-
- dbus_g_error_domain_register (NM_SETTINGS_ERROR,
- NM_DBUS_INTERFACE_SETTINGS,
- NM_TYPE_SETTINGS_ERROR);
- dbus_g_error_domain_register (NM_CONNECTION_ERROR,
- NM_DBUS_INTERFACE_SETTINGS_CONNECTION,
- NM_TYPE_CONNECTION_ERROR);
+ NMDBUS_TYPE_SETTINGS_SKELETON,
+ "ListConnections", impl_settings_list_connections,
+ "GetConnectionByUuid", impl_settings_get_connection_by_uuid,
+ "AddConnection", impl_settings_add_connection,
+ "AddConnectionUnsaved", impl_settings_add_connection_unsaved,
+ "LoadConnections", impl_settings_load_connections,
+ "ReloadConnections", impl_settings_reload_connections,
+ "SaveHostname", impl_settings_save_hostname,
+ NULL);
}
diff --git a/src/settings/nm-settings.h b/src/settings/nm-settings.h
index 8e2d32895..0801054d6 100644
--- a/src/settings/nm-settings.h
+++ b/src/settings/nm-settings.h
@@ -87,14 +87,14 @@ void nm_settings_for_each_connection (NMSettings *settings,
typedef void (*NMSettingsAddCallback) (NMSettings *settings,
NMSettingsConnection *connection,
GError *error,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
NMAuthSubject *subject,
gpointer user_data);
void nm_settings_add_connection_dbus (NMSettings *self,
NMConnection *connection,
gboolean save_to_disk,
- DBusGMethodInvocation *context,
+ GDBusMethodInvocation *context,
NMSettingsAddCallback callback,
gpointer user_data);