]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-reply.c
cli: modify mime_node_open to take new crypto struct as argument
[notmuch] / notmuch-reply.c
index 0c82755345aa4ff2d013b600c315ac75959430af..6f368c93206d152fdb93a29320a74217a51946ae 100644 (file)
@@ -377,19 +377,18 @@ add_recipients_from_message (GMimeMessage *reply,
 static const char *
 guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message)
 {
-    const char *received,*primary,*by;
-    const char **other;
-    char *tohdr;
+    const char *addr, *received, *by;
     char *mta,*ptr,*token;
     char *domain=NULL;
     char *tld=NULL;
     const char *delim=". \t";
-    size_t i,j,other_len;
-
-    const char *to_headers[] = {"Envelope-to", "X-Original-To"};
+    size_t i;
 
-    primary = notmuch_config_get_user_primary_email (config);
-    other = notmuch_config_get_user_other_email (config, &other_len);
+    const char *to_headers[] = {
+       "Envelope-to",
+       "X-Original-To",
+       "Delivered-To",
+    };
 
     /* sadly, there is no standard way to find out to which email
      * address a mail was delivered - what is in the headers depends
@@ -400,28 +399,19 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message
      * the To: or Cc: header. From here we try the following in order:
      * 1) check for an Envelope-to: header
      * 2) check for an X-Original-To: header
-     * 3) check for a (for <email@add.res>) clause in Received: headers
-     * 4) check for the domain part of known email addresses in the
+     * 3) check for a Delivered-To: header
+     * 4) check for a (for <email@add.res>) clause in Received: headers
+     * 5) check for the domain part of known email addresses in the
      *    'by' part of Received headers
      * If none of these work, we give up and return NULL
      */
-    for (i = 0; i < sizeof(to_headers)/sizeof(*to_headers); i++) {
-       tohdr = xstrdup(notmuch_message_get_header (message, to_headers[i]));
-       if (tohdr && *tohdr) {
-           /* tohdr is potentialy a list of email addresses, so here we
-            * check if one of the email addresses is a substring of tohdr
-            */
-           if (strcasestr(tohdr, primary)) {
-               free(tohdr);
-               return primary;
-           }
-           for (j = 0; j < other_len; j++)
-               if (strcasestr (tohdr, other[j])) {
-                   free(tohdr);
-                   return other[j];
-               }
-           free(tohdr);
-       }
+    for (i = 0; i < ARRAY_SIZE (to_headers); i++) {
+       const char *tohdr = notmuch_message_get_header (message, to_headers[i]);
+
+       /* Note: tohdr potentially contains a list of email addresses. */
+       addr = user_address_in_string (tohdr, config);
+       if (addr)
+           return addr;
     }
 
     /* We get the concatenated Received: headers and search from the
@@ -439,19 +429,12 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message
      * header
      */
     ptr = strstr (received, " for ");
-    if (ptr) {
-       /* the text following is potentialy a list of email addresses,
-        * so again we check if one of the email addresses is a
-        * substring of ptr
-        */
-       if (strcasestr(ptr, primary)) {
-           return primary;
-       }
-       for (i = 0; i < other_len; i++)
-           if (strcasestr (ptr, other[i])) {
-               return other[i];
-           }
-    }
+
+    /* Note: ptr potentially contains a list of email addresses. */
+    addr = user_address_in_string (ptr, config);
+    if (addr)
+       return addr;
+
     /* Finally, we parse all the " by MTA ..." headers to guess the
      * email address that this was originally delivered to.
      * We extract just the MTA here by removing leading whitespace and
@@ -492,15 +475,11 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message
             */
            *(tld-1) = '.';
 
-           if (strcasestr(primary, domain)) {
-               free(mta);
-               return primary;
+           addr = string_in_user_address (domain, config);
+           if (addr) {
+               free (mta);
+               return addr;
            }
-           for (i = 0; i < other_len; i++)
-               if (strcasestr (other[i],domain)) {
-                   free(mta);
-                   return other[i];
-               }
        }
        free (mta);
     }
@@ -596,8 +575,7 @@ notmuch_reply_format_default(void *ctx,
        g_object_unref (G_OBJECT (reply));
        reply = NULL;
 
-       if (mime_node_open (ctx, message, params->cryptoctx, params->decrypt,
-                           &root) == NOTMUCH_STATUS_SUCCESS) {
+       if (mime_node_open (ctx, message, &(params->crypto), &root) == NOTMUCH_STATUS_SUCCESS) {
            format_part_reply (root);
            talloc_free (root);
        }
@@ -626,8 +604,7 @@ notmuch_reply_format_json(void *ctx,
 
     messages = notmuch_query_search_messages (query);
     message = notmuch_messages_get (messages);
-    if (mime_node_open (ctx, message, params->cryptoctx, params->decrypt,
-                       &node) != NOTMUCH_STATUS_SUCCESS)
+    if (mime_node_open (ctx, message, &(params->crypto), &node) != NOTMUCH_STATUS_SUCCESS)
        return 1;
 
     reply = create_reply_message (ctx, config, message, reply_all);
@@ -727,7 +704,12 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
     char *query_string;
     int opt_index, ret = 0;
     int (*reply_format_func)(void *ctx, notmuch_config_t *config, notmuch_query_t *query, notmuch_show_params_t *params, notmuch_bool_t reply_all);
-    notmuch_show_params_t params = { .part = -1 };
+    notmuch_show_params_t params = {
+       .part = -1,
+       .crypto = {
+           .decrypt = FALSE
+       }
+    };
     int format = FORMAT_DEFAULT;
     int reply_all = TRUE;
 
@@ -741,7 +723,7 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
          (notmuch_keyword_t []){ { "all", TRUE },
                                  { "sender", FALSE },
                                  { 0, 0 } } },
-       { NOTMUCH_OPT_BOOLEAN, &params.decrypt, "decrypt", 'd', 0 },
+       { NOTMUCH_OPT_BOOLEAN, &params.crypto.decrypt, "decrypt", 'd', 0 },
        { 0, 0, 0, 0, 0 }
     };
 
@@ -758,18 +740,18 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
     else
        reply_format_func = notmuch_reply_format_default;
 
-    if (params.decrypt) {
+    if (params.crypto.decrypt) {
 #ifdef GMIME_ATLEAST_26
        /* TODO: GMimePasswordRequestFunc */
-       params.cryptoctx = g_mime_gpg_context_new (NULL, "gpg");
+       params.crypto.gpgctx = g_mime_gpg_context_new (NULL, "gpg");
 #else
        GMimeSession* session = g_object_new (g_mime_session_get_type(), NULL);
-       params.cryptoctx = g_mime_gpg_context_new (session, "gpg");
+       params.crypto.gpgctx = g_mime_gpg_context_new (session, "gpg");
 #endif
-       if (params.cryptoctx) {
-           g_mime_gpg_context_set_always_trust ((GMimeGpgContext*) params.cryptoctx, FALSE);
+       if (params.crypto.gpgctx) {
+           g_mime_gpg_context_set_always_trust ((GMimeGpgContext*) params.crypto.gpgctx, FALSE);
        } else {
-           params.decrypt = FALSE;
+           params.crypto.decrypt = FALSE;
            fprintf (stderr, "Failed to construct gpg context.\n");
        }
 #ifndef GMIME_ATLEAST_26
@@ -805,11 +787,9 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
     if (reply_format_func (ctx, config, query, &params, reply_all) != 0)
        return 1;
 
+    notmuch_crypto_cleanup (&params.crypto);
     notmuch_query_destroy (query);
     notmuch_database_destroy (notmuch);
 
-    if (params.cryptoctx)
-       g_object_unref(params.cryptoctx);
-
     return ret;
 }