Post by Markus FritscheMahlzeit,
ich bastel gerade im lokalen Netz an einem Newsserver
und hänge momentan an dem Thema Cleanfeed.
Nachdem ich mehrere Posts in einer eigenen Testgruppe,
gepostet. Wollte ich nun testen, ob das Cancel mit Key funktioniert.
Beim INN ist "innflags: -C" in der Config gesetzt.
Jedoch werden keine Cancels ausgeführt, weder Local - noch werden diese
an den zweiten Testserver weitergereicht.
In der Syslog ist folgendes hinterlegt:
-----------
news nnrpd-ssl[5742]: xxxxxxxxxxxxxx.xxxxxxx.de post ok
<***@news.mydomain.de>
-----------
Der Cancel Lock Eintrag ist im Header des Posts korrekt gesetzt.
Die mit INN::syslog definierten Meldungen werden nicht in der Syslog
vermerkt.
Die cleanfeed.local sieht wie folgt aus:
Auschnitt:
##############################################################################################
###### Cancel-Lock
##############################################################################################
#
# local_filter_cancel
#
sub local_filter_cancel {
unless($hdr{Control} =~ m/^cancel\s+(<[^>]+>)/i) {
return "Cancel with broken target ID";
}
return verify_cancel(\%hdr, $1, 'Cancel');
}
sub local_filter_after_emp {
if (exists( $hdr{'Supersedes'} )) {
#return verify_cancel(\%hdr, $hdr{'Supersedes'}, 'Supersedes');
# verify_cancel is called, but not returned, so the
# posting is unconditionally accepted
# verify_cancel calls INN:cancel() if verification suceeds
verify_cancel(\%hdr, $hdr{'Supersedes'}, 'Supersedes');
}
return undef;
}
sub verify_cancel($$$) {
my $r_hdr = shift || die;
my $target = shift;
my $descr = shift;
my $headers = INN::head($target) || return "$descr of
non-existing ID $target";
my %headers;
for my $line(split(/\s*\n/, $headers)) {
if ($line =~ m/^([[:alnum:]-]+):\s+(.*)/) {
$headers{$1} = $2;
}
}
my $lock = $headers{'Cancel-Lock'};
if (defined($lock)) {
my $key = $r_hdr->{'Cancel-Key'} || return "$descr of $target
without Cancel-Key";
#return verify_cancel_key($key, $lock, ' target=' . $target);
return verify_cancel_key($key, $lock, $target);
}
return undef;
}
sub verify_cancel_key($$$) {
my $cancel_key = shift;
my $cancel_lock = shift;
my $msg = shift;
$msg = '' unless(defined($msg));
# -thh
my $target = $msg;
$msg = ' target=' . $msg;
my %lock;
for my $l(split(/\s+/, $cancel_lock)) {
next unless($l =~ m/^(sha1|md5):(\S+)/);
$lock{$2} = $1;
}
for my $k(split(/\s+/, $cancel_key)) {
unless($k =~ m/^(sha1|md5):(\S+)/) {
INN::syslog('notice', "Invalid Cancel-Key syntax '$k'.$msg");
next;
}
my $key;
if ($1 eq 'sha1') {
$key = Digest::SHA1($2); }
elsif ($1 eq 'md5') {
$key = Digest::MD5::md5($2);
}
$key = MIME::Base64::encode_base64($key, '');
if (exists($lock{$key})) {
INN::syslog('notice', "Valid Cancel-Key $key found.$msg");
# -thh
# article is canceled now
INN::cancel($target) if ($target);
return undef;
}
}
INN::syslog('notice',
"No Cancel-Key[$cancel_key] matches
Cancel-Lock[$cancel_lock]$msg"
);
return "No Cancel-Key matches Cancel-Lock.$msg";
}
##############################################################################################
... Script Ende
Ich bin bei dem ganzen nach der Anleitung von Thomas Hochstein
vorgegangen.
(https://netz-rettung-recht.de/archives/1473-INN-Cancel-Lock-und-Cancel-Key.html)
Habe ich irgendwas übersehen?
Gruß,
Markus Fritsche