diff options
author | Steffen Ullrich <Steffen_Ullrich@genua.de> | 2014-06-26 21:33:28 +0200 |
---|---|---|
committer | Steffen Ullrich <Steffen_Ullrich@genua.de> | 2014-06-26 21:33:28 +0200 |
commit | 3a57ec7b3ea8b3b3dcf433bd2bcb6ecc93fc297b (patch) | |
tree | b88ea102b024a637f79d82fa779932e9759b25e1 /lib/Net/NNTP.pm | |
parent | ef6f54955527c2ad62c6944e459c61937c2aa768 (diff) | |
download | perl-libnet-3a57ec7b3ea8b3b3dcf433bd2bcb6ecc93fc297b.tar.gz |
IPv6 and SSL support for Net::NNTP
Diffstat (limited to 'lib/Net/NNTP.pm')
-rw-r--r-- | lib/Net/NNTP.pm | 76 |
1 files changed, 74 insertions, 2 deletions
diff --git a/lib/Net/NNTP.pm b/lib/Net/NNTP.pm index 790b6db..47c4456 100644 --- a/lib/Net/NNTP.pm +++ b/lib/Net/NNTP.pm @@ -21,7 +21,31 @@ use Net::Config; use Time::Local; our $VERSION = "2.27"; -our @ISA = qw(Net::Cmd IO::Socket::INET); + +# Code for detecting if we can use SSL +my $ssl_class = eval { + require IO::Socket::SSL; + # first version with default CA on most platforms + IO::Socket::SSL->VERSION(1.994); +} && 'IO::Socket::SSL'; + +my $nossl_warn = !$ssl_class && + 'To use SSL please install IO::Socket::SSL with version>=1.994'; + +# Code for detecting if we can use IPv6 +my $inet6_class = eval { + require IO::Socket::IP; + IO::Socket::IP->VERSION(0.20); +} && 'IO::Socket::IP' || eval { + require IO::Socket::INET6; + IO::Socket::INET6->VERSION(2.62); +} && 'IO::Socket::INET6'; + +sub can_ssl { $ssl_class }; +sub can_inet6 { $inet6_class }; + +our @ISA = ('Net::Cmd', $ssl_class || $inet6_class || 'IO::Socket::INET'); + sub new { my $self = shift; @@ -45,6 +69,21 @@ sub new { unless @{$hosts}; my %connect = ( Proto => 'tcp'); + + if ($ssl_class) { + $connect{SSL_verifycn_scheme} = 'nntp'; + $connect{$_} = $arg{$_} for(grep { m{^SSL_} } keys %arg); + if ($arg{SSL}) { + # SSL from start + $arg{Port} ||= 563; + } else { + # upgrade later with STARTTLS + $connect{SSL_startHandshake} = 0; + } + } elsif ($arg{SSL}) { + die $nossl_warn; + } + foreach my $o (qw(LocalAddr Timeout)) { $connect{$o} = $arg{$o} if exists $arg{$o}; } @@ -52,6 +91,7 @@ sub new { $connect{PeerPort} = $arg{Port} || 'nntp(119)'; foreach my $h (@{$hosts}) { $connect{PeerAddr} = $h; + $connect{SSL_verifycn_name} = $arg{SSL_verifycn_name} || $h if $ssl_class; $obj = $type->SUPER::new(%connect) and last; } @@ -122,6 +162,15 @@ sub postok { } +sub starttls { + my $self = shift; + $ssl_class or die $nossl_warn; + $self->is_SSL and croak("NNTP connection is already in SSL mode"); + $self->_STARTTLS or return; + $self->connect_SSL; +} + + sub article { @_ >= 1 && @_ <= 3 or croak 'usage: $nntp->article( [ MSGID ], [ FH ] )'; my $nntp = shift; @@ -675,6 +724,7 @@ sub _NEXT { shift->command('NEXT')->response == CMD_OK } sub _POST { shift->command('POST', @_)->response == CMD_MORE } sub _QUIT { shift->command('QUIT', @_)->response == CMD_OK } sub _SLAVE { shift->command('SLAVE', @_)->response == CMD_OK } +sub _STARTTLS { shift->command("STARTTLS")->response() == CMD_MORE } sub _STAT { shift->command('STAT', @_)->response == CMD_OK } sub _MODE { shift->command('MODE', @_)->response == CMD_OK } sub _XGTITLE { shift->command('XGTITLE', @_)->response == CMD_OK } @@ -713,10 +763,18 @@ Net::NNTP - NNTP Client class $nntp = Net::NNTP->new("some.host.name"); $nntp->quit; + # start with SSL, e.g. nntps + $nntp = Net::NNTP->new("some.host.name", SSL => 1); + + # start with plain and upgrade to SSL + $nntp = Net::NNTP->new("some.host.name"); + $nntp->starttls; + + =head1 DESCRIPTION C<Net::NNTP> is a class implementing a simple NNTP client in Perl as described -in RFC977. +in RFC977 and RFC4642. The Net::NNTP class is a subclass of Net::Cmd and IO::Socket::INET. @@ -741,6 +799,14 @@ the C<PeerAddr> option in L<IO::Socket::INET>, or a reference to an array with hosts to try in turn. The L</host> method will return the value which was used to connect to the host. +B<Port> - port to connect to. +Default - 119 for plain NNTP and 563 for immediate SSL (nntps). + +B<SSL> - If the connection should be done from start with SSL, contrary to later +upgrade with C<starttls>. +You can use SSL arguments as documented in L<IO::Socket::SSL>, but it will +usually use the right arguments already. + B<Timeout> - Maximum time, in seconds, to wait for a response from the NNTP server, a value of zero will cause all IO operations to block. (default: 120) @@ -778,6 +844,11 @@ documented here. Returns the value used by the constructor, and passed to IO::Socket::INET, to connect to the host. +=item starttls () + +Upgrade existing plain connection to SSL. +Any arguments necessary for SSL must be given in C<new> already. + =item article ( [ MSGID|MSGNUM ], [FH] ) Retrieve the header, a blank line, then the body (text) of the @@ -1164,6 +1235,7 @@ with a and ends with d. =head1 SEE ALSO L<Net::Cmd> +L<IO::Socket::SSL> =head1 AUTHOR |