Integrated the DKIM signer into serv_smtpclient, but disabled it
[citadel.git] / webcit / preferences.c
index 02b9102b5872c9b4a8ef7baa21b016f4fbc57150..e438b03185571fde8ed216b88c7faec40581b446 100644 (file)
@@ -1,10 +1,20 @@
 /*
  * Manage user preferences with a little help from the Citadel server.
+ *
+ * Copyright (c) 1996-2012 by the citadel.org team
+ *
+ * This program is open source software.  You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
  */
 
 #include "webcit.h"
-#include "webserver.h"
-#include "groupdav.h"
+
+#include "dav.h"
 
 HashList *PreferenceHooks;
 extern HashList *HandlerHash;
@@ -27,7 +37,7 @@ typedef struct _Preference {
        long lval;
        long decoded;
        StrBuf *DeQPed;
-}Preference;
+} Preference;
 
 void DestroyPrefDef(void *vPrefDef)
 {
@@ -46,6 +56,7 @@ void DestroyPreference(void *vPref)
        free(Pref);
 
 }
+
 void _RegisterPreference(const char *Setting, long SettingLen, 
                         const char *PrefStr, 
                         ePrefType Type, 
@@ -108,7 +119,7 @@ void GetPrefTypes(HashList *List)
                        Pref->Type = PrefType;
                        Pref->eFlatPrefType = Pref->Type->eType;
 
-                       syslog(1, "Loading [%s]with type [%ld] [\"%s\"]\n",
+                       syslog(LOG_DEBUG, "Loading [%s]with type [%d] [\"%s\"]\n",
                                ChrPtr(Pref->Key),
                                Pref->Type->eType,
                                ChrPtr(Pref->Val));
@@ -136,7 +147,7 @@ void GetPrefTypes(HashList *List)
 
                        if (PrefType->OnLoad != NULL){
 
-                               syslog(1, "Loading with: -> %s(\"%s\", %ld)\n",
+                               syslog(LOG_DEBUG, "Loading with: -> %s(\"%s\", %ld)\n",
                                        ChrPtr(PrefType->OnLoadName),
                                        ChrPtr(Pref->Val),
                                        Pref->lval);
@@ -173,6 +184,20 @@ void ParsePref(HashList **List, StrBuf *ReadBuf)
                        Data->Val = NewStrBuf();
                        StrBufExtract_token(Data->Key, ReadBuf, 0, '|');
                        StrBufExtract_token(Data->Val, ReadBuf, 1, '|');
+
+                       /***************** BEGIN VILE SLEAZY HACK ************************/
+
+                       /* some users might still have this start page configured, which now breaks */
+
+                       if (    (!strcasecmp(ChrPtr(Data->Key), "startpage"))
+                               && (!strcasecmp(ChrPtr(Data->Val), "/do_template?template=summary_page"))
+                       ) {
+                               FreeStrBuf(&Data->Val);
+                               Data->Val = NewStrBufPlain(HKEY("/summary"));
+                       }
+
+                       /******************* END VILE SLEAZY HACK ************************/
+
                        if (!IsEmptyStr(ChrPtr(Data->Key)))
                        {
                                Put(*List, 
@@ -183,7 +208,7 @@ void ParsePref(HashList **List, StrBuf *ReadBuf)
                        else 
                        {
                                StrBufTrim(ReadBuf);
-                               syslog(1, "ignoring spurious preference line: [%s]\n", 
+                               syslog(LOG_INFO, "ignoring spurious preference line: [%s]\n", 
                                        ChrPtr(ReadBuf));
                                DestroyPreference(Data);
                                LastData = NULL;
@@ -221,10 +246,8 @@ void load_preferences(void)
                serv_puts("subj|__ WebCit Preferences __");
                serv_puts("000");
        }
-       while (!Done &&
-              (StrBuf_ServGetln(ReadBuf) >= 0)) {
-               if ( (StrLength(ReadBuf)==3) && 
-                    !strcmp(ChrPtr(ReadBuf), "000")) {
+       while (!Done && (StrBuf_ServGetln(ReadBuf) >= 0)) {
+               if ( (StrLength(ReadBuf)==3) && !strcmp(ChrPtr(ReadBuf), "000")) {
                        Done = 1;
                        break;
                }
@@ -235,9 +258,11 @@ void load_preferences(void)
                serv_printf("MSG0 %ld", msgnum);
                StrBuf_ServGetln(ReadBuf);
                if (GetServerStatus(ReadBuf, NULL) == 1) {
-                       while ((StrBuf_ServGetln(ReadBuf) >= 0) && 
-                              (strcmp(ChrPtr(ReadBuf), "text") && 
-                               strcmp(ChrPtr(ReadBuf), "000"))) {
+                       while ( (StrBuf_ServGetln(ReadBuf) >= 0)
+                               && (strcmp(ChrPtr(ReadBuf), "text")
+                               && strcmp(ChrPtr(ReadBuf), "000"))
+                       ) {
+                               /* flush */
                        }
                        if (!strcmp(ChrPtr(ReadBuf), "text")) {
                                ParsePref(&WCC->hash_prefs, ReadBuf);
@@ -255,8 +280,9 @@ void load_preferences(void)
        FlushFolder(&Room);
 }
 
+
 /*
- * Goto the user's configuration room, creating it if necessary.
+ * Go to the user's configuration room, creating it if necessary.
  * returns 0 on success or nonzero upon failure.
  */
 int goto_config_room(StrBuf *Buf, folder *Room) 
@@ -315,10 +341,12 @@ void WritePrefsToServer(HashList *Hash)
                                
                                nchars = StrBufSub(SubBuf, Pref->Val, offset, nchars);
                                
-                               if (n == 0)
+                               if (n == 0) {
                                        serv_printf("%s|%s", ChrPtr(Pref->Key), ChrPtr(SubBuf));
-                               else
+                               }
+                               else {
                                        serv_printf(" %s", ChrPtr(SubBuf));
+                               }
                                
                                offset += nchars;
                                nchars = StrLength(Pref->Val) - offset;
@@ -326,16 +354,17 @@ void WritePrefsToServer(HashList *Hash)
                        }
                        
                }
-               else
+               else {
                        serv_printf("%s|%s", ChrPtr(Pref->Key), ChrPtr(Pref->Val));
+               }
                
        }
        FreeStrBuf(&SubBuf);
        DeleteHashPos(&HashPos);
 }
 
-/**
- * \brief save the modifications
+/*
+ * save the modifications
  */
 void save_preferences(void) 
 {
@@ -375,10 +404,8 @@ void save_preferences(void)
                serv_puts("subj|__ WebCit Preferences __");
                serv_puts("000");
        }
-       while (!Done &&
-              (StrBuf_ServGetln(ReadBuf) >= 0)) {
-               if ( (StrLength(ReadBuf)==3) && 
-                    !strcmp(ChrPtr(ReadBuf), "000")) {
+       while (!Done && (StrBuf_ServGetln(ReadBuf) >= 0)) {
+               if ( (StrLength(ReadBuf)==3) && !strcmp(ChrPtr(ReadBuf), "000")) {
                        Done = 1;
                        break;
                }
@@ -410,12 +437,13 @@ void save_preferences(void)
        FlushFolder(&Room);
 }
 
-/**
- * \brief query the actual setting of key in the citadel database
- * \param key config key to query
- * \param keylen length of the key string
- * \param value StrBuf-value to the key to get
- * \returns found?
+/*
+ * query the actual setting of key in the citadel database
+ *
+ * key         config key to query
+ * keylen      length of the key string
+ * value       StrBuf-value to the key to get
+ * returns:    found?
  */
 int get_pref_backend(const char *key, size_t keylen, Preference **Pref)
 {
@@ -446,49 +474,54 @@ int get_PREFERENCE(const char *key, size_t keylen, StrBuf **value)
        return Ret;
 }
 
-/**
- * \brief      Write a key into the webcit preferences database for this user
+/*
+ * Write a key into the webcit preferences database for this user
  *
- * \params     key             key whichs value is to be modified
- * \param keylen length of the key string
- * \param      value           value to set
- * \param      save_to_server  1 = flush all data to the server, 0 = cache it for now
+ * key                 key whichs value is to be modified
+ * keylen              length of the key string
+ * value               value to set
+ * save_to_server      1 = flush all data to the server, 0 = cache it for now
  */
-long compare_preference(const Preference *PrefA, 
-                       const Preference *PrefB)
+long compare_preference(const Preference *PrefA, const Preference *PrefB)
 {
        ePrefType TypeA, TypeB;
 
-       if (PrefA->Type != NULL)
+       if (PrefA->Type != NULL) {
                TypeA = PrefA->Type->eType;
-       else 
+       }
+       else {
                TypeA = PrefA->eFlatPrefType;
+       }
 
-       if (PrefB->Type != NULL)
+       if (PrefB->Type != NULL) {
                TypeB = PrefB->Type->eType;
-       else 
+       }
+       else {
                TypeB = PrefB->eFlatPrefType;
+       }
 
-       if ((TypeA != PRF_UNSET) && 
-           (TypeB != PRF_UNSET) && 
-           (TypeA != TypeB))
-       {
-               if (TypeA > TypeB)
+       if (    (TypeA != PRF_UNSET)
+               && (TypeB != PRF_UNSET)
+               && (TypeA != TypeB)
+       {
+               if (TypeA > TypeB) {
                        return 1;
-               else /* (PrefA->Type < PrefB->Type) */
+               }
+               else {  /* (PrefA->Type < PrefB->Type) */
                        return -1;
+               }
        }
 
-       if (TypeB == PRF_UNSET)
+       if (TypeB == PRF_UNSET) {
                TypeA = PRF_UNSET;
+       }
                    
        switch (TypeA)
        {
        default:
        case PRF_UNSET:
        case PRF_STRING:
-               return strcmp(ChrPtr(PrefA->Val), 
-                             ChrPtr(PrefB->Val));
+               return strcmp(ChrPtr(PrefA->Val), ChrPtr(PrefB->Val));
        case PRF_YESNO:
        case PRF_INT:
                if (PrefA->lval == PrefB->lval)
@@ -503,13 +536,14 @@ long compare_preference(const Preference *PrefA,
        }
 }
 
-/**
- * \brief      Write a key into the webcit preferences database for this user
+
+/*
+ * Write a key into the webcit preferences database for this user
  *
- * \params     key             key whichs value is to be modified
- * \param keylen length of the key string
- * \param      value           value to set
- * \param      save_to_server  1 = flush all data to the server, 0 = cache it for now
+ * key                 key which value is to be modified
+ * keylen              length of the key string
+ * value               value to set
+ * save_to_server      1 = flush all data to the server, 0 = cache it for now
  */
 void set_preference_backend(const char *key, size_t keylen, 
                            long lvalue, 
@@ -537,7 +571,7 @@ void set_preference_backend(const char *key, size_t keylen,
                Pref->Type = PrefType;
                Pref->eFlatPrefType = PrefType->eType;
                if (Pref->Type->eType != lPrefType)
-                       syslog(1, "warning: saving preference with wrong type [%s] %ld != %ld \n",
+                       syslog(LOG_WARNING, "warning: saving preference with wrong type [%s] %d != %ld \n",
                                key, Pref->Type->eType, lPrefType);
                switch (Pref->Type->eType)
                {
@@ -837,15 +871,13 @@ void GetPreferences(HashList *Setting)
 }
 
 
-/**
- * \brief Commit new preferences and settings
+/*
+ * Commit new preferences and settings
  */
 void set_preferences(void)
 {      
        if (!havebstr("change_button")) {
-               safestrncpy(WC->ImportantMessage, 
-                           _("Cancelled.  No settings were changed."),
-                           sizeof WC->ImportantMessage);
+               AppendImportantMessage(_("Cancelled.  No settings were changed."), -1);
                display_main_menu();
                return;
        }
@@ -971,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;
@@ -978,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);
@@ -992,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 (StrLength(EnvelopeTo) > 0)
+                                       VEA->IsDefault = strstr(ChrPtr(EnvelopeTo), ChrPtr(Rcp)) != NULL;
+                               else if (StrLength(DefaultFrom) > 0)
+                                       VEA->IsDefault = !strcmp(ChrPtr(Rcp), ChrPtr(DefaultFrom));
+                               else
+                                       VEA->IsDefault = 0;
+
+                               Put(List, N, i, VEA, DeleteValidEmailAddress);
                                Rcp = NewStrBuf();
                        }
                        n++;
@@ -1068,7 +1136,6 @@ void offer_start_page(StrBuf *Target, WCTemplputParams *TP)
  */
 void change_start_page(void) 
 {
-       wcsession *WCC = WC;
        const char *pch;
        void *vHandler;
        int ProhibitSave = 0;
@@ -1096,13 +1163,9 @@ void change_start_page(void)
                                       1, 
                                       NULL);
                if (ProhibitSave == 1)
-                       StrBufAppendBufPlain(WCC->ImportantMsg,
-                                            _("This isn't allowed to become the start page."),
-                                            -1, 0);
+                       AppendImportantMessage(_("This isn't allowed to become the start page."), -1);
                else
-                       StrBufAppendBufPlain(WCC->ImportantMsg,
-                                            _("You no longer have a start page selected."),
-                                            -1, 0);
+                       AppendImportantMessage(_("You no longer have a start page selected."), -1);
                display_main_menu();
                return;
        }
@@ -1117,7 +1180,7 @@ void change_start_page(void)
                               NULL);
 
        output_headers(1, 1, 0, 0, 0, 0);
-       do_template("newstartpage", NULL);
+       do_template("newstartpage");
        wDumpContent(1);
 }
 
@@ -1149,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);
 
@@ -1161,12 +1226,15 @@ InitModule_PREFERENCES
        
        RegisterNamespace("PREF:DESCR", 1, 1, tmplput_CFG_Descr, NULL, CTX_NONE);
 
-       RegisterConditional(HKEY("COND:PREF"), 4, ConditionalPreference, CTX_NONE);
-       RegisterConditional(HKEY("COND:PREF:SET"), 4, ConditionalHasPreference, CTX_NONE);
-       RegisterConditional(HKEY("COND:ROOM:SET"), 4, ConditionalHasRoomPreference, CTX_NONE);
+       RegisterConditional("COND:PREF", 4, ConditionalPreference, CTX_NONE);
+       RegisterConditional("COND:PREF:SET", 4, ConditionalHasPreference, CTX_NONE);
+       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);
 
@@ -1212,7 +1280,3 @@ SessionDestroyModule_PREFERENCES
 {
        DeleteHash(&sess->hash_prefs);
 }
-
-
-
-/*@}*/