#include <stddef.h>
#include <glib.h>
#include <glib/gi18n.h>
+#include <sys/types.h>
+#include <sys/wait.h>
#include "version.h"
#include "common/sylpheed.h"
+#include "mainwindow.h"
#include "mimeview.h"
#include "textview.h"
#include "sgpgme.h"
#include "prefs_common.h"
#include "prefs_gpg.h"
+#include "alertpanel.h"
#include "plugin.h"
typedef struct _PgpViewer PgpViewer;
return;
}
gpgme_get_key(ctx, sig->fpr, &key, 0);
- TEXTVIEW_INSERT(_("\n Importing key ID "));
- TEXTVIEW_INSERT(sig->fpr);
- TEXTVIEW_INSERT(":\n\n");
if (!key) {
- if (prefs_common.work_offline) {
- gchar *cmd = g_strdup_printf("gpg --recv-keys %s", sig->fpr);
+ gchar *cmd = g_strdup_printf("gpg --no-tty --recv-keys %s", sig->fpr);
+ AlertValue val = G_ALERTDEFAULT;
+ if (!prefs_common.work_offline) {
+ val = alertpanel(_("Key import"),
+ _("This key is not in your keyring. Do you want "
+ "Sylpheed-Claws to try and import it from a "
+ "keyserver?"),
+ GTK_STOCK_NO, "+" GTK_STOCK_YES, NULL);
+ GTK_EVENTS_FLUSH();
+ }
+ if (val == G_ALERTDEFAULT) {
+ TEXTVIEW_INSERT(_("\n Key ID "));
+ TEXTVIEW_INSERT(sig->fpr);
+ TEXTVIEW_INSERT(":\n\n");
TEXTVIEW_INSERT(_(" This key is not in your keyring.\n"));
- TEXTVIEW_INSERT(_(" It should be possible to import it when working online,\n"));
- TEXTVIEW_INSERT(_(" or with the following command: \n\n "));
+ TEXTVIEW_INSERT(_(" It should be possible to import it "));
+ if (prefs_common.work_offline)
+ TEXTVIEW_INSERT(_("when working online,\n or "));
+ TEXTVIEW_INSERT(_("with the following command: \n\n "));
TEXTVIEW_INSERT(cmd);
- g_free(cmd);
} else {
#ifndef G_OS_WIN32
- gchar *cmd = g_strdup_printf("gpg --recv-keys %s", sig->fpr);
int res = 0;
+ pid_t pid = 0;
+
+ TEXTVIEW_INSERT(_("\n Importing key ID "));
+ TEXTVIEW_INSERT(sig->fpr);
+ TEXTVIEW_INSERT(":\n\n");
+
+ main_window_cursor_wait(mainwindow_get_mainwindow());
GTK_EVENTS_FLUSH();
- res = system(cmd);
+
+ pid = fork();
+ if (pid == -1) {
+ res = -1;
+ } else if (pid == 0) {
+ /* son */
+ res = system(cmd);
+ _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);
+ }
+ main_window_cursor_normal(mainwindow_get_mainwindow());
if (res == 0) {
TEXTVIEW_INSERT(_(" This key has been imported to your keyring.\n"));
} else {
TEXTVIEW_INSERT(_(" You can try to import it manually with the command:\n\n "));
TEXTVIEW_INSERT(cmd);
}
- g_free(cmd);
#else
TEXTVIEW_INSERT(_(" This key is not in your keyring.\n"));
TEXTVIEW_INSERT(_(" Key import isn't implemented in Windows.\n"));
#endif
}
+ g_free(cmd);
return;
} else {
- TEXTVIEW_INSERT(_(" This key is already in your keyring.\n"));
-
+ TEXTVIEW_INSERT(_("\n Key ID "));
+ TEXTVIEW_INSERT(sig->fpr);
+ TEXTVIEW_INSERT(":\n\n");
+ TEXTVIEW_INSERT(_(" This key is in your keyring.\n"));
}
gpgme_data_release(sigdata);
gpgme_release(ctx);