Choose default sender email address by envelope recipient
authorWilfried Goesgens <dothebart@citadel.org>
Wed, 5 Dec 2012 22:44:38 +0000 (23:44 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Wed, 5 Dec 2012 22:44:38 +0000 (23:44 +0100)
  - propagate the stored 'enVelopeto' to the citadel protocol as 'nvto' header; nvto may contain several recipients.
  - add handlers to read nvto in webcit
  - evaluate which should be the prefered chosen default sender while loading the GVEA Hash instead of while rendering the template
  - if we are replying to an email, base choice on the nvto-header if it exists.
  - in all other cases use the preference chosen in the prefs-screen

citadel/msgbase.c
webcit/messages.c
webcit/messages.h
webcit/msg_renderers.c
webcit/preferences.c
webcit/static/t/prefs/section_msg_sender_from_select.html

index f44dfe66cb339cc3662ce65f8d798aa2b9cc9a05..dc407afdc369ff88aad6d06684dd39da9cb03b53 100644 (file)
@@ -88,30 +88,32 @@ char *msgkeys[] = {
        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
        NULL, 
-       "from",
-       NULL, NULL, NULL,
-       "exti",
-       "rfca",
-       NULL, 
-       "hnod",
-       "msgn",
-       "jrnl",
-       "rep2",
-       "list",
-       "text",
-       "node",
-       "room",
-       "path",
-       NULL,
-       "rcpt",
-       "spec",
-       "time",
-       "subj",
-       NULL,
-       "wefw",
-       NULL,
-       "cccc",
-       NULL
+       "from", /* A */
+       NULL,   /* B */
+       NULL,   /* C */
+       NULL,   /* D */
+       "exti", /* E */
+       "rfca", /* F */
+       NULL,   /* G */
+       "hnod", /* H */
+       "msgn", /* I */
+       "jrnl", /* J */
+       "rep2", /* K */
+       "list", /* L */
+       "text", /* M */
+       "node", /* N */
+       "room", /* O */
+       "path", /* P */
+       NULL,   /* Q */
+       "rcpt", /* R */
+       "spec", /* S */
+       "time", /* T */
+       "subj", /* U */
+       "nvto", /* V */
+       "wefw", /* W */
+       NULL,   /* X */
+       "cccc", /* Y */
+       NULL    /* Z */
 };
 
 /*
index 6da0b55aa1a97b37df63fc990ab813c185ea9237..4e45ea69681778d6b99d784e9cb08972e768165f 100644 (file)
@@ -1335,6 +1335,7 @@ long l_cccc;
 long l_replyto;
 long l_node;
 long l_rfca;
+long l_nvto;
 
 const char *ReplyToModeStrings [3] = {
        "reply",
@@ -1454,6 +1455,7 @@ void display_enter(void)
                StrBuf *rcpt = NULL;
                StrBuf *cccc = NULL;
                StrBuf *replyto = NULL;
+               StrBuf *nvto = NULL;
                serv_printf("MSG0 %ld|1", replying_to); 
 
                StrBuf_ServGetln(Line);
@@ -1539,7 +1541,7 @@ void display_enter(void)
                                }
                                else if (which == l_replyto) {
                                        replyto = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
-                               }                               
+                               }
                                else if (which == l_rfca) {
                                        StrBuf *FlatRFCA;
                                        rfca = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
@@ -1548,6 +1550,10 @@ void display_enter(void)
                                        FreeStrBuf(&rfca);
                                        rfca = FlatRFCA;
                                }
+                               else if (which == l_nvto) {
+                                       nvto = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+                                       putbstr("nvto", nvto);
+                               }
                        }
 
 
@@ -2071,6 +2077,7 @@ InitModule_MSG
        l_replyto = FourHash("rep2", 4);
        l_node = FourHash("node", 4);
        l_rfca = FourHash("rfca", 4);
+       l_nvto = FourHash("nvto", 4);
 
        return ;
 }
index e8ba1a3f7afc67fa9eaf3e2bd213c3f2074d5cb7..050117b0e2dd7df7a136eab2ff68045188d67537 100644 (file)
@@ -47,6 +47,7 @@ typedef struct _message_summary {
        StrBuf *AllRcpt;
        StrBuf *Room;
        StrBuf *Rfca;
+       StrBuf *EnvTo;
        StrBuf *OtherNode;
        const StrBuf *PartNum;
 
index 47d749b266e43268ee0a84181c8b50eed2c6ddfd..50a0f22714d6abcc63b146d3d1d259ad6a7d82e7 100644 (file)
@@ -51,6 +51,7 @@ void DestroyMessageSummary(void *vMsg)
        FreeStrBuf(&Msg->AllRcpt);
        FreeStrBuf(&Msg->Room);
        FreeStrBuf(&Msg->Rfca);
+       FreeStrBuf(&Msg->EnvTo);
        FreeStrBuf(&Msg->OtherNode);
 
        DeleteHash(&Msg->Attachments);  /* list of Attachments */
@@ -484,6 +485,21 @@ int Conditional_MAIL_SUMM_OTHERNODE(StrBuf *Target, WCTemplputParams *TP)
        return StrLength(Msg->OtherNode) > 0;
 }
 
+void examine_nvto(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
+{
+       wcsession *WCC = WC;
+
+       CheckConvertBufs(WCC);
+       FreeStrBuf(&Msg->EnvTo);
+       Msg->EnvTo = NewStrBufPlain(NULL, StrLength(HdrLine));
+       StrBuf_RFC822_2_Utf8(Msg->EnvTo, 
+                            HdrLine, 
+                            WCC->DefaultCharset, 
+                            FoundCharset,
+                            WCC->ConvertBuf1,
+                            WCC->ConvertBuf2);
+}
+
 
 void examine_rcpt(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
 {
@@ -1598,6 +1614,7 @@ InitModule_MSGRENDERERS
        RegisterMsgHdr(HKEY("rfca"), examine_rfca, 0);
        RegisterMsgHdr(HKEY("node"), examine_node, 0);
        RegisterMsgHdr(HKEY("rcpt"), examine_rcpt, 0);
+       RegisterMsgHdr(HKEY("nvto"), examine_nvto, 0);
        RegisterMsgHdr(HKEY("time"), examine_time, 0);
        RegisterMsgHdr(HKEY("part"), examine_mime_part, 0);
        RegisterMsgHdr(HKEY("text"), examine_text, 1);
index 260bdc7b32f83e0e0d99f6e0c01f83b66ab2d6fb..1155a182da6b846d68fccacde2646ec0207835f5 100644 (file)
@@ -1003,6 +1003,28 @@ int ConditionalHasPreference(StrBuf *Target, WCTemplputParams *TP)
 /********************************************************************************
  *                 preferences stored discrete in citserver
  ********************************************************************************/
+CtxType CTX_VEA = CTX_NONE;
+typedef struct __ValidEmailAddress {
+       StrBuf *Address;
+       int IsDefault;
+}ValidEmailAddress;
+
+void DeleteValidEmailAddress(void *v)
+{
+       ValidEmailAddress *VEA = (ValidEmailAddress*)v;
+       FreeStrBuf(&VEA->Address);
+       free(VEA);
+}
+void tmplput_VEA(StrBuf *Target, WCTemplputParams *TP)
+{
+       ValidEmailAddress* VEA = (ValidEmailAddress*) CTX((CTX_VEA));
+       StrBufAppendTemplate(Target, TP, VEA->Address, 0);
+}
+int ConditionalPreferenceIsDefaulVEA(StrBuf *Target, WCTemplputParams *TP)
+{
+       ValidEmailAddress* VEA = (ValidEmailAddress*) CTX((CTX_VEA));
+       return VEA->IsDefault;
+}
 HashList *GetGVEAHash(StrBuf *Target, WCTemplputParams *TP)
 {
        StrBuf *Rcp;
@@ -1010,7 +1032,12 @@ HashList *GetGVEAHash(StrBuf *Target, WCTemplputParams *TP)
        int Done = 0;
        int i, n = 1;
        char N[64];
+       StrBuf *DefaultFrom = NULL;
+       const StrBuf *EnvelopeTo;
+       ValidEmailAddress *VEA;
 
+       get_preference("defaultfrom", &DefaultFrom);
+       EnvelopeTo = sbstr("nvto");
        Rcp = NewStrBuf();
        serv_puts("GVEA");
        StrBuf_ServGetln(Rcp);
@@ -1024,9 +1051,18 @@ HashList *GetGVEAHash(StrBuf *Target, WCTemplputParams *TP)
                                Done = 1;
                        }
                        else {
+                               VEA = (ValidEmailAddress*) malloc(sizeof(ValidEmailAddress));
                                i = snprintf(N, sizeof(N), "%d", n);
                                StrBufTrim(Rcp);
-                               Put(List, N, i, Rcp, HFreeStrBuf);
+                               VEA->Address = Rcp;
+                               if (EnvelopeTo != NULL)
+                                       VEA->IsDefault = strstr(ChrPtr(EnvelopeTo), ChrPtr(Rcp)) != NULL;
+                               else if (DefaultFrom != NULL)
+                                       VEA->IsDefault = !strcmp(ChrPtr(Rcp), ChrPtr(DefaultFrom));
+                               else
+                                       VEA->IsDefault = 0;
+
+                               Put(List, N, i, VEA, DeleteValidEmailAddress);
                                Rcp = NewStrBuf();
                        }
                        n++;
@@ -1176,6 +1212,8 @@ void
 InitModule_PREFERENCES
 (void)
 {
+       RegisterCTX(CTX_VEA);
+
        WebcitAddUrlHandler(HKEY("set_preferences"), "", 0, set_preferences, 0);
        WebcitAddUrlHandler(HKEY("change_start_page"), "", 0, change_start_page, 0);
 
@@ -1193,7 +1231,10 @@ InitModule_PREFERENCES
        RegisterConditional("COND:ROOM:SET", 4, ConditionalHasRoomPreference, CTX_NONE);
        
        RegisterIterator("PREF:VALID:EMAIL:ADDR", 0, NULL, 
-                        GetGVEAHash, NULL, DeleteGVEAHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+                        GetGVEAHash, NULL, DeleteGVEAHash, CTX_VEA, CTX_NONE, IT_NOFLAG);
+       RegisterNamespace("PREF:VALID:EMAIL:ADDR:STR", 1, 1, tmplput_VEA, NULL, CTX_VEA);
+       RegisterConditional("COND:PREF:VALID:EMAIL:ADDR:STR", 4, ConditionalPreferenceIsDefaulVEA, CTX_VEA);
+
        RegisterIterator("PREF:VALID:EMAIL:NAME", 0, NULL, 
                         GetGVSNHash, NULL, DeleteGVSNHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
 
index b80b79cb8fa55c6982f753f4e5d8641354d663ea..e9877151022e219a64d5f4103b1a07b8a76ba57d 100644 (file)
@@ -1 +1 @@
-<option value="<?CONTEXTSTR("X")>" <?%("COND:CONTEXTSTR", 1, :"defaultfrom", 0, "selected", "")>>&lt;<?CONTEXTSTR("H")>&gt;</option>
+<option value="<?PREF:VALID:EMAIL:ADDR:STR("X")>" <?%("COND:PREF:VALID:EMAIL:ADDR:STR", 1, 0, 0, "selected", "")>>&lt;<?PREF:VALID:EMAIL:ADDR:STR("H")>&gt;</option>