# 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 - a high-performance webmail to maildir
# $Id$
package Ext::MgrApp::Alias;
use strict;
use Exporter;
use vars qw(@ISA @EXPORT);
@ISA = qw(Exporter Ext::MgrApp);
use POSIX qw(strftime);
use Ext::MgrApp;
use Ext::Utils;
use vars qw($lang_charset %lang_alias $default_expire);
use Ext::Lang;
$default_expire = '';
sub init {
my $self = shift;
$self->SUPER::init(@_);
return unless($self->valid||$self->permit);
$self->add_methods(add_alias => \&add_alias);
$self->add_methods(edit_alias => \&edit_alias);
$self->add_methods(save_alias => \&save_alias);
$self->add_methods(delete_alias => \&delete_alias);
$self->{default_mode} = 'edit_alias';
$default_expire = $self->cvt2expire(strftime("%Y-%m-%d %H:%M:%S", localtime));
$self->_initme;
$self;
}
sub _initme {
initlang($_[0]->{sysconfig}->{'SYS_LANG'}, __PACKAGE__);
$_[0]->{tpl}->assign( lang_charset => $lang_charset );
$_[0]->{tpl}->assign( \%lang_alias );
}
sub add_alias {
my $self = shift;
my $tpl = $self->{tpl};
my $mgr = $self->{backend};
my $q = $self->{query};
$tpl->assign(
HAVE_ALIAS => 1,
NEWADD => 1,
ACTIVE => 1,
EXPIRE => $default_expire,
);
my $domains = [];
if ($ENV{USERTYPE} eq 'admin') {
my $alldomain = $mgr->get_domains_list || [];
foreach my $d ( @$alldomain ) {
push @$domains, $d->{domain};
}
} else {
my $pm = $mgr->get_manager_info($ENV{USERNAME});
$domains = $pm->{'domain'};
}
if ($domains) {
$domains = [$domains] unless (ref $domains);
foreach my $vd ( @$domains ) {
$tpl->assign(
'LOOP_DOMAIN',
DOMAIN => $vd
);
}
} else {
# no permission or not assign domain
$tpl->assign(NOPERM => 1);
$tpl->assign(HAVE_USER => 0);
}
}
sub edit_alias {
my $self = shift;
my $tpl = $self->{tpl};
my $mgr = $self->{backend};
my $q = $self->{query};
my $alias = lc $q->cgi('alias');
my ($domain) = ($alias=~ m!.*@(.*)!);
my $ai = $mgr->get_alias_info($alias);
return 0 unless($ai);
# permission validation
unless ($self->valid_perm($domain)) {
$self->error('Access denied');
return 0;
}
$tpl->assign(HAVE_ALIAS => 1);
$tpl->assign(
ALIAS => $ai->{alias},
EXPIRE => $ai->{expire} || $default_expire,
ACTIVE => $ai->{active},
);
if (my $mail = $ai->{goto}) {
my $goto = '';
if (ref $mail && scalar @$mail >0) {
foreach my $m (@$mail) {
$goto .= "$m\n";
}
} else {
$goto = $mail;
}
$tpl->assign( GOTO => $goto );
}
}
sub save_alias {
my $self = shift;
my $tpl = $self->{tpl};
my $mgr = $self->{backend};
my $q = $self->{query};
my ($alias, $domain) = (lc $q->cgi('alias'), lc $q->cgi('domain'));
my $tmp = lc $q->cgi('goto');
$alias =~ s! !!g;
$alias =~ s![^a-zA-Z0-9-_\.=@]!!g;
$tmp =~ s![^a-zA-Z0-9-_\.=,\n@]!!g;
$tmp =~ s!\r!!g;
$tmp =~ s! !!g;
my $goto = '';
foreach my $s ( split(/\n/, $tmp) ) {
$goto .= "$s\n" if ($s);
}
unless ($alias && $goto) {
$tpl->assign(ERROR => $lang_alias{'err_input'});
return 0;
}
if (!$domain && $alias) {# no domain provide, may be in edit mode
($domain) = ($alias =~ m!.*@(.*)!);
}
unless ($self->valid_perm($domain)) {
$self->error('Access denied');
return 0;
}
if ($mgr->get_alias_info("$alias\@$domain") ||
$mgr->get_alias_info($alias)) {
if ($q->cgi('newadd')) {
$tpl->assign(ERROR => $lang_alias{'alias_exist'});
$self->add_alias;
return 0;
} else {
# save the change
if ($alias eq '@') {
$alias = '';
}
if (!$self->valid_time($q->cgi('expire'))) {
$tpl->assign(ERROR => $lang_alias{'err_time'});
$self->edit_alias;
return 0;
}
my $rc = $mgr->modify_alias(
alias => lc $q->cgi('alias'), # XXX
goto => $goto,
active => $q->cgi('active'),
expire => $q->cgi('expire'),
);
if ($rc) {
$tpl->assign(ERROR => sprintf($lang_alias{'modify_fail'}, $q->cgi('alias')).$rc);
} else {
$tpl->assign(SUCCESS => sprintf($lang_alias{'modify_ok'}, $q->cgi('alias')));
}
$self->edit_alias;
}
} else {
# new add
if ($q->cgi('newadd')) {
my $rc = $self->domain_overusage(
domain => $domain,
alias => 1,
); # query the rc whether it overquota or not
if ($alias eq '@') {
$alias = ''; # catchAll or domain alias
}
if (!$self->valid_time($q->cgi('expire'))) {
$tpl->assign(ERROR => $lang_alias{'err_time'});
$self->add_alias;
return;
}
$rc = $mgr->add_alias(
alias => "$alias\@$domain",
domain => $domain,
goto => $goto,
active => $q->cgi('active'),
expire => $q->cgi('expire'),
create => strftime("%Y-%m-%d %H:%M:%S", localtime),
) unless ($rc);
if ($rc) {
$tpl->assign(ERROR => sprintf($lang_alias{'add_fail'}, "$alias\@$domain").$rc);
} else {
$tpl->assign(SUCCESS => sprintf($lang_alias{'add_ok'}, "$alias\@$domain"));
}
$self->add_alias;
} else {
$tpl->assign(ERROR => $lang_alias{'no_such_alias'});
}
}
}
sub delete_alias {
my $self = shift;
my $tpl = $self->{tpl};
my $q = $self->{query};
my $mgr = $self->{backend};
my $alias = lc $q->cgi('alias');
my ($domain) = ($alias =~ m!.*@(.*)!);
# permission validation
unless ($self->valid_perm($domain)) {
$self->error('Access denied');
return 0;
}
if ($mgr->get_alias_info($alias)) {
my $rc = $mgr->delete_alias($alias);
if ($rc) {
$tpl->assign(ERROR => "Delete fail!");
} else {
$tpl->{noprint} = 1;
$self->{redirect} = url2str($q->cgi('url'));
}
} else {
$tpl->assign(ERROR => $lang_alias{'no_such_alias'});
}
}
sub pre_run { 1 }
sub post_run {
my $template = $_[0]->{query}->cgi('screen') || 'edit_alias.html';
$_[0]->{tpl}->process($template);
$_[0]->{tpl}->print;
}
1;
syntax highlighted by Code2HTML, v. 0.9.1