Hi,

--On Mittwoch, 6. Oktober 2004 15:25 Uhr -0700 Rob Tanner <[EMAIL PROTECTED]> wrote:

My other thought was to write my own, using the Cyrus::SIEVE::managesieve
package, but there's no helpful documentation that I could find.

Has anyone resolved this problem?

well, we have a script that does use the Perl module. I didn't write it myself, but I think it's OK to attach it. This script prompts for password info, but obviously you could get that from somewhere else as well.

Cheers, Sebastian Hagedorn
--
Sebastian Hagedorn M.A. - RZKR-R1 (Gebäude 52), Zimmer 18
Zentrum für angewandte Informatik - Universitätsweiter Service RRZK
Universität zu Köln / Cologne University - Tel. +49-221-478-5587
#!/vol/gnu/bin/perl5.6 -w

require File::Temp;

use Cyrus::SIEVE::managesieve;
use File::Temp qw/ tempfile /;
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
use strict;

## Interaktiv oder ueber cgi gestartet
## interaktiv (0), cgi (-1, wird zu 1)
my $SysMode=(system("/usr/bin/tty -s") == 0) ? 0 : 1;     

# Wer bin ich?
my $whoami=($SysMode) ? $ENV{'SCRIPT_NAME'} : $0 ;

$whoami =~ s/.+\/(.+)$/$1/g;

my $scriptname = "rrzk";
my $ImapServer = "imap.uni-koeln.de";

my $user;
my $passwd;
my $spamlevel;
my $spamfolder;
my $ServerHandle;
my $TmpHandle;
my $TmpFileName;
my $error;
my $message;
my $ret;
my $mode;
my $mode_txt;
my $mode_tag;

########
# Texte
########

my $head=<<"...";

   ZAIK/RRZK Sieve-Konfiguration (CO, 30.01.2004)
...

my $intro1=<<"...";
   Auf dem zentralen Mailserver des ZAIK/RRZK wird eingehende Mail mit 
   Spamassassin untersucht. Erkannte SPAM-Emails werden dabei markiert.
   Diese Emails koennen wahlweise mit geeigneten Mailklienten beim Benutzer,
   oder auf dem Server mit Sieve gefiltert werden. Von Spamassassin markierte
   Mails werden dabei in ein Mailverzeichniss verschoben oder geloescht.
   Dieses Skript dient der Konfiguration Ihres SPAM-Filters mit Sieve.

...
   
my $intro2=<<"...";
   Das Mailverzeichnis, in das die SPAMs verschoben sollen,  muessen Sie mit 
   Ihrem Mailklienten erzeugen, bevor die Aenderung wirksam werden kann. 
...

my $link=<<"...";
   http://www.uni-koeln.de/rrzk/mail/spam/spamcfg

...

my $info=<<"...";
   Bitte geben Sie Ihren Benutzernamen und Ihr Passwort f¸r den Rechner 
   imap.uni-koeln.de ein und w?hlen Sie den SPAM-Level (0-9) aus, ab dem die 
   Mail gefiltert werden soll. Sie koennen auswaehlen, ob die Mail geloescht 
   oder in einen Ordner verschoben werden soll. 
   Geben Sie in diesem Fall auch den Namen des Ordners an. Beachten Sie die
   Gross- bzw. Kleinschreibung des Ordnernamens.

...

my $hinweis=<<"...";
   Achtung: Vorhandene benutzerdefinierte Sieve-Filter werden deaktiviert! 

...

my $fertig=<<"...";
   Fuer Sie wurde ein Sieve-Script mit dem Namen rrzk angelegt und aktiviert,
   das Sie bei Bedarf mit Smartsieve bearbeiten koennen.
   (https://smartsieve.uni-koeln.de/smartsieve/)
   Auch Deaktivierung und Loeschen des Scripts sind auf diesem Weg moeglich.

   Denken Sie daran, das Mailverzeichnis fuer SPAM-Mails mit Ihrem Mailklienten 
   auf dem Server anzulegen.

...

################
# CGI-Variablen
################

my $cgi = new CGI;

#HTML
my $titel=$whoami;
my $author_email="[EMAIL PROTECTED]";
my $attribut="bgcolor=#003399";

#Formulardaten
my $method="post";
my $action=$whoami;
my $encoding=$cgi->URL_ENCODED;

# Seiten-Header
my $Header=<<"...";
...

# Seiten-Footer
my $Footer=<<"...";
<hr>
<table>
<tr><td nowrap>
<ADDRESS>
<A HREF="http://www.uni-koeln.de/rrzk/Autoren/CO";><small>Berthold Cogel</small></A>
</ADDRESS>
</td></tr>
<tr><td>
<table><tr><td width="15\%" valign="top" nowrap><small><b>\&copy</b>2003</small> 
</td><td align="center" valign="top" nowrap><small>Zentrum f\&uuml\;r Angew. 
Informatik (ZAIK),<br>Universit\&auml\;tsweiter Service 
(RRZK)</small></td></tr></table>
</td>
</tr>
</table>
...

# Radiobuttons 'Modus'
my $radio="mode";
my @radio_value=('move','delete');
my %radio_label=('move'=>' in SPAM-Ordner verschieben','delete'=>' l?schen');
my $radio_default='move';
my $radio_selected=$radio_default;



##################
# Sieve Variablen
##################

my $move_txt = "fileinto \"SPAM\"";
my $move_tag = "folder\&\&SPAM";
my $delete_txt = "discard";
my $delete_tag = "discard\&\&";

my $SieveScript=<<"...";
#Mail filter rules for rrzk
#Generated by rrzk
require ["fileinto","regex"];

if allof (header :regex "X-Spam-Level" "*****") {
       MODETXT;
}

##PSEUDO script start
#rule&&1&&ENABLED&&&&&&&&MODETAG&&128&&X-Spam-Level&&*****&&
#mode&&basic
...


#######
# MAIN
#######

if ($SysMode){
   # Aufruf als CGI
   #Browser hat Formulardaten gesendet
   if ($cgi->param()){
      get_parameter();
   }
   else{
      # erster Seitenaufruf, sende Login-Formular 
      showlogin();
      exit;
   }
}
else{
   # Programm wird interaktiv benutzt

   #Cyrus-SASL-Libraries (NUR fuer Campfire)
   $ENV{SASL_PATH} = '/vol/local/lib/sasl2/';


   print $head;
   print $intro1;
   print $intro2;
   print $link;
   print $hinweis;
   print $info;
   print $hinweis;
   print "Weiter mit Enter";
   prompt("","");
   print "Verbindung zu $ImapServer wird aufgebaut\n";
   $user = $ENV{USER};

}
# Verbindung zum IMAP-Server aufbauen
$ServerHandle = sieve_get_handle($ImapServer,"prompt","prompt","prompt","prompt");
if (!defined $ServerHandle){message($titel,"Fehler: Keine Verbindung zu $ImapServer");}

# Spam-Level erfragen
$spamlevel = prompt("spamlevel","Spam-Level"); 
if (!defined $spamlevel){message($titel,"Fehler: Unzulaessiger Spamlevel");}

# Modus erfragen
$mode = prompt("mode","Modus (v)erschieben/(l)oeschen"); 
if (!defined $mode){message($titel,"Fehler: Unzulaessiger Modus");}
if ($mode eq "move"){
   $mode_txt = $move_txt;
   $mode_tag = $move_tag;
}
elsif($mode eq "delete"){
   $mode_txt = $delete_txt;
   $mode_tag = $delete_tag;
}

if ($mode eq "move"){
   # Spam-Ordner erfragen
   $mode = prompt("spamfolder","SPAM-Ordner"); 
   if (!defined $spamfolder){message($titel,"Fehler: Unzulaessiger SPAM-Ordner");}
   $mode_txt =~ s/SPAM/$spamfolder/g; 
   $mode_tag =~ s/SPAM/$spamfolder/g; 
}


# Spam-Level im Script setzen
$SieveScript =~ s/\*\*\*\*\*/"\\\\\*"x$spamlevel/ge; 
# Modus im Script setzen
$SieveScript =~ s/MODETXT/$mode_txt/g; 
$SieveScript =~ s/MODETAG/$mode_tag/g; 

# Tempfile anlegen
($TmpHandle,$TmpFileName) = tempfile();
if (!$TmpHandle) {message($titel,"Fehler: Kann Temp-File nicht oeffnen!:$?");}

# Tempfile schreiben
print $TmpHandle $SieveScript;

# Rewind, sonst ist Filelaenge 0 bei Uebertragung
seek $TmpHandle,0,0;

# Script-Upload
$ret = sieve_put_file_withdest($ServerHandle,$TmpFileName,$scriptname);
if ($ret != 0){
  $error = sieve_get_error($ServerHandle);
  $error = "Unbekannter Fehler" if (!defined $error);
  message($titel,"Fehler: Upload fehlgeschlagen: $error");
}

# Script-Aktivierung
$ret = sieve_activate($ServerHandle,$scriptname);
if ($ret != 0){
  $error = sieve_get_error($ServerHandle);
  $error = "Unbekannter Fehler" if (!defined $error);
  message("Fehler","Aktivierung fehlgeschlagen: $error");
}

# Tempfile loeschen
unlink ("$TmpFileName");

message($titel,$fertig);

exit;

#############################
# Authentifizierung abfragen
#############################
sub prompt {

   my ($type,$prompt) = @_;

#   print "$type,$prompt\n";

   if (($type eq "username") && (defined $user)){
      return $user;
   } 
   elsif (($type eq "authname") && (defined $user)){
      return $user;
   }
   elsif (($type eq "spamlevel") && (defined $spamlevel)){
      return $spamlevel;
   }
   elsif (($type eq "spamfolder") && (defined $spamfolder)){
      return $spamfolder;
   }
   elsif (($type eq "password") && (defined $passwd)){
      return $passwd;
   }
   elsif (($type eq "mode") && (defined $mode)){
      return $mode;
   }

   
if ($SysMode){return;}
   my $tty;
   my $in;
   my $dummy = "";
   
   chomp($tty = `stty -g`);

   if ($type eq "authname") {
      $prompt = "Login";
   }
   if ($type eq "username") {
      $prompt = "Login";
   }
   
   if ($type eq "password") {
      $prompt = "Passwort";
      system "stty -echo -icanon min 1 time 0 2>/dev/null||" .
             "stty -echo cbreak";
      $dummy="\n"; 
   }
   
   
   print "$prompt:";
   
   $in = <STDIN>;
   chop($in);
   
   print $dummy;
   system "stty $tty";


   # Taste fuer Weiter
        if ($prompt eq ""){ return;}


   # Leerstring abfangen
        if ($in eq ""){
      undef $in;
      message($titel,"Fehler: Ungueltige Eingabe!");}

   if ($type eq "authname") {
      $user = $in;
   }
   if ($type eq "username") {
      $user = $in;
   }
   if ($type eq "spamlevel") {
        if ($in =~ /\D/){undef $in;}
   }
   if ($type eq "spamfolder") {
      $spamfolder = $in;
   }
   if ($type eq "mode"){
        if ($in eq "v"){$in="move";}
        elsif ($in eq "l"){$in="delete";}
        else{undef $in;}
   }
   
   return $in;

}


##########################
# zeichnet die Startseite
##########################

sub showlogin {

   print $cgi->header(-expires=>'now');
   print $cgi->start_html($titel);

   print $Header,,$cgi->h1($titel);
   print $cgi->h3($head),,'<p>',$intro1,'</p>','<p>',$intro2,'(<a href=\'',$link,'\' 
target=_blank>Anleitung</a>)','</p>',
      '<p style="color:red">',$hinweis,'</p>','<hr>',
      '<p>',$info,'</p>', 
      $cgi->startform($method,$action,$encoding),

      '<table>
       <tr><td>
       <table>
         <tr>
            <td align="right"><strong>Login:</strong></td>
            
<td>',$cgi->textfield(-name=>'login',-default=>$user,-override=>1,-size=>10,-maxlength=>10),'</td>
         </tr>
         <tr>
            <td align="right"><strong>Passwort:</strong></td>
            
<td>',$cgi->password_field(-name=>'passwd',-default=>$passwd,-size=>10,-maxlength=>20),'</td>
         </tr>
         <tr>
            <td align="right"><strong>SPAM-Level:</strong></td>
            
<td>',$cgi->textfield(-name=>'spamlevel',-default=>$spamlevel,-override=>1,-size=>1,-maxlength=>1),'</td>
         </tr>
         <tr>
            <td align="right"><strong>SPAM-Ordner:</strong></td>
            
<td>',$cgi->textfield(-name=>'spamfolder',-default=>$spamfolder,-override=>1,-size=>10,-maxlength=>20),'</td>
         </tr>
      </table>
      </td>
      <td>',
      $cgi->radio_group(-name=>$radio,-value=>[EMAIL 
PROTECTED],-default=>$radio_selected,-linebreak=>'true',-labels=>\%radio_label),
      '</td>
      </tr>
         <tr><td colspan="2">&nbsp;</td></tr>
         <tr><td colspan="2" style="color:red">',$hinweis,'</td></tr>
         <tr><td colspan="2">&nbsp;</td></tr>
         <tr>
            <td align="center">',$cgi->reset(-value=>'Formular zur¸cksetzen'),'</td>
            <td align="center">',$cgi->submit(-value=>'Formular absenden'),'</td>
         </tr>
      </table>   
      </table>',

      $cgi->endform(),$Footer,$cgi->end_html();
}

################################
# liest Parameter aus Seite aus
################################
sub get_parameter {
   
   $user=$cgi->param('login');               # Seitendaten holen
   $passwd=$cgi->param('passwd');
   $spamlevel=$cgi->param('spamlevel');
   $spamfolder=$cgi->param('spamfolder');
   $mode=$cgi->param('mode');               # Seitendaten holen
   
   if ($user eq ""){message($titel,"Fehler: Bitte geben Sie Ihren Benutzernamen 
an!");exit;}
   if ($passwd eq ""){message($titel,"Fehler: Bitte geben Sie Ihr Passwort an!");exit;}
   if ($spamlevel eq ""){message($titel,"Fehler: Bitte setzen Sie den gewuenschten 
SPAM-Level!");exit;}
   if ($spamlevel =~ /\D/){message($titel,"Fehler: Setzen Sie einen SPAM-Level von 0 
bis 9!");exit;}
   if ($mode eq "move"){
      if ($spamfolder eq ""){message($titel,"Fehler: Bitte geben Sie den SPAM-Ordner 
an!");exit;}
   }
}

#####################
# gibt Meldungen aus
#####################
sub message {
   my($titel,$message)[EMAIL PROTECTED];
   if ($SysMode){
      # Aufruf als CGI
   
      print $cgi->header;
      print $cgi->start_html($titel);
      print $Header,,$cgi->h1($titel);
      print $cgi->h3($head),,
         '<p>',$message,'</p>',
         $Footer,$cgi->end_html();
      exit;
   }
   else{
      print "$message\n";
      exit;
   }
}

Attachment: pgpS9G2cw2Ntg.pgp
Description: PGP signature

Reply via email to