82554e56ec7bb222c2e9783b2bb290ef423f72ce
[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
15
16 void LoadZoneFiles(void)
17 {
18         icalarray *zones;
19         int z;
20         long len;
21         const char *this_zone;
22         StrBuf *ZName;
23         
24         ZoneHash = NewHash(1, NULL);
25         ZName = NewStrBufPlain(HKEY("UTC"));
26         Put(ZoneHash, HKEY("UTC"), ZName, HFreeStrBuf);
27         zones = icaltimezone_get_builtin_timezones();
28         for (z = 0; z < zones->num_elements; ++z) {
29                 /* lprintf(9, "Location: %-40s tzid: %s\n",
30                         icaltimezone_get_location(icalarray_element_at(zones, z)),
31                         icaltimezone_get_tzid(icalarray_element_at(zones, z))
32                 ); */
33                 this_zone = icaltimezone_get_location(icalarray_element_at(zones, z));
34                 len = strlen(this_zone);
35                 ZName = NewStrBufPlain(this_zone, len);
36                 Put(ZoneHash, this_zone, len, ZName, HFreeStrBuf);
37         }
38         SortByHashKey(ZoneHash, 0);
39 }
40
41
42 typedef struct _CfgMapping {
43         int type;
44         const char *Key;
45         long len;
46 }CfgMapping;
47
48 #define CFG_STR 1
49 #define CFG_YES 2
50 #define CFG_NO 3
51
52 CfgMapping ServerConfig[] = {
53         {CFG_STR, HKEY("c_nodename")},
54         {CFG_STR, HKEY("c_fqdn")},
55         {CFG_STR, HKEY("c_humannode")},
56         {CFG_STR, HKEY("c_phonenum")},
57         {CFG_YES, HKEY("c_creataide")},
58         {CFG_STR, HKEY("c_sleeping")},
59         {CFG_STR, HKEY("c_initax")},
60         {CFG_YES, HKEY("c_regiscall")},
61         {CFG_YES, HKEY("c_twitdetect")},
62         {CFG_STR, HKEY("c_twitroom")},
63         {CFG_STR, HKEY("c_moreprompt")},
64         {CFG_YES, HKEY("c_restrict")},
65         {CFG_STR, HKEY("c_bbs_city")},
66         {CFG_STR, HKEY("c_sysadm")},
67         {CFG_STR, HKEY("c_maxsessions")},
68         {CFG_STR, HKEY("reserved1")},
69         {CFG_STR, HKEY("c_userpurge")},
70         {CFG_STR, HKEY("c_roompurge")},
71         {CFG_STR, HKEY("c_logpages")},
72         {CFG_STR, HKEY("c_createax")},
73         {CFG_STR, HKEY("c_maxmsglen")},
74         {CFG_STR, HKEY("c_min_workers")},
75         {CFG_STR, HKEY("c_max_workers")},
76         {CFG_STR, HKEY("c_pop3_port")},
77         {CFG_STR, HKEY("c_smtp_port")},
78         {CFG_NO , HKEY("c_rfc822_strict_from")},        /* note: reverse bool */
79         {CFG_YES, HKEY("c_aide_zap")},
80         {CFG_STR, HKEY("c_imap_port")},
81         {CFG_STR, HKEY("c_net_freq")},
82         {CFG_YES, HKEY("c_disable_newu")},
83         {CFG_STR, HKEY("reserved2")},
84         {CFG_STR, HKEY("c_purge_hour")},
85         {CFG_STR, HKEY("c_ldap_host")},
86         {CFG_STR, HKEY("c_ldap_port")},
87         {CFG_STR, HKEY("c_ldap_base_dn")},
88         {CFG_STR, HKEY("c_ldap_bind_dn")},
89         {CFG_STR, HKEY("c_ldap_bind_pw")},
90         {CFG_STR, HKEY("c_ip_addr")},
91         {CFG_STR, HKEY("c_msa_port")},
92         {CFG_STR, HKEY("c_imaps_port")},
93         {CFG_STR, HKEY("c_pop3s_port")},
94         {CFG_STR, HKEY("c_smtps_port")},
95         {CFG_YES, HKEY("c_enable_fulltext")},
96         {CFG_YES, HKEY("c_auto_cull")},
97         {CFG_YES, HKEY("c_instant_expunge")},
98         {CFG_YES, HKEY("c_allow_spoofing")},
99         {CFG_YES, HKEY("c_journal_email")},
100         {CFG_YES, HKEY("c_journal_pubmsgs")},
101         {CFG_STR, HKEY("c_journal_dest")},
102         {CFG_STR, HKEY("c_default_cal_zone")},
103         {CFG_STR, HKEY("c_pftcpdict_port")},
104         {CFG_STR, HKEY("c_mgesve_port")},
105         {CFG_STR, HKEY("c_auth_mode")},
106         {CFG_STR, HKEY("c_funambol_host")},
107         {CFG_STR, HKEY("c_funambol_port")},
108         {CFG_STR, HKEY("c_funambol_source")},
109         {CFG_STR, HKEY("c_funambol_auth")},
110         {CFG_YES, HKEY("c_rbl_at_greeting")},
111         {CFG_STR, HKEY("c_master_user")},
112         {CFG_STR, HKEY("c_master_pass")},
113         {CFG_STR, HKEY("c_pager_program")},
114         {CFG_YES, HKEY("c_imap_keep_from")},
115         {CFG_STR, HKEY("c_xmpp_c2s_port")},
116         {CFG_STR, HKEY("c_xmpp_s2s_port")},
117         {CFG_STR, HKEY("c_pop3_fetch")},
118         {CFG_STR, HKEY("c_pop3_fastest")},
119         {CFG_YES , HKEY("c_spam_flag_only")}
120 };
121
122
123 /*
124  *  display all configuration items
125  */
126 void load_siteconfig(void)
127 {
128         wcsession *WCC = WC;
129         StrBuf *Buf, *CfgToken;
130         HashList *Cfg;
131         char buf[SIZ];
132         long len;
133         int i;
134         
135         if (WCC->ServCfg == NULL)
136                 WCC->ServCfg = NewHash(1, NULL);
137         Cfg = WCC->ServCfg;
138
139         serv_printf("CONF get");
140         serv_getln(buf, sizeof buf);
141         i = 0;
142         Buf = NewStrBuf();
143         while ((sizeof(ServerConfig) / sizeof(CfgMapping)) &&
144                (len = StrBuf_ServGetln(Buf),
145                 strcmp(ChrPtr(Buf), "000")) && 
146                (i <= sizeof(ServerConfig))) 
147         {
148                 Put(Cfg,
149                     ServerConfig[i].Key, 
150                     ServerConfig[i].len, 
151                     Buf, 
152                     HFreeStrBuf);
153                 i++;
154                 if (i <= sizeof(ServerConfig) / sizeof(CfgMapping))
155                         Buf = NewStrBuf();
156                 else
157                         Buf = NULL;                     
158         }
159         FreeStrBuf(&Buf);
160
161         serv_puts("GPEX site");
162         Buf = NewStrBuf();
163         CfgToken = NULL;
164         StrBuf_ServGetln(Buf);
165         if (GetServerStatus(Buf, NULL) == 2) {
166                 StrBufCutLeft(Buf, 4);
167
168                 CfgToken = NewStrBuf();
169                 StrBufExtract_token(CfgToken, Buf, 0, '|');
170                 Put(Cfg, HKEY("sitepolicy"), CfgToken, HFreeStrBuf);
171
172                 CfgToken = NewStrBuf();
173                 StrBufExtract_token(CfgToken, Buf, 1, '|');
174                 Put(Cfg, HKEY("sitevalue"), CfgToken, HFreeStrBuf);
175         }
176
177         serv_puts("GPEX mailboxes");
178         StrBuf_ServGetln(Buf);
179         if (GetServerStatus(Buf, NULL) == 2) {
180                 StrBufCutLeft(Buf, 4);
181
182                 CfgToken = NewStrBuf();
183                 StrBufExtract_token(CfgToken, Buf, 0, '|');
184                 Put(Cfg, HKEY("mboxpolicy"), CfgToken, HFreeStrBuf);
185
186                 CfgToken = NewStrBuf();
187                 StrBufExtract_token(CfgToken, Buf, 1, '|');
188                 Put(Cfg, HKEY("mboxvalue"), CfgToken, HFreeStrBuf);
189         }
190         FreeStrBuf(&Buf);
191 }
192
193
194 /**
195  * parse siteconfig changes 
196  */
197 void siteconfig(void)
198 {
199         wcsession *WCC = WC;
200         int i;
201         char buf[256];
202
203         if (strlen(bstr("ok_button")) == 0) {
204                 display_aide_menu();
205                 return;
206         }
207         serv_printf("CONF set");
208         serv_getln(buf, sizeof buf);
209         if (buf[0] != '4') {
210                 safestrncpy(WCC->ImportantMessage, &buf[4], sizeof WCC->ImportantMessage);
211                 display_aide_menu();
212                 return;
213         }
214
215         for (i=0; i < (sizeof(ServerConfig) / sizeof(CfgMapping)); i ++)
216         {
217                 switch (ServerConfig[i].type) {
218                 default:
219                 case CFG_STR:
220                         serv_putbuf(SBstr(ServerConfig[i].Key, ServerConfig[i].len));
221                         break;
222                 case CFG_YES:
223                         serv_puts(YesBstr(ServerConfig[i].Key, 
224                                           ServerConfig[i].len) ?
225                                   "1" : "0");
226                         break;
227                 case CFG_NO:
228                         serv_puts(YesBstr(ServerConfig[i].Key, 
229                                           ServerConfig[i].len) ?
230                                   "0" : "1");
231                         break;
232                 }
233         }
234         serv_puts("000");
235
236         serv_printf("SPEX site|%d|%d", ibstr("sitepolicy"), ibstr("sitevalue"));
237         serv_getln(buf, sizeof buf);
238         serv_printf("SPEX mailboxes|%d|%d", ibstr("mboxpolicy"), ibstr("mboxvalue"));
239         serv_getln(buf, sizeof buf);
240         FreeStrBuf(&WCC->serv_info->serv_default_cal_zone);
241         WCC->serv_info->serv_default_cal_zone = NewStrBufDup(sbstr("c_default_cal_zone"));
242
243         safestrncpy(WCC->ImportantMessage, _("Your system configuration has been updated."),
244                 sizeof WCC->ImportantMessage);
245         DeleteHash(&WCC->ServCfg);
246         display_aide_menu();
247 }
248
249 void tmplput_servcfg(StrBuf *Target, WCTemplputParams *TP)
250 {
251         wcsession *WCC = WC;
252         void *vBuf;
253         StrBuf *Buf;
254
255         if (WCC->is_aide) {
256                 if (WCC->ServCfg == NULL)
257                         load_siteconfig();
258                 GetHash(WCC->ServCfg, TKEY(0), &vBuf);
259                 Buf = (StrBuf*) vBuf;
260                 StrBufAppendTemplate(Target, TP, Buf, 1);
261         }
262 }
263
264 int ConditionalServCfg(StrBuf *Target, WCTemplputParams *TP)
265 {
266         wcsession *WCC = WC;
267         void *vBuf;
268         StrBuf *Buf;
269
270         if (WCC->is_aide) {
271                 if (WCC->ServCfg == NULL)
272                         load_siteconfig();
273                 GetHash(WCC->ServCfg, TKEY(2), &vBuf);
274                 if (vBuf == NULL) return 0;
275                 Buf = (StrBuf*) vBuf;
276                 if (TP->Tokens->nParameters == 3) {
277                         return 1;
278                 }
279                 else if (TP->Tokens->Params[3]->Type == TYPE_STR)
280                         return (strcmp(TP->Tokens->Params[3]->Start, ChrPtr(Buf)) == 0);
281                 else return (StrTol(Buf) == TP->Tokens->Params[3]->lvalue);
282         }
283         else return 0;
284 }
285
286 int ConditionalServCfgSubst(StrBuf *Target, WCTemplputParams *TP)
287 {
288         wcsession *WCC = WC;
289         void *vBuf;
290         StrBuf *Buf;
291
292         if (WCC->is_aide) {
293                 if (WCC->ServCfg == NULL)
294                         load_siteconfig();
295                 GetHash(WCC->ServCfg, TKEY(2), &vBuf);
296                 if (vBuf == NULL) return 0;
297                 Buf = (StrBuf*) vBuf;
298
299                 return CompareSubstToStrBuf(Buf, TP->Tokens->Params[3]);
300         }
301         else return 0;
302 }
303
304 void CfgZoneTempl(StrBuf *TemplBuffer, WCTemplputParams *TP)
305 {
306         StrBuf *Zone = (StrBuf*) CTX;
307
308         SVPutBuf("ZONENAME", Zone, 1);
309 }
310
311 void 
312 InitModule_SITECONFIG
313 (void)
314 {
315         WebcitAddUrlHandler(HKEY("siteconfig"), "", 0, siteconfig, CTX_NONE);
316
317         RegisterNamespace("SERV:CFG", 1, 2, tmplput_servcfg, NULL, CTX_NONE);
318         RegisterConditional(HKEY("COND:SERVCFG"), 3, ConditionalServCfg, CTX_NONE);
319         RegisterConditional(HKEY("COND:SERVCFG:SUBST"), 4, ConditionalServCfgSubst, CTX_NONE);
320         RegisterIterator("PREF:ZONE", 0, ZoneHash, NULL, CfgZoneTempl, NULL, CTX_PREF, CTX_NONE, IT_NOFLAG);
321 }
322
323 void 
324 ServerStartModule_SITECONFIG
325 (void)
326 {
327         LoadZoneFiles();
328 }
329
330 void 
331 ServerShutdownModule_SITECONFIG
332 (void)
333 {
334         DeleteHash(&ZoneHash);
335 }
336
337
338 void 
339 SessionDestroyModule_SITECONFIG
340 (wcsession *sess)
341 {
342         DeleteHash(&sess->ServCfg);
343 }