# 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::Manager;
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_manager $default_expire);
use Ext::Lang;
sub init {
my $self = shift;
$self->SUPER::init(@_);
return unless($self->valid||$self->permit);
$self->add_methods(add_manager => \&add_manager);
$self->add_methods(edit_manager => \&edit_manager);
$self->add_methods(save_manager => \&save_manager);
$self->add_methods(delete_manager => \&delete_manager);
$self->{default_mode} = 'edit_manager';
$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_manager );
}
sub add_manager {
my $self = shift;
my $tpl = $self->{tpl};
my $mgr = $self->{backend};
my $q = $self->{query};
$tpl->assign(
HAVE_MANAGER => 1,
NEWADD => 1,
ACTIVE => 1,
EXPIRE => $default_expire,
);
my $domains = $mgr->get_domains_list || [];
foreach my $vd ( @$domains ) {
$tpl->assign(
'LOOP_DOMAIN',
VDOMAIN => $vd->{domain},
);
}
# then nothing to do :-)
}
sub edit_manager {
my $self = shift;
my $tpl = $self->{tpl};
my $mgr = $self->{backend};
my $q = $self->{query};
my $mi = $mgr->get_manager_info(lc $q->cgi('manager'));
return 0 unless ($mi);
my $owndomains = $mi->{domain};
if (!ref $owndomains) {
$owndomains = [$owndomains]; # force to ARRAY ref
}
$tpl->assign(HAVE_MANAGER => 1);
$tpl->assign(
USERNAME => $mi->{manager},
NAME => $mi->{cn},
TYPE => $mi->{type},
EXPIRE => $mi->{expire},
ACTIVE => $mi->{active},
);
my $domains = $mgr->get_domains_list || [];
foreach my $vd ( @$domains ) {
$tpl->assign(
'LOOP_DOMAIN',
CHECK => (grep(/^$vd->{domain}$/,@$owndomains) ? 1 : 0),
VDOMAIN => $vd->{domain},
);
}
$tpl->assign(
QUESTION => $mi->{question},
ANSWER => $mi->{answer},
DISABLEPWDCHANGE => $mi->{disablepwdchange} ? 1 : 0,
);
}
sub save_manager {
my $self = shift;
my $tpl = $self->{tpl};
my $mgr = $self->{backend};
my $q = $self->{query};
my $manager = lc $q->cgi('manager');
if (!$self->sanity_manager($manager)) {
$self->error('Bad Manager Name');
return 0;
}
if ($mgr->get_manager_info($manager)) {
if ($q->cgi('newadd')) {
$tpl->assign(ERROR => sprintf($lang_manager{'manager_exist'}, $manager));
$self->add_manager;
return 0;
} else {
my $pwd1 = $q->cgi('passwd1');
my $pwd2 = $q->cgi('passwd2');
if ($pwd1 ne $pwd2) {
$tpl->assign(ERROR => $lang_manager{'errinput_passwd'});
return 0;
}
my $rc = $mgr->modify_manager(
manager => $manager,
cn => $q->cgi('cn'),
expire => $q->cgi('expire'),
active => $q->cgi('active'),
domain => $q->cgi('owndomain'),
question => $q->cgi('question'),
answer => $q->cgi('answer'),
disablepwdchange => ($q->cgi('disablepwdchange') ? 1 : 0),
passwd => $pwd1,
);
if ($rc) {
$tpl->assign(ERROR => sprintf($lang_manager{'modify_fail'}, $manager).$rc);
} else {
$tpl->assign(SUCCESS => sprintf($lang_manager{'modify_ok'}, $manager));
}
$self->edit_manager;
}
} else {
if ($q->cgi('newadd')) {
# save the change
my $pwd1 = $q->cgi('passwd1');
my $pwd2 = $q->cgi('passwd2');
if (!$pwd1 or !$pwd2 or ($pwd1 ne $pwd2)) {
# pwd1 != pwd2, password modification fail, abort
$tpl->assign(ERROR => $lang_manager{'errinput_passwd'});
return 0;
}
my $rc = $mgr->add_manager(
manager => $manager,
cn => $q->cgi('cn'),
expire => $q->cgi('expire'),
create => strftime("%Y-%m-%d %H:%M:%S", localtime),
active => $q->cgi('active'),
domain => $q->cgi('owndomain'),
question => $q->cgi('question'),
answer => $q->cgi('answer'),
disablepwdchange => ($q->cgi('disablepwdchange') ? 1 : 0),
type => 'postmaster', # XXX
passwd => $pwd1,
);
if ($rc) {
$tpl->assign(ERROR => sprintf($lang_manager{'add_fail'}, $manager).$rc);
} else {
$tpl->assign(SUCCESS => sprintf($lang_manager{'add_ok'}, $manager));
}
$self->add_manager;
} else {
$tpl->assign(ERROR => $lang_manager{'no_such_manager'});
}
}
}
sub delete_manager {
my $self = shift;
my $tpl = $self->{tpl};
my $q = $self->{query};
my $mgr = $self->{backend};
my $manager = lc $q->cgi('manager');
if ($mgr->get_manager_info($manager)) {
my $rc = '';
# can not delete self
if ($ENV{USERNAME} eq $manager) {
$rc = $lang_manager{'delete_self_fail'} || 'Can\'t delete yourself';
} else {
$rc = $mgr->delete_manager($manager);
}
if ($rc) {
$tpl->assign(ERROR => "Delete fail ! reason: ".$rc);
} else {
$tpl->{noprint} = 1;
$self->{redirect} = url2str($q->cgi('url'));
}
} else {
$tpl->assign(ERROR => $lang_manager{'no_such_manager'});
}
}
sub pre_run { 1 }
sub post_run {
my $template = $_[0]->{query}->cgi('screen') || 'edit_manager.html';
$_[0]->{tpl}->process($template);
$_[0]->{tpl}->print;
}
1;
syntax highlighted by Code2HTML, v. 0.9.1