void prefs_gpg_remove_skip_encryption_warning(const gchar *systemid) { gchar **systems = NULL; int i = 0; if (prefs_gpg_get_config()->skip_encryption_warning == NULL) return; if (prefs_gpg_should_skip_encryption_warning(systemid)) { systems = g_strsplit(prefs_gpg_get_config()->skip_encryption_warning, ",", -1); g_free(prefs_gpg_get_config()->skip_encryption_warning); prefs_gpg_get_config()->skip_encryption_warning = NULL; while (systems && systems[i]) { if (!strcmp(systems[i],systemid)) { i++; continue; } prefs_gpg_add_skip_encryption_warning(systems[i]); i++; } g_strfreev(systems); } prefs_gpg_save_config(); }
static void prefs_gpg_save_func(PrefsPage *_page) { struct GPGPage *page = (struct GPGPage *) _page; GPGConfig *config = prefs_gpg_get_config(); config->auto_check_signatures = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_auto_check_signatures)); config->autocompletion = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_autocompletion)); config->use_gpg_agent = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_use_gpg_agent)); config->store_passphrase = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_store_passphrase)); config->store_passphrase_timeout = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(page->spinbtn_store_passphrase)); config->passphrase_grab = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_passphrase_grab)); config->gpg_warning = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_gpg_warning)); g_free(config->gpg_path); config->gpg_path = g_strdup(gtk_entry_get_text(GTK_ENTRY(page->gpg_path))); if (strcmp(config->gpg_path, "") != 0 && access(config->gpg_path, X_OK) != -1) gpgme_set_engine_info(GPGME_PROTOCOL_OpenPGP, config->gpg_path, NULL); prefs_gpg_enable_agent(config->use_gpg_agent); prefs_gpg_save_config(); }
void sgpgme_check_create_key(void) { if (prefs_gpg_get_config()->gpg_ask_create_key && !sgpgme_has_secret_key()) { sgpgme_create_secret_key(NULL, TRUE); } else { prefs_gpg_get_config()->gpg_ask_create_key = FALSE; prefs_gpg_save_config(); } }
void prefs_gpg_add_skip_encryption_warning(const gchar *systemid) { gchar *tmp = NULL; if (prefs_gpg_get_config()->skip_encryption_warning == NULL) prefs_gpg_get_config()->skip_encryption_warning = g_strdup_printf("%s,", systemid); else if (!prefs_gpg_should_skip_encryption_warning(systemid)) { tmp = g_strdup_printf("%s%s,", prefs_gpg_get_config()->skip_encryption_warning, systemid); g_free(prefs_gpg_get_config()->skip_encryption_warning); prefs_gpg_get_config()->skip_encryption_warning = tmp; } prefs_gpg_save_config(); }
void sgpgme_create_secret_key(PrefsAccount *account, gboolean ask_create) { AlertValue val = G_ALERTDEFAULT; gchar *key_parms = NULL; gchar *name = NULL; gchar *email = NULL; gchar *passphrase = NULL, *passphrase_second = NULL; gint prev_bad = 0; gchar *tmp = NULL; gpgme_error_t err = 0; gpgme_ctx_t ctx; GtkWidget *window = NULL; gpgme_genkey_result_t key; if (account == NULL) account = account_get_default(); if (account->address == NULL) { alertpanel_error(_("You have to save the account's information with \"OK\" " "before being able to generate a key pair.\n")); return; } if (ask_create) { val = alertpanel(_("No PGP key found"), _("Claws Mail did not find a secret PGP key, " "which means that you won't be able to sign " "emails or receive encrypted emails.\n" "Do you want to create a new key pair now?"), GTK_STOCK_NO, "+" GTK_STOCK_YES, NULL); if (val == G_ALERTDEFAULT) { prefs_gpg_get_config()->gpg_ask_create_key = FALSE; prefs_gpg_save_config(); return; } } if (account->name) { name = g_strdup(account->name); } else { name = g_strdup(account->address); } email = g_strdup(account->address); tmp = g_strdup_printf("%s <%s>", account->name?account->name:account->address, account->address); again: passphrase = passphrase_mbox(tmp, NULL, prev_bad, 1); if (passphrase == NULL) { g_free(tmp); g_free(email); g_free(name); return; } passphrase_second = passphrase_mbox(tmp, NULL, 0, 2); if (passphrase_second == NULL) { g_free(tmp); g_free(email); g_free(passphrase); g_free(name); return; } if (strcmp(passphrase, passphrase_second)) { g_free(passphrase); g_free(passphrase_second); prev_bad = 1; goto again; } key_parms = g_strdup_printf("<GnupgKeyParms format=\"internal\">\n" "Key-Type: RSA\n" "Key-Length: 2048\n" "Subkey-Type: RSA\n" "Subkey-Length: 2048\n" "Name-Real: %s\n" "Name-Email: %s\n" "Expire-Date: 0\n" "%s%s%s" "</GnupgKeyParms>\n", name, email, strlen(passphrase)?"Passphrase: ":"", passphrase, strlen(passphrase)?"\n":""); #ifndef G_PLATFORM_WIN32 if (mlock(passphrase, strlen(passphrase)) == -1) debug_print("couldn't lock passphrase\n"); if (mlock(passphrase_second, strlen(passphrase_second)) == -1) debug_print("couldn't lock passphrase2\n"); #endif g_free(tmp); g_free(email); g_free(name); g_free(passphrase_second); g_free(passphrase); err = gpgme_new (&ctx); if (err) { alertpanel_error(_("Couldn't generate a new key pair: %s"), gpgme_strerror(err)); g_free(key_parms); return; } window = label_window_create(_("Generating your new key pair... Please move the mouse " "around to help generate entropy...")); err = gpgme_op_genkey(ctx, key_parms, NULL, NULL); g_free(key_parms); label_window_destroy(window); if (err) { alertpanel_error(_("Couldn't generate a new key pair: %s"), gpgme_strerror(err)); gpgme_release(ctx); return; } key = gpgme_op_genkey_result(ctx); if (key == NULL) { alertpanel_error(_("Couldn't generate a new key pair: unknown error")); gpgme_release(ctx); return; } else { gchar *buf = g_strdup_printf(_("Your new key pair has been generated. " "Its fingerprint is:\n%s\n\nDo you want to export it " "to a keyserver?"), key->fpr ? key->fpr:"null"); AlertValue val = alertpanel(_("Key generated"), buf, GTK_STOCK_NO, "+" GTK_STOCK_YES, NULL); g_free(buf); if (val == G_ALERTALTERNATE) { #ifndef G_OS_WIN32 gchar *cmd = g_strdup_printf("gpg --no-tty --send-keys %s", key->fpr); int res = 0; pid_t pid = 0; pid = fork(); if (pid == -1) { res = -1; } else if (pid == 0) { /* son */ res = system(cmd); res = WEXITSTATUS(res); _exit(res); } else { int status = 0; time_t start_wait = time(NULL); res = -1; do { if (waitpid(pid, &status, WNOHANG) == 0 || !WIFEXITED(status)) { usleep(200000); } else { res = WEXITSTATUS(status); break; } if (time(NULL) - start_wait > 5) { debug_print("SIGTERM'ing gpg\n"); kill(pid, SIGTERM); } if (time(NULL) - start_wait > 6) { debug_print("SIGKILL'ing gpg\n"); kill(pid, SIGKILL); break; } } while(1); } if (res == 0) { alertpanel_notice(_("Key exported.")); } else { alertpanel_error(_("Couldn't export key.")); } g_free(cmd); #else alertpanel_error(_("Key export isn't implemented in Windows.")); #endif } } prefs_gpg_get_config()->gpg_ask_create_key = FALSE; prefs_gpg_save_config(); gpgme_release(ctx); }