Package: sasl2-bin
Version: 2.1.25.dfsg1-6
Severity: normal
Tags: patch

Hi,

I use auth_rimap with Perdition and Dovecot.

When auth_rimap close the connection with the IMAP server, no
LOGOUT are sent.

In Dovecot, you can specify a maximum number of IMAP
connections allowed for a user from each IP address.

Without LOGOUT, auth_rimap is easily blacklisted by Dovecot,
and the user can't authenticate anymore.

This patch make auth_rimap send a LOGOUT before closing
the connection.

-- System Information:
Debian Release: 7.0
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: i386 (x86_64)

Kernel: Linux 3.2.0-4-amd64 (SMP w/1 CPU core)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages sasl2-bin depends on:
ii  db-util                5.1.6
ii  debconf [debconf-2.0]  1.5.49
ii  libc6                  2.13-38
ii  libcomerr2             1.42.5-1.1
ii  libdb5.1               5.1.29-5
ii  libgssapi-krb5-2       1.10.1+dfsg-5
ii  libk5crypto3           1.10.1+dfsg-5
ii  libkrb5-3              1.10.1+dfsg-5
ii  libldap-2.4-2          2.4.31-1+nmu2
ii  libpam0g               1.1.3-7.1
ii  libsasl2-2             2.1.25.dfsg1-6
ii  libssl1.0.0            1.0.1e-2
ii  lsb-base               4.1+Debian8

sasl2-bin recommends no packages.

sasl2-bin suggests no packages.

-- Configuration Files:
/etc/default/saslauthd changed [not included]
--- cyrus-sasl2-2.1.25.dfsg1.orig/saslauthd/auth_rimap.c
+++ cyrus-sasl2-2.1.25.dfsg1/saslauthd/auth_rimap.c
@@ -90,6 +90,7 @@ static struct addrinfo *ai = NULL;	/* re
 					   service we connect to.	 */
 #define TAG "saslauthd"			/* IMAP command tag */
 #define LOGIN_CMD (TAG " LOGIN ")	/* IMAP login command (with tag) */
+#define LOGOUT_CMD (TAG " LOGOUT ")	/* IMAP logout command (with tag)*/
 #define NETWORK_IO_TIMEOUT 30		/* network I/O timeout (seconds) */
 #define RESP_LEN 1000			/* size of read response buffer  */
 
@@ -307,10 +308,12 @@ auth_rimap (
     int	s=-1;				/* socket to remote auth host   */
     struct addrinfo *r;			/* remote socket address info   */
     struct iovec iov[5];		/* for sending LOGIN command    */
+    struct iovec iov2[1];               /* for sending LOGOUT command   */
     char *qlogin;			/* pointer to "quoted" login    */
     char *qpass;			/* pointer to "quoted" password */
     char *c;				/* scratch pointer              */
     int rc;				/* return code scratch area     */
+    int rcl;				/* return code scratch area     */
     char rbuf[RESP_LEN];		/* response read buffer         */
     char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
     int saved_errno;
@@ -505,6 +508,24 @@ auth_rimap (
            }
         }
     }
+
+    /* close remote imap */
+    iov2[0].iov_base = LOGOUT_CMD;
+    iov2[0].iov_len  = sizeof(LOGOUT_CMD) - 1;
+    iov2[1].iov_base = "\r\n";
+    iov2[1].iov_len  = sizeof("\r\n") - 1;
+
+    if (flags & VERBOSE) {
+        syslog(LOG_DEBUG, "auth_rimap: sending %s%s %s",
+               LOGOUT_CMD, qlogin, qpass);
+    }
+    alarm(NETWORK_IO_TIMEOUT);
+    rcl = retry_writev(s, iov2, 2);
+    alarm(0);
+    if (rcl == -1) {
+        syslog(LOG_WARNING, "auth_rimap: writev logout: %m");
+    }
+
     (void) close(s);			/* we're done with the remote */
     if (rc == -1) {
 	syslog(LOG_WARNING, "auth_rimap: read (response): %m");

Reply via email to