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