/** * nm_secret_agent_simple_response: * @self: the #NMSecretAgentSimple * @request_id: the request ID being responded to * @secrets: (allow-none): the array of secrets, or %NULL * * Response to a #NMSecretAgentSimple::get-secrets signal. * * If the user provided secrets, the caller should set the * corresponding <literal>value</literal> fields in the * #NMSecretAgentSimpleSecrets (freeing any initial values they had), and * pass the array to nm_secret_agent_simple_response(). If the user * cancelled the request, @secrets should be NULL. */ void nm_secret_agent_simple_response (NMSecretAgentSimple *self, const char *request_id, GPtrArray *secrets) { NMSecretAgentSimplePrivate *priv; NMSecretAgentSimpleRequest *request; GVariant *dict = NULL; GError *error = NULL; int i; g_return_if_fail (NM_IS_SECRET_AGENT_SIMPLE (self)); priv = NM_SECRET_AGENT_SIMPLE_GET_PRIVATE (self); request = g_hash_table_lookup (priv->requests, request_id); g_return_if_fail (request != NULL); if (secrets) { GVariantBuilder conn_builder, *setting_builder; GHashTable *settings; GHashTableIter iter; const char *name; settings = g_hash_table_new (g_str_hash, g_str_equal); for (i = 0; i < secrets->len; i++) { NMSecretAgentSimpleSecretReal *secret = secrets->pdata[i]; setting_builder = g_hash_table_lookup (settings, nm_setting_get_name (secret->setting)); if (!setting_builder) { setting_builder = g_variant_builder_new (NM_VARIANT_TYPE_SETTING); g_hash_table_insert (settings, (char *) nm_setting_get_name (secret->setting), setting_builder); } g_variant_builder_add (setting_builder, "{sv}", secret->property, g_variant_new_string (secret->base.value)); } g_variant_builder_init (&conn_builder, NM_VARIANT_TYPE_CONNECTION); g_hash_table_iter_init (&iter, settings); while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer *) &setting_builder)) g_variant_builder_add (&conn_builder, "{sa{sv}}", name, setting_builder); dict = g_variant_builder_end (&conn_builder); g_hash_table_destroy (settings); } else { error = g_error_new (NM_SECRET_AGENT_ERROR, NM_SECRET_AGENT_ERROR_USER_CANCELED, "User cancelled"); } request->callback (NM_SECRET_AGENT_OLD (self), request->connection, dict, error, request->callback_data); g_clear_error (&error); g_hash_table_remove (priv->requests, request_id); }
static void read_hash_of_string (GKeyFile *file, NMSetting *setting, const char *key) { char **keys, **iter; char *value; const char *setting_name = nm_setting_get_name (setting); keys = nm_keyfile_plugin_kf_get_keys (file, setting_name, NULL, NULL); if (!keys || !*keys) return; for (iter = keys; *iter; iter++) { value = nm_keyfile_plugin_kf_get_string (file, setting_name, *iter, NULL); if (!value) continue; if (NM_IS_SETTING_VPN (setting)) { if (strcmp (*iter, NM_SETTING_VPN_SERVICE_TYPE)) nm_setting_vpn_add_data_item (NM_SETTING_VPN (setting), *iter, value); } if (NM_IS_SETTING_BOND (setting)) { if (strcmp (*iter, NM_SETTING_BOND_INTERFACE_NAME)) nm_setting_bond_add_option (NM_SETTING_BOND (setting), *iter, value); } g_free (value); } g_strfreev (keys); }
static void ip4_dns_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path) { const char *setting_name = nm_setting_get_name (setting); GArray *array = NULL; gsize length; char **list, **iter; int ret; list = g_key_file_get_string_list (keyfile, setting_name, key, &length, NULL); if (!list || !g_strv_length (list)) return; array = g_array_sized_new (FALSE, FALSE, sizeof (guint32), length); for (iter = list; *iter; iter++) { struct in_addr addr; ret = inet_pton (AF_INET, *iter, &addr); if (ret <= 0) { g_warning ("%s: ignoring invalid DNS server address '%s'", __func__, *iter); continue; } g_array_append_val (array, addr.s_addr); } g_strfreev (list); if (array) { g_object_set (setting, key, array, NULL); g_array_unref (array); } }
static void ip4_dns_writer (GKeyFile *file, NMSetting *setting, const char *key, const GValue *value) { GArray *array; char **list; int i, num = 0; g_return_if_fail (G_VALUE_HOLDS (value, DBUS_TYPE_G_UINT_ARRAY)); array = (GArray *) g_value_get_boxed (value); if (!array || !array->len) return; list = g_new0 (char *, array->len + 1); for (i = 0; i < array->len; i++) { char buf[INET_ADDRSTRLEN + 1]; struct in_addr addr; addr.s_addr = g_array_index (array, guint32, i); if (!inet_ntop (AF_INET, &addr, buf, sizeof (buf))) { nm_warning ("%s: error converting IP4 address 0x%X", __func__, ntohl (addr.s_addr)); } else list[num++] = g_strdup (buf); } g_key_file_set_string_list (file, nm_setting_get_name (setting), key, (const char **) list, num); g_strfreev (list); }
static void save_one_secret (Request *r, NMSetting *setting, const char *key, const char *secret, const char *display_name) { GHashTable *attrs; char *alt_display_name = NULL; const char *setting_name; NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE; /* Don't system-owned or always-ask secrets */ if (!nm_setting_get_secret_flags (setting, key, &secret_flags, NULL)) return; if (secret_flags != NM_SETTING_SECRET_FLAG_AGENT_OWNED) return; setting_name = nm_setting_get_name (setting); g_assert (setting_name); attrs = _create_keyring_add_attr_list (r->connection, setting_name, key, display_name ? NULL : &alt_display_name); g_assert (attrs); secret_password_storev (&network_manager_secret_schema, attrs, NULL, display_name ? display_name : alt_display_name, secret, r->cancellable, save_secret_cb, r); r->keyring_calls++; g_hash_table_unref (attrs); g_free (alt_display_name); }
static void mac_address_writer (GKeyFile *file, NMSetting *setting, const char *key, const GValue *value) { GByteArray *array; const char *setting_name = nm_setting_get_name (setting); char *mac; struct ether_addr tmp; g_return_if_fail (G_VALUE_HOLDS (value, DBUS_TYPE_G_UCHAR_ARRAY)); array = (GByteArray *) g_value_get_boxed (value); if (!array) return; if (array->len != ETH_ALEN) { nm_warning ("%s: invalid %s / %s MAC address length %d", __func__, setting_name, key, array->len); return; } memcpy (tmp.ether_addr_octet, array->data, ETH_ALEN); mac = ether_ntoa (&tmp); g_key_file_set_string (file, setting_name, key, mac); }
static void cert_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path) { const char *setting_name = nm_setting_get_name (setting); GByteArray *array; gboolean success = FALSE; array = get_uchar_array (keyfile, setting_name, key, TRUE, FALSE); if (array && array->len > 0) { /* Try as a path + scheme (ie, starts with "file://") */ success = handle_as_scheme (array, setting, key); /* If not, it might be a plain path */ if (success == FALSE) success = handle_as_path (array, setting, key, keyfile_path); /* If neither of those two, assume blob with certificate data */ if (success == FALSE) g_object_set (setting, key, array, NULL); } else { g_warning ("%s: ignoring invalid key/cert value for %s / %s", __func__, setting_name, key); } if (array) g_byte_array_free (array, TRUE); }
static void mac_address_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path) { const char *setting_name = nm_setting_get_name (setting); char *tmp_string = NULL, *p; gint *tmp_list; GByteArray *array = NULL; gsize length; int i, type; p = tmp_string = g_key_file_get_string (keyfile, setting_name, key, NULL); if (tmp_string) { /* Look for enough ':' characters to signify a MAC address */ i = 0; while (*p) { if (*p == ':') i++; p++; } /* If we found enough it's probably a string-format MAC address */ type = nm_utils_hwaddr_type (i + 1); if (type > 0) array = nm_utils_hwaddr_atoba (tmp_string, type); } g_free (tmp_string); if (array == NULL) { /* Old format; list of ints */ tmp_list = g_key_file_get_integer_list (keyfile, setting_name, key, &length, NULL); type = nm_utils_hwaddr_type (length); if (type < 0) { array = g_byte_array_sized_new (length); for (i = 0; i < length; i++) { int val = tmp_list[i]; const guint8 v = (guint8) (val & 0xFF); if (val < 0 || val > 255) { g_warning ("%s: %s / %s ignoring invalid byte element '%d' (not " " between 0 and 255 inclusive)", __func__, setting_name, key, val); g_byte_array_free (array, TRUE); array = NULL; break; } g_byte_array_append (array, &v, 1); } } g_free (tmp_list); } if (array) { g_object_set (setting, key, array, NULL); g_byte_array_free (array, TRUE); } else { g_warning ("%s: ignoring invalid MAC address for %s / %s", __func__, setting_name, key); } }
static gint find_setting_by_name (gconstpointer a, gconstpointer b) { NMSetting *setting = NM_SETTING (a); const char *str = (const char *) b; return strcmp (nm_setting_get_name (setting), str); }
static void test_defaults (GType type, const char *name) { GParamSpec **property_specs; guint n_property_specs; GObject *setting; int i; setting = g_object_new (type, NULL); property_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (setting), &n_property_specs); ASSERT (property_specs != NULL, name, "couldn't find property specs for object of type '%s'", g_type_name (G_OBJECT_TYPE (setting))); for (i = 0; i < n_property_specs; i++) { GParamSpec *prop_spec = property_specs[i]; GValue value = G_VALUE_INIT; GValue defvalue = G_VALUE_INIT; char *actual, *expected; gboolean ok = FALSE; /* Ignore non-fundamental types since they won't really have * defaults. */ if (!G_TYPE_IS_FUNDAMENTAL (prop_spec->value_type)) continue; g_value_init (&value, prop_spec->value_type); g_object_get_property (G_OBJECT (setting), prop_spec->name, &value); g_value_init (&defvalue, prop_spec->value_type); g_param_value_set_default (prop_spec, &defvalue); actual = g_strdup_value_contents (&value); expected = g_strdup_value_contents (&defvalue); if (!strcmp (prop_spec->name, NM_SETTING_NAME)) { /* 'name' is always the setting name, not the default value */ ok = !strcmp (nm_setting_get_name (NM_SETTING (setting)), name); g_free (expected); expected = g_strdup (name); } else ok = g_param_value_defaults (prop_spec, &value); ASSERT (ok, name, "property '%s' value '%s' not the expected default value '%s'", prop_spec->name, actual, expected); g_free (actual); g_free (expected); g_value_unset (&value); g_value_unset (&defvalue); } g_free (property_specs); g_object_unref (setting); }
static void ssid_writer (GKeyFile *file, const char *keyfile_dir, const char *uuid, NMSetting *setting, const char *key, const GValue *value) { GByteArray *array; const char *setting_name = nm_setting_get_name (setting); gboolean new_format = TRUE; unsigned int semicolons = 0; int i, *tmp_array; char *ssid; g_return_if_fail (G_VALUE_HOLDS (value, DBUS_TYPE_G_UCHAR_ARRAY)); array = (GByteArray *) g_value_get_boxed (value); if (!array || !array->len) return; /* Check whether each byte is printable. If not, we have to use an * integer list, otherwise we can just use a string. */ for (i = 0; i < array->len; i++) { char c = array->data[i] & 0xFF; if (!isprint (c)) { new_format = FALSE; break; } if (c == ';') semicolons++; } if (new_format) { ssid = g_malloc0 (array->len + semicolons + 1); if (semicolons == 0) memcpy (ssid, array->data, array->len); else { /* Escape semicolons with backslashes to make strings * containing ';', such as '16;17;' unambiguous */ int j = 0; for (i = 0; i < array->len; i++) { if (array->data[i] == ';') ssid[j++] = '\\'; ssid[j++] = array->data[i]; } } g_key_file_set_string (file, setting_name, key, ssid); g_free (ssid); } else { tmp_array = g_new (gint, array->len); for (i = 0; i < array->len; i++) tmp_array[i] = (int) array->data[i]; g_key_file_set_integer_list (file, setting_name, key, tmp_array, array->len); g_free (tmp_array); } }
static void mac_address_parser (NMSetting *setting, const char *key, GKeyFile *keyfile) { const char *setting_name = nm_setting_get_name (setting); struct ether_addr *eth; char *tmp_string = NULL, *p; gint *tmp_list; GByteArray *array = NULL; gsize length; int i; p = tmp_string = g_key_file_get_string (keyfile, setting_name, key, NULL); if (tmp_string) { /* Look for enough ':' characters to signify a MAC address */ i = 0; while (*p) { if (*p == ':') i++; p++; } if (i == 5) { /* parse as a MAC address */ eth = ether_aton (tmp_string); if (eth) { g_free (tmp_string); array = g_byte_array_sized_new (ETH_ALEN); g_byte_array_append (array, eth->ether_addr_octet, ETH_ALEN); goto done; } } } g_free (tmp_string); /* Old format; list of ints */ tmp_list = g_key_file_get_integer_list (keyfile, setting_name, key, &length, NULL); array = g_byte_array_sized_new (length); for (i = 0; i < length; i++) { int val = tmp_list[i]; unsigned char v = (unsigned char) (val & 0xFF); if (val < 0 || val > 255) { g_warning ("%s: %s / %s ignoring invalid byte element '%d' (not " " between 0 and 255 inclusive)", __func__, setting_name, key, val); } else g_byte_array_append (array, (const unsigned char *) &v, sizeof (v)); } g_free (tmp_list); done: if (array->len == ETH_ALEN) { g_object_set (setting, key, array, NULL); } else { g_warning ("%s: ignoring invalid MAC address for %s / %s", __func__, setting_name, key); } g_byte_array_free (array, TRUE); }
static void ip6_route_writer (GKeyFile *file, const char *keyfile_dir, const char *uuid, NMSetting *setting, const char *key, const GValue *value) { GPtrArray *array; const char *setting_name = nm_setting_get_name (setting); char *list[3]; int i, j; g_return_if_fail (G_VALUE_HOLDS (value, DBUS_TYPE_G_ARRAY_OF_IP6_ROUTE)); array = (GPtrArray *) g_value_get_boxed (value); if (!array || !array->len) return; for (i = 0, j = 1; i < array->len; i++) { GValueArray *values = g_ptr_array_index (array, i); char *key_name; guint32 int_val; char buf[INET6_ADDRSTRLEN + 1]; gboolean is_unspec = FALSE; memset (list, 0, sizeof (list)); /* Address and prefix */ list[0] = ip6_array_to_addr_prefix (values); if (!list[0]) continue; /* Next Hop */ if (!ip6_array_to_addr (values, 2, buf, sizeof (buf), &is_unspec)) continue; if (is_unspec) continue; list[1] = g_strdup (buf); /* Metric */ value = g_value_array_get_nth (values, 3); int_val = g_value_get_uint (value); list[2] = g_strdup_printf ("%d", int_val); /* Write it out */ key_name = g_strdup_printf ("%s%d", key, j++); g_key_file_set_string_list (file, setting_name, key_name, (const char **) list, 3); g_free (key_name); g_free (list[0]); g_free (list[1]); g_free (list[2]); } }
static void ip4_route_parser (NMSetting *setting, const char *key, GKeyFile *keyfile) { GPtrArray *routes; const char *setting_name = nm_setting_get_name (setting); routes = read_ip4_routes (keyfile, setting_name, key); if (routes) { g_object_set (setting, key, routes, NULL); g_ptr_array_foreach (routes, free_one_ip4_route, NULL); g_ptr_array_free (routes, TRUE); } }
static void ip6_addr_parser (NMSetting *setting, const char *key, GKeyFile *keyfile) { GPtrArray *addresses; const char *setting_name = nm_setting_get_name (setting); addresses = read_ip6_addresses (keyfile, setting_name, key); if (addresses) { g_object_set (setting, key, addresses, NULL); g_ptr_array_foreach (addresses, free_one_ip6_address, NULL); g_ptr_array_free (addresses, TRUE); } }
static void ip4_route_writer (GKeyFile *file, NMSetting *setting, const char *key, const GValue *value) { GPtrArray *array; const char *setting_name = nm_setting_get_name (setting); g_return_if_fail (G_VALUE_HOLDS (value, DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT)); array = (GPtrArray *) g_value_get_boxed (value); if (array && array->len) write_ip4_values (file, setting_name, key, array, 4, 0, 2); }
static void password_raw_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path) { const char *setting_name = nm_setting_get_name (setting); GByteArray *array; array = get_uchar_array (keyfile, setting_name, key, FALSE, TRUE); if (array) { g_object_set (setting, key, array, NULL); g_byte_array_free (array, TRUE); } else { g_warning ("%s: ignoring invalid raw password for %s / %s", __func__, setting_name, key); } }
/* Some setting properties also contain setting names, such as * NMSettingConnection's 'type' property (which specifies the base type of the * connection, e.g. ethernet or wifi) or 'slave-type' (specifies type of slave * connection, e.g. bond or bridge). This function handles translating those * properties' values to the real setting name if they are an alias. */ static void setting_alias_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path) { const char *setting_name = nm_setting_get_name (setting); char *s; const char *key_setting_name; s = nm_keyfile_plugin_kf_get_string (keyfile, setting_name, key, NULL); if (s) { key_setting_name = nm_keyfile_plugin_get_setting_name_for_alias (s); g_object_set (G_OBJECT (setting), key, key_setting_name ? key_setting_name : s, NULL); g_free (s); } }
static void ip4_addr_parser (NMSetting *setting, const char *key, GKeyFile *keyfile) { GPtrArray *addresses; const char *setting_name = nm_setting_get_name (setting); addresses = read_ip4_addresses (keyfile, setting_name, key); /* Work around for previous syntax */ if (!addresses && !strcmp (key, NM_SETTING_IP4_CONFIG_ADDRESSES)) addresses = read_ip4_addresses (keyfile, setting_name, "address"); if (addresses) { g_object_set (setting, key, addresses, NULL); g_ptr_array_foreach (addresses, free_one_ip4_address, NULL); g_ptr_array_free (addresses, TRUE); } }
static void ip_address_or_route_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path) { const char *setting_name = nm_setting_get_name (setting); gboolean ipv6 = !strcmp (setting_name, "ipv6"); gboolean routes = !strcmp (key, "routes"); static const char *key_names_routes[] = { "route", "routes", NULL }; static const char *key_names_addresses[] = { "address", "addresses", NULL }; const char **key_names = routes ? key_names_routes : key_names_addresses; GPtrArray *list; int i; G_GNUC_BEGIN_IGNORE_DEPRECATIONS; list = g_ptr_array_new_with_free_func ( ipv6 ? (GDestroyNotify) g_value_array_free : (GDestroyNotify) g_array_unref); G_GNUC_END_IGNORE_DEPRECATIONS; for (i = -1; i < 1000; i++) { const char **key_basename; for (key_basename = key_names; *key_basename; key_basename++) { char *key_name; gpointer item; /* -1 means no suffix */ if (i >= 0) key_name = g_strdup_printf ("%s%d", *key_basename, i); else key_name = g_strdup (*key_basename); item = read_one_ip_address_or_route (keyfile, setting_name, key_name, ipv6, routes); if (item) g_ptr_array_add (list, item); g_free (key_name); } } if (list->len >= 1) g_object_set (setting, key, list, NULL); g_ptr_array_unref (list); }
static void ssid_writer (GKeyFile *file, const char *keyfile_dir, const char *uuid, NMSetting *setting, const char *key, const GValue *value) { GByteArray *array; const char *setting_name = nm_setting_get_name (setting); gboolean new_format = TRUE; int i, *tmp_array; char *ssid; g_return_if_fail (G_VALUE_HOLDS (value, DBUS_TYPE_G_UCHAR_ARRAY)); array = (GByteArray *) g_value_get_boxed (value); if (!array || !array->len) return; /* Check whether each byte is printable. If not, we have to use an * integer list, otherwise we can just use a string. */ for (i = 0; i < array->len; i++) { char c = array->data[i] & 0xFF; if (!isprint (c)) { new_format = FALSE; break; } } if (new_format) { ssid = g_malloc0 (array->len + 1); memcpy (ssid, array->data, array->len); g_key_file_set_string (file, setting_name, key, ssid); g_free (ssid); } else { tmp_array = g_new (gint, array->len); for (i = 0; i < array->len; i++) tmp_array[i] = (int) array->data[i]; g_key_file_set_integer_list (file, setting_name, key, tmp_array, array->len); g_free (tmp_array); } }
static void save_one_secret (Request *r, NMSetting *setting, const char *key, const char *secret, const char *display_name) { GnomeKeyringAttributeList *attrs; KeyringCall *call; char *alt_display_name = NULL; const char *setting_name; NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE; /* Don't system-owned or always-ask secrets */ if (!nm_setting_get_secret_flags (setting, key, &secret_flags, NULL)) return; if (secret_flags != NM_SETTING_SECRET_FLAG_AGENT_OWNED) return; setting_name = nm_setting_get_name (setting); g_assert (setting_name); attrs = utils_create_keyring_add_attr_list (r->connection, NULL, NULL, setting_name, key, display_name ? NULL : &alt_display_name); g_assert (attrs); call = keyring_call_new (r); call->keyring_id = gnome_keyring_item_create (NULL, GNOME_KEYRING_ITEM_GENERIC_SECRET, display_name ? display_name : alt_display_name, attrs, secret, TRUE, save_secret_cb, call, keyring_call_free); r->keyring_calls = g_slist_append (r->keyring_calls, call); gnome_keyring_attribute_list_free (attrs); g_free (alt_display_name); }
static void write_hash_of_string (GKeyFile *file, NMSetting *setting, const char *key, const GValue *value) { GHashTable *hash = g_value_get_boxed (value); WriteStringHashInfo info; info.file = file; /* Write VPN secrets out to a different group to keep them separate */ if ( (G_OBJECT_TYPE (setting) == NM_TYPE_SETTING_VPN) && !strcmp (key, NM_SETTING_VPN_SECRETS)) { info.setting_name = VPN_SECRETS_GROUP; } else info.setting_name = nm_setting_get_name (setting); g_hash_table_foreach (hash, write_hash_of_string_helper, &info); }
static void ip6_dns_writer (GKeyFile *file, const char *keyfile_dir, const char *uuid, NMSetting *setting, const char *key, const GValue *value) { GPtrArray *array; GByteArray *byte_array; char **list; int i, num = 0; g_return_if_fail (G_VALUE_HOLDS (value, DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR)); array = (GPtrArray *) g_value_get_boxed (value); if (!array || !array->len) return; list = g_new0 (char *, array->len + 1); for (i = 0; i < array->len; i++) { char buf[INET6_ADDRSTRLEN]; byte_array = g_ptr_array_index (array, i); if (!inet_ntop (AF_INET6, (struct in6_addr *) byte_array->data, buf, sizeof (buf))) { int j; GString *ip6_str = g_string_new (NULL); g_string_append_printf (ip6_str, "%02X", byte_array->data[0]); for (j = 1; j < 16; j++) g_string_append_printf (ip6_str, " %02X", byte_array->data[j]); g_warning ("%s: error converting IP6 address %s", __func__, ip6_str->str); g_string_free (ip6_str, TRUE); } else list[num++] = g_strdup (buf); } g_key_file_set_string_list (file, nm_setting_get_name (setting), key, (const char **) list, num); g_strfreev (list); }
static gboolean write_array_of_uint (GKeyFile *file, NMSetting *setting, const char *key, const GValue *value) { GArray *array; int i; int *tmp_array; array = (GArray *) g_value_get_boxed (value); if (!array || !array->len) return TRUE; tmp_array = g_new (gint, array->len); for (i = 0; i < array->len; i++) tmp_array[i] = g_array_index (array, int, i); g_key_file_set_integer_list (file, nm_setting_get_name (setting), key, tmp_array, array->len); g_free (tmp_array); return TRUE; }
static NMSecretAgentSimpleSecret * nm_secret_agent_simple_secret_new (const char *name, NMSetting *setting, const char *property, gboolean password) { NMSecretAgentSimpleSecretReal *real; real = g_slice_new0 (NMSecretAgentSimpleSecretReal); real->base.name = g_strdup (name); real->base.prop_name = g_strdup_printf ("%s.%s", nm_setting_get_name (setting), property); real->base.password = password; if (setting) { real->setting = g_object_ref (setting); real->property = g_strdup (property); g_object_get (setting, property, &real->base.value, NULL); } return &real->base; }
static void ip6_addr_writer (GKeyFile *file, const char *keyfile_dir, const char *uuid, NMSetting *setting, const char *key, const GValue *value) { GPtrArray *array; const char *setting_name = nm_setting_get_name (setting); int i, j; g_return_if_fail (G_VALUE_HOLDS (value, DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS)); array = (GPtrArray *) g_value_get_boxed (value); if (!array || !array->len) return; for (i = 0, j = 1; i < array->len; i++) { GValueArray *values = g_ptr_array_index (array, i); char *key_name, *ip6_addr; if (values->n_values != 3) { g_warning ("%s: error writing IP6 address %d (address array length " "%d is not 3)", __func__, i, values->n_values); continue; } ip6_addr = ip6_array_to_addr_prefix (values); if (ip6_addr) { /* Write it out */ key_name = g_strdup_printf ("%s%d", key, j++); g_key_file_set_string (file, setting_name, key_name, ip6_addr); g_free (key_name); g_free (ip6_addr); } } }
static gboolean read_array_of_uint (GKeyFile *file, NMSetting *setting, const char *key) { GArray *array = NULL; gsize length; int i; gint *tmp; tmp = g_key_file_get_integer_list (file, nm_setting_get_name (setting), key, &length, NULL); array = g_array_sized_new (FALSE, FALSE, sizeof (guint32), length); g_return_val_if_fail (array != NULL, FALSE); for (i = 0; i < length; i++) g_array_append_val (array, tmp[i]); g_object_set (setting, key, array, NULL); g_array_unref (array); return TRUE; }
static void write_hash_of_string (GKeyFile *file, NMSetting *setting, const char *key, const GValue *value) { GHashTableIter iter; const char *property = NULL, *data = NULL; const char *group_name = nm_setting_get_name (setting); gboolean vpn_secrets = FALSE; /* Write VPN secrets out to a different group to keep them separate */ if (NM_IS_SETTING_VPN (setting) && !strcmp (key, NM_SETTING_VPN_SECRETS)) { group_name = VPN_SECRETS_GROUP; vpn_secrets = TRUE; } g_hash_table_iter_init (&iter, (GHashTable *) g_value_get_boxed (value)); while (g_hash_table_iter_next (&iter, (gpointer *) &property, (gpointer *) &data)) { gboolean write_item = TRUE; /* Handle VPN secrets specially; they are nested in the property's hash; * we don't want to write them if the secret is not saved, not required, * or owned by a user's secret agent. */ if (vpn_secrets) { NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE; nm_setting_get_secret_flags (setting, property, &secret_flags, NULL); if (secret_flags != NM_SETTING_SECRET_FLAG_NONE) write_item = FALSE; } if (write_item) g_key_file_set_string (file, group_name, property, data); } }
static const char * _fmt_warn (const char *group, NMSetting *setting, const char *property_name, const char *message, char **out_message) { const char *setting_name = setting ? nm_setting_get_name (setting) : NULL; if (group) { char *res; if (setting_name) { if (property_name && !strcmp (group, setting_name)) res = g_strdup_printf ("%s.%s: %s", group, property_name, message); else if (property_name) res = g_strdup_printf ("%s/%s.%s: %s", group, setting_name, property_name, message); else if (!strcmp (group, setting_name)) res = g_strdup_printf ("%s: %s", group, message); else res = g_strdup_printf ("%s/%s: %s", group, setting_name, message); } else res = g_strdup_printf ("%s: %s", group, message); *out_message = res; return res; } else return message; }