/*
* vQadmin Virtual Administration Interface
* Copyright (C) 2000-2002 Inter7 Internet Technologies, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* vol@inter7.com
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <unistd.h>
#include <memory.h>
#include "config.h"
#include "global.h"
#include "vpopmail.h"
#include "vpopmail_config.h"
#include "vauth.h"
#define TOKENS " :\t\n\r"
extern unsigned int acl_features;
extern char WarningBuff[MAX_WARNING_BUFF];
extern vdir_type vdir;
void add_domain()
{
char *domain = NULL;
char *passwd = NULL;
char *lusers = NULL;
char *lfor = NULL;
char *lalias = NULL;
char *lresponder = NULL;
char *llists = NULL;
char *quota = NULL;
char *upop = NULL;
char *uimap = NULL;
char *udialup = NULL;
char *upassc = NULL;
char *uweb = NULL;
char *urelay = NULL;
int ret;
char dir[156];
uid_t uid;
gid_t gid;
FILE *fs;
if (!(acl_features & ACL_DOMAIN_CREATE)) {
global_warning("Create Domain: Permission denied");
t_open(T_MAIN, 1);
}
domain = cgi_is_var("dname");
passwd = cgi_is_var("pp");
lusers = cgi_is_var("lusers");
lfor = cgi_is_var("lfor");
lalias = cgi_is_var("lalias");
lresponder = cgi_is_var("lresponder");
llists = cgi_is_var("llists");
quota = cgi_is_var("quota");
upop = cgi_is_var("upop");
uimap = cgi_is_var("uimap");
udialup = cgi_is_var("udialup");
upassc = cgi_is_var("upassc");
uweb = cgi_is_var("uweb");
urelay = cgi_is_var("urelay");
/* get the domain name */
if (domain==NULL || strlen(domain)==0) {
global_warning("Create Domain: Failed: Must supply domain name");
#ifdef ENABLE_MYSQL
display_add_domain();
#else
t_open("html/add_domain.html", 1);
#endif
}
/* get the password */
if (passwd==NULL || strlen(passwd)==0 ) {
global_warning("Create Domain: Failed: Must supply password");
#ifdef ENABLE_MYSQL
display_add_domain();
#else
t_open("html/add_domain.html", 1);
#endif
}
/* add the domain with defaults */
ret = vadddomain(domain, VPOPMAILDIR, VPOPMAILUID, VPOPMAILGID );
if (ret != VA_SUCCESS) {
global_warning(verror(ret));
t_open(T_MAIN, 1);
} else {
global_warning("Created Domain");
}
/* setup the .qmailadmin-limits file */
vget_assign(domain,dir,156,&uid,&gid);
strncat(dir,"/.qmailadmin-limits", 156);
if ( (fs = fopen(dir,"w+")) == NULL ) {
global_warning("Create Domain: open .qmailadmin-limits failed");
t_open(T_MAIN, 1);
}
if (lusers!=NULL&&strlen(lusers)>0)
fprintf(fs, "maxpopaccounts: %s\n", lusers);
if (lalias!=NULL&&strlen(lalias)>0)
fprintf(fs, "maxaliases: %s\n", lalias);
if (lfor!=NULL&&strlen(lfor)>0)
fprintf(fs, "maxforwards: %s\n", lfor);
if (lresponder!=NULL&&strlen(lresponder)>0)
fprintf(fs, "maxautoresponders: %s\n", lresponder);
if (llists!=NULL&&strlen(llists)>0)
fprintf(fs, "maxmailinglists: %s\n", llists);
if (quota!=NULL && strlen(quota)>0)
fprintf(fs,"default_quota: %s\n",quota);
if (upop!=NULL) fprintf(fs, "disable_pop\n");
if (uimap!=NULL) fprintf(fs, "disable_imap\n");
if (udialup!=NULL) fprintf(fs, "disable_dialup\n");
if (upassc!=NULL) fprintf(fs, "disable_password_changing\n");
if (uweb!=NULL) fprintf(fs, "disable_webmail\n");
if (urelay!=NULL) fprintf(fs, "disable_external_relay\n");
fclose(fs);
chown(dir,uid, gid);
chmod(dir, S_IRUSR | S_IWUSR);
ret = vadduser("postmaster", domain, passwd, "Postmaster", USE_POP );
if (ret != VA_SUCCESS) {
global_warning(verror(ret));
t_open(T_MAIN, 1);
} else {
global_warning("Domain postmaster added");
}
#ifdef ENABLE_MYSQL
ret=insert_owner(domain);
switch(ret) {
case 1:
global_warning("Domain owner not put in database<BR>insert_owner: NULL domain parameter");
break;
case 2:
global_warning("Domain owner not put in database<BR>insert_owner: could not retrieve owner info");
break;
case 3:
global_warning("Domain owner not put in database<BR>You must either select a name or input a name for domain owner");
break;
default:
break;
}
#endif
t_open(T_MAIN, 1);
}
void del_domain()
{
char *domain;
int ret;
if (!(acl_features & ACL_DOMAIN_DELETE)) {
global_warning("Delete Domain: Permission denied");
t_open(T_MAIN, 1);
}
domain = cgi_is_var("dname");
if (domain==NULL || strlen(domain)==0 ) {
global_warning("Delete Domain: Failed: Must supply domain name");
t_open("html/del_domain.html", 1);
}
ret = vdeldomain(domain);
if (ret != VA_SUCCESS) global_warning("Delete Domain: Failed");
else global_warning("Deleted Domain");
t_open(T_MAIN, 1);
}
void view_domain()
{
char *domain;
if (!(acl_features & ACL_DOMAIN_VIEW)) {
global_warning("View Domain: Permission denied");
t_open(T_MAIN, 1);
}
domain = cgi_is_var("dname");
if (domain==NULL || strlen(domain)==0 ) {
global_warning("View Domain: Failed: Must supply domain name");
t_open("html/view_domain.html", 1);
}
post_domain_info(domain);
t_open("html/mod_domain.html", 1);
}
void mod_domain()
{
char *domain = NULL;
char *ppass = NULL;
char *lusers = NULL;
char *lfor = NULL;
char *lalias = NULL;
char *lresponder = NULL;
char *llists = NULL;
char *quota = NULL;
char *upop = NULL;
char *uimap = NULL;
char *udialup = NULL;
char *upassc = NULL;
char *uweb = NULL;
char *urelay = NULL;
int ret;
char dir[156];
uid_t uid;
gid_t gid;
FILE *fs;
if (!(acl_features & ACL_DOMAIN_MOD)) {
global_warning("Mod Domain: Permission denied");
t_open(T_MAIN, 1);
}
domain = cgi_is_var("dname");
/* get the domain name */
if (domain==NULL || strlen(domain)==0) {
global_warning("Mod Domain: Failed: Must supply domain name");
t_open("html/mod_domain.html", 1);
}
lusers = cgi_is_var("lusers");
lfor = cgi_is_var("lfor");
lalias = cgi_is_var("lalias");
lresponder = cgi_is_var("lresponder");
llists = cgi_is_var("llists");
quota = cgi_is_var("quota");
upop = cgi_is_var("upop");
uimap = cgi_is_var("uimap");
udialup = cgi_is_var("udialup");
upassc = cgi_is_var("upassc");
uweb = cgi_is_var("uweb");
urelay = cgi_is_var("urelay");
vget_assign(domain,dir,156,&uid,&gid);
strncat(dir,"/.qmailadmin-limits", 156);
if ( (fs = fopen(dir,"w+")) == NULL ) {
global_warning("Create Domain: open .qmailadmin-limits failed");
t_open(T_MAIN, 1);
}
if ( lusers!=NULL && strlen(lusers) > 0 )
fprintf(fs, "maxpopaccounts: %s\n", lusers);
if ( lalias!=NULL && strlen(lalias) > 0 )
fprintf(fs, "maxaliases: %s\n", lalias);
if ( lfor!=NULL && strlen(lfor) > 0 )
fprintf(fs, "maxforwards: %s\n", lfor);
if ( lresponder!=NULL && strlen(lresponder) > 0 )
fprintf(fs, "maxautoresponders: %s\n", lresponder);
if ( llists!=NULL && strlen(llists) > 0 )
fprintf(fs, "maxmailinglists: %s\n", llists);
if (quota!=NULL && strlen(quota)>0)
fprintf(fs,"default_quota: %s\n",quota);
if (upop!=NULL) fprintf(fs, "disable_pop\n");
if (uimap!=NULL) fprintf(fs, "disable_imap\n");
if (udialup!=NULL) fprintf(fs, "disable_dialup\n");
if (upassc!=NULL) fprintf(fs, "disable_password_changing\n");
if (uweb!=NULL) fprintf(fs, "disable_webmail\n");
if (urelay!=NULL) fprintf(fs, "disable_external_relay\n");
fclose(fs);
chown(dir,uid, gid);
chmod(dir, S_IRUSR | S_IWUSR);
ppass = cgi_is_var("ppass");
if (ppass!=NULL && strlen(ppass)>0) {
ret = vpasswd("postmaster", domain, ppass, USE_POP);
if ( ret != VA_SUCCESS ) {
snprintf(WarningBuff, MAX_WARNING_BUFF,
"Postmaster Password error %s", verror(ret));
global_warning(WarningBuff);
} else {
global_warning("Postmaster password set");
}
}
post_domain_info(domain);
t_open("html/mod_domain.html", 1);
}
void post_domain_info(char *domain)
{
char Dir[156];
char cuid[10];
char cgid[10];
char cusers[10];
char *tmpstr1;
char *tmpstr2;
uid_t uid;
gid_t gid;
FILE *fs;
struct vqpasswd *vpw;
if ( vget_assign(domain,Dir,156,&uid,&gid) == NULL ) {
snprintf(WarningBuff, MAX_WARNING_BUFF,
"Domain %s does not exist", domain);
global_warning(WarningBuff);
global_par("DN", domain);
t_open("html/view_domain.html", 1);
}
global_par("DN", domain);
global_par("DD", Dir);
sprintf(cuid,"%lu", (long unsigned)uid);
global_par("DU", cuid);
sprintf(cgid,"%lu", (long unsigned)gid);
global_par("DG", cgid);
open_big_dir(domain, uid, gid);
close_big_dir(domain,uid,gid);
sprintf(cusers,"%lu", (long unsigned)vdir.cur_users);
global_par("DS", cusers);
vpw = vauth_getpw("postmaster", domain);
if ( vpw != NULL ) global_par("DP", vpw->pw_clear_passwd);
else global_par("DP", "Domain has no postmaster!!");
strncat(Dir,"/.qmailadmin-limits", 156);
fs = fopen(Dir,"r");
if ( fs != NULL ) {
global_par("QL", "CHECKED");
while(fgets(Dir,156,fs)!=NULL) {
if ( (tmpstr1 = strtok(Dir,TOKENS))==NULL) continue;
if ( strcmp(tmpstr1, "maxpopaccounts") == 0 ) {
if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
global_par("MU", tmpstr2);
} else if ( strcmp(tmpstr1, "maxaliases") == 0 ) {
if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
global_par("MA", tmpstr2);
} else if ( strcmp(tmpstr1, "maxforwards") == 0 ) {
if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
global_par("MF", tmpstr2);
} else if ( strcmp(tmpstr1, "maxautoresponders") == 0 ) {
if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
global_par("MR", tmpstr2);
} else if ( strcmp(tmpstr1, "maxmailinglists") == 0 ) {
if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
global_par("ML", tmpstr2);
} else if ( strcmp(tmpstr1, "quota") == 0 ) {
if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
global_par("MQ", tmpstr2);
} else if ( strcmp(tmpstr1, "default_quota") == 0 ) {
if ( (tmpstr2 = strtok(NULL,TOKENS))==NULL) continue;
global_par("MQ", tmpstr2);
} else if ( strcmp(tmpstr1, "disable_pop") == 0 ) {
global_par("MP", "checked");
} else if ( strcmp(tmpstr1, "disable_imap") == 0 ) {
global_par("MI", "checked");
} else if ( strcmp(tmpstr1, "disable_dialup") == 0 ) {
global_par("MD", "checked");
} else if ( strcmp(tmpstr1, "disable_password_changing") == 0 ) {
global_par("MC", "checked");
} else if ( strcmp(tmpstr1, "disable_external_relay") == 0 ) {
global_par("MS", "checked");
} else if ( strcmp(tmpstr1, "disable_webmail") == 0 ) {
global_par("MW", "checked");
}
}
fclose(fs);
} else {
global_par("QU", "CHECKED");
}
}
void list_domains()
{
char *domain;
int matchit = 0;
FILE *fs;
char *tmpbuf;
char *assign_domain;
char *assign_alias_domain;
char bgcolor[30];
char fgcolor[30];
char face[30];
char size[30];
tmpbuf = malloc(500);
if (!(acl_features & ACL_DOMAIN_VIEW)) {
global_warning("List Domains: Permission denied");
t_open(T_MAIN, 1);
}
domain = cgi_is_var("dname");
if (domain!=NULL && strlen(domain)>0 ) {
matchit = 1;
}
memset(bgcolor, 0, 30);
memset(fgcolor, 0, 30);
memset(face, 0, 30);
memset(size, 0, 30);
strncpy( bgcolor, get_lang_code("055"), 30);
strncpy( fgcolor, get_lang_code("056"), 30);
strncpy( face, get_lang_code("057"), 30);
strncpy( size, get_lang_code("058"), 30);
printf("<HTML><HEAD><TITLE>List Domains</TITLE><link href=\"/images/vqadmin/vqadmin.css\" rel=\"stylesheet\" rev=\"stylesheet\" type=\"text/css\" media=\"all\"> </HEAD>\n");
printf("<body bgcolor=%s vlink=%s link=%s alink=%s>\n",
bgcolor, fgcolor, fgcolor, fgcolor);
printf("<FONT face=\"%s\" SIZE=\"%s\" color=\"%s\">\n",
face, size, fgcolor);
if ( matchit == 1 ) printf("<B>Domains containing %s</B><BR>\n", domain);
else printf("<B>All domains</B><BR>\n");
snprintf(tmpbuf, 500, "%s/users/assign", QMAILDIR);
if ( (fs = fopen(tmpbuf, "r")) == NULL ) {
global_warning("List Domains: could not open assign file");
t_open(T_MAIN, 1);
}
while( fgets(tmpbuf,500,fs) != NULL ) {
if ( (assign_domain = strtok(tmpbuf, TOKENS)) == NULL ) continue;
if ( (assign_alias_domain = strtok(NULL, TOKENS)) == NULL ) continue;
/* skip the first + character */
++assign_domain;
/* skip the last - character */
assign_domain[strlen(assign_domain)-1] = 0;
if ( matchit == 1 && strstr(assign_domain, domain) == NULL ) continue;
if ( strcmp(assign_domain, assign_alias_domain) == 0 ) {
printf("<a href=vqadmin.cgi?nav=view_domain&dname=%s>%s</a><BR>\n",
assign_alias_domain, assign_alias_domain);
} else {
printf(
"<a href=vqadmin.cgi?nav=view_domain&dname=%s>%s</a> Aliased to %s<BR>\n",
assign_alias_domain, assign_domain, assign_alias_domain);
}
}
fclose(fs);
printf("<HR>\n");
printf("<a href=\"/cgi-bin/vqadmin/vqadmin.cgi\">Main VqAdmin Menu</a><BR><BR>\n");
printf("<a href=http://www.inter7.com/vqadmin/>%s</a> %s<BR>\n",
VQA_PACKAGE, VQA_VERSION);
printf("<a href=http://www.inter7.com/vpopmail/>%s</a> %s<BR>\n",
PACKAGE, VERSION);
free(tmpbuf);
vexit(0);
}
void add_alias_domain()
{
char *domain = NULL;
char *alias_domain = NULL;
int ret;
if (!(acl_features & ACL_DOMAIN_CREATE)) {
global_warning("Add Alias Domain: Permission denied");
t_open(T_MAIN, 1);
}
domain = cgi_is_var("dname");
alias_domain = cgi_is_var("adname");
/* get the domain name */
if (domain==NULL || strlen(domain)==0) {
global_warning("Add Alias Domain: Failed: Must supply domain name");
#ifdef ENABLE_MYSQL
display_add_domain();
#else
t_open("html/add_domain.html", 1);
#endif
}
/* get the domain name */
if (alias_domain==NULL || strlen(alias_domain)==0) {
global_warning("Add Alias Domain: Failed: Must supply alias domain name");
#ifdef ENABLE_MYSQL
display_add_domain();
#else
t_open("html/add_domain.html", 1);
#endif
}
/* add the domain with defaults */
ret = vaddaliasdomain(alias_domain, domain);
if (ret != VA_SUCCESS) {
global_warning(verror(ret));
t_open(T_MAIN, 1);
} else {
global_warning("Alias Domain Added");
}
t_open(T_MAIN, 1);
}
syntax highlighted by Code2HTML, v. 0.9.1