int main(int argc, const char **argv) { git_credential_t cred = {0}; if (argc < 2) { error("Usage: git credential-gnomekeyring <get|store|erase>"); return 1; } if (read_credential(&cred)) { clear_credential(&cred); return 1; } if (strcmp(argv[1], "get") == 0) { get_password(&cred); } else if (strcmp(argv[1], "store") == 0) { store_password(&cred); } else if (strcmp(argv[1], "erase") == 0) { erase_password(&cred); } clear_credential(&cred); return 0; }
int main(int argc, const char **argv) { jaro_credential_t cred = {0}; int res = 0; if (argc < 2) { error("Usage: jaro-gnome-keyring <get|check|store|erase>"); error("input from stdin: newline separated parameter=value tuples"); error("i.e: protocol, path, username, host, password (password on store)"); return 1; } if (read_credential(&cred)) { clear_credential(&cred); return 1; } if (strcmp(argv[1], "get") == 0) { res = get_password(&cred); } if (strcmp(argv[1], "check") == 0) { res = check_password(&cred); } else if (strcmp(argv[1], "store") == 0) { res = store_password(&cred); } else if (strcmp(argv[1], "erase") == 0) { res = erase_password(&cred); } clear_credential(&cred); return res; }
static void get_input(GncGWENGui *gui, guint32 flags, const gchar *title, const gchar *text, gchar **input, gint min_len, gint max_len) { GladeXML *xml; GtkWidget *dialog; GtkWidget *heading_label; GtkWidget *input_entry; GtkWidget *confirm_entry; GtkWidget *confirm_label; GtkWidget *remember_pin_checkbutton; const gchar *internal_input, *internal_confirmed; gboolean confirm = (flags & GWEN_GUI_INPUT_FLAGS_CONFIRM) != 0; gboolean hidden = (flags & GWEN_GUI_INPUT_FLAGS_SHOW) == 0; gboolean is_tan = (flags & GWEN_GUI_INPUT_FLAGS_TAN) != 0; gint retval; g_return_if_fail(input); g_return_if_fail(max_len >= min_len && max_len > 0); ENTER(" "); /* Set up dialog */ xml = gnc_glade_xml_new("aqbanking.glade", "Password Dialog"); dialog = glade_xml_get_widget(xml, "Password Dialog"); g_object_set_data_full(G_OBJECT(dialog), "xml", xml, g_object_unref); heading_label = glade_xml_get_widget(xml, "heading_label"); input_entry = glade_xml_get_widget(xml, "input_entry"); confirm_entry = glade_xml_get_widget(xml, "confirm_entry"); confirm_label = glade_xml_get_widget(xml, "confirm_label"); remember_pin_checkbutton = glade_xml_get_widget(xml, "remember_pin"); if (is_tan) { gtk_widget_hide(remember_pin_checkbutton); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remember_pin_checkbutton), gui->cache_passwords); } if (gui->parent) gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gui->parent)); if (title) gtk_window_set_title(GTK_WINDOW(dialog), title); if (text) { gchar *raw_text = strip_html(g_strdup(text)); gtk_label_set_text(GTK_LABEL(heading_label), raw_text); g_free(raw_text); } if (*input) { gtk_entry_set_text(GTK_ENTRY(input_entry), *input); erase_password(*input); *input = NULL; } if (confirm) { gtk_entry_set_activates_default(GTK_ENTRY(input_entry), FALSE); gtk_entry_set_activates_default(GTK_ENTRY(confirm_entry), TRUE); gtk_entry_set_max_length(GTK_ENTRY(input_entry), max_len); gtk_entry_set_max_length(GTK_ENTRY(confirm_entry), max_len); } else { gtk_entry_set_activates_default(GTK_ENTRY(input_entry), TRUE); gtk_entry_set_max_length(GTK_ENTRY(input_entry), max_len); gtk_widget_hide(confirm_entry); gtk_widget_hide(confirm_label); } gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); /* Ask the user until he enters a valid input or cancels */ while (TRUE) { gboolean remember_pin; if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) break; if (!is_tan) { /* Enable or disable the password cache */ remember_pin = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(remember_pin_checkbutton)); enable_password_cache(gui, remember_pin); gnc_gconf_set_bool(GCONF_SECTION_AQBANKING, KEY_REMEMBER_PIN, remember_pin, NULL); } internal_input = gtk_entry_get_text(GTK_ENTRY(input_entry)); if (strlen(internal_input) < min_len) { gboolean retval; gchar *msg = g_strdup_printf( _("The PIN needs to be at least %d characters \n" "long. Do you want to try again?"), min_len); retval = gnc_verify_dialog(gui->parent, TRUE, "%s", msg); g_free(msg); if (!retval) break; continue; } if (!confirm) { *input = g_strdup(internal_input); break; } internal_confirmed = gtk_entry_get_text(GTK_ENTRY(confirm_entry)); if (strcmp(internal_input, internal_confirmed) == 0) { *input = g_strdup(internal_input); break; } } /* This trashes passwords in the entries' memory as well */ gtk_widget_destroy(dialog); LEAVE("input %s", *input ? "non-NULL" : "NULL"); }
static gint getpassword_cb(GWEN_GUI *gwen_gui, guint32 flags, const gchar *token, const gchar *title, const gchar *text, gchar *buffer, gint min_len, gint max_len, guint32 guiid) { GncGWENGui *gui = GETDATA_GUI(gwen_gui); gchar *password = NULL; gboolean is_tan = (flags & GWEN_GUI_INPUT_FLAGS_TAN) != 0; g_return_val_if_fail(gui, -1); ENTER("gui=%p, flags=%d, token=%s", gui, flags, token ? token : "(null"); /* Check remembered passwords, excluding TANs */ if (!is_tan && gui->cache_passwords && gui->passwords && token) { if (flags & GWEN_GUI_INPUT_FLAGS_RETRY) { /* If remembered, remove password from memory */ g_hash_table_remove(gui->passwords, token); } else { gpointer p_var; if (g_hash_table_lookup_extended(gui->passwords, token, NULL, &p_var)) { /* Copy the password to the result buffer */ password = p_var; strncpy(buffer, password, max_len); buffer[max_len-1] = '\0'; LEAVE("chose remembered password"); return 0; } } } get_input(gui, flags, title, text, &password, min_len, max_len); if (password) { /* Copy the password to the result buffer */ strncpy(buffer, password, max_len); buffer[max_len-1] = '\0'; if (!is_tan && token) { if (gui->cache_passwords && gui->passwords) { /* Remember password */ DEBUG("Remember password, token=%s", token); g_hash_table_insert(gui->passwords, g_strdup(token), password); } else { /* Remove the password from memory */ DEBUG("Forget password, token=%s", token); erase_password(password); } } } LEAVE(" "); return password ? 0 : -1; }