On 4-Oct-07, at 1:00 PM, Chris Lewis wrote:
Chris Lewis wrote:
Any idea why I'd be getting these:
_convert_to_ssl failed (Could not create SSL socket: Socket
operation on non-socket at ./plugins/tls line 158
[At end of _convert_to_ssl(), I'm logging $@ if it's non-null]
I've confirmed, this is only happening in qpsmtpd-async. It works
fine in forkservers.
Hey Matt! ;-)
Yeah, plugins/tls wasn't written for -async... Try this patch:
Index: plugins/tls
===================================================================
--- plugins/tls (revision 805)
+++ plugins/tls (working copy)
@@ -150,7 +150,7 @@
return DECLINED unless $local_port == 465; # SMTPS
unless ( _convert_to_ssl($self) ) {
- return (DENY_DISCONNECT, "Cannot establish SSL session");
+ return (DENY_DISCONNECT, "Cannot establish SSL session");
}
$self->log(LOGWARN, "Connected via SMTPS");
return DECLINED;
@@ -159,6 +159,10 @@
sub _convert_to_ssl {
my ($self) = @_;
+ if ($self->qp->isa('Qpsmtpd::PollServer')) {
+ return _convert_to_ssl_async($self);
+ }
+
eval {
my $tlssocket = IO::Socket::SSL->new_from_fd(
fileno(STDIN), '+>',
@@ -178,13 +182,44 @@
$self->connection->notes('tls_enabled', 1);
};
if ($@) {
- return 0;
+ return 0;
}
else {
- return 1;
+ return 1;
}
}
+sub _convert_to_ssl_async {
+ my ($self) = @_;
+
+ eval {
+ my $tlssocket = IO::Socket::SSL->new_from_fd(
+ fileno($self->qp->sock), '+>',
+ SSL_use_cert => 1,
+ SSL_cert_file => $self->tls_cert,
+ SSL_key_file => $self->tls_key,
+ SSL_ca_file => $self->tls_ca,
+ SSL_cipher_list => $self->tls_ciphers,
+ SSL_server => 1,
+ SSL_reuse_ctx => $self->ssl_context,
+ ) or die "Could not create SSL socket: $!";
+
+ # Clone connection object (without data received from client)
+ $self->qp->connection($self->connection->clone());
+ $self->qp->reset_transaction;
+ $self->qp->{sock} = $self->connection->notes('tls_socket',
$tlssocket);
+ $self->qp->{fd} = fileno($tlssocket);
+ $self->qp->watch_read();
+ $self->connection->notes('tls_enabled', 1);
+ };
+ if ($@) {
+ return 0;
+ }
+ else {
+ return 1;
+ }
+}
+
sub can_do_tls {
my ($self) = @_;
$self->tls_cert && -r $self->tls_cert;
______________________________________________________________________
This email has been scanned by the MessageLabs Email Security System.
For more information please visit http://www.messagelabs.com/email
______________________________________________________________________