[Pkg-cyrus-sasl2-commits] [cyrus-sasl2] 02/03: Add patch to fix login to dovecot imapd 2.x (Closes: #715040)
Ondrej Sury
ondrej at moszumanska.debian.org
Thu Oct 23 10:03:24 UTC 2014
This is an automated email from the git hooks/post-receive script.
ondrej pushed a commit to branch master
in repository cyrus-sasl2.
commit 88958ace71de26b0c20e488f66515cbe983a55b3
Author: Ondřej Surý <ondrej at sury.org>
Date: Fri Oct 17 14:41:02 2014 +0200
Add patch to fix login to dovecot imapd 2.x (Closes: #715040)
---
debian/patches/bug715040.patch | 176 +++++++++++++++++++++++++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 177 insertions(+)
diff --git a/debian/patches/bug715040.patch b/debian/patches/bug715040.patch
new file mode 100644
index 0000000..596af0a
--- /dev/null
+++ b/debian/patches/bug715040.patch
@@ -0,0 +1,176 @@
+From 98b21c0aa01d4ef1e05158a79dc3e291e53bee81 Mon Sep 17 00:00:00 2001
+From: Sebastian Pipping <sebastian at pipping.org>
+Date: Fri, 5 Jul 2013 18:34:50 +0200
+Subject: [PATCH] 2.1.26: Allow "* CAPABILITY" lines in IMAP login reply (v4)
+
+---
+ saslauthd/auth_rimap.c | 125 +++++++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 111 insertions(+), 14 deletions(-)
+
+--- cyrus-sasl2.orig/saslauthd/auth_rimap.c
++++ cyrus-sasl2/saslauthd/auth_rimap.c
+@@ -3,6 +3,7 @@
+
+ /* COPYRIGHT
+ * Copyright (c) 1998 Messaging Direct Ltd.
++ * Copyright (c) 2013 Sebastian Pipping <sebastian at pipping.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+@@ -91,6 +92,9 @@ static struct addrinfo *ai = NULL; /* re
+ #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 LOGIN_REPLY_GOOD (TAG " OK") /* Expected IMAP login reply, good edition (with tag) */
++#define LOGIN_REPLY_BAD (TAG " NO") /* Expected IMAP login reply, bad edition (with tag) */
++#define LOGIN_REPLY_CAP "* CAPABILITY" /* Expected IMAP login reply, capabilities edition */
+ #define NETWORK_IO_TIMEOUT 30 /* network I/O timeout (seconds) */
+ #define RESP_LEN 1000 /* size of read response buffer */
+
+@@ -278,6 +282,109 @@ auth_rimap_init (
+
+ /* END FUNCTION: auth_rimap_init */
+
++typedef enum _t_login_status {
++ LOGIN_STATUS_UNKNOWN,
++
++ LOGIN_STATUS_ACCEPTED,
++ LOGIN_STATUS_REJECTED,
++ LOGIN_STATUS_MALFORMED
++} t_login_status;
++
++/* FUNCTION: warn_malformed_imap_login_reply */
++void
++warn_malformed_imap_login_reply(
++ /* PARAMETERS */
++ const char * server_reply /* I: plaintext server reply */
++ /* END PARAMETERS */
++ )
++{
++ syslog(LOG_WARNING, "auth_rimap: unexpected response to auth request: %s", server_reply);
++}
++
++/* END FUNCTION: warn_malformed_imap_login_reply */
++
++/* FUNCTION: process_login_reply */
++
++/* SYNOPSIS
++ * Classify IMAP server reply into accepted, rejected or malformed.
++ * END SYNOPSIS */
++
++t_login_status
++process_login_reply(
++ /* PARAMETERS */
++ char * server_reply, /* I/O: plaintext server reply */
++ const char * login /* I : plaintext authenticator */
++ /* END PARAMETERS */
++ )
++{
++ /* VARIABLES */
++ t_login_status res = LOGIN_STATUS_UNKNOWN;
++ char * line_first = server_reply;
++ char * line_after_last;
++ /* END VARIABLES */
++
++ for (;;) {
++ /* find line boundary */
++ line_after_last = strpbrk(line_first, "\x0a\x0d");
++ if (line_after_last == NULL) {
++ warn_malformed_imap_login_reply(line_first);
++ return LOGIN_STATUS_MALFORMED;
++ }
++
++ /* handle single line */
++ {
++ /* terminate line (reverted later) */
++ const char backup = line_after_last[0];
++ line_after_last[0] = '\0';
++
++ /* classify current line */
++ if (strncmp(line_first, LOGIN_REPLY_GOOD, sizeof(LOGIN_REPLY_GOOD) - 1) == 0) {
++ res = LOGIN_STATUS_ACCEPTED;
++ } else if (strncmp(line_first, LOGIN_REPLY_BAD, sizeof(LOGIN_REPLY_BAD) - 1) == 0) {
++ res = LOGIN_STATUS_REJECTED;
++ } else if (strncmp(line_first, LOGIN_REPLY_CAP, sizeof(LOGIN_REPLY_CAP) - 1) == 0) {
++ /* keep looking for ".. OK" or ".. NO" */
++ } else {
++ res = LOGIN_STATUS_MALFORMED;
++ }
++
++ /* report current line */
++ if (res == LOGIN_STATUS_MALFORMED) {
++ warn_malformed_imap_login_reply(line_first);
++ } else if (flags & VERBOSE) {
++ syslog(LOG_DEBUG, "auth_rimap: [%s] %s", login, line_first);
++ }
++
++ /* revert termination */
++ line_after_last[0] = backup;
++ }
++
++ /* are we done? */
++ if (res != LOGIN_STATUS_UNKNOWN) {
++ return res;
++ }
++
++ /* forward to next line */
++ while ((line_after_last[0] == '\x0a')
++ || (line_after_last[0] == '\x0d')) {
++ line_after_last++;
++ }
++
++ /* no more lines? */
++ if (line_after_last[0] == '\0') {
++ warn_malformed_imap_login_reply("");
++ return LOGIN_STATUS_MALFORMED;
++ }
++
++ /* prepare for next round */
++ line_first = line_after_last;
++ }
++
++ assert(! "cannot be reached");
++}
++
++/* END FUNCTION: process_login_reply */
++
+ /* FUNCTION: auth_rimap */
+
+ /* SYNOPSIS
+@@ -318,6 +425,7 @@ auth_rimap (
+ char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
+ int saved_errno;
+ int niflags;
++ t_login_status login_status = LOGIN_STATUS_MALFORMED;
+ /* END VARIABLES */
+
+ /* sanity checks */
+@@ -533,25 +641,14 @@ auth_rimap (
+ }
+
+ rbuf[rc] = '\0'; /* tie off response */
+- c = strpbrk(rbuf, "\r\n");
+- if (c != NULL) {
+- *c = '\0'; /* tie off line termination */
+- }
++ login_status = process_login_reply(rbuf, login);
+
+- if (!strncmp(rbuf, TAG " OK", sizeof(TAG " OK")-1)) {
+- if (flags & VERBOSE) {
+- syslog(LOG_DEBUG, "auth_rimap: [%s] %s", login, rbuf);
+- }
++ if (login_status == LOGIN_STATUS_ACCEPTED) {
+ return strdup("OK remote authentication successful");
+ }
+- if (!strncmp(rbuf, TAG " NO", sizeof(TAG " NO")-1)) {
+- if (flags & VERBOSE) {
+- syslog(LOG_DEBUG, "auth_rimap: [%s] %s", login, rbuf);
+- }
++ if (login_status == LOGIN_STATUS_REJECTED) {
+ return strdup("NO remote server rejected your credentials");
+ }
+- syslog(LOG_WARNING, "auth_rimap: unexpected response to auth request: %s",
+- rbuf);
+ return strdup(RESP_UNEXPECTED);
+
+ }
diff --git a/debian/patches/series b/debian/patches/series
index 0915958..33989db 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -29,3 +29,4 @@
0045_revert_upstream_soname_bump.patch
0046_fix_void_return.patch
properly-create-libsasl2.pc.patch
+bug715040.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-cyrus-sasl2/cyrus-sasl2.git
More information about the Pkg-cyrus-sasl2-commits
mailing list