* add frontent code for xmpps port
[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         {CFG_STR, HKEY("c_xmpps_c2s_port")}
121 };
122
123
124 /*
125  *  display all configuration items
126  */
127 void load_siteconfig(void)
128 {
129         wcsession *WCC = WC;
130         StrBuf *Buf, *CfgToken;
131         HashList *Cfg;
132         char buf[SIZ];
133         long len;
134         int i;
135         
136         if (WCC->ServCfg == NULL)
137                 WCC->ServCfg = NewHash(1, NULL);
138         Cfg = WCC->ServCfg;
139
140         serv_printf("CONF get");
141         serv_getln(buf, sizeof buf);
142         i = 0;
143         Buf = NewStrBuf();
144         while ((sizeof(ServerConfig) / sizeof(CfgMapping)) &&
145                (len = StrBuf_ServGetln(Buf),
146                 strcmp(ChrPtr(Buf), "000")) && 
147                (i <= sizeof(ServerConfig))) 
148         {
149                 Put(Cfg,
150                     ServerConfig[i].Key, 
151                     ServerConfig[i].len, 
152                     Buf, 
153                     HFreeStrBuf);
154                 i++;
155                 if (i <= sizeof(ServerConfig) / sizeof(CfgMapping))
156                         Buf = NewStrBuf();
157                 else
158                         Buf = NULL;                     
159         }
160         FreeStrBuf(&Buf);
161
162         serv_puts("GPEX site");
163         Buf = NewStrBuf();
164         CfgToken = NULL;
165         StrBuf_ServGetln(Buf);
166         if (GetServerStatus(Buf, NULL) == 2) {
167                 StrBufCutLeft(Buf, 4);
168
169                 CfgToken = NewStrBuf();
170                 StrBufExtract_token(CfgToken, Buf, 0, '|');
171                 Put(Cfg, HKEY("sitepolicy"), CfgToken, HFreeStrBuf);
172
173                 CfgToken = NewStrBuf();
174                 StrBufExtract_token(CfgToken, Buf, 1, '|');
175                 Put(Cfg, HKEY("sitevalue"), CfgToken, HFreeStrBuf);
176         }
177
178         serv_puts("GPEX mailboxes");
179         StrBuf_ServGetln(Buf);
180         if (GetServerStatus(Buf, NULL) == 2) {
181                 StrBufCutLeft(Buf, 4);
182
183                 CfgToken = NewStrBuf();
184                 StrBufExtract_token(CfgToken, Buf, 0, '|');
185                 Put(Cfg, HKEY("mboxpolicy"), CfgToken, HFreeStrBuf);
186
187                 CfgToken = NewStrBuf();
188                 StrBufExtract_token(CfgToken, Buf, 1, '|');
189                 Put(Cfg, HKEY("mboxvalue"), CfgToken, HFreeStrBuf);
190         }
191         FreeStrBuf(&Buf);
192 }
193
194
195 /**
196  * parse siteconfig changes 
197  */
198 void siteconfig(void)
199 {
200         wcsession *WCC = WC;
201         int i;
202         char buf[256];
203
204         if (strlen(bstr("ok_button")) == 0) {
205                 display_aide_menu();
206                 return;
207         }
208         serv_printf("CONF set");
209         serv_getln(buf, sizeof buf);
210         if (buf[0] != '4') {
211                 safestrncpy(WCC->ImportantMessage, &buf[4], sizeof WCC->ImportantMessage);
212                 display_aide_menu();
213                 return;
214         }
215
216         for (i=0; i < (sizeof(ServerConfig) / sizeof(CfgMapping)); i ++)
217         {
218                 switch (ServerConfig[i].type) {
219                 default:
220                 case CFG_STR:
221                         serv_putbuf(SBstr(ServerConfig[i].Key, ServerConfig[i].len));
222                         break;
223                 case CFG_YES:
224                         serv_puts(YesBstr(ServerConfig[i].Key, 
225                                           ServerConfig[i].len) ?
226                                   "1" : "0");
227                         break;
228                 case CFG_NO:
229                         serv_puts(YesBstr(ServerConfig[i].Key, 
230                                           ServerConfig[i].len) ?
231                                   "0" : "1");
232                         break;
233                 }
234         }
235         serv_puts("000");
236
237         serv_printf("SPEX site|%d|%d", ibstr("sitepolicy"), ibstr("sitevalue"));
238         serv_getln(buf, sizeof buf);
239         serv_printf("SPEX mailboxes|%d|%d", ibstr("mboxpolicy"), ibstr("mboxvalue"));
240         serv_getln(buf, sizeof buf);
241         FreeStrBuf(&WCC->serv_info->serv_default_cal_zone);
242         WCC->serv_info->serv_default_cal_zone = NewStrBufDup(sbstr("c_default_cal_zone"));
243
244         safestrncpy(WCC->ImportantMessage, _("Your system configuration has been updated."),
245                 sizeof WCC->ImportantMessage);
246         DeleteHash(&WCC->ServCfg);
247         display_aide_menu();
248 }
249
250 void tmplput_servcfg(StrBuf *Target, WCTemplputParams *TP)
251 {
252         wcsession *WCC = WC;
253         void *vBuf;
254         StrBuf *Buf;
255
256         if (WCC->is_aide) {
257                 if (WCC->ServCfg == NULL)
258                         load_siteconfig();
259                 GetHash(WCC->ServCfg, TKEY(0), &vBuf);
260                 Buf = (StrBuf*) vBuf;
261                 StrBufAppendTemplate(Target, TP, Buf, 1);
262         }
263 }
264
265 int ConditionalServCfg(StrBuf *Target, WCTemplputParams *TP)
266 {
267         wcsession *WCC = WC;
268         void *vBuf;
269         StrBuf *Buf;
270
271         if (WCC->is_aide) {
272                 if (WCC->ServCfg == NULL)
273                         load_siteconfig();
274                 GetHash(WCC->ServCfg, TKEY(2), &vBuf);
275                 if (vBuf == NULL) return 0;
276                 Buf = (StrBuf*) vBuf;
277                 if (TP->Tokens->nParameters == 3) {
278                         return 1;
279                 }
280                 else if (TP->Tokens->Params[3]->Type == TYPE_STR)
281                         return (strcmp(TP->Tokens->Params[3]->Start, ChrPtr(Buf)) == 0);
282                 else return (StrTol(Buf) == TP->Tokens->Params[3]->lvalue);
283         }
284         else return 0;
285 }
286
287 int ConditionalServCfgSubst(StrBuf *Target, WCTemplputParams *TP)
288 {
289         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, TKEY(2), &vBuf);
297                 if (vBuf == NULL) return 0;
298                 Buf = (StrBuf*) vBuf;
299
300                 return CompareSubstToStrBuf(Buf, TP->Tokens->Params[3]);
301         }
302         else return 0;
303 }
304
305 void 
306 InitModule_SITECONFIG
307 (void)
308 {
309         WebcitAddUrlHandler(HKEY("siteconfig"), siteconfig, CTX_NONE);
310
311         RegisterNamespace("SERV:CFG", 1, 2, tmplput_servcfg, CTX_NONE);
312         RegisterConditional(HKEY("COND:SERVCFG"), 3, ConditionalServCfg, CTX_NONE);
313         RegisterConditional(HKEY("COND:SERVCFG:SUBST"), 4, ConditionalServCfgSubst, CTX_NONE);
314 }