1 /*
2 * vQadmin Virtual Administration Interface
3 * Copyright (C) 2000-2002 Inter7 Internet Technologies, Inc.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 *
19 * vol@inter7.com
20 */
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <sys/types.h>
25 #include <sys/stat.h>
26 #include <string.h>
27 #include <unistd.h>
28 #include <memory.h>
29 #include "config.h"
30 #include "global.h"
31 #include "vpopmail.h"
32 #include "vpopmail_config.h"
33 #include "vauth.h"
34
35 #define TOKENS " :\t\n\r"
36
37 extern unsigned int acl_features;
38 extern char WarningBuff[MAX_WARNING_BUFF];
39 extern vdir_type vdir;
40
add_domain()41 void add_domain()
42 {
43 char *domain = NULL;
44 char *passwd = NULL;
45 char *lusers = NULL;
46 char *lfor = NULL;
47 char *lalias = NULL;
48 char *lresponder = NULL;
49 char *llists = NULL;
50 char *quota = NULL;
51 char *upop = NULL;
52 char *uimap = NULL;
53 char *udialup = NULL;
54 char *upassc = NULL;
55 char *uweb = NULL;
56 char *urelay = NULL;
57 int ret;
58 char dir[156];
59 uid_t uid;
60 gid_t gid;
61 FILE *fs;
62
63 if (!(acl_features & ACL_DOMAIN_CREATE)) {
64 global_warning("Create Domain: Permission denied");
65 t_open(T_MAIN, 1);
66 }
67
68 domain = cgi_is_var("dname");
69 passwd = cgi_is_var("pp");
70
71 lusers = cgi_is_var("lusers");
72 lfor = cgi_is_var("lfor");
73 lalias = cgi_is_var("lalias");
74 lresponder = cgi_is_var("lresponder");
75 llists = cgi_is_var("llists");
76
77 quota = cgi_is_var("quota");
78 upop = cgi_is_var("upop");
79 uimap = cgi_is_var("uimap");
80 udialup = cgi_is_var("udialup");
81 upassc = cgi_is_var("upassc");
82 uweb = cgi_is_var("uweb");
83 urelay = cgi_is_var("urelay");
84
85 /* get the domain name */
86 if (domain==NULL || strlen(domain)==0) {
87 global_warning("Create Domain: Failed: Must supply domain name");
88
89 #ifdef ENABLE_MYSQL
90 display_add_domain();
91 #else
92 t_open("html/add_domain.html", 1);
93 #endif
94 }
95
96 /* get the password */
97 if (passwd==NULL || strlen(passwd)==0 ) {
98 global_warning("Create Domain: Failed: Must supply password");
99
100 #ifdef ENABLE_MYSQL
101 display_add_domain();
102 #else
103 t_open("html/add_domain.html", 1);
104 #endif
105 }
106
107 /* add the domain with defaults */
108 ret = vadddomain(domain, VPOPMAILDIR, VPOPMAILUID, VPOPMAILGID );
109 if (ret != VA_SUCCESS) {
110 global_warning(verror(ret));
111 t_open(T_MAIN, 1);
112 } else {
113 global_warning("Created Domain");
114 }
115
116 /* setup the .qmailadmin-limits file */
117 vget_assign(domain,dir,156,&uid,&gid);
118 strncat(dir,"/.qmailadmin-limits", 156);
119 if ( (fs = fopen(dir,"w+")) == NULL ) {
120 global_warning("Create Domain: open .qmailadmin-limits failed");
121 t_open(T_MAIN, 1);
122 }
123
124 if (lusers!=NULL&&strlen(lusers)>0)
125 fprintf(fs, "maxpopaccounts: %s\n", lusers);
126
127 if (lalias!=NULL&&strlen(lalias)>0)
128 fprintf(fs, "maxaliases: %s\n", lalias);
129
130 if (lfor!=NULL&&strlen(lfor)>0)
131 fprintf(fs, "maxforwards: %s\n", lfor);
132
133 if (lresponder!=NULL&&strlen(lresponder)>0)
134 fprintf(fs, "maxautoresponders: %s\n", lresponder);
135
136 if (llists!=NULL&&strlen(llists)>0)
137 fprintf(fs, "maxmailinglists: %s\n", llists);
138
139 if (quota!=NULL && strlen(quota)>0)
140 fprintf(fs,"default_quota: %s\n",quota);
141
142 if (upop!=NULL) fprintf(fs, "disable_pop\n");
143 if (uimap!=NULL) fprintf(fs, "disable_imap\n");
144 if (udialup!=NULL) fprintf(fs, "disable_dialup\n");
145 if (upassc!=NULL) fprintf(fs, "disable_password_changing\n");
146 if (uweb!=NULL) fprintf(fs, "disable_webmail\n");
147 if (urelay!=NULL) fprintf(fs, "disable_external_relay\n");
148 fclose(fs);
149 chown(dir,uid, gid);
150 chmod(dir, S_IRUSR | S_IWUSR);
151
152 ret = vadduser("postmaster", domain, passwd, "Postmaster", USE_POP );
153 if (ret != VA_SUCCESS) {
154 global_warning(verror(ret));
155 t_open(T_MAIN, 1);
156 } else {
157 global_warning("Domain postmaster added");
158 }
159
160 #ifdef ENABLE_MYSQL
161 ret=insert_owner(domain);
162
163 switch(ret) {
164 case 1:
165 global_warning("Domain owner not put in database<BR>insert_owner: NULL domain parameter");
166 break;
167 case 2:
168 global_warning("Domain owner not put in database<BR>insert_owner: could not retrieve owner info");
169 break;
170 case 3:
171 global_warning("Domain owner not put in database<BR>You must either select a name or input a name for domain owner");
172 break;
173 default:
174 break;
175 }
176 #endif
177
178 t_open(T_MAIN, 1);
179 }
180
181
del_domain()182 void del_domain()
183 {
184 char *domain;
185 int ret;
186
187 if (!(acl_features & ACL_DOMAIN_DELETE)) {
188 global_warning("Delete Domain: Permission denied");
189 t_open(T_MAIN, 1);
190 }
191
192 domain = cgi_is_var("dname");
193 if (domain==NULL || strlen(domain)==0 ) {
194 global_warning("Delete Domain: Failed: Must supply domain name");
195 t_open("html/del_domain.html", 1);
196 }
197
198 ret = vdeldomain(domain);
199 if (ret != VA_SUCCESS) global_warning("Delete Domain: Failed");
200 else global_warning("Deleted Domain");
201
202 t_open(T_MAIN, 1);
203 }
204
view_domain()205 void view_domain()
206 {
207 char *domain;
208
209
210 if (!(acl_features & ACL_DOMAIN_VIEW)) {
211 global_warning("View Domain: Permission denied");
212 t_open(T_MAIN, 1);
213 }
214
215 domain = cgi_is_var("dname");
216 if (domain==NULL || strlen(domain)==0 ) {
217 global_warning("View Domain: Failed: Must supply domain name");
218 t_open("html/view_domain.html", 1);
219 }
220
221 post_domain_info(domain);
222
223 t_open("html/mod_domain.html", 1);
224
225 }
226
227
mod_domain()228 void mod_domain()
229 {
230 char *domain = NULL;
231 char *ppass = NULL;
232 char *lusers = NULL;
233 char *lfor = NULL;
234 char *lalias = NULL;
235 char *lresponder = NULL;
236 char *llists = NULL;
237 char *quota = NULL;
238 char *upop = NULL;
239 char *uimap = NULL;
240 char *udialup = NULL;
241 char *upassc = NULL;
242 char *uweb = NULL;
243 char *urelay = NULL;
244 int ret;
245 char dir[156];
246 uid_t uid;
247 gid_t gid;
248 FILE *fs;
249
250 if (!(acl_features & ACL_DOMAIN_MOD)) {
251 global_warning("Mod Domain: Permission denied");
252 t_open(T_MAIN, 1);
253 }
254
255 domain = cgi_is_var("dname");
256
257 /* get the domain name */
258 if (domain==NULL || strlen(domain)==0) {
259 global_warning("Mod Domain: Failed: Must supply domain name");
260 t_open("html/mod_domain.html", 1);
261 }
262
263 lusers = cgi_is_var("lusers");
264 lfor = cgi_is_var("lfor");
265 lalias = cgi_is_var("lalias");
266 lresponder = cgi_is_var("lresponder");
267 llists = cgi_is_var("llists");
268 quota = cgi_is_var("quota");
269 upop = cgi_is_var("upop");
270 uimap = cgi_is_var("uimap");
271 udialup = cgi_is_var("udialup");
272 upassc = cgi_is_var("upassc");
273 uweb = cgi_is_var("uweb");
274 urelay = cgi_is_var("urelay");
275
276 vget_assign(domain,dir,156,&uid,&gid);
277 strncat(dir,"/.qmailadmin-limits", 156);
278 if ( (fs = fopen(dir,"w+")) == NULL ) {
279 global_warning("Create Domain: open .qmailadmin-limits failed");
280 t_open(T_MAIN, 1);
281 }
282 if ( lusers!=NULL && strlen(lusers) > 0 )
283 fprintf(fs, "maxpopaccounts: %s\n", lusers);
284 if ( lalias!=NULL && strlen(lalias) > 0 )
285 fprintf(fs, "maxaliases: %s\n", lalias);
286 if ( lfor!=NULL && strlen(lfor) > 0 )
287 fprintf(fs, "maxforwards: %s\n", lfor);
288 if ( lresponder!=NULL && strlen(lresponder) > 0 )
289 fprintf(fs, "maxautoresponders: %s\n", lresponder);
290 if ( llists!=NULL && strlen(llists) > 0 )
291 fprintf(fs, "maxmailinglists: %s\n", llists);
292 if (quota!=NULL && strlen(quota)>0)
293 fprintf(fs,"default_quota: %s\n",quota);
294
295 if (upop!=NULL) fprintf(fs, "disable_pop\n");
296 if (uimap!=NULL) fprintf(fs, "disable_imap\n");
297 if (udialup!=NULL) fprintf(fs, "disable_dialup\n");
298 if (upassc!=NULL) fprintf(fs, "disable_password_changing\n");
299 if (uweb!=NULL) fprintf(fs, "disable_webmail\n");
300 if (urelay!=NULL) fprintf(fs, "disable_external_relay\n");
301
302 fclose(fs);
303 chown(dir,uid, gid);
304 chmod(dir, S_IRUSR | S_IWUSR);
305
306 ppass = cgi_is_var("ppass");
307 if (ppass!=NULL && strlen(ppass)>0) {
308 ret = vpasswd("postmaster", domain, ppass, USE_POP);
309 if ( ret != VA_SUCCESS ) {
310 snprintf(WarningBuff, MAX_WARNING_BUFF,
311 "Postmaster Password error %s", verror(ret));
312 global_warning(WarningBuff);
313 } else {
314 global_warning("Postmaster password set");
315 }
316 }
317
318 post_domain_info(domain);
319
320 t_open("html/mod_domain.html", 1);
321
322 }
323
post_domain_info(char * domain)324 void post_domain_info(char *domain)
325 {
326 char Dir[156];
327 char cuid[10];
328 char cgid[10];
329 char cusers[10];
330 char *tmpstr1;
331 char *tmpstr2;
332 uid_t uid;
333 gid_t gid;
334 FILE *fs;
335 struct vqpasswd *vpw;
336
337 if ( vget_assign(domain,Dir,156,&uid,&gid) == NULL ) {
338 snprintf(WarningBuff, MAX_WARNING_BUFF,
339 "Domain %s does not exist", domain);
340 global_warning(WarningBuff);
341 global_par("DN", domain);
342 t_open("html/view_domain.html", 1);
343 }
344 global_par("DN", domain);
345 global_par("DD", Dir);
346
347 sprintf(cuid,"%lu", (long unsigned)uid);
348 global_par("DU", cuid);
349
350 sprintf(cgid,"%lu", (long unsigned)gid);
351 global_par("DG", cgid);
352
353 open_big_dir(domain, uid, gid);
354 close_big_dir(domain,uid,gid);
355
356 sprintf(cusers,"%lu", (long unsigned)vdir.cur_users);
357 global_par("DS", cusers);
358
359 vpw = vauth_getpw("postmaster", domain);
360 if ( vpw != NULL ) global_par("DP", vpw->pw_clear_passwd);
361 else global_par("DP", "Domain has no postmaster!!");
362
363 strncat(Dir,"/.qmailadmin-limits", 156);
364 fs = fopen(Dir,"r");
365 if ( fs != NULL ) {
366 global_par("QL", "CHECKED");
367 while(fgets(Dir,156,fs)!=NULL) {
368 if ( (tmpstr1 = strtok(Dir,TOKENS))==NULL) continue;
369
370 if ( strcmp(tmpstr1, "maxpopaccounts") == 0 ) {
371 if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
372 global_par("MU", tmpstr2);
373
374 } else if ( strcmp(tmpstr1, "maxaliases") == 0 ) {
375 if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
376 global_par("MA", tmpstr2);
377
378 } else if ( strcmp(tmpstr1, "maxforwards") == 0 ) {
379 if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
380 global_par("MF", tmpstr2);
381
382 } else if ( strcmp(tmpstr1, "maxautoresponders") == 0 ) {
383 if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
384 global_par("MR", tmpstr2);
385
386 } else if ( strcmp(tmpstr1, "maxmailinglists") == 0 ) {
387 if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
388 global_par("ML", tmpstr2);
389
390 } else if ( strcmp(tmpstr1, "quota") == 0 ) {
391 if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
392 global_par("MQ", tmpstr2);
393
394 } else if ( strcmp(tmpstr1, "default_quota") == 0 ) {
395 if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
396 global_par("MQ", tmpstr2);
397
398 } else if ( strcmp(tmpstr1, "disable_pop") == 0 ) {
399 global_par("MP", "checked");
400
401 } else if ( strcmp(tmpstr1, "disable_imap") == 0 ) {
402 global_par("MI", "checked");
403
404 } else if ( strcmp(tmpstr1, "disable_dialup") == 0 ) {
405 global_par("MD", "checked");
406
407 } else if ( strcmp(tmpstr1, "disable_password_changing") == 0 ) {
408 global_par("MC", "checked");
409
410 } else if ( strcmp(tmpstr1, "disable_external_relay") == 0 ) {
411 global_par("MS", "checked");
412
413 } else if ( strcmp(tmpstr1, "disable_webmail") == 0 ) {
414 global_par("MW", "checked");
415
416 }
417 }
418 fclose(fs);
419 } else {
420 global_par("QU", "CHECKED");
421 }
422
423 }
424
list_domains()425 void list_domains()
426 {
427 char *domain;
428 int matchit = 0;
429 FILE *fs;
430 char *tmpbuf;
431 char *assign_domain;
432 char *assign_alias_domain;
433 char bgcolor[30];
434 char fgcolor[30];
435 char face[30];
436 char size[30];
437
438 tmpbuf = malloc(500);
439 if (!(acl_features & ACL_DOMAIN_VIEW)) {
440 global_warning("List Domains: Permission denied");
441 t_open(T_MAIN, 1);
442 }
443
444 domain = cgi_is_var("dname");
445 if (domain!=NULL && strlen(domain)>0 ) {
446 matchit = 1;
447 }
448
449 memset(bgcolor, 0, 30);
450 memset(fgcolor, 0, 30);
451 memset(face, 0, 30);
452 memset(size, 0, 30);
453 strncpy( bgcolor, get_lang_code("055"), 30);
454 strncpy( fgcolor, get_lang_code("056"), 30);
455 strncpy( face, get_lang_code("057"), 30);
456 strncpy( size, get_lang_code("058"), 30);
457
458 printf("<HTML><HEAD><TITLE>List Domains</TITLE><link href=\"/images/vqadmin/vqadmin.css\" rel=\"stylesheet\" rev=\"stylesheet\" type=\"text/css\" media=\"all\"> </HEAD>\n");
459 printf("<body bgcolor=%s vlink=%s link=%s alink=%s>\n",
460 bgcolor, fgcolor, fgcolor, fgcolor);
461 printf("<FONT face=\"%s\" SIZE=\"%s\" color=\"%s\">\n",
462 face, size, fgcolor);
463
464 if ( matchit == 1 ) printf("<B>Domains containing %s</B><BR>\n", domain);
465 else printf("<B>All domains</B><BR>\n");
466
467 snprintf(tmpbuf, 500, "%s/users/assign", QMAILDIR);
468 if ( (fs = fopen(tmpbuf, "r")) == NULL ) {
469 global_warning("List Domains: could not open assign file");
470 t_open(T_MAIN, 1);
471 }
472
473 while( fgets(tmpbuf,500,fs) != NULL ) {
474 if ( (assign_domain = strtok(tmpbuf, TOKENS)) == NULL ) continue;
475 if ( (assign_alias_domain = strtok(NULL, TOKENS)) == NULL ) continue;
476
477 /* skip the first + character */
478 ++assign_domain;
479
480 /* skip the last - character */
481 assign_domain[strlen(assign_domain)-1] = 0;
482 if ( matchit == 1 && strstr(assign_domain, domain) == NULL ) continue;
483
484 if ( strcmp(assign_domain, assign_alias_domain) == 0 ) {
485 printf("<a href=vqadmin.cgi?nav=view_domain&dname=%s>%s</a><BR>\n",
486 assign_alias_domain, assign_alias_domain);
487 } else {
488 printf(
489 "<a href=vqadmin.cgi?nav=view_domain&dname=%s>%s</a> Aliased to %s<BR>\n",
490 assign_alias_domain, assign_domain, assign_alias_domain);
491 }
492 }
493 fclose(fs);
494
495 printf("<HR>\n");
496 printf("<a href=\"/cgi-bin/vqadmin/vqadmin.cgi\">Main VqAdmin Menu</a><BR><BR>\n");
497 printf("<a href=http://www.inter7.com/vqadmin/>%s</a> %s<BR>\n",
498 VQA_PACKAGE, VQA_VERSION);
499 printf("<a href=http://www.inter7.com/vpopmail/>%s</a> %s<BR>\n",
500 PACKAGE, VERSION);
501
502 free(tmpbuf);
503 vexit(0);
504
505 }
506
add_alias_domain()507 void add_alias_domain()
508 {
509 char *domain = NULL;
510 char *alias_domain = NULL;
511 int ret;
512
513 if (!(acl_features & ACL_DOMAIN_CREATE)) {
514 global_warning("Add Alias Domain: Permission denied");
515 t_open(T_MAIN, 1);
516 }
517
518 domain = cgi_is_var("dname");
519 alias_domain = cgi_is_var("adname");
520
521 /* get the domain name */
522 if (domain==NULL || strlen(domain)==0) {
523 global_warning("Add Alias Domain: Failed: Must supply domain name");
524
525 #ifdef ENABLE_MYSQL
526 display_add_domain();
527 #else
528 t_open("html/add_domain.html", 1);
529 #endif
530 }
531
532 /* get the domain name */
533 if (alias_domain==NULL || strlen(alias_domain)==0) {
534 global_warning("Add Alias Domain: Failed: Must supply alias domain name");
535
536 #ifdef ENABLE_MYSQL
537 display_add_domain();
538 #else
539 t_open("html/add_domain.html", 1);
540 #endif
541 }
542
543 /* add the domain with defaults */
544 ret = vaddaliasdomain(alias_domain, domain);
545 if (ret != VA_SUCCESS) {
546 global_warning(verror(ret));
547 t_open(T_MAIN, 1);
548 } else {
549 global_warning("Alias Domain Added");
550 }
551
552 t_open(T_MAIN, 1);
553
554 }
555