user-directory.c revision afbc6221ea2dae6c86c04efbf443bd891cb61e45
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen/* Copyright (c) 2010-2016 Dovecot authors, see the included COPYING file */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen/* n% of timeout_secs */
04c3ac276103b56185119bcff9a66de7a8bb0e68Timo Sirainen/* but min/max. of this many secs */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* unsigned int username_hash => user */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* sorted by time */
1dd054126238349e1a7d3d1ffe7f8bc5fdbacb7aTimo Sirainen /* If user's expire time is less than this many seconds away,
5fb3f13537dffd15a31e997da133a721c0728af8Timo Sirainen don't assume that other directors haven't yet expired it */
5b62dea2f88165f3f4d87bba9011343f3ff415ffTimo Sirainenstatic void user_move_iters(struct user_directory *dir, struct user *user)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void user_free(struct user_directory *dir, struct user *user)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* director_user_expire is very short. user expired before
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen moving the user finished or timed out. */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen hash_table_remove(dir->hash, POINTER_CAST(user->username_hash));
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic bool user_directory_user_has_connections(struct user_directory *dir,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen time_t expire_timestamp = user->timestamp + dir->timeout_secs;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen if (user->kill_state != USER_KILL_STATE_NONE) {
f605df8a4c15cc7a11e16fdde994d51473700890Timo Sirainen /* don't free this user until the kill is finished */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (expire_timestamp + USER_NEAR_EXPIRING_MAX >= ioloop_time)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen i_warning("User %u weakness appears to be stuck, removing it",
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void user_directory_drop_expired(struct user_directory *dir)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen !user_directory_user_has_connections(dir, dir->head))
5fb3f13537dffd15a31e997da133a721c0728af8Timo Sirainenunsigned int user_directory_count(struct user_directory *dir)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstruct user *user_directory_lookup(struct user_directory *dir,
unsigned int username_hash)
return user;
struct user *
user);
user);
return user;
if (users_count == 0) {
const char *username)
struct user_directory *
return dir;
struct user_directory_iter *
return iter;
return NULL;
return user;
unsigned int i, count;
for (i = 0; i < count; i++) {