about summary refs log tree commit diff stats
path: root/src/command/commands.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/command/commands.c')
-rw-r--r--src/command/commands.c139
1 files changed, 102 insertions, 37 deletions
diff --git a/src/command/commands.c b/src/command/commands.c
index 113532a5..6717157e 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -4143,59 +4143,124 @@ cmd_pgp(ProfWin *window, gchar **args, struct cmd_help_t help)
     if (args[0] == NULL) {
         cons_show("Usage: %s", help.usage);
         return TRUE;
-    } else if (g_strcmp0(args[0], "keys") == 0) {
+    }
+
+    if (g_strcmp0(args[0], "keys") == 0) {
         GSList *keys = p_gpg_list_keys();
-        if (keys) {
-            cons_show("PGP keys:");
-            while (keys) {
-                ProfPGPKey *key = keys->data;
-                cons_show("  %s", key->name);
-                cons_show("    ID          : %s", key->id);
-                cons_show("    Fingerprint : %s", key->fp);
-                keys = g_slist_next(keys);
-            }
-        } else {
+        if (!keys) {
             cons_show("No keys found");
+            return TRUE;
+        }
+
+        cons_show("PGP keys:");
+        GSList *curr = keys;
+        while (curr) {
+            ProfPGPKey *key = curr->data;
+            cons_show("  %s", key->name);
+            cons_show("    ID          : %s", key->id);
+            cons_show("    Fingerprint : %s", key->fp);
+            curr = g_slist_next(curr);
         }
         g_slist_free_full(keys, (GDestroyNotify)p_gpg_free_key);
-    } else if (g_strcmp0(args[0], "fps") == 0) {
+        return TRUE;
+    }
+
+    if (g_strcmp0(args[0], "fps") == 0) {
         jabber_conn_status_t conn_status = jabber_get_connection_status();
         if (conn_status != JABBER_CONNECTED) {
             cons_show("You are not currently connected.");
-        } else {
-            GHashTable *fingerprints = p_gpg_fingerprints();
-            GList *jids = g_hash_table_get_keys(fingerprints);
-            if (jids) {
-                cons_show("Received PGP fingerprints:");
-                GList *curr = jids;
-                while (curr) {
-                    char *jid = curr->data;
-                    char *fingerprint = g_hash_table_lookup(fingerprints, jid);
-                    cons_show("  %s: %s", jid, fingerprint);
-                    curr = g_list_next(curr);
-                }
-            } else {
-                cons_show("No PGP fingerprints received.");
-            }
-            g_list_free(jids);
+            return TRUE;
         }
-    } else if (g_strcmp0(args[0], "libver") == 0) {
+        GHashTable *fingerprints = p_gpg_fingerprints();
+        GList *jids = g_hash_table_get_keys(fingerprints);
+        if (!jids) {
+            cons_show("No PGP fingerprints received.");
+            return TRUE;
+        }
+
+        cons_show("Received PGP fingerprints:");
+        GList *curr = jids;
+        while (curr) {
+            char *jid = curr->data;
+            char *fingerprint = g_hash_table_lookup(fingerprints, jid);
+            cons_show("  %s: %s", jid, fingerprint);
+            curr = g_list_next(curr);
+        }
+        g_list_free(jids);
+        return TRUE;
+    }
+
+    if (g_strcmp0(args[0], "libver") == 0) {
         const char *libver = p_gpg_libver();
-        if (libver) {
-            GString *fullstr = g_string_new("Using libgpgme version ");
-            g_string_append(fullstr, libver);
-            cons_show("%s", fullstr->str);
-            g_string_free(fullstr, TRUE);
-        } else {
+        if (!libver) {
             cons_show("Could not get libgpgme version");
+            return TRUE;
         }
-    } else if (g_strcmp0(args[0], "start") == 0) {
+
+        GString *fullstr = g_string_new("Using libgpgme version ");
+        g_string_append(fullstr, libver);
+        cons_show("%s", fullstr->str);
+        g_string_free(fullstr, TRUE);
+
+        return TRUE;
+    }
+
+    if (g_strcmp0(args[0], "start") == 0) {
         jabber_conn_status_t conn_status = jabber_get_connection_status();
         if (conn_status != JABBER_CONNECTED) {
             cons_show("You must be connected to start PGP encrpytion.");
-        } else if (window->type != WIN_CHAT && args[1] == NULL) {
+            return TRUE;
+        }
+
+        if (window->type != WIN_CHAT && args[1] == NULL) {
             cons_show("You must be in a regular chat window to start PGP encrpytion.");
+            return TRUE;
+        }
+
+        ProfChatWin *chatwin = NULL;
+
+        if (args[1]) {
+            char *contact = args[1];
+            char *barejid = roster_barejid_from_name(contact);
+            if (barejid == NULL) {
+                barejid = contact;
+            }
+
+            chatwin = wins_get_chat(barejid);
+            if (!chatwin) {
+                chatwin = ui_ev_new_chat_win(barejid);
+            }
+            ui_ev_focus_win((ProfWin*)chatwin);
+        } else {
+            chatwin = (ProfChatWin*)window;
+            assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK);
         }
+
+        if (chatwin->enc_mode == PROF_ENC_OTR) {
+            ui_current_print_formatted_line('!', 0, "You must end the OTR session to start PGP encryption.");
+            return TRUE;
+        }
+
+        if (chatwin->enc_mode == PROF_ENC_PGP) {
+            ui_current_print_formatted_line('!', 0, "You have already started PGP encryption.");
+            return TRUE;
+        }
+
+        ProfAccount *account = accounts_get_account(jabber_get_account_name());
+        if (!account->pgp_keyid) {
+            ui_current_print_formatted_line('!', 0, "You must specify a PGP key ID for this account to start PGP encryption.");
+            account_free(account);
+            return TRUE;
+        }
+        account_free(account);
+
+        if (!p_gpg_available(chatwin->barejid)) {
+            ui_current_print_formatted_line('!', 0, "No PGP key found for %s.", chatwin->barejid);
+            return TRUE;
+        }
+
+        chatwin->enc_mode = PROF_ENC_PGP;
+        ui_current_print_formatted_line('!', 0, "PGP encyption enabled.");
     }
 
     return TRUE;