#!/usr/bin/perl -wT

# FEX CGI for Bedienungssteuerung
#
# Author: Ulli Horlacher <framstag@rus.uni-stuttgart.de>
#
# Copyright: GNU General Public License

use CGI         qw(:standard);
use CGI::Carp	qw(fatalsToBrowser);
use Fcntl 	qw(:flock);
use Digest::MD5	qw(md5_hex);

# add fex lib
($FEXLIB) = $ENV{FEXLIB} =~ /(.+)/;
die "$0: no $FEXLIB\n" unless -d $FEXLIB;

our ($FEXHOME,$mdomain);
our $akey = '';

# load common code, local config : $HOME/lib/fex.ph
require "$FEXLIB/fex.pp" or die "$0: cannot load $FEXLIB/fex.pp - $!\n";

my $error = 'F*EX Bedienungssteuerungs-Fehler';

chdir $spooldir or die "$spooldir - $!\n";

$akeydir = "$spooldir/.akeys"; 
$user = $id = '';

# look for CGI parameters
foreach my $v (param) {
  my $vv = param($v);
  $vv =~ s/[ \t\000]//g;
  $vv =~ s/[<>%]/_/g;
  debuglog("Param: $v=\"$vv\"");
  if ($v =~ /^akey$/i) { 
    $vv =~ s:/::g;
    next if $vv eq '.' or $vv eq '..';
    $akey = untaint($vv);
  } elsif ($v =~ /^(from|user)$/i) {
    $vv =~ s:/::g;
    next if $vv eq '.' or $vv eq '..';
    $user = untaint($vv);
    $user .= '@'.$mdomain if $mdomain and $user !~ /@/;
  } elsif ($v =~ /^id$/i) {
    $id = $vv;
  }
}

if ($akey and not $user and not $id) {
  if (open $akey,'<',"$akeydir/$akey/@" and $id = getline($akey)) {
    close $akey;
    $user = readlink "$akeydir/$akey"
      or http_die("internal server error: no $akey symlink");
    $user =~ s:.*/::;
    $user = untaint($user);
    if ($akey ne md5_hex("$user:$id")) {
      $user = $id = '';
    }
  }
}


$head = "$ENV{SERVER_NAME} F*EX Bedienungssteuerung";

# display HTML form and request user data
if ($user and $id) {
  open my $idf,'<',"$user/@" or html_error($error,"Falscher Benutzer oder falsche auth-ID");
  $rid = getline($idf);
  close $idf;
  if ($id eq $rid) {
    unless ($akey) {
      $akey = untaint(md5_hex("$user:$id"));
      unlink "$akeydir/$akey";
      symlink "../$user","$akeydir/$akey";
    }
  } else {
    html_error($error,"Falscher Benutzer oder falsche auth-ID");
  }
  http_header("200 OK");
  print html_header($head);
  # authorized login URL
  my $url = "$ENV{PROTO}://$ENV{HTTP_HOST}/fup/".b64("from=$user&id=$id");
  pq(qq(
    '<h2>F&uuml;r Benutzer <a href="$url">$user</a></h2>'
    '<table>'
  ));
  ($quota,$du) = check_sender_quota($user);
  if ($quota) {
    pq(qq(
      <tr title="Sie als Absender haben auf dem Server insgesamt $quota MB Speicherplatz und Sie benutzen momentan $du MB">
        <td>Absender Speicherplatz (benutzt):<td align=\"right\">$quota ($du) MB
      </tr>
    ));
  }
  ($quota,$du) = check_recipient_quota($user);
  if ($quota) {
    pq(qq(
      <tr title="You as the recipient have a server disk quota of $quota MB and currently using $du MB">
        <td>Emp&auml;nger Speicherplatz (benutzt):<td align=\"right\">$quota ($du) MB
      </tr>
    ));
  }
  pq(qq(
    '</table>'
    '<p>'
    '<a href="/fup?akey=$akey&command=LIST">'
    'Zeige die Liste aller empfangenen Dateien</a>.'
    '<p>'
    '<a href="/fup?akey=$akey&command=LIST&to=*">'
    'Eine Kopie der Datei weiterleiten</a>, welche Sie bereits f&uuml;r einen anderen Empf&auml;nger hochgeladen haben.'
    '<p>'
    '<a href="/rup?akey=$akey">'
    'Leite Dateien weiter</a>, die an eine falsche oder ung&uuml;ltige E-Mail Adresse gegangen sind.'
    '<p>'
    '<form action="/fuc"'
    '      method="post"'
    '      accept-charset="UTF-8"'
    '      enctype="multipart/form-data">'
    '  <input type="hidden" name="user" value="$user">'
    '  <input type="hidden" name="id"   value="$id">'
    '  &Auml;nder die auth-ID "<tt>$id</tt>" in'
    '  <input type="text"   name="nid"  size="16">'
    '  (merken!)'
    '<p>'
  ));
  unless (-s "$user/\@ALLOWED_RECIPIENTS") {
    pq(qq(
      '  <p>'
      '  Erzeuge eine einmalig g&uuml;ltige upload URL f&uuml;r'
      '  <input type="text" name="otuser" size="60"><br>'
      '  <input type="submit" value="Geben Sie eine g&uuml;tige E-Mail Adresse an">'
      '  <p>'
      '  Erlaube '
      '  <input type="text" name="subuser" size="60">'
      '  Daten an Sie zu senden.<br>'
      '  <input type="submit" value="Geben Sie eine g&uuml;tige E-Mail Adresse f&uuml;r Ihren Subuser an">'
      '  <p>'
      '  <a href="/fuc?akey=$akey">Subusers und Gruppen verwalten</a>'
      '  <p>'
      '  <a href="/fuc?ab=load&akey=$akey">Ihr Adressbuch editieren</a>'
      '  <p>'
    ));
  }
  pq(qq(
    '  <a href="/fup?akey=$akey">Zur&uuml;ck zu fup (Upload Seite)</a>'
    '</form>'
  ));
  print &logout;
  print "</body></html>\n";
  exit;
}

my $login = -x "$FEXHOME/login" ? 'login' : 'fup';
nvt_print(
  "HTTP/1.1 302 Found",
  "Location: $ENV{PROTO}://$ENV{HTTP_HOST}/$login",
  'Expires: 0',
  'Content-Length: 0',
  ''
);
exec($FEXHOME.'/bin/fexsrv') if $ENV{KEEP_ALIVE};
