RFC dazu: http://tools.ietf.org/pdf/draft-ietf-usefor-cancel-lock-01.pdf
http://th-h.de/blog/archives/1473-INN-Cancel-Lock-und-Cancel-Key.html
Cancelock und Cancelkey
#!/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'} = '';
$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;
}