From: Timo Sirainen Date: Thu, 20 Oct 2016 17:31:33 +0000 (+0300) Subject: director: Code cleanup - moved username_hash generation to director.h X-Git-Tag: 2.3.0.rc1~2668 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=de92873c366becfaea1554642f89b9169d7955e2;p=thirdparty%2Fdovecot%2Fcore.git director: Code cleanup - moved username_hash generation to director.h It's not really user_directory specific. This is especially important in the following patches that add per-tag user_directories. It's also not always known which tag the username_hash refers to, so there can't be different tag-specific username_hash generators. --- diff --git a/src/director/director-request.c b/src/director/director-request.c index 3b5c8d9c47..24d5c24f71 100644 --- a/src/director/director-request.c +++ b/src/director/director-request.c @@ -127,8 +127,8 @@ void director_request(struct director *dir, const char *username, struct director_request *request; unsigned int username_hash; - if (!user_directory_get_username_hash(dir->users, username, - &username_hash)) { + if (!director_get_username_hash(dir, username, + &username_hash)) { callback(NULL, NULL, "Failed to expand director_username_hash", context); return; } diff --git a/src/director/director.c b/src/director/director.c index ea32812ee8..90280b7181 100644 --- a/src/director/director.c +++ b/src/director/director.c @@ -12,6 +12,7 @@ #include "istream.h" #include "ostream.h" #include "iostream-temp.h" +#include "mail-user-hash.h" #include "user-directory.h" #include "mail-host.h" #include "director-host.h" @@ -1299,7 +1300,6 @@ director_init(const struct director_settings *set, i_array_init(&dir->pending_requests, 16); i_array_init(&dir->connections, 8); dir->users = user_directory_init(set->director_user_expire, - set->director_username_hash, director_user_freed); dir->mail_hosts = mail_hosts_init(set->director_consistent_hashing); @@ -1390,6 +1390,20 @@ void director_iterate_users_deinit(struct director_user_iter **_iter) i_free(iter); } +bool +director_get_username_hash(struct director *dir, const char *username, + unsigned int *hash_r) +{ + const char *error; + + if (mail_user_hash(username, dir->set->director_username_hash, hash_r, + &error)) + return TRUE; + i_error("Failed to expand director_user_expire=%s: %s", + dir->set->director_username_hash, error); + return FALSE; +} + void directors_init(void) { user_move_throttle = diff --git a/src/director/director.h b/src/director/director.h index 11a515cfbb..590366b39b 100644 --- a/src/director/director.h +++ b/src/director/director.h @@ -235,6 +235,10 @@ void director_update_send_version(struct director *dir, int director_connect_host(struct director *dir, struct director_host *host); +bool +director_get_username_hash(struct director *dir, const char *username, + unsigned int *hash_r); + void directors_init(void); void directors_deinit(void); diff --git a/src/director/doveadm-connection.c b/src/director/doveadm-connection.c index b352486c2e..99395a9a69 100644 --- a/src/director/doveadm-connection.c +++ b/src/director/doveadm-connection.c @@ -567,8 +567,8 @@ doveadm_cmd_user_lookup(struct doveadm_connection *conn, tag = args[1] != NULL ? args[1] : ""; } if (str_to_uint(username, &username_hash) < 0) { - if (!user_directory_get_username_hash(users, - username, &username_hash)) { + if (!director_get_username_hash(conn->dir, + username, &username_hash)) { o_stream_nsend_str(conn->output, "TRYAGAIN\n"); return 1; } @@ -657,8 +657,8 @@ doveadm_cmd_user_move(struct doveadm_connection *conn, const char *const *args) } if (str_to_uint(args[0], &username_hash) < 0) { - if (!user_directory_get_username_hash(users, - args[0], &username_hash)) { + if (!director_get_username_hash(conn->dir, + args[0], &username_hash)) { o_stream_nsend_str(conn->output, "TRYAGAIN\n"); return 1; } diff --git a/src/director/notify-connection.c b/src/director/notify-connection.c index 05ba2ba40d..eedf1ca0ac 100644 --- a/src/director/notify-connection.c +++ b/src/director/notify-connection.c @@ -42,7 +42,7 @@ static void notify_connection_input(struct notify_connection *conn) unsigned int hash; while ((line = i_stream_read_next_line(conn->input)) != NULL) { - if (!user_directory_get_username_hash(conn->dir->users, line, &hash)) + if (!director_get_username_hash(conn->dir, line, &hash)) continue; notify_update_user(conn->dir, line, hash); } diff --git a/src/director/test-user-directory.c b/src/director/test-user-directory.c index 9b97a00a93..4f00d19d72 100644 --- a/src/director/test-user-directory.c +++ b/src/director/test-user-directory.c @@ -47,7 +47,7 @@ static void test_user_directory_ascending(void) unsigned int i; test_begin("user directory ascending"); - dir = user_directory_init(USER_DIR_TIMEOUT, "%u", NULL); + dir = user_directory_init(USER_DIR_TIMEOUT, NULL); (void)user_directory_add(dir, 1, host, ioloop_time + count+1); for (i = 0; i < count; i++) @@ -65,7 +65,7 @@ static void test_user_directory_descending(void) unsigned int i; test_begin("user directory descending"); - dir = user_directory_init(USER_DIR_TIMEOUT, "%u", NULL); + dir = user_directory_init(USER_DIR_TIMEOUT, NULL); for (i = 0; i < count; i++) (void)user_directory_add(dir, i+1, host, ioloop_time - i); @@ -82,7 +82,7 @@ static void test_user_directory_random(void) unsigned int i, count = 10000 + rand()%10000; test_begin("user directory random"); - dir = user_directory_init(USER_DIR_TIMEOUT, "%u", NULL); + dir = user_directory_init(USER_DIR_TIMEOUT, NULL); for (i = 0; i < count; i++) { if (rand() % 10 == 0) timestamp = ioloop_time; diff --git a/src/director/user-directory.c b/src/director/user-directory.c index aa1c365855..8856650588 100644 --- a/src/director/user-directory.c +++ b/src/director/user-directory.c @@ -5,7 +5,6 @@ #include "array.h" #include "hash.h" #include "llist.h" -#include "mail-user-hash.h" #include "mail-host.h" #include "user-directory.h" @@ -30,7 +29,6 @@ struct user_directory { ARRAY(struct user_directory_iter *) iters; void (*user_free_hook)(struct user *); - char *username_hash_fmt; unsigned int timeout_secs; /* If user's expire time is less than this many seconds away, don't assume that other directors haven't yet expired it */ @@ -256,19 +254,6 @@ void user_directory_sort(struct user_directory *dir) array_free(&users); } -bool user_directory_get_username_hash(struct user_directory *dir, - const char *username, - unsigned int *hash_r) -{ - const char *error; - - if (mail_user_hash(username, dir->username_hash_fmt, hash_r, &error)) - return TRUE; - i_error("Failed to expand director_user_expire=%s: %s", - dir->username_hash_fmt, error); - return FALSE; -} - bool user_directory_user_is_recently_updated(struct user_directory *dir, struct user *user) { @@ -286,7 +271,7 @@ bool user_directory_user_is_near_expiring(struct user_directory *dir, } struct user_directory * -user_directory_init(unsigned int timeout_secs, const char *username_hash_fmt, +user_directory_init(unsigned int timeout_secs, void (*user_free_hook)(struct user *)) { struct user_directory *dir; @@ -303,7 +288,6 @@ user_directory_init(unsigned int timeout_secs, const char *username_hash_fmt, I_MAX(dir->user_near_expiring_secs, USER_NEAR_EXPIRING_MIN); i_assert(dir->timeout_secs/2 > dir->user_near_expiring_secs); - dir->username_hash_fmt = i_strdup(username_hash_fmt); dir->user_free_hook = user_free_hook; hash_table_create_direct(&dir->hash, default_pool, 0); i_array_init(&dir->iters, 8); @@ -322,7 +306,6 @@ void user_directory_deinit(struct user_directory **_dir) user_free(dir, dir->head); hash_table_destroy(&dir->hash); array_free(&dir->iters); - i_free(dir->username_hash_fmt); i_free(dir); } diff --git a/src/director/user-directory.h b/src/director/user-directory.h index 0be4a8c829..1cbd55dcce 100644 --- a/src/director/user-directory.h +++ b/src/director/user-directory.h @@ -29,7 +29,7 @@ struct user { /* Create a new directory. Users are dropped if their time gets older than timeout_secs. */ struct user_directory * -user_directory_init(unsigned int timeout_secs, const char *username_hash_fmt, +user_directory_init(unsigned int timeout_secs, void (*user_free_hook)(struct user *)); void user_directory_deinit(struct user_directory **dir); @@ -52,10 +52,6 @@ void user_directory_remove_host(struct user_directory *dir, timestamps based on remote director's user list after handshake. */ void user_directory_sort(struct user_directory *dir); -bool user_directory_get_username_hash(struct user_directory *dir, - const char *username, - unsigned int *hash_r); - bool user_directory_user_is_recently_updated(struct user_directory *dir, struct user *user); bool user_directory_user_is_near_expiring(struct user_directory *dir,