#!/usr/athena/bin/perl # # Mini NNTP server which accepts a nonstreaming header-only feeds in # order to collect addresses from messages # # Based on original 'news-server' which accepted a traditional INN feed # # kolya 1999/Jul/05 # use Sys::Syslog; $max_message_length = 50000; $delivery_address = 'update-of-addresses@penguin-lust.mit.edu'; $| = 1; $final = 0; &openlog('address-scanner', 'pid', 'local2'); sub deliver { local($address) = @_; $message .= ($address eq '') ? '' : "ADD:$address\n"; $message_length += length($str); if ($final || ($message_length > $max_message_length)) { open(MAIL, "|/bin/mail $delivery_address"); print MAIL "Subject: usenet-addresses list\n\n$message"; close(MAIL); if ($?) { &syslog('err', "/bin/mail exited with non-zero status"); } else { $message = ""; $message_length = 0; } } } print "200 address-scanner ready to collect addresses\r\n"; while (<>) { $_ =~ s/[\r\n]*$//g; if(/^mode headfeed$/i) { print "250 mode ok\r\n"; } elsif(/^check (.*)$/i) { print "238 $1\r\n"; } elsif(/^takethis (.*)$/i) { $msgid=$1; &take_article; print "239 $msgid\r\n"; } elsif(/^ihave (.*)$/i) { $msgid=$1; print "335 $msgid\r\n"; &take_article; print "235 $msgid\r\n"; } elsif(/^quit/i) { print "205 quit\r\n"; &done; } else { print "500 not implemented\r\n"; } } &done; sub done { $final=1; &deliver(""); exit; } sub take_article { $header = '\n'; $in = ''; while ($in !~ /^\.$/) { $in = <>; $in =~ s/[\r\n]*$//g; last if $in eq ''; $header .= $in. "\n"; } while ($in !~ /^\.[\r\n]*$/) { $in=<>; last if $in eq ''; } $header =~ s/\n[ \t]+/ /; if ( ($header =~ /\nReply-To:\s+([^\n]*[^\s])\s*\n/) || ($header =~ /\nFrom:\s+([^\n]*[^\s])\s*\n/) || ($header =~ /\nSender:\s+([^\n]*[^\s])\s*\n/) ) { if ($last ne $1) { $last = $1; &deliver($last); } } }