static gchar* do_get_password (GckSession *session, const gchar *keyid, const gchar *errmsg, const gchar *prompt_text, const gchar *description, gboolean confirm) { GSettings *settings; gchar *password = NULL; GcrPrompt *prompt; gboolean chosen; GError *error = NULL; gint lifetime; gchar *method; gchar *label; gchar *text; g_assert (GCK_IS_SESSION (session)); /* Do we have the keyid? */ password = gkd_login_lookup_password (session, "keyid", keyid, "source", "gnome-keyring:gpg-agent", NULL); if (password != NULL) return password; prompt = open_password_prompt (session, keyid, errmsg, prompt_text, description, confirm); if (prompt != NULL) { password = egg_secure_strdup (gcr_prompt_password (prompt, NULL, &error)); if (password == NULL) { if (error && !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning ("couldn't prompt for password: %s", egg_error_message (error)); g_clear_error (&error); } } if (password != NULL && keyid != NULL) { settings = gkd_gpg_agent_settings (); /* Load up the save options */ chosen = gcr_prompt_get_choice_chosen (prompt); if (chosen) { method = g_strdup (GCR_UNLOCK_OPTION_ALWAYS); lifetime = -1; } else { method = g_settings_get_string (settings, "gpg-cache-method"); lifetime = g_settings_get_int (settings, "gpg-cache-ttl"); if (g_str_equal (method, GCR_UNLOCK_OPTION_ALWAYS)) { g_free (method); method = NULL; } } /* Now actually save the password */ text = calculate_label_for_key (keyid, description); label = g_strdup_printf (_("PGP Key: %s"), text); gkd_login_store_password (session, password, label, method, lifetime, "keyid", keyid, "source", "gnome-keyring:gpg-agent", NULL); g_free (label); g_free (method); g_free (text); } g_clear_object (&prompt); return password; }
/** * mate_keyring_memory_strdup: * @str: The null terminated string to copy * * Copy a string into non-pageable memory. If the input string is %NULL, then * %NULL will be returned. * * Return value: The copied string, should be freed with mate_keyring_memory_free() */ gchar* mate_keyring_memory_strdup (const gchar* str) { return egg_secure_strdup (str); }