[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 '.