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