From: Timo Sirainen Date: Fri, 28 Aug 2015 12:43:35 +0000 (+0200) Subject: *-login: Added %{passdb:*} fields to login_log_format_elements X-Git-Tag: 2.2.19.rc1~165 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2dfd08e8aa16dfcc975d8a62bc8d20b2ef849d71;p=thirdparty%2Fdovecot%2Fcore.git *-login: Added %{passdb:*} fields to login_log_format_elements --- diff --git a/src/login-common/client-common.c b/src/login-common/client-common.c index ed3a35a17a..5e28807cee 100644 --- a/src/login-common/client-common.c +++ b/src/login-common/client-common.c @@ -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 { diff --git a/src/login-common/client-common.h b/src/login-common/client-common.h index d19b10be81..1ccc932ac0 100644 --- a/src/login-common/client-common.h +++ b/src/login-common/client-common.h @@ -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; diff --git a/src/login-common/sasl-server.c b/src/login-common/sasl-server.c index 2e1e675ff8..784691fc83 100644 --- a/src/login-common/sasl-server.c +++ b/src/login-common/sasl-server.c @@ -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++) {