INN commit: trunk (11 files)

INN Commit Russ_Allbery at isc.org
Sat Jan 10 11:52:16 UTC 2009


    Date: Saturday, January 10, 2009 @ 03:52:16
  Author: iulius
Revision: 8281

Use MIME::Parser in controlchan so that we could decode MIME
control headers (especially those which contain application/news-groupinfo
entities, as described in USEPRO).

Also fix a long-standing bug of uninitialized variables when
some headers were missing.

Update INSTALL to mention the dependency on MIME::Parser.

close #122

Modified:
  trunk/control/controlchan.in
  trunk/control/modules/checkgroups.pl
  trunk/control/modules/ihave.pl
  trunk/control/modules/newgroup.pl
  trunk/control/modules/rmgroup.pl
  trunk/control/modules/sendme.pl
  trunk/control/modules/sendsys.pl
  trunk/control/modules/senduuname.pl
  trunk/control/modules/version.pl
  trunk/doc/pod/install.pod
  trunk/doc/pod/news.pod

--------------------------------+
 control/controlchan.in         |  113 ++++++++++++++++++++-------------------
 control/modules/checkgroups.pl |   15 +++--
 control/modules/ihave.pl       |    9 +--
 control/modules/newgroup.pl    |   44 ++++++++++++---
 control/modules/rmgroup.pl     |   14 +++-
 control/modules/sendme.pl      |   10 ++-
 control/modules/sendsys.pl     |   14 +++-
 control/modules/senduuname.pl  |   14 +++-
 control/modules/version.pl     |   14 +++-
 doc/pod/install.pod            |   10 ++-
 doc/pod/news.pod               |    6 ++
 11 files changed, 166 insertions(+), 97 deletions(-)

Modified: control/controlchan.in
===================================================================
--- control/controlchan.in	2009-01-09 19:35:11 UTC (rev 8280)
+++ control/controlchan.in	2009-01-10 11:52:16 UTC (rev 8281)
@@ -30,6 +30,7 @@
 ##     :<pathbin>/controlchan
 
 require 5.004_03;
+use MIME::Parser;
 use strict;
 
 delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
@@ -82,27 +83,35 @@
     my $artfh = open_article($token);
     next if not defined $artfh;
 
-    # suck in headers and body, normalize the strange ones
-    my (@headers, @body, %hdr);
-    if (not parse_article($artfh, \@headers, \@body, \%hdr)) {
-        close $artfh;
-        next;
+    my $article_string = '';
+    while (<$artfh>) {
+        $article_string .= $_;
     }
+
     close $artfh or logdie('sm died with status ' . ($? >> 8));
 
-    next if not exists $hdr{control};
+    my %hdr;
+    my $parser = new MIME::Parser;
+    $parser->output_to_core(1);
+    my $article = $parser->parse_data($article_string);
 
+    if (not parse_article($article, \%hdr)) {
+        next;
+    }
+
+    next if not $hdr{'control'};
+
     $curmsgid = $hdr{'message-id'};
-    my $sender = cleanaddr($hdr{sender} || $hdr{from});
-    my $replyto = cleanaddr($hdr{'reply-to'} || $hdr{from});
+    my $sender = cleanaddr($hdr{'sender'} || $hdr{'from'});
+    my $replyto = cleanaddr($hdr{'reply-to'} || $hdr{'from'});
 
     my (@progparams, $progname);
-    if ($hdr{control} =~ /\s/) {
-        $hdr{control} =~ /^(\S+)\s+(.+)?/;
+    if ($hdr{'control'} =~ /\s/) {
+        $hdr{'control'} =~ /^(\S+)\s+(.+)?/;
         $progname = lc $1;
         @progparams = split(/\s+/, lc $2) if $2;
     } else {
-        $progname = lc $hdr{control};
+        $progname = lc $hdr{'control'};
     }
 
     next if $progname eq 'cancel';
@@ -116,7 +125,7 @@
     # Do we want to process the message?  Let's check the permissions.
     my ($action, $logname, $newsgrouppats) =
         ctlperm($progname, $sender, $progparams[0],
-                $token, \@headers, \@body);
+                $token, $article);
 
     next if $action eq 'drop';
 
@@ -150,20 +159,20 @@
     if (not defined &$subfind) {
         if ($logname) {
             logger($logname, "Unknown control message by $sender",
-                \@headers, \@body);
+                $article);
         } else {
             logmsg("Unknown \"$progname\" control by $sender");
         }
         next;
     }
 
-    my $approved = $hdr{approved} ? 1 : 0;
+    my $approved = $hdr{'approved'} ? 1 : 0;
     logmsg("$subname, " . join(' ', @progparams)
         . " $sender $replyto $token, $sitepath, $action"
         . ($logname ? "=$logname" : '') .", $approved");
 
     &$subfind(\@progparams, $sender, $replyto, $sitepath,
-        $action, $logname, $approved, \@headers, \@body);
+        $action, $logname, $approved, $article);
 }
 
 closelog() if $use_syslog;
@@ -171,41 +180,30 @@
 
 # misc functions ##########################################################
 sub parse_article {
-    my ($artfh, $headers, $body, $hdr) = @_;
-    my $h;
-    my %uniquehdr = map { $_ => 1 }    qw(date followup-to from message-id
-        newsgroups path reply-to subject sender);
+    my ($article, $hdr) = @_;
+    my ($h, $buffer);
+    my %uniquehdr = map { $_ => 1 } qw(approved control date followup-to
+        from message-id newsgroups path reply-to sender subject);
 
-    while (<$artfh>) {
-        s/\r?\n$//;
-        last if /^$/;
-        push @$headers, $_;
-        if (/^(\S+):\s+(.+)/) {
-            $h = lc $1;
-            if (exists $hdr->{$h}) {
-                if (exists $uniquehdr{$h}) {
-                    logmsg("Multiple $1 headers in article $curmsgid");
-                    return 0;
-                }
-                $hdr->{$h} .= ' ' . $2;
-            } else {
-                $hdr->{$h} = $2;
-            }
-            next;
-        } elsif (/^\s+(.+)/) {
-            if (defined $h) {
-                $hdr->{$h} .= ' ' . $1;
-                next;
-            }
+    my $head = $article->head;
+
+    foreach $h (%uniquehdr) {
+        $hdr->{$h} = '';
+        $buffer = $head->get($h);
+        if ($buffer) {
+            $buffer =~ s/\r?\n$//;
+            $buffer =~ s/\r?\n\s+/ /g;
+            $hdr->{$h} = $buffer;
         }
-        logmsg("Broken headers in article $curmsgid");
-        return 0;
+        if ($head->count($h) > 1) {
+            logmsg("Multiple $h headers in article $curmsgid");
+            return 0;
+        }
     }
 
-    # article is empty or does not exist
-    return 0 if not @$headers;
+    # Article is empty or does not exist.
+    return 0 if not $head->stringify;
 
-    chop (@$body = <$artfh>);
     return 1;
 }
 
@@ -215,7 +213,7 @@
     s/(\s+)?\(.*\)(\s+)?//g;
     s/.*<(.*)>.*/$1/;
     s/[^-a-zA-Z0-9+_.@%]/_/g;    # protect MTA
-    s/^-/_/;                    # protect MTA
+    s/^-/_/;                     # protect MTA
     return $_;
 }
 
@@ -255,7 +253,7 @@
 
 # Parse a control message's permissions.
 sub ctlperm {
-    my ($type, $sender, $newsgroup, $token, $headers, $body) = @_;
+    my ($type, $sender, $newsgroup, $token, $article) = @_;
 
     my $action = 'drop';    # default
     my ($logname, $hier);
@@ -291,7 +289,7 @@
         my $keyowner = $1;
         if ($INN::Config::pgpverify and $INN::Config::pgpverify =~ /^(?:true|on|yes)$/i) {
             my $pgpresult = defined &local_pgpverify ?
-                local_pgpverify($token, $headers, $body) : pgpverify($token);
+                local_pgpverify($token, $article) : pgpverify($token);
             if ($keyowner eq $pgpresult) {
                 $action = 'doit';
             } else {
@@ -307,13 +305,22 @@
 
 # Write stuff to a log or send mail to the news admin.
 sub logger {
-    my ($logfile, $message, $headers, $body) = @_;
+    my ($logfile, $message, $article) = @_;
+    my (@headers, @body);
 
+    if (ref $article eq 'ARRAY') {
+        @headers = @$article;
+    } else {
+        my $head = $article->head;
+        @headers = split(/\r?\n/, $head->stringify);
+        @body = split(/\r?\n/, $article->stringify_body);
+    }
+
     if ($logfile eq 'mail') {
         my $mail = sendmail($message);
-        print $mail map { s/^~/~~/; "$_\n" } @$headers;
-        print $mail "\n" . join ('', map { s/^~/~~/; "$_\n" } @$body)
-            if $body;
+        print $mail map { s/^~/~~/; "$_\n" } @headers;
+        print $mail "\n" . join ('', map { s/^~/~~/; "$_\n" } @body)
+            if @body;
         close $mail or logdie("Cannot send mail: $!");
         return;
     }
@@ -333,7 +340,7 @@
 
     open(LOGFILE, ">>$logfile") or logdie("Cannot open $logfile: $!");
     print LOGFILE "$message\n";
-    foreach (@$headers, '', @$body, '') {
+    foreach (@headers, '', @body, '') {
         print LOGFILE "    $_\n";
     }
     close LOGFILE;

Modified: control/modules/checkgroups.pl
===================================================================
--- control/modules/checkgroups.pl	2009-01-09 19:35:11 UTC (rev 8280)
+++ control/modules/checkgroups.pl	2009-01-10 11:52:16 UTC (rev 8281)
@@ -19,13 +19,16 @@
 
 sub control_checkgroups {
     my ($par, $sender, $replyto, $site, $action, $log, $approved,
-        $headers, $body) = @_;
+        $article) = @_;
     my ($newsgrouppats) = @$par;
+    my $head = $article->head;
+    my @headers = split(/\r?\n/, $head->stringify);
+    my @body = split(/\r?\n/, $article->stringify_body);
 
     if ($action eq 'mail') {
         my $mail = sendmail("checkgroups by $sender");
         print $mail "$sender posted the following checkgroups message:\n";
-        print $mail map { s/^~/~~/; "$_\n" } @$headers;
+        print $mail map { s/^~/~~/; "$_\n" } @headers;
         print $mail <<END;
 
 If you want to process it, feed the body
@@ -34,20 +37,20 @@
 
 $INN::Config::pathbin/docheckgroups '$newsgrouppats' <<zRbJ
 END
-        print $mail map { s/^~/~~/; "$_\n" } @$body;
+        print $mail map { s/^~/~~/; "$_\n" } @body;
         print $mail "zRbJ\n";
         close $mail or logdie("Cannot send mail: $!");
     } elsif ($action eq 'log') {
         if ($log) {
-            logger($log, "checkgroups by $sender", $headers, $body);
+            logger($log, "checkgroups by $sender", $article);
         } else {
             logmsg("checkgroups by $sender");
         }
     } elsif ($action eq 'doit') {
         if (defined &local_docheckgroups) {
-            local_docheckgroups($body, $newsgrouppats, $log, $sender);
+            local_docheckgroups(\@body, $newsgrouppats, $log, $sender);
         } else {
-            docheckgroups($body, $newsgrouppats, $log, $sender);
+            docheckgroups(\@body, $newsgrouppats, $log, $sender);
         }
     }
 }

Modified: control/modules/ihave.pl
===================================================================
--- control/modules/ihave.pl	2009-01-09 19:35:11 UTC (rev 8280)
+++ control/modules/ihave.pl	2009-01-10 11:52:16 UTC (rev 8281)
@@ -19,15 +19,16 @@
 
 sub control_ihave {
     my ($par, $sender, $replyto, $site, $action, $log, $approved,
-        $headers, $body) = @_;
+        $article) = @_;
+    my @body = split(/\r?\n/, $article->stringify_body);
 
     if ($action eq 'mail') {
         my $mail = sendmail("ihave by $sender");
-        print $mail map { s/^~/~~/; "$_\n" } @$body;
+        print $mail map { s/^~/~~/; "$_\n" } @body;
         close $mail or logdie('Cannot send mail: ' . $!);
     } elsif ($action eq 'log') {
         if ($log) {
-            logger($log, "ihave $sender", $headers, $body);
+            logger($log, "ihave $sender", $article);
         } else {
             logmsg("ihave $sender");
         }
@@ -35,7 +36,7 @@
         my $tempfile = "$INN::Config::tmpdir/ihave.$$";
         open(GREPHIST, "| $INN::Config::newsbin/grephistory -i > $tempfile")
             or logdie('Cannot run grephistory: ' . $!);
-	foreach (@$body) {
+	foreach (@body) {
             print GREPHIST "$_\n";
         }
         close GREPHIST;

Modified: control/modules/newgroup.pl
===================================================================
--- control/modules/newgroup.pl	2009-01-09 19:35:11 UTC (rev 8280)
+++ control/modules/newgroup.pl	2009-01-10 11:52:16 UTC (rev 8281)
@@ -19,9 +19,37 @@
 
 sub control_newgroup {
     my ($par, $sender, $replyto, $site, $action, $log, $approved,
-        $headers, $body) = @_;
+        $article) = @_;
     my ($groupname, $modflag) = @$par;
 
+    my $head = $article->head;
+    my @headers = split(/\r?\n/, $head->stringify);
+    my @fullbody = split(/\r?\n/, $article->stringify_body);
+    my (@body, $part, $part_head);
+    my $mimegroupinfo = 0;
+
+    # Check if it is a multipart message.  The body is restricted to
+    # the application/news-groupinfo part, if any.
+    if ($article->parts > 0) {
+        foreach $part ($article->parts) {
+            $part_head = $part->head;
+
+            if ($part_head->mime_type eq 'application/news-groupinfo') {
+                @body = split(/\r?\n/, $part->stringify_body);
+                $mimegroupinfo = 1;
+            }
+        }
+    }
+
+    # The newgroup control message can be an application/news-groupinfo
+    # entity itself.
+    if ($head->mime_type eq 'application/news-groupinfo') {
+        @body = @fullbody;
+        $mimegroupinfo = 1;
+    }
+
+    @body = @fullbody if not $mimegroupinfo;
+
     $modflag ||= '';
     my $modcmd = $modflag eq 'moderated' ? 'm' : 'y';
 
@@ -31,7 +59,7 @@
         $errmsg = checkgroupname($groupname) if $errmsg eq 'DONE';
 
         if ($log) {
-            logger($log, "skipping newgroup ($errmsg)", $headers, $body);
+            logger($log, "skipping newgroup ($errmsg)", $article);
         } else {
             logmsg("skipping newgroup ($errmsg)");
         }
@@ -57,7 +85,9 @@
     # If there is a tag line, search whether the description has changed.
     my $found = 0;
     my $ngline = '';
-    foreach (@$body) {
+    foreach (@body) {
+        $found = 1 if (($mimegroupinfo)
+                       and ($_ !~ /^For your newsgroups file:\s*$/));
         if ($found) {
             # It is the line which contains the description.
             $ngline = $_;
@@ -118,14 +148,14 @@
 The control message follows:
 
 END
-        print $mail map { s/^~/~~/; "$_\n" } @$headers;
+        print $mail map { s/^~/~~/; "$_\n" } @headers;
         print $mail "\n";
-        print $mail map { s/^~/~~/; "$_\n" } @$body;
+        print $mail map { s/^~/~~/; "$_\n" } @fullbody;
         close $mail or logdie("Cannot send mail: $!");
     } elsif ($action eq 'log') {
         if ($log) {
             logger($log, "skipping newgroup $groupname $modcmd"
-                . " $sender (would $status)", $headers, $body);
+                . " $sender (would $status)", $article);
         } else {
             logmsg("skipping newgroup $groupname $modcmd $sender"
                 . " (would $status)");
@@ -142,7 +172,7 @@
 
         if ($log) {
             logger($log, "newgroup $groupname $modcmd $status $sender",
-                   $headers, $body) if ($log ne 'mail' or $status ne 'no change');
+                   $article) if ($log ne 'mail' or $status ne 'no change');
         }
     }
     return;

Modified: control/modules/rmgroup.pl
===================================================================
--- control/modules/rmgroup.pl	2009-01-09 19:35:11 UTC (rev 8280)
+++ control/modules/rmgroup.pl	2009-01-10 11:52:16 UTC (rev 8281)
@@ -19,9 +19,13 @@
 
 sub control_rmgroup {
     my ($par, $sender, $replyto, $site, $action, $log, $approved,
-        $headers, $body) = @_;
+        $article) = @_;
     my ($groupname) = @$par;
 
+    my $head = $article->head;
+    my @headers = split(/\r?\n/, $head->stringify);
+    my @body = split(/\r?\n/, $article->stringify_body);
+
     # Scan active to see what sort of change we are making.
     open(ACTIVE, $INN::Config::active) or logdie("Cannot open $INN::Config::active: $!");
     my @oldgroup;
@@ -55,14 +59,14 @@
 The control message follows:
 
 END
-        print $mail map { s/^~/~~/; "$_\n" } @$headers;
+        print $mail map { s/^~/~~/; "$_\n" } @headers;
         print $mail "\n";
-        print $mail map { s/^~/~~/; "$_\n" } @$body;
+        print $mail map { s/^~/~~/; "$_\n" } @body;
         close $mail or logdie("Cannot send mail: $!");
     } elsif ($action eq 'log') {
         if ($log) {
             logger($log, "skipping rmgroup $groupname"
-                . " $sender (would be $status)", $headers, $body);
+                . " $sender (would be $status)", $article);
         } else {
             logmsg("skipping rmgroup $groupname $sender (would be $status)");
         }
@@ -84,7 +88,7 @@
         unlink "$INN::Config::locks/LOCK.newsgroups";
         unlink $tempfile;
 
-        logger($log, "rmgroup $groupname $status $sender", $headers, $body)
+        logger($log, "rmgroup $groupname $status $sender", $article)
             if $log;
     }
 }

Modified: control/modules/sendme.pl
===================================================================
--- control/modules/sendme.pl	2009-01-09 19:35:11 UTC (rev 8280)
+++ control/modules/sendme.pl	2009-01-10 11:52:16 UTC (rev 8281)
@@ -19,15 +19,17 @@
 
 sub control_sendme {
     my ($par, $sender, $replyto, $site, $action, $log, $approved,
-        $headers, $body) = @_;
+        $article) = @_;
 
+    my @body = split(/\r?\n/, $article->stringify_body);
+
     if ($action eq 'mail') {
         my $mail = sendmail("sendme by $sender");
-        print $mail map { s/^~/~~/; "$_\n" } @$body;
+        print $mail map { s/^~/~~/; "$_\n" } @body;
         close $mail or logdie('Cannot send mail: ' . $!);
     } elsif ($action eq 'log') {
         if ($log) {
-            logger($log, "sendme $sender", $headers, $body);
+            logger($log, "sendme $sender", $article);
         } else {
             logmsg("sendme from $sender");
         }
@@ -35,7 +37,7 @@
         my $tempfile = "$INN::Config::tmpdir/sendme.$$";
         open(GREPHIST, "| $INN::Config::newsbin/grephistory -s > $tempfile")
             or logdie("Cannot run grephistory: $!");
-	foreach (@$body) {
+	foreach (@body) {
             print GREPHIST "$_\n";
 	}
         close GREPHIST or logdie("Cannot run grephistory: $!");

Modified: control/modules/sendsys.pl
===================================================================
--- control/modules/sendsys.pl	2009-01-09 19:35:11 UTC (rev 8280)
+++ control/modules/sendsys.pl	2009-01-10 11:52:16 UTC (rev 8281)
@@ -19,9 +19,13 @@
 
 sub control_sendsys {
     my ($par, $sender, $replyto, $site, $action, $log, $approved,
-        $headers, $body) = @_;
+        $article) = @_;
     my ($where) = @$par;
 
+    my $head = $article->head;
+    my @headers = split(/\r?\n/, $head->stringify);
+    my @body = split(/\r?\n/, $article->stringify_body);
+
     if ($action eq 'mail') {
         my $mail = sendmail("sendsys $sender");
         print $mail <<END;
@@ -34,13 +38,13 @@
 The control message follows:
 
 END
-        print $mail map { s/^~/~~/; "$_\n" } @$headers;
+        print $mail map { s/^~/~~/; "$_\n" } @headers;
         print $mail "\n";
-        print $mail map { s/^~/~~/; "$_\n" } @$body;
+        print $mail map { s/^~/~~/; "$_\n" } @body;
         close $mail or logdie("Cannot send mail: $!");
     } elsif ($action eq 'log') {
         if ($log) {
-            logger($log, "sendsys $sender", $headers, $body);
+            logger($log, "sendsys $sender", $article);
         } else {
             logmsg("sendsys $sender");
         }
@@ -57,7 +61,7 @@
         close NEWSFEEDS;
         close $mail or logdie("Cannot send mail: $!");
 
-        logger($log, "sendsys $sender to $replyto", $headers, $body) if $log;
+        logger($log, "sendsys $sender to $replyto", $article) if $log;
     }
 }
 

Modified: control/modules/senduuname.pl
===================================================================
--- control/modules/senduuname.pl	2009-01-09 19:35:11 UTC (rev 8280)
+++ control/modules/senduuname.pl	2009-01-10 11:52:16 UTC (rev 8281)
@@ -19,9 +19,13 @@
 
 sub control_senduuname {
     my ($par, $sender, $replyto, $site, $action, $log, $approved,
-        $headers, $body) = @_;
+        $article) = @_;
     my ($where) = @$par;
 
+    my $head = $article->head;
+    my @headers = split(/\r?\n/, $head->stringify);
+    my @body = split(/\r?\n/, $article->stringify_body);
+
     if ($action eq 'mail') {
         my $mail = sendmail("senduuname $sender");
         print $mail <<END;
@@ -33,13 +37,13 @@
 The control message follows:
 
 END
-        print $mail map { s/^~/~~/; "$_\n" } @$headers;
+        print $mail map { s/^~/~~/; "$_\n" } @headers;
         print $mail "\n";
-        print $mail map { s/^~/~~/; "$_\n" } @$body;
+        print $mail map { s/^~/~~/; "$_\n" } @body;
         close $mail or logdie("Cannot send mail: $!");
     } elsif ($action eq 'log') {
         if ($log) {
-            logger($log, "senduuname $sender", $headers, $body);
+            logger($log, "senduuname $sender", $article);
         } else {
             logmsg("senduuname $sender");
         }
@@ -54,7 +58,7 @@
         close UUNAME or logdie("Cannot run uuname: $!");
         close $mail or logdie("Cannot send mail: $!");
 
-        logger($log, "senduuname $sender to $replyto", $headers, $body) if $log;
+        logger($log, "senduuname $sender to $replyto", $article) if $log;
     }
 }
 

Modified: control/modules/version.pl
===================================================================
--- control/modules/version.pl	2009-01-09 19:35:11 UTC (rev 8280)
+++ control/modules/version.pl	2009-01-10 11:52:16 UTC (rev 8281)
@@ -19,9 +19,13 @@
 
 sub control_version {
     my ($par, $sender, $replyto, $site, $action, $log, $approved,
-        $headers, $body) = @_;
+        $article) = @_;
     my ($where) = @$par;
 
+    my $head = $article->head;
+    my @headers = split(/\r?\n/, $head->stringify);
+    my @body = split(/\r?\n/, $article->stringify_body);
+
     my $version = $INN::Config::version || '(unknown version)';
 
     if ($action eq 'mail') {
@@ -36,13 +40,13 @@
 The control message follows:
 
 END
-        print $mail map { s/^~/~~/; "$_\n" } @$headers;
+        print $mail map { s/^~/~~/; "$_\n" } @headers;
         print $mail "\n";
-        print $mail map { s/^~/~~/; "$_\n" } @$body;
+        print $mail map { s/^~/~~/; "$_\n" } @body;
         close $mail or logdie("Cannot send mail: $!");
     } elsif ($action eq 'log') {
         if ($log) {
-            logger($log, "version $sender", $headers, $body);
+            logger($log, "version $sender", $article);
         } else {
             logmsg("version $sender");
         }
@@ -54,7 +58,7 @@
         sendmail("version reply from $INN::Config::pathhost", $replyto,
             [ "InterNetNews $version\n" ]);
 
-        logger($log, "version $sender to $replyto", $headers, $body) if $log;
+        logger($log, "version $sender to $replyto", $article) if $log;
     }
 }
 

Modified: doc/pod/install.pod
===================================================================
--- doc/pod/install.pod	2009-01-09 19:35:11 UTC (rev 8280)
+++ doc/pod/install.pod	2009-01-10 11:52:16 UTC (rev 8281)
@@ -87,8 +87,12 @@
 
 =item *
 
-INN requires at least S<B<Perl 5.004_03>> to build and to run several
-subsystems.  INN is tested primarily with newer versions of Perl, so it's
+INN requires at least S<B<Perl 5.8.0>> to build and to run several
+subsystems.  In order to process control messages, B<controlchan> needs
+the C<MIME::Parser> module available from CPAN (C<MIME-tools>
+in F<modules/by-module/MIME/>, for instance on L<ftp://ftp.perl.org/>).  This
+Perl module has probably already been packaged for your distribution.
+INN is tested primarily with newer versions of Perl, so it's
 generally recommended that you install the latest stable distribution of
 Perl before compiling INN.  For instructions on obtaining and installing
 Perl, see L<http://www.perl.com/pub/language/info/software.html>.  Note
@@ -149,7 +153,7 @@
 of configure options enabling optional features and the software and
 versions you'll need:
 
-    --with-perl         Perl 5.004_03 or higher, 5.6.1+ recommended
+    --with-perl         Perl 5.004_03 or higher, 5.8.0+ recommended
     --with-python       Python 1.5.2 or higher
     --with-berkeleydb   Berkeley DB 4.4 or higher
     --with-zlib         zlib 1.x or higher

Modified: doc/pod/news.pod
===================================================================
--- doc/pod/news.pod	2009-01-09 19:35:11 UTC (rev 8280)
+++ doc/pod/news.pod	2009-01-10 11:52:16 UTC (rev 8281)
@@ -2,6 +2,12 @@
 
 The following upgrade process is still under construction and not complete.
 
+In order to process control messages which contain an application/news-groupinfo
+entity as described in USEPRO, B<controlchan> needs the C<MIME::Parser> module.
+It is available from CPAN (C<MIME-tools> in F<modules/by-module/MIME/>,
+for instance on ftp.perl.org).  You can also use the one provided with your
+distribution, has it already been packaged for it.
+
 =over 2
 
 =item *




More information about the inn-committers mailing list