]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
*-login: Added %{passdb:*} fields to login_log_format_elements
authorTimo Sirainen <tss@iki.fi>
Fri, 28 Aug 2015 12:43:35 +0000 (14:43 +0200)
committerTimo Sirainen <tss@iki.fi>
Fri, 28 Aug 2015 12:43:35 +0000 (14:43 +0200)
src/login-common/client-common.c
src/login-common/client-common.h
src/login-common/sasl-server.c

index ed3a35a17a7abba0824c7076f34798009275dde2..5e28807cee8d7f03dc555cb8689e1cf083356d49 100644 (file)
@@ -586,14 +586,38 @@ static bool have_username_key(const char *str)
        return FALSE;
 }
 
+static const char *
+client_var_expand_func_passdb(const char *data, void *context)
+{
+       struct client *client = context;
+       const char *field_name = data;
+       unsigned int i, field_name_len;
+
+       if (client->auth_passdb_args == NULL)
+               return NULL;
+
+       field_name_len = strlen(field_name);
+       for (i = 0; client->auth_passdb_args[i] != NULL; i++) {
+               if (strncmp(client->auth_passdb_args[i], field_name,
+                           field_name_len) == 0 &&
+                   client->auth_passdb_args[i][field_name_len] == '=')
+                       return client->auth_passdb_args[i] + field_name_len+1;
+       }
+       return NULL;
+}
+
 static const char *
 client_get_log_str(struct client *client, const char *msg)
 {
-       static struct var_expand_table static_tab[3] = {
+       static const struct var_expand_table static_tab[3] = {
                { 's', NULL, NULL },
                { '$', NULL, NULL },
                { '\0', NULL, NULL }
        };
+       static const struct var_expand_func_table func_table[] = {
+               { "passdb", client_var_expand_func_passdb },
+               { NULL, NULL }
+       };
        const struct var_expand_table *var_expand_table;
        struct var_expand_table *tab;
        char *const *e;
@@ -609,7 +633,8 @@ client_get_log_str(struct client *client, const char *msg)
        str2 = t_str_new(128);
        for (e = client->set->log_format_elements_split; *e != NULL; e++) {
                pos = str_len(str);
-               var_expand(str, *e, var_expand_table);
+               var_expand_with_funcs(str, *e, var_expand_table,
+                                     func_table, client);
                if (have_username_key(*e)) {
                        /* username is added even if it's empty */
                } else {
index d19b10be812a373a350636203b0aceb2d144165a..1ccc932ac0f891e022c180eb4de890bc25296eb0 100644 (file)
@@ -137,6 +137,7 @@ struct client {
        string_t *auth_response;
        time_t auth_first_started, auth_finished;
        const char *sasl_final_resp;
+       const char *const *auth_passdb_args;
 
        unsigned int master_auth_id;
        unsigned int master_tag;
index 2e1e675ff80935f1a31ffcf74d933c1e676520cb..784691fc8379fb142fa2bffbb87dec0b5161265d 100644 (file)
@@ -234,6 +234,7 @@ authenticate_callback(struct auth_client_request *request,
        case AUTH_REQUEST_STATUS_OK:
                client->auth_request = NULL;
                client->auth_successes++;
+               client->auth_passdb_args = p_strarray_dup(client->pool, args);
 
                nologin = FALSE;
                for (i = 0; args[i] != NULL; i++) {