]> git.treefish.org Git - fex.git/blobdiff - bin/fac
Original release 20160104
[fex.git] / bin / fac
diff --git a/bin/fac b/bin/fac
index b17d0261f4677a91f3b924e43e622e958ba5f892..c2d59f43b47dadb88b55f592e5d276f6800951ac 100755 (executable)
--- a/bin/fac
+++ b/bin/fac
@@ -43,7 +43,7 @@ unless ($<) {
 umask 077;
 
 # import from fex.pp
 umask 077;
 
 # import from fex.pp
-our ($FEXHOME,$FHS,$hostname,$spooldir,@logdir,$akeydir,$docdir);
+our ($FEXHOME,$FHS,$hostname,$spooldir,@logdir,$logdir,$akeydir,$docdir);
 our ($durl,@durl,$mdomain,$admin,$mailmode);
 our ($autodelete,$keep_default,$keep_max,$recipient_quota,$sender_quota);
 our (@local_rdomains);
 our ($durl,@durl,$mdomain,$admin,$mailmode);
 our ($autodelete,$keep_default,$keep_max,$recipient_quota,$sender_quota);
 our (@local_rdomains);
@@ -57,10 +57,10 @@ die "$0: \$admin not configured in $FEXLIB/fex.ph\n" unless $admin;
 $EDITOR = $ENV{EDITOR} || $ENV{VISUAL} ||
           (-x '/usr/bin/editor' ? '/usr/bin/editor' : 'vi');
 
 $EDITOR = $ENV{EDITOR} || $ENV{VISUAL} ||
           (-x '/usr/bin/editor' ? '/usr/bin/editor' : 'vi');
 
-$opt_c = $opt_v = $opt_l = $opt_L = $opt_h = $opt_w = $opt_u = $opt_R = 0;
+$opt_c = $opt_v = $opt_l = $opt_L = $opt_h = $opt_w = $opt_u = 0;
 $opt_M = $opt_E = 0;
 $opt_r = $opt_d = $opt_q = $opt_a = $opt_n = $opt_k = $opt_m = '';
 $opt_M = $opt_E = 0;
 $opt_r = $opt_d = $opt_q = $opt_a = $opt_n = $opt_k = $opt_m = '';
-$opt_y = $opt_S = $opt_C = $opt_D = $opt_A = $opt_V = $opt_P = '';
+$opt_y = $opt_S = $opt_C = $opt_D = $opt_A = $opt_V = $opt_P =  $opt_R = '';
 ${'opt_/'} = '';
 
 @__ = @ARGV;
 ${'opt_/'} = '';
 
 @__ = @ARGV;
@@ -79,8 +79,8 @@ warn "WARNING: $spooldir with owner=root !?\n" unless $stat[4];
 if (abs_path($spooldir) ne abs_path("$FEXHOME/spool")) {
   warn "WARNING: \$spooldir differs from $FEXHOME/spool !\n";
 }
 if (abs_path($spooldir) ne abs_path("$FEXHOME/spool")) {
   warn "WARNING: \$spooldir differs from $FEXHOME/spool !\n";
 }
-  
-getopts('hcvlLwuMRE/q:r:d:a:n:k:m:y:S:C:A:V:D:P:') or usage(2);
+
+getopts('hcvlLwuME/q:r:d:a:n:k:m:y:S:C:A:V:D:P:R:') or usage(2);
 usage(0)   if $opt_h;
 examples() if $opt_E;
 
 usage(0)   if $opt_h;
 examples() if $opt_E;
 
@@ -97,7 +97,7 @@ if (${'opt_/'}) {
   close $aa or die "$0: cannot write $aa - $!\n";
   my $fph = "$FEXLIB/fex.ph";
   $_ = slurp($fph) or die "$0: cannot read $fph\n";
   close $aa or die "$0: cannot write $aa - $!\n";
   my $fph = "$FEXLIB/fex.ph";
   $_ = slurp($fph) or die "$0: cannot read $fph\n";
-  s/^\s*\$admin\s*=.*/\$admin = '$admin';/m or 
+  s/^\s*\$admin\s*=.*/\$admin = '$admin';/m or
   $_ = "\$admin = '$admin';\n".$_;
   open $fph,">$fph.new" or die "$0: cannot write $fph.new\n";
   print {$fph} $_;
   $_ = "\$admin = '$admin';\n".$_;
   open $fph,">$fph.new" or die "$0: cannot write $fph.new\n";
   print {$fph} $_;
@@ -159,14 +159,14 @@ if ($opt_m) {
 if ($opt_M) {
   my ($mtime,$comment,$file,$keep);
   local $_;
 if ($opt_M) {
   my ($mtime,$comment,$file,$keep);
   local $_;
-  
+
   if (@ARGV) {
     foreach $file (glob("@ARGV")) {
       $mtime = mtime("$file/data") or next;
       $comment = slurp("$file/comment")||'';
       next if $comment =~ /NOMAIL/;
   if (@ARGV) {
     foreach $file (glob("@ARGV")) {
       $mtime = mtime("$file/data") or next;
       $comment = slurp("$file/comment")||'';
       next if $comment =~ /NOMAIL/;
-      $keep = readlink "$file/keep" 
-           || readlink "$file/../../\@KEEP" 
+      $keep = readlink "$file/keep"
+           || readlink "$file/../../\@KEEP"
            || $keep_default;
       $keep = $keep - int((time-mtime("$file/data"))/60/60/24);
 
            || $keep_default;
       $keep = $keep - int((time-mtime("$file/data"))/60/60/24);
 
@@ -198,7 +198,7 @@ if ($opt_M) {
 
 # show logfile
 if ($opt_w) {
 
 # show logfile
 if ($opt_w) {
-  $log = $logdir[0]."/fexsrv.log";
+  $log = "$logdir/fexsrv.log";
   warn "$0: polling $log\n\n";
   exec "$FEXHOME/bin/logwatch",$log;
   die "$0: logwatch not found\n";
   warn "$0: polling $log\n\n";
   exec "$FEXHOME/bin/logwatch",$log;
   die "$0: logwatch not found\n";
@@ -209,8 +209,8 @@ if ($opt_l) {
   my ($file,$dkey,@L);
   chdir $spooldir or die "$0: $spooldir - $!\n";
   foreach $file (glob "*/*/*") {
   my ($file,$dkey,@L);
   chdir $spooldir or die "$0: $spooldir - $!\n";
   foreach $file (glob "*/*/*") {
-    if (-s "$file/data" and 
-        $dkey = readlink("$file/dkey") and 
+    if (-s "$file/data" and
+        $dkey = readlink("$file/dkey") and
         -l ".dkeys/$dkey"
     ) {
       push @L,sprintf "%2\$s --> %1\$s : $durl/$dkey/%3\$s\n",split "/",$file;
         -l ".dkeys/$dkey"
     ) {
       push @L,sprintf "%2\$s --> %1\$s : $durl/$dkey/%3\$s\n",split "/",$file;
@@ -225,7 +225,7 @@ if ($opt_L) {
   my $filter = shift;
   my ($comment,$file,$keep,$old,$size,$download);
   local $_;
   my $filter = shift;
   my ($comment,$file,$keep,$old,$size,$download);
   local $_;
-  
+
   foreach $file (glob "*/*/*/data") {
     next if $file =~ m:(.+?)/: and -l $1;
     $size = -s $file or next;
   foreach $file (glob "*/*/*/data") {
     next if $file =~ m:(.+?)/: and -l $1;
     $size = -s $file or next;
@@ -238,7 +238,7 @@ if ($opt_L) {
     $download = join(' & ',split("\n",(slurp("$file/download")||'')));
     print "\n$file\n";
     printf "  comment: %s\n",decode_utf8($comment);
     $download = join(' & ',split("\n",(slurp("$file/download")||'')));
     print "\n$file\n";
     printf "  comment: %s\n",decode_utf8($comment);
-    printf "  size: %s\n",d3($size); 
+    printf "  size: %s\n",d3($size);
     printf "  sender ip: %s\n",readlink("$file/ip")||'';
     printf "  expire in: %s days\n",$keep-$old;
     printf "  upload speed: %s kB/s\n",readlink("$file/speed")||0;
     printf "  sender ip: %s\n",readlink("$file/ip")||'';
     printf "  expire in: %s days\n",$keep-$old;
     printf "  upload speed: %s kB/s\n",readlink("$file/speed")||0;
@@ -248,7 +248,7 @@ if ($opt_L) {
   exit;
 }
 
   exit;
 }
 
-# delete user 
+# delete user
 if ($opt_d) {
   $idf = "$spooldir/$opt_d/\@";
   die "$0: no such user $opt_d\n" unless -f $idf;
 if ($opt_d) {
   $idf = "$spooldir/$opt_d/\@";
   die "$0: no such user $opt_d\n" unless -f $idf;
@@ -260,17 +260,32 @@ if ($opt_d) {
 
 # set user restriction file
 if ($opt_R) {
 
 # set user restriction file
 if ($opt_R) {
-  $user = shift or die "usage: $0 -R user\n";
-  $user .= '@'.$mdomain if $mdomain and $user !~ /@/;
-  die "$0: no user $user\n" unless -d "$spooldir/$user";
-  unless (@local_rdomains) {
-    die "$0: no \@local_rdomains in server config\n";
-  }
-  my $rf = "$spooldir/$user/\@ALLOWED_RECIPIENTS";
-  open $rf,'>',$rf or die "$0: cannot open $rf - $!";
-  print {$rf} "\@LOCAL_RDOMAINS\n";
-  close $rf;
-  print "$user restricted\n";
+  if ($opt_R eq 'i') {
+    $user = shift or die "usage: $0 -Ri user\n";
+    $user .= '@'.$mdomain if $mdomain and $user !~ /@/;
+    die "$0: no user $user\n" unless -d "$spooldir/$user";
+    unless (@local_rdomains) {
+      die "$0: no \@local_rdomains in server config\n";
+    }
+    my $rf = "$spooldir/$user/\@ALLOWED_RECIPIENTS";
+    open $rf,'>',$rf or die "$0: cannot open $rf - $!";
+    print {$rf} "\@LOCAL_RDOMAINS\n";
+    close $rf;
+    print "$user restricted to internal recipients\n";
+    exit;
+  } elsif ($opt_R eq 'l') {
+    $user = shift or die "usage: $0 -Rl user\n";
+    $user .= '@'.$mdomain if $mdomain and $user !~ /@/;
+    die "$0: no user $user\n" unless -d "$spooldir/$user";
+    my $rf = "$spooldir/$user/\@ALLOWED_RECIPIENTS";
+    open $rf,'>',$rf or die "$0: cannot open $rf - $!";
+    print {$rf} "\@LOCAL_USERS\n";
+    close $rf;
+    print "$user restricted to local recipients\n";
+    exit;
+  } else {
+    usage(2);
+  }
   exit;
 }
 
   exit;
 }
 
@@ -297,7 +312,7 @@ if ($opt_r) {
 EOD
     } elsif ($opt_r eq 'UPLOAD_HOSTS') {
       print {$rf}<<EOD;
 EOD
     } elsif ($opt_r eq 'UPLOAD_HOSTS') {
       print {$rf}<<EOD;
-# Restrict allowed upload hosts. 
+# Restrict allowed upload hosts.
 # Only listed addresses are allowed as upload hosts.
 # Make this file COMPLETLY empty if you want to disable the restriction.
 # You can add single ip adresses or ip ranges.
 # Only listed addresses are allowed as upload hosts.
 # Make this file COMPLETLY empty if you want to disable the restriction.
 # You can add single ip adresses or ip ranges.
@@ -307,7 +322,7 @@ EOD
 EOD
     } elsif ($opt_r eq 'DOWNLOAD_HOSTS') {
       print {$rf}<<EOD;
 EOD
     } elsif ($opt_r eq 'DOWNLOAD_HOSTS') {
       print {$rf}<<EOD;
-# Restrict allowed download hosts. 
+# Restrict allowed download hosts.
 # Only listed addresses are allowed as download hosts.
 # Make this file COMPLETLY empty if you want to disable the restriction.
 # You can add single ip adresses or ip ranges.
 # Only listed addresses are allowed as download hosts.
 # Make this file COMPLETLY empty if you want to disable the restriction.
 # You can add single ip adresses or ip ranges.
@@ -332,10 +347,10 @@ if ($opt_c) {
 
 # add virtual server
 if ($opt_A) {
 
 # add virtual server
 if ($opt_A) {
-  if ($opt_A =~ /(.+):(.+)/) { 
+  if ($opt_A =~ /(.+):(.+)/) {
     $vhost = $1;
     $hhost = $2;
     $vhost = $1;
     $hhost = $2;
-  } else { 
+  } else {
     die "usage: $0 -A alias:hostname\n".
         "example: $0 -A flupp:fex.flupp.org\n";
   }
     die "usage: $0 -A alias:hostname\n".
         "example: $0 -A flupp:fex.flupp.org\n";
   }
@@ -477,7 +492,7 @@ if ($opt_a) {
   if    (/^n/i) { $autodelete = 'no' }
   elsif (/^y/i) { $autodelete = 'yes' }
   elsif (/^d/i) { $autodelete = 'delay' }
   if    (/^n/i) { $autodelete = 'no' }
   elsif (/^y/i) { $autodelete = 'yes' }
   elsif (/^d/i) { $autodelete = 'delay' }
-  else { 
+  else {
     die "usage: $0 -a user yes\n".
         "usage: $0 -a user no\n".
         "usage: $0 -a user delay\n".
     die "usage: $0 -a user yes\n".
         "usage: $0 -a user no\n".
         "usage: $0 -a user delay\n".
@@ -498,7 +513,7 @@ if ($opt_n) {
   if    (/^n/i)    { $notification = 'no' }
   elsif (/^[sb]/i) { $notification = 'short' }
   elsif (/^[fd]/i) { $notification = '' }
   if    (/^n/i)    { $notification = 'no' }
   elsif (/^[sb]/i) { $notification = 'short' }
   elsif (/^[fd]/i) { $notification = '' }
-  else { 
+  else {
     die "usage: $0 -n user no\n".
         "usage: $0 -n user brief\n".
         "usage: $0 -n user detailed\n".
     die "usage: $0 -n user no\n".
         "usage: $0 -n user brief\n".
         "usage: $0 -n user detailed\n".
@@ -588,18 +603,15 @@ if ($opt_y) {
 if ($opt_D) {
   $user = lc $opt_D;
   $user .= '@'.$mdomain if $mdomain and $user !~ /@/;
 if ($opt_D) {
   $user = lc $opt_D;
   $user .= '@'.$mdomain if $mdomain and $user !~ /@/;
-  $_ = shift @ARGV || '';
-  if (/^y/i) {
-    open $user,">>$spooldir/$user/\@DISABLED";
-    close $user;
-    print "$user is now disabled\n";
-  } elsif (/^n/i) {
+  $_ = $ARGV[0] || '';
+  if (/^no?$/i) {
     unlink "$spooldir/$user/\@DISABLED";
     print "$user is now enabled\n";
   } else {
     unlink "$spooldir/$user/\@DISABLED";
     print "$user is now enabled\n";
   } else {
-    die "usage: $0 -D user yes\n".
-        "usage: $0 -D user no\n".
-        "example: $0 -D framstag\@rus.uni-stuttgart.de no\n";
+    open $user,">>$spooldir/$user/\@DISABLED";
+    print {$user} "@ARGV\n";
+    close $user;
+    print "$user is now disabled\n";
   }
   exit;
 }
   }
   exit;
 }
@@ -655,14 +667,19 @@ sub showuser {
       print "login: DELETED\n";
     }
   }
       print "login: DELETED\n";
     }
   }
+  my $disabled = 'no';
+  if (-e "$spooldir/$user/\@DISABLED") {
+    $disabled = slurp("$spooldir/$user/\@DISABLED");
+    chomp $disabled;
+    $disabled ||= 'yes';
+  }
   printf "fex yourself web default: %s\n",
          -e "$spooldir/$user/\@FEXYOURSELF" ? 'yes' : 'no';
   printf "persistent: %s\n",
          -e "$spooldir/$user/\@PERSISTENT" ? 'yes' : 'no';
   printf "captive: %s\n",
          -e "$spooldir/$user/\@CAPTIVE" ? 'yes' : 'no';
   printf "fex yourself web default: %s\n",
          -e "$spooldir/$user/\@FEXYOURSELF" ? 'yes' : 'no';
   printf "persistent: %s\n",
          -e "$spooldir/$user/\@PERSISTENT" ? 'yes' : 'no';
   printf "captive: %s\n",
          -e "$spooldir/$user/\@CAPTIVE" ? 'yes' : 'no';
-  printf "disabled: %s\n",
-         -e "$spooldir/$user/\@DISABLED" ? 'yes' : 'no';
+  printf "disabled: %s\n",$disabled;
   printf "recipients restrictions: %s\n",
          -e "$spooldir/$user/\@ALLOWED_RECIPIENTS" ? 'yes' : 'no';
   printf "upload restrictions: %s\n",
   printf "recipients restrictions: %s\n",
          -e "$spooldir/$user/\@ALLOWED_RECIPIENTS" ? 'yes' : 'no';
   printf "upload restrictions: %s\n",
@@ -702,17 +719,13 @@ sub quota {
       $squota = $1 if /^s.*:(\d*)/i;
     }
     open $qf,'>',$qf or die "$0: cannot write $qf - $!\n";
       $squota = $1 if /^s.*:(\d*)/i;
     }
     open $qf,'>',$qf or die "$0: cannot write $qf - $!\n";
-    print {$qf} "recipient:$rquota\n" if $rquota =~ /\d/;
-    print {$qf} "sender:$squota\n"    if $squota =~ /\d/;
+    print {$qf} "recipient:$rquota\n" if $rquota;
+    print {$qf} "sender:$squota\n"    if $squota;
     close $qf;
   }
 
     close $qf;
   }
 
-  $rquota = $recipient_quota if $rquota !~ /\d/;
-  $squota = $sender_quota    if $squota !~ /\d/;
-  printf "recpient quota (used): %d (%d) MB\n",
-         check_recipient_quota($user) if $rquota;
-  printf "sender quota (used): %d (%d) MB\n",
-         check_sender_quota($user) if $squota;
+  printf "recpient quota (used): %d (%d) MB\n",check_recipient_quota($user);
+  printf "sender quota (used): %d (%d) MB\n",check_sender_quota($user);
 }
 
 
 }
 
 
@@ -721,7 +734,7 @@ sub fupstat {
   my ($log,$u,$d,$z);
   my $Z = 0;
 
   my ($log,$u,$d,$z);
   my $Z = 0;
 
-  if (-t) { $log = $logdir[0].'/fup.log' }
+  if (-t) { $log = "$logdir/fup.log" }
   else    { $log = '>&=STDIN' }
   open $log,$log or die "$0: cannot open $log - $!\n";
 
   else    { $log = '>&=STDIN' }
   open $log,$log or die "$0: cannot open $log - $!\n";
 
@@ -758,7 +771,7 @@ sub fopstat {
   my ($log,$u,$d,$z);
   my (%user,%domain,%du);
 
   my ($log,$u,$d,$z);
   my (%user,%domain,%du);
 
-  if (-t) { $log = $logdir[0].'/fop.log' }
+  if (-t) { $log = "$logdir/fop.log" }
   else    { $log = '>&=STDIN' }
   open $log,$log or die "$0: cannot open $log - $!\n";
 
   else    { $log = '>&=STDIN' }
   open $log,$log or die "$0: cannot open $log - $!\n";
 
@@ -799,7 +812,7 @@ sub cpa {
 
 
 sub check_admin {
 
 
 sub check_admin {
-  
+
   my $admin_id = slurp("$spooldir/$admin/@") or
     die "$0: no admin account - you have to create it with:\n".
         "$0 -/ $admin ".randstring(8)."\n";
   my $admin_id = slurp("$spooldir/$admin/@") or
     die "$0: no admin account - you have to create it with:\n".
         "$0 -/ $admin ".randstring(8)."\n";
@@ -824,7 +837,7 @@ sub check_admin {
       warn "$0: moving $fid to ${fid}_save\n";
       rename $fid,$fid.'_save';
     }
       warn "$0: moving $fid to ${fid}_save\n";
       rename $fid,$fid.'_save';
     }
-  } 
+  }
   unless (-f $fid) {
     mkdir dirname($fid);
     open $fid,'>',$fid or die "$0: cannot create $fid - $!\n";
   unless (-f $fid) {
     mkdir dirname($fid);
     open $fid,'>',$fid or die "$0: cannot create $fid - $!\n";
@@ -864,12 +877,14 @@ $0 -u user auth-ID    # create new user or set new auth-ID
 $0 -/ admin auth-ID   # set new admin and auth-ID
 $0 -q user s:quota    # set new disk quota (MB) for sender user
 $0 -q user r:quota    # set new disk quota (MB) for recipient user
 $0 -/ admin auth-ID   # set new admin and auth-ID
 $0 -q user s:quota    # set new disk quota (MB) for sender user
 $0 -q user r:quota    # set new disk quota (MB) for recipient user
-$0 -R user            # restrict user: only internal recipients allowed
+$0 -Ri user           # restrict user: only internal domain recipients allowed
+$0 -Rl user           # restrict user: only local users as recipients allowed
 $0 -rr user           # edit user recipients restriction
 $0 -ru user           # edit user upload restriction
 $0 -rd user           # edit user download restriction
 $0 -d user            # delete user
 $0 -rr user           # edit user recipients restriction
 $0 -ru user           # edit user upload restriction
 $0 -rd user           # edit user download restriction
 $0 -d user            # delete user
-$0 -D user [yn]       # disable user (yes,no)
+$0 -D user "reason"   # disable user
+$0 -D user "no"       # re-enable user
 $0 -P user [yn]       # make user persistent = no account expiration (yes,no)
 $0 -a user [ynd]      # set user autodelete default (yes,no,delay)
 $0 -n user [dbn]      # set user notification default (detailed,brief,no)
 $0 -P user [yn]       # make user persistent = no account expiration (yes,no)
 $0 -a user [ynd]      # set user autodelete default (yes,no,delay)
 $0 -n user [dbn]      # set user notification default (detailed,brief,no)