]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-auth-client: auth-master - Compose command line at a single location
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 5 Jan 2019 14:08:59 +0000 (15:08 +0100)
committerStephan Bosch <stephan.bosch@open-xchange.com>
Wed, 27 Aug 2025 11:37:23 +0000 (13:37 +0200)
src/lib-auth-client/auth-master-private.h
src/lib-auth-client/auth-master-request.c
src/lib-auth-client/auth-master.c

index f7af30bdeb3a32bd66c7eb848ae6596d223cf270..9212c852c4b3aad8d7f4eb0805a915a9eb309d94 100644 (file)
@@ -45,11 +45,11 @@ struct auth_master_connection {
 void auth_request_lookup_abort(struct auth_master_connection *conn);
 
 int auth_master_run_cmd_pre(struct auth_master_connection *conn,
-                           const char *cmd);
+                           const char *cmd, const unsigned char *args,
+                           size_t args_size);
 int auth_master_run_cmd_post(struct auth_master_connection *conn);
-int auth_master_run_cmd(struct auth_master_connection *conn, const char *cmd);
-
-unsigned int auth_master_next_request_id(struct auth_master_connection *conn);
+int auth_master_run_cmd(struct auth_master_connection *conn, const char *cmd,
+                       const unsigned char *args, size_t args_size);
 
 /*
  * Connection
index 64833ef3182a5ca3a2e9f43b9c59e5d354b56da4..5b4d21599961d79ade665fb380f41b6973539339 100644 (file)
@@ -13,9 +13,32 @@ void auth_request_lookup_abort(struct auth_master_connection *conn)
        conn->aborted = TRUE;
 }
 
+static void
+auth_master_request_send(struct auth_master_connection *conn,
+                        const char *cmd, unsigned int id,
+                        const unsigned char *args, size_t args_size)
+{
+       const char *id_str = dec2str(id);
+
+       const struct const_iovec iov[] = {
+               { cmd, strlen(cmd), },
+               { "\t", 1 },
+               { id_str, strlen(id_str), },
+               { "\t", args_size > 0 ? 1 : 0 },
+               { args, args_size },
+               { "\r\n", 2 },
+       };
+       unsigned int iovc = N_ELEMENTS(iov);
+
+       o_stream_nsendv(conn->conn.output, iov, iovc);
+}
+
 int auth_master_run_cmd_pre(struct auth_master_connection *conn,
-                           const char *cmd)
+                           const char *cmd, const unsigned char *args,
+                           size_t args_size)
 {
+       unsigned int id;
+
        auth_master_set_io(conn);
 
        if (!conn->connected) {
@@ -38,7 +61,13 @@ int auth_master_run_cmd_pre(struct auth_master_connection *conn,
                conn->sent_handshake = TRUE;
        }
 
-       o_stream_nsend_str(conn->conn.output, cmd);
+       if (++conn->id_counter == 0) {
+               /* avoid zero */
+               conn->id_counter++;
+       }
+       id = conn->id_counter;
+
+       auth_master_request_send(conn, cmd, id, args, args_size);
        o_stream_uncork(conn->conn.output);
 
        if (o_stream_flush(conn->conn.output) < 0) {
@@ -70,9 +99,10 @@ static void auth_master_stop(struct auth_master_connection *conn)
        }
 }
 
-int auth_master_run_cmd(struct auth_master_connection *conn, const char *cmd)
+int auth_master_run_cmd(struct auth_master_connection *conn, const char *cmd,
+                       const unsigned char *args, size_t args_size)
 {
-       if (auth_master_run_cmd_pre(conn, cmd) < 0)
+       if (auth_master_run_cmd_pre(conn, cmd, args, args_size) < 0)
                return -1;
        /* add stop handler */
        struct timeout *to = timeout_add_short(100, auth_master_stop, conn);
@@ -80,12 +110,3 @@ int auth_master_run_cmd(struct auth_master_connection *conn, const char *cmd)
        timeout_remove(&to);
        return auth_master_run_cmd_post(conn);
 }
-
-unsigned int auth_master_next_request_id(struct auth_master_connection *conn)
-{
-       if (++conn->id_counter == 0) {
-               /* avoid zero */
-               conn->id_counter++;
-       }
-       return conn->id_counter;
-}
index bd577adcd914324fc508d9eb96147b1963f973d7..624c93fb6ccacff24d97934fbb938021d72ad5bf 100644 (file)
@@ -589,7 +589,7 @@ int auth_master_pass_lookup(struct auth_master_connection *conn,
                            pool_t pool, const char *const **fields_r)
 {
        struct auth_master_lookup lookup;
-       string_t *str;
+       string_t *args;
 
        if (!is_valid_string(user) || !is_valid_string(info->protocol)) {
                /* non-allowed characters, the user can't exist */
@@ -607,11 +607,9 @@ int auth_master_pass_lookup(struct auth_master_connection *conn,
        conn->reply_callback = auth_lookup_reply_callback;
        conn->reply_context = &lookup;
 
-       str = t_str_new(128);
-       str_printfa(str, "PASS\t%u\t%s",
-                   auth_master_next_request_id(conn), user);
-       auth_user_info_export(str, info);
-       str_append_c(str, '\n');
+       args = t_str_new(128);
+       str_append(args, user);
+       auth_user_info_export(args, info);
 
        lookup.event = auth_master_user_event_create(
                conn, t_strdup_printf("passdb lookup(%s): ", user), info);
@@ -622,7 +620,7 @@ int auth_master_pass_lookup(struct auth_master_connection *conn,
                set_name("auth_client_passdb_lookup_started");
        e_debug(e->event(), "Started passdb lookup");
 
-       (void)auth_master_run_cmd(conn, str_c(str));
+       (void)auth_master_run_cmd(conn, "PASS", str_data(args), str_len(args));
 
        *fields_r = lookup.fields != NULL ? lookup.fields :
                p_new(pool, const char *, 1);
@@ -664,7 +662,7 @@ int auth_master_user_lookup(struct auth_master_connection *conn,
                            const char *const **fields_r)
 {
        struct auth_master_lookup lookup;
-       string_t *str;
+       string_t *args;
 
        if (!is_valid_string(user) || !is_valid_string(info->protocol)) {
                /* non-allowed characters, the user can't exist */
@@ -683,11 +681,9 @@ int auth_master_user_lookup(struct auth_master_connection *conn,
        conn->reply_callback = auth_lookup_reply_callback;
        conn->reply_context = &lookup;
 
-       str = t_str_new(128);
-       str_printfa(str, "USER\t%u\t%s",
-                   auth_master_next_request_id(conn), user);
-       auth_user_info_export(str, info);
-       str_append_c(str, '\n');
+       args = t_str_new(128);
+       str_append(args, user);
+       auth_user_info_export(args, info);
 
        lookup.event = auth_master_user_event_create(
                conn, t_strdup_printf("userdb lookup(%s): ", user), info);
@@ -698,7 +694,7 @@ int auth_master_user_lookup(struct auth_master_connection *conn,
                set_name("auth_client_userdb_lookup_started");
        e_debug(e->event(), "Started userdb lookup");
 
-       (void)auth_master_run_cmd(conn, str_c(str));
+       (void)auth_master_run_cmd(conn, "USER", str_data(args), str_len(args));
 
        if (lookup.return_value <= 0 || lookup.fields[0] == NULL) {
                *username_r = NULL;
@@ -821,7 +817,7 @@ auth_master_user_list_init(struct auth_master_connection *conn,
                           const struct auth_user_info *info)
 {
        struct auth_master_user_list_ctx *ctx;
-       string_t *str;
+       string_t *args;
 
        ctx = i_new(struct auth_master_user_list_ctx, 1);
        ctx->conn = conn;
@@ -830,14 +826,11 @@ auth_master_user_list_init(struct auth_master_connection *conn,
        conn->reply_callback = auth_user_list_reply_callback;
        conn->reply_context = ctx;
 
-       str = t_str_new(128);
-       str_printfa(str, "LIST\t%u",
-                   auth_master_next_request_id(conn));
+       args = t_str_new(128);
        if (*user_mask != '\0')
-               str_printfa(str, "\tuser=%s", user_mask);
+               str_printfa(args, "\tuser=%s", user_mask);
        if (info != NULL)
-               auth_user_info_export(str, info);
-       str_append_c(str, '\n');
+               auth_user_info_export(args, info);
 
        ctx->event = auth_master_user_event_create(conn, "userdb list: ", info);
        event_add_str(ctx->event," user_mask", user_mask);
@@ -847,7 +840,8 @@ auth_master_user_list_init(struct auth_master_connection *conn,
                set_name("auth_client_userdb_list_started");
        e_debug(e->event(), "Started listing users (user_mask=%s)", user_mask);
 
-       if (auth_master_run_cmd_pre(conn, str_c(str)) < 0)
+       if (auth_master_run_cmd_pre(conn, "LIST",
+                                   str_data(args), str_len(args)) < 0)
                ctx->failed = TRUE;
        if (conn->prev_ioloop != NULL)
                io_loop_set_current(conn->prev_ioloop);
@@ -964,7 +958,7 @@ int auth_master_cache_flush(struct auth_master_connection *conn,
                            const char *const *users, unsigned int *count_r)
 {
        struct auth_master_cache_ctx ctx;
-       string_t *str;
+       string_t *args;
 
        i_zero(&ctx);
        ctx.conn = conn;
@@ -972,15 +966,14 @@ int auth_master_cache_flush(struct auth_master_connection *conn,
        conn->reply_callback = auth_cache_flush_reply_callback;
        conn->reply_context = &ctx;
 
-       str = t_str_new(128);
-       str_printfa(str, "CACHE-FLUSH\t%u", auth_master_next_request_id(conn));
+       args = t_str_new(128);
        if (users != NULL) {
                for (; *users != NULL; users++) {
-                       str_append_c(str, '\t');
-                       str_append_tabescaped(str, *users);
+                       if (str_len(args) > 0)
+                               str_append_c(args, '\t');
+                       str_append_tabescaped(args, *users);
                }
        }
-       str_append_c(str, '\n');
 
        ctx.event = event_create(conn->conn.event);
        event_drop_parent_log_prefixes(ctx.event, 1);
@@ -988,7 +981,8 @@ int auth_master_cache_flush(struct auth_master_connection *conn,
 
        e_debug(ctx.event, "Started cache flush");
 
-       (void)auth_master_run_cmd(conn, str_c(str));
+       (void)auth_master_run_cmd(conn, "CACHE-FLUSH",
+                                 str_data(args), str_len(args));
 
        if (ctx.failed)
                e_debug(ctx.event, "Cache flush failed");