Blame SOURCES/dovecot-2.3.8-CVE_2020_12674prereq.patch

7bc0c9
diff -up dovecot-2.3.8/src/auth/Makefile.am.CVE_2020_12674prereq dovecot-2.3.8/src/auth/Makefile.am
7bc0c9
--- dovecot-2.3.8/src/auth/Makefile.am.CVE_2020_12674prereq	2019-10-08 10:46:18.000000000 +0200
7bc0c9
+++ dovecot-2.3.8/src/auth/Makefile.am	2020-08-07 20:46:56.095295825 +0200
7bc0c9
@@ -38,6 +38,7 @@ AM_CPPFLAGS = \
7bc0c9
 	-I$(top_srcdir)/src/lib-oauth2 \
7bc0c9
 	-I$(top_srcdir)/src/lib-ssl-iostream \
7bc0c9
 	-I$(top_srcdir)/src/lib-lua \
7bc0c9
+	-I$(top_srcdir)/src/lib-dcrypt \
7bc0c9
 	-DAUTH_MODULE_DIR=\""$(auth_moduledir)"\" \
7bc0c9
 	-DPKG_LIBEXECDIR=\""$(pkglibexecdir)"\" \
7bc0c9
 	-DPKG_RUNDIR=\""$(rundir)"\" \
7bc0c9
@@ -248,7 +249,8 @@ libstats_auth_la_SOURCES = auth-stats.c
7bc0c9
 test_programs = \
7bc0c9
 	test-libpassword \
7bc0c9
 	test-auth-cache \
7bc0c9
-	test-auth
7bc0c9
+	test-auth \
7bc0c9
+	test-mech
7bc0c9
 
7bc0c9
 noinst_PROGRAMS = $(test_programs)
7bc0c9
 
7bc0c9
@@ -288,6 +290,13 @@ test_auth_SOURCES = \
7bc0c9
 test_auth_LDADD = $(test_libs) $(auth_libs) $(AUTH_LIBS)
7bc0c9
 test_auth_DEPENDENCIES = $(pkglibexec_PROGRAMS) $(test_libs)
7bc0c9
 
7bc0c9
+test_mech_SOURCES = \
7bc0c9
+	test-mock.c \
7bc0c9
+	test-mech.c
7bc0c9
+
7bc0c9
+test_mech_LDADD = $(test_libs) $(auth_libs) $(AUTH_LIBS)
7bc0c9
+test_mech_DEPENDENCIES = $(pkglibexec_PROGRAMS) $(test_libs)
7bc0c9
+
7bc0c9
 check-local:
7bc0c9
 	for bin in $(test_programs); do \
7bc0c9
 	  if ! $(RUN_TEST) ./$$bin; then exit 1; fi; \
7bc0c9
diff -up dovecot-2.3.8/src/auth/passdb.h.CVE_2020_12674prereq dovecot-2.3.8/src/auth/passdb.h
7bc0c9
--- dovecot-2.3.8/src/auth/passdb.h.CVE_2020_12674prereq	2019-10-08 10:46:18.000000000 +0200
7bc0c9
+++ dovecot-2.3.8/src/auth/passdb.h	2020-08-07 20:35:16.295684287 +0200
7bc0c9
@@ -24,6 +24,8 @@ enum passdb_result {
7bc0c9
 
7bc0c9
 typedef void verify_plain_callback_t(enum passdb_result result,
7bc0c9
 				     struct auth_request *request);
7bc0c9
+typedef void verify_plain_continue_callback_t(struct auth_request *request,
7bc0c9
+					      verify_plain_callback_t *callback);
7bc0c9
 typedef void lookup_credentials_callback_t(enum passdb_result result,
7bc0c9
 					   const unsigned char *credentials,
7bc0c9
 					   size_t size,
7bc0c9
diff -up dovecot-2.3.8/src/auth/auth-request-handler-private.h.CVE_2020_12674prereq dovecot-2.3.8/src/auth/auth-request-handler-private.h
7bc0c9
--- dovecot-2.3.8/src/auth/auth-request-handler-private.h.CVE_2020_12674prereq	2020-08-07 20:35:16.295684287 +0200
7bc0c9
+++ dovecot-2.3.8/src/auth/auth-request-handler-private.h	2020-08-07 20:35:16.295684287 +0200
7bc0c9
@@ -0,0 +1,27 @@
7bc0c9
+#ifndef AUTH_REQUEST_HANDLER_PRIVATE_H
7bc0c9
+#define AUTH_REQUEST_HANDLER_PRIVATE_H
7bc0c9
+
7bc0c9
+struct auth_request;
7bc0c9
+struct auth_client_connection;
7bc0c9
+
7bc0c9
+struct auth_request_handler {
7bc0c9
+	int refcount;
7bc0c9
+	pool_t pool;
7bc0c9
+	HASH_TABLE(void *, struct auth_request *) requests;
7bc0c9
+
7bc0c9
+        unsigned int connect_uid, client_pid;
7bc0c9
+
7bc0c9
+	auth_client_request_callback_t *callback;
7bc0c9
+	struct auth_client_connection *conn;
7bc0c9
+
7bc0c9
+	auth_master_request_callback_t *master_callback;
7bc0c9
+	auth_request_handler_reply_callback_t *reply_callback;
7bc0c9
+	auth_request_handler_reply_continue_callback_t *reply_continue_callback;
7bc0c9
+	verify_plain_continue_callback_t *verify_plain_continue_callback;
7bc0c9
+
7bc0c9
+	bool destroyed:1;
7bc0c9
+	bool token_auth:1;
7bc0c9
+};
7bc0c9
+
7bc0c9
+
7bc0c9
+#endif
7bc0c9
diff -up dovecot-2.3.8/src/auth/auth-request-handler.h.CVE_2020_12674prereq dovecot-2.3.8/src/auth/auth-request-handler.h
7bc0c9
--- dovecot-2.3.8/src/auth/auth-request-handler.h.CVE_2020_12674prereq	2019-10-08 10:46:18.000000000 +0200
7bc0c9
+++ dovecot-2.3.8/src/auth/auth-request-handler.h	2020-08-07 20:35:16.295684287 +0200
7bc0c9
@@ -17,6 +17,17 @@ auth_client_request_callback_t(const cha
7bc0c9
 typedef void
7bc0c9
 auth_master_request_callback_t(const char *reply, struct auth_master_connection *conn);
7bc0c9
 
7bc0c9
+typedef void
7bc0c9
+auth_request_handler_reply_callback_t(struct auth_request *request,
7bc0c9
+				      enum auth_client_result result,
7bc0c9
+				      const void *auth_reply,
7bc0c9
+				      size_t reply_size);
7bc0c9
+typedef void
7bc0c9
+auth_request_handler_reply_continue_callback_t(struct auth_request *request,
7bc0c9
+					       const void *reply,
7bc0c9
+					       size_t reply_size);
7bc0c9
+
7bc0c9
+
7bc0c9
 struct auth_request_handler *
7bc0c9
 auth_request_handler_create(bool token_auth, auth_client_request_callback_t *callback,
7bc0c9
 			    struct auth_client_connection *conn,
7bc0c9
diff -up dovecot-2.3.8/src/auth/test-mock.c.CVE_2020_12674prereq dovecot-2.3.8/src/auth/test-mock.c
7bc0c9
--- dovecot-2.3.8/src/auth/test-mock.c.CVE_2020_12674prereq	2019-10-08 10:46:18.000000000 +0200
7bc0c9
+++ dovecot-2.3.8/src/auth/test-mock.c	2020-08-07 20:35:16.296684273 +0200
7bc0c9
@@ -28,14 +28,22 @@ static void passdb_mock_verify_plain(str
7bc0c9
 	callback(PASSDB_RESULT_OK, request);
7bc0c9
 }
7bc0c9
 
7bc0c9
+static void passdb_mock_lookup_credentials(struct auth_request *request,
7bc0c9
+					   lookup_credentials_callback_t *callback)
7bc0c9
+{
7bc0c9
+	passdb_handle_credentials(PASSDB_RESULT_OK, "password", "PLAIN",
7bc0c9
+				  callback, request);
7bc0c9
+}
7bc0c9
+
7bc0c9
 static struct passdb_module_interface mock_interface = {
7bc0c9
 	.name = "mock",
7bc0c9
 	.init = passdb_mock_init,
7bc0c9
 	.deinit = passdb_mock_deinit,
7bc0c9
 	.verify_plain = passdb_mock_verify_plain,
7bc0c9
+	.lookup_credentials = passdb_mock_lookup_credentials,
7bc0c9
 };
7bc0c9
 
7bc0c9
-static struct auth_passdb_settings set = {
7bc0c9
+struct auth_passdb_settings mock_passdb_set = {
7bc0c9
 	.name = "mock",
7bc0c9
 	.driver = "mock",
7bc0c9
 	.args = "",
7bc0c9
@@ -95,7 +103,7 @@ void passdb_mock_mod_deinit(void)
7bc0c9
 struct auth_passdb *passdb_mock(void)
7bc0c9
 {
7bc0c9
 	struct auth_passdb *ret = i_new(struct auth_passdb, 1);
7bc0c9
-	ret->set = &set;
7bc0c9
+	ret->set = &mock_passdb_set;
7bc0c9
 	ret->passdb = mock_passdb_mod;
7bc0c9
 	return ret;
7bc0c9
 }
7bc0c9
diff -up dovecot-2.3.8/src/auth/test-auth.h.CVE_2020_12674prereq dovecot-2.3.8/src/auth/test-auth.h
7bc0c9
--- dovecot-2.3.8/src/auth/test-auth.h.CVE_2020_12674prereq	2019-10-08 10:46:18.000000000 +0200
7bc0c9
+++ dovecot-2.3.8/src/auth/test-auth.h	2020-08-07 20:35:16.296684273 +0200
7bc0c9
@@ -8,6 +8,8 @@
7bc0c9
 
7bc0c9
 struct auth_passdb;
7bc0c9
 
7bc0c9
+extern struct auth_passdb_settings mock_passdb_set;
7bc0c9
+
7bc0c9
 void test_auth_request_var_expand(void);
7bc0c9
 void test_db_dict_parse_cache_key(void);
7bc0c9
 void test_username_filter(void);
7bc0c9
diff -up dovecot-2.3.8/src/auth/auth-request.c.CVE_2020_12674prereq dovecot-2.3.8/src/auth/auth-request.c
7bc0c9
--- dovecot-2.3.8/src/auth/auth-request.c.CVE_2020_12674prereq	2019-10-08 10:46:18.000000000 +0200
7bc0c9
+++ dovecot-2.3.8/src/auth/auth-request.c	2020-08-07 20:35:16.295684287 +0200
7bc0c9
@@ -16,6 +16,7 @@
7bc0c9
 #include "auth-cache.h"
7bc0c9
 #include "auth-request.h"
7bc0c9
 #include "auth-request-handler.h"
7bc0c9
+#include "auth-request-handler-private.h"
7bc0c9
 #include "auth-request-stats.h"
7bc0c9
 #include "auth-client-connection.h"
7bc0c9
 #include "auth-master-connection.h"
7bc0c9
@@ -67,9 +68,6 @@ static void
7bc0c9
 auth_request_userdb_import(struct auth_request *request, const char *args);
7bc0c9
 
7bc0c9
 static
7bc0c9
-void auth_request_verify_plain_continue(struct auth_request *request,
7bc0c9
-					verify_plain_callback_t *callback);
7bc0c9
-static
7bc0c9
 void auth_request_lookup_credentials_policy_continue(struct auth_request *request,
7bc0c9
 						     lookup_credentials_callback_t *callback);
7bc0c9
 static
7bc0c9
@@ -307,10 +307,12 @@ void auth_request_success_continue(struct auth_policy_check_ctx *ctx)
7bc0c9
 		return;
7bc0c9
 	}
7bc0c9
 
7bc0c9
-	stats = auth_request_stats_get(request);
7bc0c9
-	stats->auth_success_count++;
7bc0c9
-	if (request->master_user != NULL)
7bc0c9
-		stats->auth_master_success_count++;
7bc0c9
+	if (request->set->stats) {
7bc0c9
+		stats = auth_request_stats_get(request);
7bc0c9
+		stats->auth_success_count++;
7bc0c9
+		if (request->master_user != NULL)
7bc0c9
+			stats->auth_master_success_count++;
7bc0c9
+	}
7bc0c9
 
7bc0c9
 	auth_request_set_state(request, AUTH_REQUEST_STATE_FINISHED);
7bc0c9
 	auth_request_refresh_last_access(request);
7bc0c9
@@ -324,8 +326,10 @@ void auth_request_fail(struct auth_request *request)
7bc0c9
 
7bc0c9
 	i_assert(request->state == AUTH_REQUEST_STATE_MECH_CONTINUE);
7bc0c9
 
7bc0c9
-	stats = auth_request_stats_get(request);
7bc0c9
-	stats->auth_failure_count++;
7bc0c9
+	if (request->set->stats) {
7bc0c9
+		stats = auth_request_stats_get(request);
7bc0c9
+		stats->auth_failure_count++;
7bc0c9
+	}
7bc0c9
 
7bc0c9
 	auth_request_set_state(request, AUTH_REQUEST_STATE_FINISHED);
7bc0c9
 	auth_request_refresh_last_access(request);
7bc0c9
@@ -1233,7 +1231,7 @@ void auth_request_policy_penalty_finish(
7bc0c9
 
7bc0c9
 	switch(ctx->type) {
7bc0c9
 	case AUTH_POLICY_CHECK_TYPE_PLAIN:
7bc0c9
-		auth_request_verify_plain_continue(ctx->request, ctx->callback_plain);
7bc0c9
+		ctx->request->handler->verify_plain_continue_callback(ctx->request, ctx->callback_plain);
7bc0c9
 		return;
7bc0c9
 	case AUTH_POLICY_CHECK_TYPE_LOOKUP:
7bc0c9
 		auth_request_lookup_credentials_policy_continue(ctx->request, ctx->callback_lookup);
7bc0c9
@@ -1284,7 +1282,8 @@ void auth_request_verify_plain(struct au
7bc0c9
 	request->user_changed_by_lookup = FALSE;
7bc0c9
 
7bc0c9
 	if (request->policy_processed || !request->set->policy_check_before_auth) {
7bc0c9
-		auth_request_verify_plain_continue(request, callback);
7bc0c9
+		request->handler->verify_plain_continue_callback(request,
7bc0c9
+								 callback);
7bc0c9
 	} else {
7bc0c9
 		ctx = p_new(request->pool, struct auth_policy_check_ctx, 1);
7bc0c9
 		ctx->request = request;
7bc0c9
@@ -1294,10 +1293,9 @@ void auth_request_verify_plain(struct au
7bc0c9
 	}
7bc0c9
 }
7bc0c9
 
7bc0c9
-static
7bc0c9
-void auth_request_verify_plain_continue(struct auth_request *request,
7bc0c9
-					verify_plain_callback_t *callback) {
7bc0c9
-
7bc0c9
+void auth_request_default_verify_plain_continue(struct auth_request *request,
7bc0c9
+						verify_plain_callback_t *callback)
7bc0c9
+{
7bc0c9
 	struct auth_passdb *passdb;
7bc0c9
 	enum passdb_result result;
7bc0c9
 	const char *cache_key, *error;
7bc0c9
diff -up dovecot-2.3.8/src/auth/auth-request-handler.c.CVE_2020_12674prereq dovecot-2.3.8/src/auth/auth-request-handler.c
7bc0c9
--- dovecot-2.3.8/src/auth/auth-request-handler.c.CVE_2020_12674prereq	2019-10-08 10:46:18.000000000 +0200
7bc0c9
+++ dovecot-2.3.8/src/auth/auth-request-handler.c	2020-08-07 20:35:16.295684287 +0200
7bc0c9
@@ -17,32 +17,28 @@
7bc0c9
 #include "auth-client-connection.h"
7bc0c9
 #include "auth-master-connection.h"
7bc0c9
 #include "auth-request-handler.h"
7bc0c9
+#include "auth-request-handler-private.h"
7bc0c9
 #include "auth-policy.h"
7bc0c9
 
7bc0c9
 #define AUTH_FAILURE_DELAY_CHECK_MSECS 500
7bc0c9
-
7bc0c9
-struct auth_request_handler {
7bc0c9
-	int refcount;
7bc0c9
-	pool_t pool;
7bc0c9
-	HASH_TABLE(void *, struct auth_request *) requests;
7bc0c9
-
7bc0c9
-        unsigned int connect_uid, client_pid;
7bc0c9
-
7bc0c9
-	auth_client_request_callback_t *callback;
7bc0c9
-	struct auth_client_connection *conn;
7bc0c9
-
7bc0c9
-	auth_master_request_callback_t *master_callback;
7bc0c9
-
7bc0c9
-	bool destroyed:1;
7bc0c9
-	bool token_auth:1;
7bc0c9
-};
7bc0c9
-
7bc0c9
 static ARRAY(struct auth_request *) auth_failures_arr;
7bc0c9
 static struct aqueue *auth_failures;
7bc0c9
 static struct timeout *to_auth_failures;
7bc0c9
 
7bc0c9
 static void auth_failure_timeout(void *context) ATTR_NULL(1);
7bc0c9
 
7bc0c9
+
7bc0c9
+static void
7bc0c9
+auth_request_handler_default_reply_callback(struct auth_request *request,
7bc0c9
+					    enum auth_client_result result,
7bc0c9
+					    const void *auth_reply,
7bc0c9
+					    size_t reply_size);
7bc0c9
+
7bc0c9
+static void
7bc0c9
+auth_request_handler_default_reply_continue(struct auth_request *request,
7bc0c9
+					    const void *reply,
7bc0c9
+					    size_t reply_size);
7bc0c9
+
7bc0c9
 struct auth_request_handler *
7bc0c9
 auth_request_handler_create(bool token_auth, auth_client_request_callback_t *callback,
7bc0c9
 			    struct auth_client_connection *conn,
7bc0c9
@@ -61,6 +57,12 @@ auth_request_handler_create(bool token_a
7bc0c9
 	handler->conn = conn;
7bc0c9
 	handler->master_callback = master_callback;
7bc0c9
 	handler->token_auth = token_auth;
7bc0c9
+	handler->reply_callback =
7bc0c9
+		auth_request_handler_default_reply_callback;
7bc0c9
+	handler->reply_continue_callback =
7bc0c9
+		auth_request_handler_default_reply_continue;
7bc0c9
+	handler->verify_plain_continue_callback =
7bc0c9
+		auth_request_default_verify_plain_continue;
7bc0c9
 	return handler;
7bc0c9
 }
7bc0c9
 
7bc0c9
@@ -355,6 +363,16 @@ void auth_request_handler_reply(struct a
7bc0c9
 				enum auth_client_result result,
7bc0c9
 				const void *auth_reply, size_t reply_size)
7bc0c9
 {
7bc0c9
+	struct auth_request_handler *handler = request->handler;
7bc0c9
+	handler->reply_callback(request, result, auth_reply, reply_size);
7bc0c9
+}
7bc0c9
+
7bc0c9
+static void
7bc0c9
+auth_request_handler_default_reply_callback(struct auth_request *request,
7bc0c9
+					    enum auth_client_result result,
7bc0c9
+					    const void *auth_reply,
7bc0c9
+					    size_t reply_size)
7bc0c9
+{
7bc0c9
         struct auth_request_handler *handler = request->handler;
7bc0c9
 	string_t *str;
7bc0c9
 	int ret;
7bc0c9
@@ -407,6 +425,14 @@ void auth_request_handler_reply(struct a
7bc0c9
 void auth_request_handler_reply_continue(struct auth_request *request,
7bc0c9
 					 const void *reply, size_t reply_size)
7bc0c9
 {
7bc0c9
+	request->handler->reply_continue_callback(request, reply, reply_size);
7bc0c9
+}
7bc0c9
+
7bc0c9
+static void
7bc0c9
+auth_request_handler_default_reply_continue(struct auth_request *request,
7bc0c9
+					    const void *reply,
7bc0c9
+					    size_t reply_size)
7bc0c9
+{
7bc0c9
 	auth_request_handler_reply(request, AUTH_CLIENT_RESULT_CONTINUE,
7bc0c9
 				   reply, reply_size);
7bc0c9
 }
7bc0c9
@@ -703,6 +729,7 @@ static void auth_str_append_userdb_extra
7bc0c9
 		auth_str_add_keyvalue(dest, "master_user",
7bc0c9
 				      request->master_user);
7bc0c9
 	}
7bc0c9
+	auth_str_add_keyvalue(dest, "auth_mech", request->mech->mech_name);
7bc0c9
 	if (*request->set->anonymous_username != '\0' &&
7bc0c9
 	    strcmp(request->user, request->set->anonymous_username) == 0) {
7bc0c9
 		/* this is an anonymous login, either via ANONYMOUS
7bc0c9
diff -up dovecot-2.3.8/src/auth/auth-request.h.CVE_2020_12674prereq dovecot-2.3.8/src/auth/auth-request.h
7bc0c9
--- dovecot-2.3.8/src/auth/auth-request.h.CVE_2020_12674prereq	2019-10-08 10:46:18.000000000 +0200
7bc0c9
+++ dovecot-2.3.8/src/auth/auth-request.h	2020-08-07 20:35:16.295684287 +0200
7bc0c9
@@ -295,6 +295,8 @@ void auth_request_set_credentials(struct
7bc0c9
 				  set_credentials_callback_t *callback);
7bc0c9
 void auth_request_userdb_callback(enum userdb_result result,
7bc0c9
 				  struct auth_request *request);
7bc0c9
+void auth_request_default_verify_plain_continue(struct auth_request *request,
7bc0c9
+						verify_plain_callback_t *callback);
7bc0c9
 
7bc0c9
 void auth_request_refresh_last_access(struct auth_request *request);
7bc0c9
 void auth_str_append(string_t *dest, const char *key, const char *value);