/*
* 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 <unistd.h>
#include <string.h>
#include <pwd.h>
#include <dirent.h>
#include <time.h>
#include <memory.h>
#include <ctype.h>
#include "global.h"
#include "vpopmail.h"
#include "vpopmail_config.h"
#include "vauth.h"
#include "config.h"
extern unsigned int acl_features;
extern char WarningBuff[MAX_WARNING_BUFF];
char Crypted[100];
void del_user()
{
char *eaddr = NULL;
static char user[156];
static char domain[156];
int ret;
if (!(acl_features & ACL_USER_DELETE)) {
global_warning("Delete Email Account: Permission denied");
t_open(T_MAIN, 1);
}
eaddr = cgi_is_var("eaddr");
if ( eaddr==NULL || strlen(eaddr)==0 ) {
global_warning("Delete Email Account: Failed: no email address given");
t_open("html/del_user.html", 1);
}
parse_email( eaddr, user, domain, 156);
ret = vdeluser(user, domain);
if (ret != VA_SUCCESS) {
global_warning(verror(ret));
} else {
snprintf(WarningBuff, MAX_WARNING_BUFF,
"Email Acount %s deleted", eaddr);
global_warning(WarningBuff);
}
t_open(T_MAIN, 1);
}
void view_user()
{
char *eaddr = NULL;
static char user[156];
static char domain[156];
struct vqpasswd *vpw;
if (!(acl_features & ACL_USER_VIEW)) {
global_warning("View Email Account: Permission denied");
t_open(T_MAIN, 1);
}
eaddr = cgi_is_var("eaddr");
if ( eaddr==NULL || strlen(eaddr)==0 ) {
global_warning("Add Email Account: Failed: no email address given");
t_open("html/view_user.html", 1);
}
parse_email( eaddr, user, domain, 156);
vpw = vauth_getpw(user,domain);
if (vpw == NULL) {
global_warning("View User: account does not exist");
t_open("html/view_user.html", 1);
}
post_email_info( eaddr, vpw, domain);
t_open("html/mod_user.html", 1);
}
void mod_user()
{
char *eaddr = NULL;
static char user[156];
static char domain[156];
char *gecos;
char *passwd;
char *shell;
char *udisable;
char *uweb;
char *uimap;
char *upassc;
char *ubounce;
char *urelay;
char *uqadmin;
int ret;
int i;
int GidFlag = 0;
struct vqpasswd *vpw;
if (!(acl_features & ACL_USER_MOD)){
global_warning("Modify Email Account: Permission denied");
t_open(T_MAIN, 1);
}
eaddr = cgi_is_var("eaddr");
gecos = cgi_is_var("fname");
passwd = cgi_is_var("cpass");
shell = cgi_is_var("quota");
udisable = cgi_is_var("udisable");
uweb = cgi_is_var("uweb");
uimap = cgi_is_var("uimap");
upassc = cgi_is_var("upassc");
ubounce = cgi_is_var("ubounce");
urelay = cgi_is_var("urelay");
uqadmin = cgi_is_var("uqadmin");
if ( eaddr==NULL || strlen(eaddr)==0 ) {
global_warning("Modify Email Account: Failed: no email address given");
t_open("html/mod_user.html", 1);
}
parse_email( eaddr, user, domain, 156);
vpw = vauth_getpw(user,domain);
if (vpw == NULL) {
global_warning("Modify User: account does not exist");
t_open("html/mod_user.html", 1);
}
if ( passwd!=NULL && strlen(passwd)>0 ){
if ( !(vpw->pw_gid & NO_PASSWD_CHNG) ) {
mkpasswd3(passwd,Crypted, 100);
vpw->pw_passwd = Crypted;
vpw->pw_clear_passwd = passwd;
}
}
if ( gecos!=NULL && strlen(gecos)>0 ){
for(i=0;gecos[i]!=0;++i) if (gecos[i] == '+') gecos[i] = ' ';
vpw->pw_gecos = gecos;
}
if ( shell!=NULL && strlen(shell)>0 ){
vpw->pw_shell = shell;
}
if (udisable!=NULL) GidFlag |= NO_POP;
if (uweb!=NULL) GidFlag |= NO_WEBMAIL;
if (uimap!=NULL) GidFlag |= NO_IMAP;
if (ubounce!=NULL) GidFlag |= BOUNCE_MAIL;
if (upassc!=NULL) GidFlag |= NO_PASSWD_CHNG;
if (urelay!=NULL) GidFlag |= NO_RELAY;
if (uqadmin!=NULL) GidFlag |= QA_ADMIN;
vpw->pw_gid = GidFlag;
ret = vauth_setpw(vpw, domain);
if ( ret != VA_SUCCESS ) {
snprintf(WarningBuff, MAX_WARNING_BUFF,
"Modify Account %s error %s", eaddr, verror(ret));
global_warning(WarningBuff);
} else {
snprintf(WarningBuff, MAX_WARNING_BUFF,
"Modify Account %s success", eaddr);
global_warning(WarningBuff);
}
post_email_info( eaddr, vpw, domain);
t_open("html/mod_user.html", 1);
}
void post_email_info( char *eaddr, struct vqpasswd *vpw, char *domain)
{
#ifdef ENABLE_AUTH_LOGGING
time_t mytime;
char *authip;
#endif
global_par("UA", eaddr);
global_par("UN", vpw->pw_gecos);
global_par("UQ", vpw->pw_shell);
global_par("UD", vpw->pw_dir);
#ifdef CLEAR_PASS
global_par("UO", vpw->pw_clear_passwd);
#endif
if (vpw->pw_gid & NO_PASSWD_CHNG) global_par("UC", "CHECKED");
if (vpw->pw_gid & NO_POP) global_par("UP", "CHECKED");
if (vpw->pw_gid & NO_WEBMAIL) global_par("UW", "CHECKED");
if (vpw->pw_gid & NO_IMAP) global_par("UI", "CHECKED");
if (vpw->pw_gid & BOUNCE_MAIL) global_par("UB", "CHECKED");
if (vpw->pw_gid & NO_RELAY) global_par("US", "CHECKED");
if (vpw->pw_gid & QA_ADMIN) global_par("UK", "CHECKED");
#ifdef ENABLE_AUTH_LOGGING
mytime = vget_lastauth(vpw, domain);
authip = vget_lastauthip(vpw, domain);
if ( mytime == 0 ) global_par("UT", "never logged in");
else global_par("UT", asctime(localtime(&mytime)));
if ( authip == 0 || strcmp(authip,NULL_REMOTE_IP) == 0 ) {
global_par("UZ", "never logged in");
} else {
global_par("UZ", authip);
}
#else
global_par("UT", "auth logging not enabled");
global_par("UZ", "auth logging not enabled");
#endif
t_open("html/mod_user.html", 1);
}
void show_users()
{
char *domain;
struct vqpasswd *vpw;
int count;
char *tmpstr;
static char dir[500];
static char workdir[500];
static char tmpbuf[500];
FILE *fs;
DIR *mydir;
struct dirent *mydirent;
int i, j;
int found;
char bgcolor[30];
char fgcolor[30];
char face[30];
char size[30];
#ifdef ENABLE_AUTH_LOGGING
time_t mytime;
#endif
if (!(acl_features & ACL_USER_VIEW)) {
global_warning("View Email Account: Permission denied");
t_open(T_MAIN, 1);
}
domain = cgi_is_var("dname");
if ( domain==NULL ) {
global_warning("Show Users: Failed: no domain name given");
t_open(T_MAIN, 1);
}
if ( vget_assign(domain,dir,156,NULL,NULL) == NULL ) {
global_warning("Show Users: Failed: domain does not exist");
t_open(T_MAIN, 1);
}
memset(bgcolor, 0, 30);
memset(fgcolor, 0, 30);
memset(face, 0, 30);
memset(size, 0, 30);
strncpy( bgcolor, get_lang_code("055"), 29);
strncpy( fgcolor, get_lang_code("056"), 29);
strncpy( face, get_lang_code("057"), 29);
strncpy( size, get_lang_code("058"), 29);
printf("<HTML><HEAD><TITLE>Show Users</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);
printf("<B>Users for %s</B>\n", domain);
printf("<table cellspacing=5>\n");
vpw = vauth_getall(domain,1,0);
if ( vpw == NULL ) {
printf("<tr><td><FONT face=%s color=\"%s\">Domain %s does not exist</FONT></td></tr></table>\n", face, fgcolor,
domain);
} else {
printf("<tr><th align=left><FONT face=%s color=\"%s\">User</FONT></th>\n",
face, fgcolor);
#ifdef CLEAR_PASS
printf("<th><FONT face=%s color=\"%s\">Password</FONT></th>\n",
face, fgcolor);
#endif
printf("<th><FONT face=%s color=\"%s\">Forward</FONT></th>\n",
face, fgcolor);
printf("<th><FONT face=%s color=\"%s\">Vacation</FONT></th>\n",
face, fgcolor);
printf("<th><FONT face=%s color=\"%s\">Quota</FONT></th>\n",
face, fgcolor);
printf("<th><FONT face=%s color=\"%s\">Domain Administrator</FONT></th>\n",
face, fgcolor);
printf("<th><FONT face=%s color=\"%s\">Last Logon</FONT></th></tr><BR>\n",
face, fgcolor);
}
count = 0;
while(vpw != NULL && count < 128000 ){
++count;
printf("<tr><td><FONT face=%s color=\"%s\">", face, fgcolor);
printf("<a href=vqadmin.cgi?nav=view_user&eaddr=%s@%s>",
vpw->pw_name, domain);
printf("%s</a></FONT></td>\n", vpw->pw_name);
#ifdef CLEAR_PASS
printf("<td align=middle><FONT face=%s color=\"%s\">%s</FONT></td>\n",
face, fgcolor, vpw->pw_clear_passwd);
#endif
printf("<td align=middle><FONT face=%s color=\"%s\">", face, fgcolor );
snprintf(workdir, 156, "%s/.qmail", vpw->pw_dir);
fs=fopen(workdir,"r");
if ( fs == NULL ) {
printf("No");
} else {
found = 0;
while( fgets(workdir,156,fs) != NULL ) {
if ( workdir[0] == '&' ) {
printf("%s", &workdir[1]);
found = 1;
}
}
if ( found == 0 ) {
printf("No");
}
}
printf("</FONT></td>\n");
printf("<td align=middle><FONT face=%s color=\"%s\">", face, fgcolor);
if ( fs == NULL ) {
printf("No");
} else {
rewind(fs);
found = 0;
while( fgets(workdir,156,fs) != NULL ) {
if ( strstr(workdir, "autorespond") != NULL ) {
found = 1;
}
}
if ( found == 1 ) {
printf("Yes");
} else {
printf("No");
}
}
printf("</FONT></td>\n");
if ( fs!=NULL) fclose(fs);
printf("<td align=middle><FONT face=%s color=\"%s\">%s</FONT></td>",
face, fgcolor, vpw->pw_shell);
if (vpw->pw_gid & QA_ADMIN) {
printf("<td align=middle><FONT face=%s color=%s><B>Yes</B></FONT></td>\n", face, fgcolor);
} else printf("<td align=middle><FONT face=%s color=%s>No</FONT></td>\n", face, fgcolor);
#ifdef ENABLE_AUTH_LOGGING
mytime = vget_lastauth(vpw, domain);
if ( mytime == 0 ) printf("<td align=middle><FONT face=%s color=%s><B>NEVER LOGGED IN</B></font></td></tr>\n", face, fgcolor);
else printf("<td align=middle><FONT face=%s color=%s>%s</font></td></tr>\n", face, fgcolor, asctime(localtime(&mytime)));
#else
printf("<td align=middle><FONT face=%s color=%s>* auth logging not enabled *</font></td></tr>\n", face, fgcolor);
#endif
vpw = vauth_getall(domain,0,0);
}
printf("</table>\n");
printf("<HR>\n");
printf("<B>Alias/Forwards for %s</B>\n", domain);
printf("<table cellspacing=5>\n");
printf("<tr><th align=left><FONT face=%s color=\"%s\"><B>Name</B></FONT>\n",
face, fgcolor);
printf("</th><th><FONT face=%s color=\"%s\"><B>Alias/Forward</B></FONT></th><BR></tr>\n", face, fgcolor);
chdir(dir);
mydir = opendir(".");
count = 0;
while( (mydirent=readdir(mydir)) != NULL ) {
if ( strncmp(".qmail-", mydirent->d_name, 7) == 0 ) {
if ( strstr(mydirent->d_name, "-owner") != NULL ) continue;
if ( strstr( mydirent->d_name, "-default") != NULL ) continue;
fs=fopen(mydirent->d_name,"r");
memset(tmpbuf,0,sizeof(tmpbuf));
if ( fgets( tmpbuf, 156, fs ) != NULL ) {
if ( tmpbuf[0] == '|' ) {
fclose(fs);
continue;
}
}
for(i=7,j=0;j<156-1&&mydirent->d_name[i]!=0;++i,++j) {
workdir[j] = mydirent->d_name[i];
}
workdir[j] = 0;
++count;
printf("<tr><td align=left><FONT face=%s color=\"%s\">%s@%s</td>",
face, fgcolor, workdir, domain);
printf("<td align=left>\n");
fs=fopen(mydirent->d_name,"r");
while ( fgets( tmpbuf, 156, fs ) != NULL ) {
if ( tmpbuf[0] == '#' || isspace(tmpbuf[0]) ) {
printf("<FONT face=%s color=\"%s\"> </FONT><BR>\n",
face, fgcolor);
} else if ( strstr(tmpbuf, "@") != NULL ) {
if ( tmpbuf[0] == '&' ) i = 1;
else i = 0;
printf("<FONT face=%s color=\"%s\">forward: %s</FONT><BR>\n",
face, fgcolor, &tmpbuf[i]);
} else {
tmpstr = &tmpbuf[strlen(tmpbuf)-2];
*tmpstr = 0;
while (*tmpstr!='/') --tmpstr;
*tmpstr = 0;
while (*tmpstr!='/') --tmpstr;
++tmpstr;
printf("<FONT face=%s color=\"%s\">alias: %s</FONT><BR>\n",
face, fgcolor, tmpstr);
}
}
printf("</td></tr>\n");
fclose(fs);
}
}
closedir(mydir);
printf("</table>\n");
printf("<HR>\n");
printf("<B>Mailing lists for %s</B><BR>\n", domain);
printf("<table>\n");
chdir(dir);
mydir = opendir(".");
count = 0;
while( (mydirent=readdir(mydir)) != NULL ) {
if ( strncmp(".qmail-", mydirent->d_name, 7) == 0 ) {
fs=fopen(mydirent->d_name,"r");
fgets( workdir, 156, fs);
if ( strstr( workdir, "ezmlm-reject") != 0 ) {
for(i=7,j=0;j<156-1&&mydirent->d_name[i]!=0;++i,++j) {
workdir[j] = mydirent->d_name[i];
}
workdir[j] = 0;
++count;
printf("<tr><td><FONT face=%s color=\"%s\">%s@%s</td></tr>",
face, fgcolor, workdir, domain);
}
fclose(fs);
}
}
closedir(mydir);
printf("</table>\n");
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);
vexit(0);
}
void add_user()
{
char *eaddr = NULL;
static char user[156];
static char domain[156];
char *gecos;
char *passwd;
char *shell;
char *udisable;
char *uweb;
char *uimap;
char *upassc;
char *ubounce;
char *urelay;
char *uqadmin;
int ret;
int GidFlag = 0;
struct vqpasswd *vpw;
if (!(acl_features & ACL_USER_CREATE)) {
global_warning("Add Email Account: Permission denied");
t_open(T_MAIN, 1);
}
eaddr = cgi_is_var("eaddr");
gecos = cgi_is_var("fname");
passwd = cgi_is_var("cpass");
shell = cgi_is_var("quota");
udisable = cgi_is_var("udisable");
uweb = cgi_is_var("uweb");
uimap = cgi_is_var("uimap");
upassc = cgi_is_var("upassc");
ubounce = cgi_is_var("ubounce");
urelay = cgi_is_var("urelay");
uqadmin = cgi_is_var("uqadmin");
if ( eaddr==NULL || strlen(eaddr)==0 ) {
global_warning("Add Email Account: Failed: no email address given");
t_open("html/add_user.html", 1);
}
if ( parse_email( eaddr, user, domain, 156) == -1 ) {
global_warning("Add Email Account: Failled: invalid characters in email address ");
t_open("html/add_user.html", 1);
}
vpw = vauth_getpw(user,domain);
if (vpw != NULL) {
global_warning("Add User: Failed: account already exist");
t_open("html/add_user.html", 1);
}
if ( gecos==NULL || strlen(gecos)==0 ){
gecos = user;
}
ret = vadduser(user, domain, passwd, gecos, USE_POP );
if (ret != VA_SUCCESS) {
snprintf(WarningBuff, MAX_WARNING_BUFF,
"Create Account %s error %s", eaddr, verror(ret));
global_warning(WarningBuff);
} else {
snprintf(WarningBuff, MAX_WARNING_BUFF,
"Email Account %s created", eaddr);
global_warning(WarningBuff);
}
vpw = vauth_getpw(user, domain);
if (udisable!=NULL) GidFlag |= NO_POP;
if (uweb!=NULL) GidFlag |= NO_WEBMAIL;
if (uimap!=NULL) GidFlag |= NO_IMAP;
if (ubounce!=NULL) GidFlag |= BOUNCE_MAIL;
if (upassc!=NULL) GidFlag |= NO_PASSWD_CHNG;
if (urelay!=NULL) GidFlag |= NO_RELAY;
if (uqadmin!=NULL) GidFlag |= QA_ADMIN;
vpw->pw_gid = GidFlag;
if ( shell != NULL && strlen(shell) > 0 ) vpw->pw_shell = shell;
ret = vauth_setpw(vpw, domain);
if ( ret != VA_SUCCESS ) {
snprintf(WarningBuff, MAX_WARNING_BUFF,
"Add Account: Failure: %s set options", eaddr);
global_warning(WarningBuff);
}
post_email_info( eaddr, vpw, domain);
t_open(T_MAIN, 1);
}
syntax highlighted by Code2HTML, v. 0.9.1