dovecot-1.1: Use auth-stream API to build all TAB-delimited stri...
dovecot at dovecot.org
dovecot at dovecot.org
Sun Mar 9 13:04:50 EET 2008
details: http://hg.dovecot.org/dovecot-1.1/rev/08d31d752893
changeset: 7388:08d31d752893
user: Timo Sirainen <tss at iki.fi>
date: Sun Mar 09 12:37:26 2008 +0200
description:
Use auth-stream API to build all TAB-delimited strings to make sure strings
are escaped properly where necessary.
diffstat:
14 files changed, 233 insertions(+), 191 deletions(-)
src/auth/auth-client-connection.c | 5 -
src/auth/auth-master-connection.c | 14 ++-
src/auth/auth-master-connection.h | 5 -
src/auth/auth-request-handler.c | 158 +++++++++++++++++++------------------
src/auth/auth-request-handler.h | 6 -
src/auth/auth-request.c | 51 ++++++-----
src/auth/auth-request.h | 3
src/auth/auth-stream.c | 11 +-
src/auth/auth-stream.h | 3
src/auth/auth-worker-client.c | 101 ++++++++++++-----------
src/auth/auth-worker-server.c | 10 +-
src/auth/auth-worker-server.h | 4
src/auth/passdb-blocking.c | 40 ++++-----
src/auth/userdb-blocking.c | 13 +--
diffs (truncated from 869 to 300 lines):
diff -r 2bef36355718 -r 08d31d752893 src/auth/auth-client-connection.c
--- a/src/auth/auth-client-connection.c Sun Mar 09 10:32:59 2008 +0200
+++ b/src/auth/auth-client-connection.c Sun Mar 09 12:37:26 2008 +0200
@@ -9,6 +9,7 @@
#include "str.h"
#include "str-sanitize.h"
#include "safe-memset.h"
+#include "auth-stream.h"
#include "auth-request-handler.h"
#include "auth-client-interface.h"
#include "auth-client-connection.h"
@@ -63,7 +64,7 @@ static void auth_client_send(struct auth
}
}
-static void auth_callback(const char *reply,
+static void auth_callback(struct auth_stream_reply *reply,
struct auth_client_connection *conn)
{
if (reply == NULL) {
@@ -72,7 +73,7 @@ static void auth_callback(const char *re
return;
}
- auth_client_send(conn, reply);
+ auth_client_send(conn, auth_stream_reply_export(reply));
}
static bool
diff -r 2bef36355718 -r 08d31d752893 src/auth/auth-master-connection.c
--- a/src/auth/auth-master-connection.c Sun Mar 09 10:32:59 2008 +0200
+++ b/src/auth/auth-master-connection.c Sun Mar 09 12:37:26 2008 +0200
@@ -29,16 +29,20 @@ struct master_userdb_request {
struct auth_request *auth_request;
};
-void auth_master_request_callback(const char *reply, void *context)
+void auth_master_request_callback(struct auth_stream_reply *reply,
+ void *context)
{
struct auth_master_connection *conn = context;
struct const_iovec iov[2];
+ const char *reply_str;
+
+ reply_str = auth_stream_reply_export(reply);
if (conn->listener->auth->verbose_debug)
- i_info("master out: %s", reply);
-
- iov[0].iov_base = reply;
- iov[0].iov_len = strlen(reply);
+ i_info("master out: %s", reply_str);
+
+ iov[0].iov_base = reply_str;
+ iov[0].iov_len = strlen(reply_str);
iov[1].iov_base = "\n";
iov[1].iov_len = 1;
diff -r 2bef36355718 -r 08d31d752893 src/auth/auth-master-connection.h
--- a/src/auth/auth-master-connection.h Sun Mar 09 10:32:59 2008 +0200
+++ b/src/auth/auth-master-connection.h Sun Mar 09 12:37:26 2008 +0200
@@ -1,5 +1,7 @@
#ifndef AUTH_MASTER_CONNECTION_H
#define AUTH_MASTER_CONNECTION_H
+
+struct auth_stream_reply;
struct auth_master_connection {
struct auth_master_listener *listener;
@@ -24,6 +26,7 @@ void auth_master_connection_send_handsha
void auth_master_connection_send_handshake(struct auth_master_connection *conn);
void auth_master_connections_send_handshake(void);
-void auth_master_request_callback(const char *reply, void *context);
+void auth_master_request_callback(struct auth_stream_reply *reply,
+ void *context);
#endif
diff -r 2bef36355718 -r 08d31d752893 src/auth/auth-request-handler.c
--- a/src/auth/auth-request-handler.c Sun Mar 09 10:32:59 2008 +0200
+++ b/src/auth/auth-request-handler.c Sun Mar 09 12:37:26 2008 +0200
@@ -116,53 +116,51 @@ void auth_request_handler_check_timeouts
hash_iterate_deinit(&iter);
}
-static const char *get_client_extra_fields(struct auth_request *request)
-{
- string_t *str;
+static void get_client_extra_fields(struct auth_request *request,
+ struct auth_stream_reply *reply)
+{
const char **fields, *extra_fields;
unsigned int src, dest;
bool seen_pass = FALSE;
if (auth_stream_is_empty(request->extra_fields))
- return NULL;
+ return;
extra_fields = auth_stream_reply_export(request->extra_fields);
if (!request->proxy) {
/* we only wish to remove all fields prefixed with "userdb_" */
- if (strstr(extra_fields, "userdb_") == NULL)
- return extra_fields;
- }
-
- str = t_str_new(128);
+ if (strstr(extra_fields, "userdb_") == NULL) {
+ auth_stream_reply_import(reply, extra_fields);
+ return;
+ }
+ }
+
fields = t_strsplit(extra_fields, "\t");
for (src = dest = 0; fields[src] != NULL; src++) {
if (strncmp(fields[src], "userdb_", 7) != 0) {
- if (str_len(str) > 0)
- str_append_c(str, '\t');
if (!seen_pass && strncmp(fields[src], "pass=", 5) == 0)
seen_pass = TRUE;
- str_append(str, fields[src]);
+ auth_stream_reply_import(reply, fields[src]);
}
}
if (request->proxy && !seen_pass && request->mech_password != NULL) {
/* we're proxying - send back the password that was
sent by user (not the password in passdb). */
- str_printfa(str, "\tpass=%s", request->mech_password);
- }
-
- return str_len(str) == 0 ? NULL : str_c(str);
+ auth_stream_reply_add(reply, "pass", request->mech_password);
+ }
}
static void
-auth_request_handle_failure(struct auth_request *request, const char *str)
+auth_request_handle_failure(struct auth_request *request,
+ struct auth_stream_reply *reply)
{
struct auth_request_handler *handler = request->context;
if (request->delayed_failure) {
/* we came here from flush_failures() */
- handler->callback(str, handler->context);
+ handler->callback(reply, handler->context);
return;
}
@@ -173,7 +171,7 @@ auth_request_handle_failure(struct auth_
if (request->no_failure_delay) {
/* passdb specifically requested not to delay the
reply. */
- handler->callback(str, handler->context);
+ handler->callback(reply, handler->context);
auth_request_unref(&request);
return;
}
@@ -194,56 +192,56 @@ auth_request_handle_failure(struct auth_
static void auth_callback(struct auth_request *request,
enum auth_client_result result,
- const void *reply, size_t reply_size)
+ const void *auth_reply, size_t reply_size)
{
struct auth_request_handler *handler = request->context;
+ struct auth_stream_reply *reply;
string_t *str;
- const char *fields;
-
- str = t_str_new(128 + MAX_BASE64_ENCODED_SIZE(reply_size));
+
+ reply = auth_stream_reply_init(pool_datastack_create());
switch (result) {
case AUTH_CLIENT_RESULT_CONTINUE:
- str_printfa(str, "CONT\t%u\t", request->id);
- base64_encode(reply, reply_size, str);
- request->accept_input = TRUE;
- handler->callback(str_c(str), handler->context);
+ auth_stream_reply_add(reply, "CONT", NULL);
+ auth_stream_reply_add(reply, NULL, dec2str(request->id));
+
+ str = t_str_new(MAX_BASE64_ENCODED_SIZE(reply_size));
+ base64_encode(auth_reply, reply_size, str);
+ auth_stream_reply_add(reply, NULL, str_c(str));
+
+ request->accept_input = TRUE;
+ handler->callback(reply, handler->context);
break;
case AUTH_CLIENT_RESULT_SUCCESS:
auth_request_proxy_finish(request, TRUE);
- str_printfa(str, "OK\t%u\tuser=%s", request->id, request->user);
+ auth_stream_reply_add(reply, "OK", NULL);
+ auth_stream_reply_add(reply, NULL, dec2str(request->id));
+ auth_stream_reply_add(reply, "user", request->user);
if (reply_size > 0) {
- str_append(str, "\tresp=");
- base64_encode(reply, reply_size, str);
- }
- fields = get_client_extra_fields(request);
- if (fields != NULL) {
- str_append_c(str, '\t');
- str_append(str, fields);
- }
-
+ str = t_str_new(MAX_BASE64_ENCODED_SIZE(reply_size));
+ base64_encode(auth_reply, reply_size, str);
+ auth_stream_reply_add(reply, "resp", str_c(str));
+ }
+ get_client_extra_fields(request, reply);
if (request->no_login || handler->master_callback == NULL) {
/* this request doesn't have to wait for master
process to pick it up. delete it */
auth_request_handler_remove(handler, request);
}
- handler->callback(str_c(str), handler->context);
+ handler->callback(reply, handler->context);
break;
case AUTH_CLIENT_RESULT_FAILURE:
auth_request_proxy_finish(request, FALSE);
- str_printfa(str, "FAIL\t%u", request->id);
+ auth_stream_reply_add(reply, "FAIL", NULL);
+ auth_stream_reply_add(reply, NULL, dec2str(request->id));
if (request->user != NULL)
- str_printfa(str, "\tuser=%s", request->user);
+ auth_stream_reply_add(reply, "user", request->user);
if (request->internal_failure)
- str_append(str, "\ttemp");
- fields = get_client_extra_fields(request);
- if (fields != NULL) {
- str_append_c(str, '\t');
- str_append(str, fields);
- }
-
- auth_request_handle_failure(request, str_c(str));
+ auth_stream_reply_add(reply, "temp", NULL);
+ get_client_extra_fields(request, reply);
+
+ auth_request_handle_failure(request, reply);
break;
}
/* NOTE: request may be destroyed now */
@@ -255,13 +253,16 @@ static void auth_request_handler_auth_fa
struct auth_request *request,
const char *reason)
{
- string_t *reply = t_str_new(64);
+ struct auth_stream_reply *reply;
auth_request_log_info(request, request->mech->mech_name, "%s", reason);
- str_printfa(reply, "FAIL\t%u\treason=%s", request->id, reason);
- handler->callback(str_c(reply), handler->context);
-
+ reply = auth_stream_reply_init(pool_datastack_create());
+ auth_stream_reply_add(reply, "FAIL", NULL);
+ auth_stream_reply_add(reply, NULL, dec2str(request->id));
+ auth_stream_reply_add(reply, "reason", reason);
+
+ handler->callback(reply, handler->context);
auth_request_handler_remove(handler, request);
}
@@ -391,10 +392,13 @@ bool auth_request_handler_auth_continue(
request = hash_lookup(handler->requests, POINTER_CAST(id));
if (request == NULL) {
- string_t *reply = t_str_new(64);
-
- str_printfa(reply, "FAIL\t%u\treason=Timeouted", id);
- handler->callback(str_c(reply), handler->context);
+ struct auth_stream_reply *reply;
+
+ reply = auth_stream_reply_init(pool_datastack_create());
+ auth_stream_reply_add(reply, "FAIL", NULL);
+ auth_stream_reply_add(reply, NULL, dec2str(id));
+ auth_stream_reply_add(reply, "reason", "Timeouted");
+ handler->callback(reply, handler->context);
return TRUE;
}
@@ -425,8 +429,7 @@ static void userdb_callback(enum userdb_
struct auth_request *request)
{
struct auth_request_handler *handler = request->context;
- struct auth_stream_reply *reply = request->userdb_reply;
- string_t *str;
+ struct auth_stream_reply *reply;
i_assert(request->state == AUTH_REQUEST_STATE_USERDB);
@@ -435,24 +438,29 @@ static void userdb_callback(enum userdb_
if (request->userdb_lookup_failed)
result = USERDB_RESULT_INTERNAL_FAILURE;
- str = t_str_new(256);
More information about the dovecot-cvs
mailing list