X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fpreferences.c;h=ae381cc1e5b45afe68b9246c695f154a51b872a9;hb=HEAD;hp=a492f5d06c6a837cf963637ead91edd75029994c;hpb=a13d1d34c6f9bb9b2ffd448e177200151ce42e79;p=citadel.git diff --git a/webcit/preferences.c b/webcit/preferences.c index a492f5d06..e438b0318 100644 --- a/webcit/preferences.c +++ b/webcit/preferences.c @@ -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); @@ -154,7 +165,8 @@ void ParsePref(HashList **List, StrBuf *ReadBuf) Preference *LastData = NULL; while (!Done) { - StrBuf_ServGetln(ReadBuf); + if (StrBuf_ServGetln(ReadBuf) < 0) + break; if ( (StrLength(ReadBuf)==3) && !strcmp(ChrPtr(ReadBuf), "000")) { Done = 1; @@ -172,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, @@ -182,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; @@ -220,10 +246,8 @@ void load_preferences(void) serv_puts("subj|__ WebCit Preferences __"); serv_puts("000"); } - while (!Done && - StrBuf_ServGetln(ReadBuf)) { - 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; } @@ -234,9 +258,11 @@ void load_preferences(void) serv_printf("MSG0 %ld", msgnum); StrBuf_ServGetln(ReadBuf); if (GetServerStatus(ReadBuf, NULL) == 1) { - while (StrBuf_ServGetln(ReadBuf), - (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); @@ -254,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) @@ -314,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; @@ -325,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) { @@ -374,10 +404,8 @@ void save_preferences(void) serv_puts("subj|__ WebCit Preferences __"); serv_puts("000"); } - while (!Done && - StrBuf_ServGetln(ReadBuf)) { - 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; } @@ -409,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) { @@ -445,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) @@ -502,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, @@ -536,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) { @@ -836,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; } @@ -970,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; @@ -977,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); @@ -991,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++; @@ -1067,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; @@ -1095,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; } @@ -1116,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); } @@ -1148,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); @@ -1160,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); @@ -1211,7 +1280,3 @@ SessionDestroyModule_PREFERENCES { DeleteHash(&sess->hash_prefs); } - - - -/*@}*/