static gboolean get_secrets(const char *vpn_name, const char *vpn_uuid, gboolean need_password, gboolean retry, gboolean allow_interaction, gboolean external_ui_mode, const char *in_pass, NMSettingSecretFlags pw_flags, char **out_password) { VpnPasswordDialog *dialog; char *prompt, *password = NULL; gboolean success = FALSE, need_secret = FALSE; g_return_val_if_fail(vpn_name != NULL, FALSE); g_return_val_if_fail(vpn_uuid != NULL, FALSE); g_return_val_if_fail(out_password != NULL, FALSE); if (need_password) { if (!(pw_flags & NM_SETTING_SECRET_FLAG_NOT_SAVED)) { if (in_pass) #if defined(HAVE_LIBSECRET) password = g_strdup(in_pass); #else password = gnome_keyring_memory_strdup(in_pass); #endif else password = keyring_lookup_secret(vpn_uuid, NM_IPOP_KEY_XMPP_PASSWORD); } if (!password && !(pw_flags & NM_SETTING_SECRET_FLAG_NOT_REQUIRED)) need_secret = TRUE; }
static char * keyring_lookup_secret (const char *uuid, const char *secret_name) { #if defined(HAVE_LIBSECRET) GHashTable *attrs; GList *list; #else GList *found_list = NULL; GnomeKeyringResult ret; GnomeKeyringFound *found; #endif char *secret = NULL; #if defined(HAVE_LIBSECRET) attrs = secret_attributes_build(&network_manager_secret_schema, KEYRING_UUID_TAG, uuid, KEYRING_SN_TAG, NM_SETTING_VPN_SETTING_NAME, KEYRING_SK_TAG, secret_name, NULL); list = secret_service_search_sync(NULL, &network_manager_secret_schema, attrs, SECRET_SEARCH_ALL | SECRET_SEARCH_UNLOCK | SECRET_SEARCH_LOAD_SECRETS, NULL, NULL); if (list && list->data) { SecretItem *item = list->data; SecretValue *value = secret_item_get_secret(item); if (value) { secret = g_strdup(secret_value_get(value, NULL)); secret_value_unref(value); } } g_list_free_full(list, g_object_unref); g_hash_table_unref(attrs); #else ret = gnome_keyring_find_itemsv_sync(GNOME_KEYRING_ITEM_GENERIC_SECRET, &found_list, KEYRING_UUID_TAG, GNOME_KEYRING_ATTRIBUTE_TYPE_STRING, uuid, KEYRING_SN_TAG, GNOME_KEYRING_ATTRIBUTE_TYPE_STRING, NM_SETTING_VPN_SETTING_NAME, KEYRING_SK_TAG, GNOME_KEYRING_ATTRIBUTE_TYPE_STRING, secret_name, NULL); if (ret == GNOME_KEYRING_RESULT_OK && found_list) { found = g_list_nth_data(found_list, 0); secret = gnome_keyring_memory_strdup(found->secret); } gnome_keyring_found_list_free(found_list); #endif return secret; }
static GtkWidget * fill_password (GladeXML *xml, const char *widget_name, NMConnection *connection, const char *password_type) { GtkWidget *widget = NULL; gchar *password = NULL; widget = glade_xml_get_widget (xml, widget_name); g_assert (widget); if (!connection) return widget; password = NULL; if (nm_connection_get_scope (connection) == NM_CONNECTION_SCOPE_SYSTEM) { NMSettingVPN *s_vpn; s_vpn = (NMSettingVPN *) nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN); if (s_vpn) { const gchar *tmp = NULL; tmp = nm_setting_vpn_get_secret (s_vpn, password_type); if (tmp) password = gnome_keyring_memory_strdup (tmp); } } else { NMSettingConnection *s_con = NULL; gboolean unused; const char *uuid; s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION)); uuid = nm_setting_connection_get_uuid (s_con); password = keyring_helpers_lookup_secret (uuid, password_type, &unused); } if (password) { gtk_entry_set_text (GTK_ENTRY (widget), password); gnome_keyring_memory_free (password); } return widget; }