#!/usr/bin/perl
#
# Benötigte Module
use MIME::Base64;
use Digest::HMAC_SHA1;
use Digest::SHA1;
# Beispieldaten
$user = 'meinbenutzername@invalid.invalid';
$CANCELLOCK = 'Supergrossesgeheimnis';
$hdr{'Message-ID'} = '<diezukancelndemessid@newserver.invalid>';
$hdr{'Control'} = "cancel ".$hdr{'Message-ID'};
# Eigentlicher Code der auch in der filter_nnrpd.pl funktioniert
# wie bei X-Trace
if($hdr{'Control'}){
# Vielleicht nicht ganz sauber denn..
@control = split(/ /, $hdr{"Control"});
foreach(@control) {
if (/^cancel/i) {
$cancel++;
}
#hier wird der control one cancel gespeichert
#und wenn das nicht die zu cancelnde Message-ID
#ist gehts schief.
$CancelID = $_;
}
}
# Wenn der User keinen Cancellock stellt, dann stellen wir einen.
if(!$hdr{'Cancel-Lock'}) {
$hmac = Digest::HMAC_SHA1->new("$user");
$data = $hdr{'Message-ID'}."$CANCELLOCK";
$hmac->add("$data");
$digest = $hmac->b64digest;
$lock = encode_base64(Digest::SHA1::sha1($digest),"");
$hdr{'Cancel-Lock'} = "sha1:".$lock."";
}
# Mift, wenn der User doch eine CancelID stellt, dann überschreiben
# wir dessen Cancel-Key, wenn es ein cancel ist.
# das muss vielleicht noch verbessert werden.
if($cancel) {
$hmac = Digest::HMAC_SHA1->new("$user");
$data = $CancelID."$CANCELLOCK";
$hmac->add($data);
$digest = $hmac->b64digest;
$schluessel = $digest;
$hdr{'Cancel-key'} = "sha1:".$schluessel;
}