#!/usr/bin/perl -wT

#----------------------------------------------------------------------
# heading     : Administration
# description : Qmail queue Verwaltung
# navigation  : 2000 2110
# 
# Copyright (c) 2002 DMC Netsourced.com 
# Modifications 2002 SACO GmbH, Peter Schubert
# Modifications 2002 Zac Sprackett <zac@sprackett.com>
#----------------------------------------------------------------------

package esmith;

use strict;
use CGI ':all';
use CGI::Carp qw(fatalsToBrowser);

use esmith::cgi;
use esmith::config;
use esmith::util;
use esmith::db;

sub showInitial ($$);
sub performAndShowResult ($);
sub showListQueues ($);

BEGIN
{
    # Clear PATH and related environment variables so that calls to
    # external programs do not cause results to be tainted. See
    # "perlsec" manual page for details.

    $ENV {'PATH'} = '';
    $ENV {'SHELL'} = '/bin/bash';
    delete $ENV {'ENV'};
}

esmith::util::setRealToEffective ();

$CGI::POST_MAX=1024 * 100;  # max 100K posts
$CGI::DISABLE_UPLOADS = 1;  # no uploads

my %conf;
tie %conf, 'esmith::config';

#------------------------------------------------------------
# examine state parameter and display the appropriate form
#------------------------------------------------------------

my $q = new CGI;

if (! grep (/^state$/, $q->param))
{
    showInitial ($q, '');
}

elsif ($q->param ('state') eq "perform")
{
    performAndShowResult ($q);
}

else
{
    esmith::cgi::genStateError ($q, \%conf);
}

exit (0);

#------------------------------------------------------------
# subroutine to display initial form
#------------------------------------------------------------

sub showInitial ($$)
{
    my ($q, $msg) = @_;

    #------------------------------------------------------------
    # If there's a message, we just finished an operation so show the
    # status report. If no message, this is a new list of domains.
    #------------------------------------------------------------

    if ($msg eq '')
    {
        esmith::cgi::genHeaderNonCacheable ($q, \%conf, 'Qmail queue Verwaltung');
    }
    else
    {
        esmith::cgi::genHeaderNonCacheable ($q, \%conf, 'Operation status report');
        print $q->p ($msg);
        esmith::cgi::genFooter ($q);
        return;
    }

    my %labels = (
            "list-queues"    =>      "Zeige Nachrichten Warteschlange",
            "list-local-queue"   =>      "Zeige die lokale Nachichten Warteschlange",
            "list-remote-queue"    =>      "Zeige die externe Nachrichten Warteschlange",
            "force-resend"          =>      "Warteschlange neu versenden",
        );

    my @labels = (
            'list-queues',
            'list-local-queue',
            'list-remote-queue',
            'force-resend',
        );

    my $default_action = 'list-queues';

    print $q->start_multipart_form(-method => 'POST', -action => $q->url (-absolute => 1));

    print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},

        esmith::cgi::genTextRow
            ($q, $q->p ('Diese Funktion benutzt <B>qmHandle</B>',
                        'um die Ausgangs-Warteschlange von Qmail zu verwalten.',
                        'Sie knnen sich Nachrichten anzeigen lassen oder sie lschen.')),

        esmith::cgi::genWidgetRow($q, "Whlen Sie eine Funktion",
                    $q->popup_menu (-name => 'function',
                                    -values => [ @labels ],
                                    -default => $default_action,
                                    -labels => \%labels)),

        esmith::cgi::genButtonRow ($q,
                                   $q->submit (-name => 'action', -value => 'Ausfhren')));

    print $q->hidden (-name => 'state', -override => 1, -default => 'perform');
    print $q->endform;
    esmith::cgi::genFooter ($q);
}
#------------------------------------------------------------
# subroutine to performAndShowResult
#------------------------------------------------------------
sub performAndShowResult ($)
{
    my ($q) = @_;

    my $function = $q->param ('function');

    if ($function eq 'list-queues')
    {
        showListQueues ($q);
    }
    elsif ($function eq 'list-local-queue')
    {
        showListLocalQueue ($q);
    }
    elsif ($function eq 'list-remote-queue')
    {
        showListRemoteQueue ($q);
    }
    elsif ($function eq 'force-resend')
    {
        resend ($q);
    }
    elsif ($function eq 'confirm-delete-message-number')
    {
        showDeleteMessageNumber ($q);
    }
    elsif ($function eq 'delete-message-number')
    {
	deleteMessageNumber ($q);
    }
    elsif ($function eq 'delete-all-messages')
    {
        showDeleteAllMessages ($q);
    }
    else
    {
        # Unknown function - refresh the screen anyway
        showInitial ($q, 'Unknown Function');
    }

    return;

    esmith::cgi::genHeaderNonCacheable ($q, \%conf, 'Qmail queue Verwaltung');
    print $q->p ( $function );
    esmith::cgi::genFooter ($q);
}

#------------------------------------------------------------
# subroutine to showListQueues
#------------------------------------------------------------
sub showListQueues ($)
{
    my ($q) = @_;
    esmith::cgi::genHeaderNonCacheable ($q, \%conf, 'Zeige lokale und externe Qmail Warteschlange');

    {
        print $q->hr;
        print $q->h3 ("Warteschlangen Status vom ", scalar localtime(time));

        my $MailQueues = `/usr/bin/qmHandle -l`;
        $MailQueues =~ s/</'/g;
        $MailQueues =~ s/>/'/g;

	$MailQueues = AddLinks($MailQueues, $q);

        print $q->p ($q->pre ("$MailQueues"));
    }

    esmith::cgi::genFooter ($q);
    return;
}

sub AddLinks 
{
	my $queues = shift;

	my @splitq = split(/\n/, $queues);

	for (my $i = 0; $i < $#splitq; $i++) {
		if ($splitq[$i] =~ /^(\d+)\s+(\(\d+\,\s+\w+\)\s*)$/ ) {
			$splitq[$i] = "<a href=\"" . 
			$q->url( -absolute => 1 ) . 
			"?state=perform&function=confirm-delete-message-number" .
			"&msgid=$1\">$1</a> $2";
		}
	}
	$queues = join("\n", @splitq);

	return $queues;
}
#------------------------------------------------------------
# subroutine to showListLocalQueue
#------------------------------------------------------------
sub showListLocalQueue ($)
{
    my ($q) = @_;
    esmith::cgi::genHeaderNonCacheable ($q, \%conf, 'Zeige lokale Qmail Warteschlange');
    {
        print $q->hr;
        print $q->h3 ("Qmail lokale Warteschlange vom: ", scalar localtime(time));

        my $LocalQueue = `/usr/bin/qmHandle -L`;
        $LocalQueue =~ s/</'/g;
        $LocalQueue =~ s/>/'/g;

        print $q->p ($q->pre ("$LocalQueue"));
    }

    esmith::cgi::genFooter ($q);
    return;
}

#------------------------------------------------------------
# subroutine to showListRemoteQueue
#------------------------------------------------------------
sub showListRemoteQueue ($)
{
    my ($q) = @_;
    esmith::cgi::genHeaderNonCacheable ($q, \%conf, 'Zeige externe Qmail Warteschlange');
    {
        print $q->hr;
        print $q->h3 ("Qmail externe Warteschlange vom: ", scalar localtime(time));

        my $RemoteQueue = `/usr/bin/qmHandle -R`;
        $RemoteQueue =~ s/</'/g;
        $RemoteQueue =~ s/>/'/g;

	$RemoteQueue = AddLinks($RemoteQueue);
        print $q->p ($q->pre ("$RemoteQueue"));
    }

    esmith::cgi::genFooter ($q);
    return;
}

#------------------------------------------------------------
# subroutine to send ALARM to qmail
#------------------------------------------------------------
sub resend ($)
{
    my ($q) = @_;
    esmith::cgi::genHeaderNonCacheable ($q, \%conf, 'Warteschlange erneut versenden');
    {
        print $q->hr;
        print $q->h3 ("Sende das ALARM Signal an Qmail ", scalar localtime(time));

        my $res = `/etc/init.d/qmail sigalrm`;

        print $q->p ($q->pre ("$res"));
        print $q->h3 ("OK");
    }

    esmith::cgi::genFooter ($q);
    return;
}

#------------------------------------------------------------
# subroutine to showDeleteMessageNumber
#------------------------------------------------------------
sub showDeleteMessageNumber ($)
{
    my ($q) = @_;
    my $msgid = $q->param ('msgid');

    if ($msgid =~ /^(\d+)$/) {
       $msgid = $1;
    } else {
       $msgid = undef;
    }  
    esmith::cgi::genHeaderNonCacheable ($q, \%conf, 'Warteschlangen Verwaltung');
	
    print $q->hr;
    print $q->h3 ("Diese Nachricht aus der Warteschlange lschen ?");
    my $Message = `/usr/bin/qmHandle -v$msgid`;
    print $q->p ($q->pre ("$Message"));	

    print $q->start_multipart_form(-method => 'POST', -action => $q->url (-absolute => 1));
    print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},

    esmith::cgi::genButtonRow ($q,
           $q->submit (-name => 'action', -value => 'Lschen')));
    print $q->hidden (-name => 'state', -override => 1, -default => 'perform');
    print $q->hidden (-name => 'msgid', -override => 1, -default => "$msgid");
    print $q->hidden (-name => 'function', -override => 1, -default => 'delete-message-number');
    print $q->endform;
    esmith::cgi::genFooter ($q);
    return;
}

sub deleteMessageNumber ($)
{
    my ($q) = @_;

    my $msgid = $q->param ('msgid');

    if ($msgid =~ /^(\d+)$/) {
       $msgid = $1;
    } else {
       $msgid = undef;
    }  
    my $Output = `/usr/bin/qmHandle -d$msgid`;

    esmith::cgi::genHeaderNonCacheable ($q, \%conf, 'Queue Verwaltung');
	
    print $q->hr;
    print $q->h3 ("Lsche $msgid aus der Warteschlange");

    print $q->p ($q->pre ("$Output"));	

    esmith::cgi::genFooter ($q);
    return;
}

