about summary refs log tree commit homepage
path: root/lib/PublicInbox/NNTP.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/NNTP.pm')
-rw-r--r--lib/PublicInbox/NNTP.pm26
1 files changed, 20 insertions, 6 deletions
diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm
index 26bc679f..d106e315 100644
--- a/lib/PublicInbox/NNTP.pm
+++ b/lib/PublicInbox/NNTP.pm
@@ -31,9 +31,14 @@ my @OVERVIEW = qw(Subject From Date Message-ID References Xref);
 my $OVERVIEW_FMT = join(":\r\n", @OVERVIEW, qw(Bytes Lines)) . ":\r\n";
 my $LIST_HEADERS = join("\r\n", @OVERVIEW,
                         qw(:bytes :lines Xref To Cc)) . "\r\n";
-
-# disable commands with easy DoS potential:
-my %DISABLED; # = map { $_ => 1 } qw(xover list_overview_fmt newnews xhdr);
+my $CAPABILITIES = <<"";
+101 Capability list:\r
+VERSION 2\r
+READER\r
+NEWNEWS\r
+LIST ACTIVE ACTIVE.TIMES NEWSGROUPS OVERVIEW.FMT\r
+HDR\r
+OVER\r
 
 my $EXPMAP; # fd -> [ idle_time, $self ]
 my $expt;
@@ -105,10 +110,9 @@ sub process_line ($$) {
         my ($self, $l) = @_;
         my ($req, @args) = split(/[ \t]/, $l);
         return 1 unless defined($req); # skip blank line
-        $req = lc($req);
         $req = eval {
                 no strict 'refs';
-                $req = $DISABLED{$req} ? undef : *{'cmd_'.$req}{CODE};
+                *{'cmd_'.lc($req)}{CODE};
         };
         return res($self, '500 command not recognized') unless $req;
         return res($self, r501) unless args_ok($req, scalar @args);
@@ -125,6 +129,17 @@ sub process_line ($$) {
         res($self, $res);
 }
 
+# The keyword argument is not used (rfc3977 5.2.2)
+sub cmd_capabilities ($;$) {
+        my ($self, undef) = @_;
+        my $res = $CAPABILITIES;
+        if (ref($self->{sock}) ne 'IO::Socket::SSL' &&
+                        $self->{nntpd}->{accept_tls}) {
+                $res .= "STARTTLS\r\n";
+        }
+        $res .= '.';
+}
+
 sub cmd_mode ($$) {
         my ($self, $arg) = @_;
         $arg = uc $arg;
@@ -187,7 +202,6 @@ sub cmd_list ($;$$) {
                 my $arg = shift @args;
                 $arg =~ tr/A-Z./a-z_/;
                 $arg = "list_$arg";
-                return r501 if $DISABLED{$arg};
 
                 $arg = eval {
                         no strict 'refs';