#!/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);
	}
  }
}

