# vim: set cindent expandtab ts=4 sw=4:
#
# Copyright (c) 1998-2005 Chi-Keung Ho. All rights reserved.
#
# This programe 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.
#
# ExtMan - web interface to manage virtual accounts
# $Id$
package Ext::MgrApp::Domain;
use strict;
use Exporter;
use vars qw(@ISA @EXPORT);
@ISA = qw(Exporter Ext::MgrApp);
use POSIX qw(strftime);
use Ext::Utils; # import url2str
use Ext::MgrApp;
use vars qw($lang_charset %lang_domain $default_expire);
use Ext::Lang;
sub init {
my $self = shift;
$self->SUPER::init(@_);
return unless($self->valid||$self->permit);
$self->add_methods(add_domain => \&add_domain);
$self->add_methods(edit_domain => \&edit_domain);
$self->add_methods(save_domain => \&save_domain);
$self->add_methods(delete_domain => \&delete_domain);
$self->{default_mode} = 'edit_domain';
$self->_initme;
# permission validation
if ($ENV{USERTYPE} ne 'admin') {
$self->error('Access denied');
return 0;
}
$default_expire = $self->cvt2expire(strftime("%Y-%m-%d %H:%M:%S", localtime));
$self;
}
sub _initme {
initlang($_[0]->{sysconfig}->{'SYS_LANG'}, __PACKAGE__);
$_[0]->{tpl}->assign( lang_charset => $lang_charset );
$_[0]->{tpl}->assign( \%lang_domain );
}
sub add_domain {
my $self = shift;
my $tpl = $self->{tpl};
my $mgr = $self->{backend};
my $q = $self->{query};
my $sys = $self->{sysconfig};
$tpl->assign(
HAVE_DOMAIN => 1,
NEWADD => 1,
ACTIVE => 1,
MAXQUOTA => $sys->{SYS_DEFAULT_MAXQUOTA},
MAXALIAS => $sys->{SYS_DEFAULT_MAXALIAS} || '0',
MAXUSERS => $sys->{SYS_DEFAULT_MAXUSERS} || '0',
MAXNDQUOTA => $sys->{SYS_DEFAULT_MAXNDQUOTA},
DEFAULT_QUOTA => $sys->{SYS_USER_DEFAULT_QUOTA} || '5',
DEFAULT_NDQUOTA => $sys->{SYS_USER_DEFAULT_NDQUOTA} || '5',
EXPIRE => $default_expire,
);
for my $s ( split(/,/, $sys->{SYS_DEFAULT_SERVICES}) ) {
$tpl->assign(
"SERVICES_$s" => 1,
);
}
$tpl->assign(DEFAULT_EXPIRE => $sys->{SYS_USER_DEFAULT_EXPIRE} || '1y');
}
sub edit_domain {
my $self = shift;
my $tpl = $self->{tpl};
my $mgr = $self->{backend};
my $q = $self->{query};
my $multiplier = $self->{sysconfig}->{SYS_QUOTA_MULTIPLIER} || '1048576';
my $di = $mgr->get_domain_info(lc $q->cgi('domain'));
return 0 unless ($di);
use Data::Dumper;
$tpl->assign(HAVE_DOMAIN => 1);
$tpl->assign(
MAXUSERS => $di->{maxusers},
MAXQUOTA => $self->quota2num($di->{maxquota})/$multiplier,
MAXALIAS => $di->{maxalias},
VDOMAIN => $di->{domain},
TRANSPORT => $di->{transport},
CANSIGNUP => ($di->{can_signup} ? 1 : 0 ),
DEFAULT_QUOTA => $self->quota2num($di->{default_quota})/$multiplier,
DEFAULT_NDQUOTA => $self->quota2num($di->{default_ndquota})/$multiplier,
DEFAULT_EXPIRE => $di->{default_expire},
EXPIRE => $di->{expire} || $default_expire,
DESCRIPTION => $di->{description},
MAXNDQUOTA => $self->quota2num($di->{maxndquota})/$multiplier,
ACTIVE => $di->{active},
);
for my $srv (qw(smtpd smtp webmail netdisk imap pop3)) {
if (!$di->{"disable$srv"}) {
$tpl->assign( 'SERVICES_'.$srv => 1 );
} else {
$tpl->assign( 'SERVICES_'.$srv => 0 );
}
}
}
sub save_domain {
my $self = shift;
my $tpl = $self->{tpl};
my $mgr = $self->{backend};
my $q = $self->{query};
my $multiplier = $self->{sysconfig}->{SYS_QUOTA_MULTIPLIER} || '1048576';
my $domain = lc $q->cgi('domain');
if (!$self->sanity_username($domain)) {
$self->error("Bad domain name");
return 0;
}
if ($q->cgi('defaultexpire') !~ /^\d+[mydw]$/) {
$self->error("Bad default expire value");
return;
}
if ($mgr->get_domain_info($domain)) {
if ($q->cgi('newadd')) {
$tpl->assign(ERROR => sprintf($lang_domain{'domain_exist'}, $domain));
$self->add_domain;
return 0;
} else {
if (!$self->valid_time($q->cgi('expire'))) {
$tpl->assign(ERROR => $lang_domain{'err_time'});
$self->edit_domain;
return;
}
my $rc = $mgr->modify_domain(
domain => $domain,
description => $q->cgi('description'),
maxusers => $q->cgi('maxusers'),
maxalias => $q->cgi('maxalias'),
maxquota => $self->num2quota($multiplier*$q->cgi('maxquota')),
maxndquota => $self->num2quota($multiplier*$q->cgi('maxndquota')),
transport => $q->cgi('transport'),
can_signup => $q->cgi('cansignup') ? 1 : 0,
default_quota => $self->num2quota($multiplier*$q->cgi('defaultquota')),
default_ndquota => $self->num2quota($multiplier*$q->cgi('defaultndquota')),
default_expire => $q->cgi('defaultexpire'),
disablesmtpd => $q->cgi('SERVICES_smtpd') ? 0 : 1,
disablesmtp => $q->cgi('SERVICES_smtp') ? 0 : 1,
disablewebmail => $q->cgi('SERVICES_webmail') ? 0 : 1,
disablenetdisk => $q->cgi('SERVICES_netdisk') ? 0 : 1,
disablepop3 => $q->cgi('SERVICES_pop3') ? 0 : 1,
disableimap => $q->cgi('SERVICES_imap') ? 0 : 1,
expire => $q->cgi('expire'),
active => $q->cgi('active'),
);
if ($rc) {
$tpl->assign(ERROR => sprintf($lang_domain{'modify_fail'}, $domain).$rc);
} else {
$tpl->assign(SUCCESS => sprintf($lang_domain{'modify_ok'}, $domain));
}
$self->edit_domain;
}
} else {
if ($q->cgi('newadd')) {
my $description = $q->cgi('description') || sprintf($lang_domain{'default_description'}, $domain);
if (!$self->valid_time($q->cgi('expire'))) {
$tpl->assign(ERROR => $lang_domain{'err_time'});
$self->add_domain;
return;
}
my $rc = $mgr->add_domain(
domain => $domain,
description => $description,
hashdirpath => $self->gen_domain_hashdir(),
maxusers => $q->cgi('maxusers'),
maxalias => $q->cgi('maxalias'),
maxquota => $self->num2quota($multiplier*$q->cgi('maxquota')),
maxndquota => $self->num2quota($multiplier*$q->cgi('maxndquota')),
transport => $q->cgi('transport'),
can_sign => $q->cgi('cansignup') ? 1 : 0,
default_quota => $self->num2quota($multiplier*$q->cgi('defaultquota')),
default_ndquota => $self->num2quota($multiplier*$q->cgi('defaultndquota')),
default_expire => $q->cgi('defaultexpire'),
disablesmtpd => $q->cgi('SERVICES_smtpd') ? 0 : 1,
disablesmtp => $q->cgi('SERVICES_smtp') ? 0 : 1,
disablewebmail => $q->cgi('SERVICES_webmail') ? 0 : 1,
disablenetdisk => $q->cgi('SERVICES_netdisk') ? 0 : 1,
disablepop3 => $q->cgi('SERVICES_pop3') ? 0 : 1,
disableimap => $q->cgi('SERVICES_imap') ? 0 : 1,
expire => $q->cgi('expire'),
create => strftime("%Y-%m-%d %H:%M:%S", localtime),
active => $q->cgi('active'),
);
if ($rc) {
$tpl->assign(ERROR => sprintf($lang_domain{'add_fail'}, $domain).$rc);
} else {
$tpl->assign(SUCCESS => sprintf($lang_domain{'add_ok'}, $domain));
}
$self->add_domain;
} else {
$tpl->assign(ERROR => $lang_domain{'no_such_domain'});
}
}
}
sub delete_domain {
my $self = shift;
my $tpl = $self->{tpl};
my $q = $self->{query};
my $mgr = $self->{backend};
my $domain = lc $q->cgi('domain');
if ($mgr->get_domain_info($domain)) {
# could not delete a domain that associate alias or users
if ($mgr->get_aliases_list($domain)) {
$tpl->assign(
ERROR => sprintf($lang_domain{'delete_fail_alias'}, $domain),
OLDURL => $q->cgi('url'),
);
return 0;
}
if ($mgr->get_users_list($domain)) {
$tpl->assign(
ERROR => sprintf($lang_domain{'delete_fail_user'}, $domain),
OLDURL => $q->cgi('url'),
);
return 0;
}
my $rc = $mgr->delete_domain($domain);
if ($rc) {
$tpl->assign(
ERROR => sprintf($lang_domain{'delete_fail'},$domain).$rc,
OLDURL => $q->cgi('url'),
);
} else {
$tpl->{noprint} = 1;
$self->{redirect} = url2str($q->cgi('url'));
}
} else {
$tpl->assign(ERROR => $lang_domain{'no_such_domain'});
}
}
sub pre_run { 1 }
sub post_run {
my $template = $_[0]->{query}->cgi('screen') || 'edit_domain.html';
$_[0]->{tpl}->process($template);
$_[0]->{tpl}->print;
}
1;
syntax highlighted by Code2HTML, v. 0.9.1