* bust the other places still accessing token values directly:
[citadel.git] / webcit / siteconfig.c
1 /*
2  * $Id$
3  *
4  * Administrative screen for site-wide configuration
5  */
6
7
8 #include "webcit.h"
9 #include "webserver.h"
10
11
12 HashList *ZoneHash = NULL;
13
14 ConstStr ExpirePolicyString = {CStrOf(roompolicy)     };
15
16 ConstStr ExpirePolicyStrings[][2] = {
17         { { CStrOf(roompolicy)     } , { strof(roompolicy)     "_value", sizeof(strof(roompolicy)     "_value") - 1 } },
18         { { CStrOf(floorpolicy)    } , { strof(floorpolicy)    "_value", sizeof(strof(floorpolicy)    "_value") - 1 } },
19         { { CStrOf(sitepolicy)     } , { strof(sitepolicy)     "_value", sizeof(strof(sitepolicy)     "_value") - 1 } },
20         { { CStrOf(mailboxespolicy)} , { strof(mailboxespolicy)"_value", sizeof(strof(mailboxespolicy)"_value") - 1 } }
21 };
22
23 void LoadExpirePolicy(GPEXWhichPolicy which)
24 {
25         StrBuf *Buf;
26         wcsession *WCC = WC;
27         long State;
28         const char *Pos = NULL;
29
30         serv_printf("GPEX %s", ExpirePolicyStrings[which][0].Key);
31         Buf = NewStrBuf();
32         StrBuf_ServGetln(Buf);
33         WCC->Policy[which].loaded = 1;
34         if (GetServerStatus(Buf, &State) == 2) {
35                 Pos = ChrPtr(Buf) + 4;
36                 WCC->Policy[which].expire_mode = StrBufExtractNext_long(Buf, &Pos, '|');
37                 WCC->Policy[which].expire_value = StrBufExtractNext_long(Buf, &Pos, '|');
38         }
39         else if (State == 550)
40                 StrBufAppendBufPlain(WCC->ImportantMsg,
41                                      _("Higher access is required to access this function."), -1, 0);
42         FreeStrBuf(&Buf);
43 }
44
45 void SaveExpirePolicyFromHTTP(GPEXWhichPolicy which)
46 {
47         StrBuf *Buf;
48         long State;
49
50         serv_printf("SPEX %s|%d|%d", 
51                             ExpirePolicyStrings[which][0].Key,
52                     ibcstr( ExpirePolicyStrings[which][1] ),
53                     ibcstr( ExpirePolicyStrings[which][1] )  );
54
55         Buf = NewStrBuf();
56         StrBuf_ServGetln(Buf);
57         GetServerStatus(Buf, &State);
58         if (State == 550)
59                 StrBufAppendBufPlain(WC->ImportantMsg,
60                                      _("Higher access is required to access this function."), -1, 0);
61         FreeStrBuf(&Buf);
62 }
63
64 int ConditionalExpire(StrBuf *Target, WCTemplputParams *TP)
65 {
66         wcsession *WCC = WC;
67         GPEXWhichPolicy which;
68         int CompareWith;
69
70         which = GetTemplateTokenNumber(Target, TP, 2, 0);
71         CompareWith = GetTemplateTokenNumber(Target, TP, 3, 0);
72
73         if (WCC->Policy[which].loaded == 0) LoadExpirePolicy(which);
74         
75         return WCC->Policy[which].expire_mode == CompareWith;
76 }
77
78 void tmplput_ExpireValue(StrBuf *Target, WCTemplputParams *TP)
79 {
80         GPEXWhichPolicy which;
81         wcsession *WCC = WC;
82                 
83         which = GetTemplateTokenNumber(Target, TP, 2, 0);
84         if (WCC->Policy[which].loaded == 0) LoadExpirePolicy(which);
85         StrBufAppendPrintf(Target, "%d", WCC->Policy[which].expire_value);
86 }
87
88
89 void tmplput_ExpireMode(StrBuf *Target, WCTemplputParams *TP)
90 {
91         GPEXWhichPolicy which;
92         wcsession *WCC = WC;
93                 
94         which = GetTemplateTokenNumber(Target, TP, 2, 0);
95         if (WCC->Policy[which].loaded == 0) LoadExpirePolicy(which);
96         StrBufAppendPrintf(Target, "%d", WCC->Policy[which].expire_mode);
97 }
98
99
100
101 void LoadZoneFiles(void)
102 {
103         icalarray *zones;
104         int z;
105         long len;
106         const char *this_zone;
107         StrBuf *ZName;
108         
109         ZoneHash = NewHash(1, NULL);
110         ZName = NewStrBufPlain(HKEY("UTC"));
111         Put(ZoneHash, HKEY("UTC"), ZName, HFreeStrBuf);
112         zones = icaltimezone_get_builtin_timezones();
113         for (z = 0; z < zones->num_elements; ++z) {
114                 /* lprintf(9, "Location: %-40s tzid: %s\n",
115                         icaltimezone_get_location(icalarray_element_at(zones, z)),
116                         icaltimezone_get_tzid(icalarray_element_at(zones, z))
117                 ); */
118                 this_zone = icaltimezone_get_location(icalarray_element_at(zones, z));
119                 len = strlen(this_zone);
120                 ZName = NewStrBufPlain(this_zone, len);
121                 Put(ZoneHash, this_zone, len, ZName, HFreeStrBuf);
122         }
123         SortByHashKey(ZoneHash, 0);
124 }
125
126
127 typedef struct _CfgMapping {
128         int type;
129         const char *Key;
130         long len;
131 }CfgMapping;
132
133 #define CFG_STR 1
134 #define CFG_YES 2
135 #define CFG_NO 3
136
137 CfgMapping ServerConfig[] = {
138         {CFG_STR, HKEY("c_nodename")},
139         {CFG_STR, HKEY("c_fqdn")},
140         {CFG_STR, HKEY("c_humannode")},
141         {CFG_STR, HKEY("c_phonenum")},
142         {CFG_YES, HKEY("c_creataide")},
143         {CFG_STR, HKEY("c_sleeping")},
144         {CFG_STR, HKEY("c_initax")},
145         {CFG_YES, HKEY("c_regiscall")},
146         {CFG_YES, HKEY("c_twitdetect")},
147         {CFG_STR, HKEY("c_twitroom")},
148         {CFG_STR, HKEY("c_moreprompt")},
149         {CFG_YES, HKEY("c_restrict")},
150         {CFG_STR, HKEY("c_bbs_city")},
151         {CFG_STR, HKEY("c_sysadm")},
152         {CFG_STR, HKEY("c_maxsessions")},
153         {CFG_STR, HKEY("reserved1")},
154         {CFG_STR, HKEY("c_userpurge")},
155         {CFG_STR, HKEY("c_roompurge")},
156         {CFG_STR, HKEY("c_logpages")},
157         {CFG_STR, HKEY("c_createax")},
158         {CFG_STR, HKEY("c_maxmsglen")},
159         {CFG_STR, HKEY("c_min_workers")},
160         {CFG_STR, HKEY("c_max_workers")},
161         {CFG_STR, HKEY("c_pop3_port")},
162         {CFG_STR, HKEY("c_smtp_port")},
163         {CFG_NO , HKEY("c_rfc822_strict_from")},        /* note: reverse bool */
164         {CFG_YES, HKEY("c_aide_zap")},
165         {CFG_STR, HKEY("c_imap_port")},
166         {CFG_STR, HKEY("c_net_freq")},
167         {CFG_YES, HKEY("c_disable_newu")},
168         {CFG_STR, HKEY("reserved2")},
169         {CFG_STR, HKEY("c_purge_hour")},
170         {CFG_STR, HKEY("c_ldap_host")},
171         {CFG_STR, HKEY("c_ldap_port")},
172         {CFG_STR, HKEY("c_ldap_base_dn")},
173         {CFG_STR, HKEY("c_ldap_bind_dn")},
174         {CFG_STR, HKEY("c_ldap_bind_pw")},
175         {CFG_STR, HKEY("c_ip_addr")},
176         {CFG_STR, HKEY("c_msa_port")},
177         {CFG_STR, HKEY("c_imaps_port")},
178         {CFG_STR, HKEY("c_pop3s_port")},
179         {CFG_STR, HKEY("c_smtps_port")},
180         {CFG_YES, HKEY("c_enable_fulltext")},
181         {CFG_YES, HKEY("c_auto_cull")},
182         {CFG_YES, HKEY("c_instant_expunge")},
183         {CFG_YES, HKEY("c_allow_spoofing")},
184         {CFG_YES, HKEY("c_journal_email")},
185         {CFG_YES, HKEY("c_journal_pubmsgs")},
186         {CFG_STR, HKEY("c_journal_dest")},
187         {CFG_STR, HKEY("c_default_cal_zone")},
188         {CFG_STR, HKEY("c_pftcpdict_port")},
189         {CFG_STR, HKEY("c_mgesve_port")},
190         {CFG_STR, HKEY("c_auth_mode")},
191         {CFG_STR, HKEY("c_funambol_host")},
192         {CFG_STR, HKEY("c_funambol_port")},
193         {CFG_STR, HKEY("c_funambol_source")},
194         {CFG_STR, HKEY("c_funambol_auth")},
195         {CFG_YES, HKEY("c_rbl_at_greeting")},
196         {CFG_STR, HKEY("c_master_user")},
197         {CFG_STR, HKEY("c_master_pass")},
198         {CFG_STR, HKEY("c_pager_program")},
199         {CFG_YES, HKEY("c_imap_keep_from")},
200         {CFG_STR, HKEY("c_xmpp_c2s_port")},
201         {CFG_STR, HKEY("c_xmpp_s2s_port")},
202         {CFG_STR, HKEY("c_pop3_fetch")},
203         {CFG_STR, HKEY("c_pop3_fastest")},
204         {CFG_YES , HKEY("c_spam_flag_only")}
205 };
206
207
208 /*
209  *  display all configuration items
210  */
211 void load_siteconfig(void)
212 {
213         wcsession *WCC = WC;
214         StrBuf *Buf;
215         HashList *Cfg;
216         char buf[SIZ];
217         long len;
218         int i;
219         
220         if (WCC->ServCfg == NULL)
221                 WCC->ServCfg = NewHash(1, NULL);
222         Cfg = WCC->ServCfg;
223
224         serv_printf("CONF get");
225         serv_getln(buf, sizeof buf);
226         i = 0;
227         Buf = NewStrBuf();
228         while ((sizeof(ServerConfig) / sizeof(CfgMapping)) &&
229                (len = StrBuf_ServGetln(Buf),
230                 strcmp(ChrPtr(Buf), "000")) && 
231                (i <= sizeof(ServerConfig))) 
232         {
233                 Put(Cfg,
234                     ServerConfig[i].Key, 
235                     ServerConfig[i].len, 
236                     Buf, 
237                     HFreeStrBuf);
238                 i++;
239                 if (i <= sizeof(ServerConfig) / sizeof(CfgMapping))
240                         Buf = NewStrBuf();
241                 else
242                         Buf = NULL;                     
243         }
244         FreeStrBuf(&Buf);
245
246         LoadExpirePolicy(sitepolicy);
247         LoadExpirePolicy(mailboxespolicy);
248 }
249
250
251
252 /**
253  * parse siteconfig changes 
254  */
255 void siteconfig(void)
256 {
257         wcsession *WCC = WC;
258         int i;
259         char buf[256];
260
261         if (strlen(bstr("ok_button")) == 0) {
262                 display_aide_menu();
263                 return;
264         }
265         serv_printf("CONF set");
266         serv_getln(buf, sizeof buf);
267         if (buf[0] != '4') {
268                 safestrncpy(WCC->ImportantMessage, &buf[4], sizeof WCC->ImportantMessage);
269                 display_aide_menu();
270                 return;
271         }
272
273         for (i=0; i < (sizeof(ServerConfig) / sizeof(CfgMapping)); i ++)
274         {
275                 switch (ServerConfig[i].type) {
276                 default:
277                 case CFG_STR:
278                         serv_putbuf(SBstr(ServerConfig[i].Key, ServerConfig[i].len));
279                         break;
280                 case CFG_YES:
281                         serv_puts(YesBstr(ServerConfig[i].Key, 
282                                           ServerConfig[i].len) ?
283                                   "1" : "0");
284                         break;
285                 case CFG_NO:
286                         serv_puts(YesBstr(ServerConfig[i].Key, 
287                                           ServerConfig[i].len) ?
288                                   "0" : "1");
289                         break;
290                 }
291         }
292         serv_puts("000");
293
294         SaveExpirePolicyFromHTTP(sitepolicy);
295         SaveExpirePolicyFromHTTP(mailboxespolicy);
296
297         FreeStrBuf(&WCC->serv_info->serv_default_cal_zone);
298         WCC->serv_info->serv_default_cal_zone = NewStrBufDup(sbstr("c_default_cal_zone"));
299
300         safestrncpy(WCC->ImportantMessage, _("Your system configuration has been updated."),
301                 sizeof WCC->ImportantMessage);
302         DeleteHash(&WCC->ServCfg);
303         display_aide_menu();
304 }
305
306 void tmplput_servcfg(StrBuf *Target, WCTemplputParams *TP)
307 {
308         wcsession *WCC = WC;
309         void *vBuf;
310         StrBuf *Buf;
311
312         if (WCC->is_aide) {
313                 if (WCC->ServCfg == NULL)
314                         load_siteconfig();
315                 GetHash(WCC->ServCfg, TKEY(0), &vBuf);
316                 Buf = (StrBuf*) vBuf;
317                 StrBufAppendTemplate(Target, TP, Buf, 1);
318         }
319 }
320
321 int ConditionalServCfg(StrBuf *Target, WCTemplputParams *TP)
322 {
323         wcsession *WCC = WC;
324         void *vBuf;
325         StrBuf *Buf;
326
327         if (WCC->is_aide) {
328                 if (WCC->ServCfg == NULL)
329                         load_siteconfig();
330                 GetHash(WCC->ServCfg, TKEY(2), &vBuf);
331                 if (vBuf == NULL) return 0;
332                 Buf = (StrBuf*) vBuf;
333                 if (TP->Tokens->nParameters == 3) {
334                         return 1;
335                 }
336                 else if (IS_NUMBER(TP->Tokens->Params[3]->Type))
337                         return (StrTol(Buf) == GetTemplateTokenNumber (Target, TP, 3, 0));
338                 else
339                 {
340                         const char *pch;
341                         long len;
342                         
343                         GetTemplateTokenString(Target, TP, 3, &pch, &len);
344                 
345                         return ((len == StrLength(Buf)) &&
346                                 (strcmp(pch, ChrPtr(Buf)) == 0));
347                 }
348
349         }
350         else return 0;
351 }
352
353 int ConditionalServCfgSubst(StrBuf *Target, WCTemplputParams *TP)
354 {
355         wcsession *WCC = WC;
356         void *vBuf;
357         StrBuf *Buf;
358
359         if (WCC->is_aide) {
360                 if (WCC->ServCfg == NULL)
361                         load_siteconfig();
362                 GetHash(WCC->ServCfg, TKEY(2), &vBuf);
363                 if (vBuf == NULL) return 0;
364                 Buf = (StrBuf*) vBuf;
365
366                 return CompareSubstToStrBuf(Buf, TP->Tokens->Params[3]);
367         }
368         else return 0;
369 }
370
371 void CfgZoneTempl(StrBuf *TemplBuffer, WCTemplputParams *TP)
372 {
373         StrBuf *Zone = (StrBuf*) CTX;
374
375         SVPutBuf("ZONENAME", Zone, 1);
376 }
377
378 void 
379 InitModule_SITECONFIG
380 (void)
381 {
382         WebcitAddUrlHandler(HKEY("siteconfig"), "", 0, siteconfig, CTX_NONE);
383
384         RegisterNamespace("SERV:CFG", 1, 2, tmplput_servcfg, NULL, CTX_NONE);
385         RegisterConditional(HKEY("COND:SERVCFG"), 3, ConditionalServCfg, CTX_NONE);
386         RegisterConditional(HKEY("COND:SERVCFG:SUBST"), 4, ConditionalServCfgSubst, CTX_NONE);
387         RegisterIterator("PREF:ZONE", 0, ZoneHash, NULL, CfgZoneTempl, NULL, CTX_PREF, CTX_NONE, IT_NOFLAG);
388
389         REGISTERTokenParamDefine(roompolicy);
390         REGISTERTokenParamDefine(floorpolicy);
391         REGISTERTokenParamDefine(sitepolicy);
392         REGISTERTokenParamDefine(mailboxespolicy);
393
394         REGISTERTokenParamDefine(EXPIRE_NEXTLEVEL);
395         REGISTERTokenParamDefine(EXPIRE_MANUAL);
396         REGISTERTokenParamDefine(EXPIRE_NUMMSGS);
397         REGISTERTokenParamDefine(EXPIRE_AGE);
398
399         RegisterConditional(HKEY("COND:EXPIRE:MODE"), 2, ConditionalExpire, CTX_NONE);
400         RegisterNamespace("EXPIRE:VALUE", 1, 2, tmplput_ExpireValue, NULL, CTX_NONE);
401         RegisterNamespace("EXPIRE:MODE", 1, 2, tmplput_ExpireMode, NULL, CTX_NONE);
402 }
403
404 void 
405 ServerStartModule_SITECONFIG
406 (void)
407 {
408         LoadZoneFiles();
409 }
410
411 void 
412 ServerShutdownModule_SITECONFIG
413 (void)
414 {
415         DeleteHash(&ZoneHash);
416 }
417
418
419 void 
420 SessionDestroyModule_SITECONFIG
421 (wcsession *sess)
422 {
423         DeleteHash(&sess->ServCfg);
424 }