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