]> code.citadel.org Git - citadel.git/commitdiff
Use detection of config keys and sender domain to determine whether to dkim-sign...
authorArt Cancro <ajc@citadel.org>
Tue, 14 May 2024 04:25:02 +0000 (04:25 +0000)
committerArt Cancro <ajc@citadel.org>
Tue, 14 May 2024 04:25:02 +0000 (04:25 +0000)
citadel/server/modules/smtp/serv_smtpclient.c
citadel/server/msgbase.c

index ac5f3883eedee39879fba2c8b8e40d3810a72419..7247fb19e5b09153c444c05579e3dfba01db2112 100644 (file)
@@ -232,19 +232,26 @@ int smtp_attempt_delivery(long msgid, char *recp, char *envelope_from, char *sou
        CtdlOutputMsg(msgid, MT_RFC822, HEADERS_ALL, 0, 1, NULL, 0, NULL, &fromaddr, NULL);
        s.TheMessage = CC->redirect_buffer;
        CC->redirect_buffer = NULL;
+       syslog(LOG_DEBUG, "fromaddr=<%s>",fromaddr);
 
        // If we have a DKIM key, try to sign the message.
        char *dkim_private_key = CtdlGetConfigStr("dkim_private_key");
        char *dkim_selector = CtdlGetConfigStr("dkim_selector");
        char *dkim_from_domain = (strchr(fromaddr, '@') ? strchr(fromaddr, '@')+1 : NULL);
-       if (!IsEmptyStr(dkim_private_key) && !IsEmptyStr(dkim_selector) && !IsEmptyStr(dkim_from_domain)) {
-               char *pkey = strdup(dkim_private_key);
-               if (pkey) {
+       if (
+               !IsEmptyStr(dkim_from_domain)                   // Is the sending domain non-empty?
+               && IsDirectory(fromaddr, 0)                     // and is it one of "our" domains?
+               && !IsEmptyStr(dkim_private_key)                // Do we have a private signing key?
+               && !IsEmptyStr(dkim_selector)                   // and a selector to go with it?
+       ) {
+               char *pkey = strdup(dkim_private_key);          // If you answered "yes" to all of the above questions,
+               if (pkey) {                                     // congratulations!  We get to DKIM-sign the message!
                        char *sp;
-                       while (sp = strchr(pkey, '_')) {
-                               *sp = '\n';
+                       while (sp = strchr(pkey, '_')) {        // The dkim_private_key record contains our RSA private key,
+                               *sp = '\n';                     // but we have to convert all the newlines back to underscores.
                        }
-                       syslog(LOG_DEBUG, "private key: <%s>\n", pkey);
+                       syslog(LOG_DEBUG, "smtpclient: dkim-signing with private key for selector <%s> domain <%s>",
+                               dkim_selector, dkim_from_domain);
                        dkim_sign(s.TheMessage, pkey, dkim_from_domain, dkim_selector);
                        free(pkey);
                }
index 8582fba301bed1b1f50209c45b5384ec34a04187..aaf4446c604f07f6b434bffa7dc905fd26e84109 100644 (file)
@@ -1488,16 +1488,13 @@ int CtdlOutputMsg(long msg_num,         // message number (local) to fetch
                        );
 
                if ((Author != NULL) && (*Author == NULL)) {
-                       long len;
-                       CM_GetAsField(TheMessage, eAuthor, Author, &len);
+                       *Author = strdup(TheMessage->cm_fields[eAuthor]);
                }
                if ((Address != NULL) && (*Address == NULL)) {  
-                       long len;
-                       CM_GetAsField(TheMessage, erFc822Addr, Address, &len);
+                       *Address = strdup(TheMessage->cm_fields[erFc822Addr]);
                }
                if ((MessageID != NULL) && (*MessageID == NULL)) {      
-                       long len;
-                       CM_GetAsField(TheMessage, emessageId, MessageID, &len);
+                       *MessageID = strdup(TheMessage->cm_fields[emessageId]);
                }
                CM_Free(TheMessage);
                TheMessage = NULL;