# 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