1 # vim: set tabstop=4 shiftwidth=4 expandtab syntax=perl:
10 sub local_filter_cancel {
11 unless($hdr{Control} =~ m/^cancel\s+(<[^>]+>)/i) {
12 return "Cancel with broken target ID";
14 return verify_cancel(\%hdr, $1, 'Cancel');
17 sub local_filter_after_emp {
18 if (exists( $hdr{'Supersedes'} )) {
19 #return verify_cancel(\%hdr, $hdr{'Supersedes'}, 'Supersedes');
20 # verify_cancel is called, but not returned, so the
21 # posting is unconditionally accepted
22 # verify_cancel calls INN:cancel() if verification suceeds
23 verify_cancel(\%hdr, $hdr{'Supersedes'}, 'Supersedes');
29 sub verify_cancel($$$) {
30 my $r_hdr = shift || die;
34 my $headers = INN::head($target) || return "$descr of non-existing ID $target";
37 for my $line(split(/\s*\n/, $headers)) {
38 if ($line =~ m/^([[:alnum:]-]+):\s+(.*)/) {
41 } elsif ($line =~ m/^\s+(.*)/ and defined($lastkey)) {
42 $headers{$lastkey} .= ' ' . $1;
45 my $lock = $headers{'Cancel-Lock'};
48 my $key = $r_hdr->{'Cancel-Key'} || return "$descr of $target without Cancel-Key";
49 #return verify_cancel_key($key, $lock, ' target=' . $target);
50 return verify_cancel_key($key, $lock, $target);
53 # no cancel-lock: go ahead and cancel anyway!
60 sub verify_cancel_key($$$) {
61 my $cancel_key = shift;
62 my $cancel_lock = shift;
65 $msg = '' unless(defined($msg));
68 $msg = ' target=' . $msg;
71 for my $l(split(/\s+/, $cancel_lock)) {
72 next unless($l =~ m/^(sha512|sha256|sha1|md5):(\S+)/);
76 for my $k(split(/\s+/, $cancel_key)) {
77 unless($k =~ m/^(sha512|sha256|sha1|md5):(\S+)/) {
78 INN::syslog('notice', "Invalid Cancel-Key syntax '$k'.$msg");
84 $key = Digest::SHA::sha512($2);
85 } elsif ($1 eq 'sha256') {
86 $key = Digest::SHA::sha256($2);
87 } elsif($1 eq 'sha1') {
88 $key = Digest::SHA::sha1($2);
89 } elsif ($1 eq 'md5') {
90 $key = Digest::MD5::md5($2);
92 $key = MIME::Base64::encode_base64($key, '');
94 if (exists($lock{$key})) {
95 # INN::syslog('notice', "Valid Cancel-Key $key found.$msg");
97 # article is canceled now
98 INN::cancel($target) if ($target);
103 INN::syslog('notice',
104 "No Cancel-Key[$cancel_key] matches Cancel-Lock[$cancel_lock]$msg"
106 return "No Cancel-Key matches Cancel-Lock.$msg";