[svn:qpsmtpd] r624 - in branches/0.3x: . plugins

[email protected] Tue, 28 Feb 2006 13:10:13 -0800 (PST)
Newsgroups perl.cvs.qpsmtpd
Message-ID <[email protected]>
Author: jpeacock
Date: Tue Feb 28 13:10:11 2006
New Revision: 624

Modified:
   branches/0.3x/plugins/tls
   branches/0.3x/qpsmtpd-forkserver

Log:
Implement multiple IP:PORT listen in forkserver (Devin Carraway).
Add support in plugins/tls to use SMTPS (John Peacock).

Modified: branches/0.3x/plugins/tls
==============================================================================
--- branches/0.3x/plugins/tls	(original)
+++ branches/0.3x/plugins/tls	Tue Feb 28 13:10:11 2006
@@ -93,6 +93,33 @@
     # OK, now we setup TLS
     $self->qp->respond (220, "Go ahead with TLS");
     
+    unless ( _convert_to_ssl($self) ) {
+        # SSL setup failed. Now we must respond to every command with 5XX
+        warn("TLS failed: $@\n");
+        $transaction->notes('ssl_failed', 1);
+        return DENY, "TLS Negotiation Failed";
+    }
+    
+    $self->log(LOGWARN, "TLS setup returning");
+    return DONE;
+}
+
+sub hook_connect {
+    my ($self, $transaction) = @_;
+
+    my $local_port = $self->qp->connection->local_port;
+    return DECLINED unless $local_port == 465; # SMTPS
+    
+    unless ( _convert_to_ssl($self) ) {
+	return (DENY_DISCONNECT, "Cannot establish SSL session");
+    }
+    $self->log(LOGWARN, "Connected via SMTPS");
+    return DECLINED;
+}
+
+sub _convert_to_ssl {
+    my ($self) = @_;
+
     eval {
         my $tlssocket = IO::Socket::SSL->new_from_fd(
             fileno(STDIN), '+>',
@@ -112,14 +139,11 @@
         $self->connection->notes('tls_enabled', 1);
     };
     if ($@) {
-        # SSL setup failed. Now we must respond to every command with 5XX
-        warn("TLS failed: $@\n");
-        $transaction->notes('ssl_failed', 1);
-        return DENY, "TLS Negotiation Failed";
+	return 0;
+    }
+    else {
+	return 1;
     }
-    
-    $self->log(LOGWARN, "TLS setup returning");
-    return DONE;
 }
 
 sub can_do_tls {

Modified: branches/0.3x/qpsmtpd-forkserver
==============================================================================
--- branches/0.3x/qpsmtpd-forkserver	(original)
+++ branches/0.3x/qpsmtpd-forkserver	Tue Feb 28 13:10:11 2006
@@ -56,8 +56,8 @@
 if ($PORT =~ /^(\d+)$/) { $PORT = $1 } else { &usage }
 @LOCALADDR = ( '0.0.0.0' ) if !@LOCALADDR;
 for (0..$#LOCALADDR) {
-  if ($LOCALADDR[$_] =~ /^([\d\w\-.]+)$/) {
-    $LOCALADDR[$_] = $1;
+  if ($LOCALADDR[$_] =~ /^([\d\w\-.]+)(?::(\d+))?$/) {
+    $LOCALADDR[$_] = { 'addr' => $1, 'port' => $2 || $PORT };
   } else {
     &usage;
   }
@@ -94,13 +94,13 @@
 
 # establish SERVER socket(s), bind and listen.
 for my $listen_addr (@LOCALADDR) {
-  my $server = IO::Socket::INET->new(LocalPort => $PORT,
-                                     LocalAddr => $listen_addr,
+  my $server = IO::Socket::INET->new(LocalPort => $listen_addr->{'port'},
+                                     LocalAddr => $listen_addr->{'addr'},
                                      Proto     => 'tcp',
                                      Reuse     => 1,
                                      Blocking  => 0,
                                      Listen    => SOMAXCONN )
-    or die "Creating TCP socket $listen_addr:$PORT: $!\n";
+    or die "Creating TCP socket $listen_addr->{'addr'}:$listen_addr->{'port'}: $!\n";
   IO::Handle::blocking($server, 0);
   $select->add($server);
 }
@@ -149,7 +149,9 @@
 
 $qpsmtpd->load_plugins;
 
-::log(LOGINFO,"Listening on port $PORT");
+foreach my $local_addr ( @LOCALADDR ) {
+    ::log(LOGINFO,"Listening on $local_addr->{'addr'}:$local_addr->{'port'}");
+}
 ::log(LOGINFO, 'Running as user '.
 	(getpwuid($>) || $>) .
 	', group '.