#include "base64.h"
#include "str.h"
#include "wildcard-match.h"
+#include "settings-parser.h"
#include "master-service.h"
+#include "master-service-settings.h"
#include "auth-client.h"
#include "auth-master.h"
#include "auth-server-connection.h"
static void auth_cmd_help(doveadm_command_t *cmd);
+static struct auth_master_connection *
+doveadm_get_auth_master_conn(const char *auth_socket_path)
+{
+ enum auth_master_flags flags = 0;
+
+ if (doveadm_debug)
+ flags |= AUTH_MASTER_FLAG_DEBUG;
+ return auth_master_init(auth_socket_path, flags);
+}
+
static int
-cmd_user_input(const char *auth_socket_path, const struct authtest_input *input,
+cmd_user_input(struct auth_master_connection *conn,
+ const struct authtest_input *input,
const char *show_field, bool userdb)
{
const char *lookup_name = userdb ? "userdb lookup" : "passdb lookup";
- struct auth_master_connection *conn;
pool_t pool;
const char *username, *const *fields, *p;
int ret;
- if (auth_socket_path == NULL) {
- auth_socket_path = t_strconcat(doveadm_settings->base_dir,
- "/auth-userdb", NULL);
- }
-
pool = pool_alloconly_create("auth master lookup", 1024);
- conn = auth_master_init(auth_socket_path, 0);
if (userdb) {
ret = auth_master_user_lookup(conn, input->username, &input->info,
pool, &username, &fields);
}
}
}
- auth_master_deinit(&conn);
return ret;
}
}
static void
-cmd_user_list(const char *auth_socket_path, const struct authtest_input *input,
+cmd_user_list(struct auth_master_connection *conn,
+ const struct authtest_input *input,
char *const *users)
{
struct auth_master_user_list_ctx *ctx;
- struct auth_master_connection *conn;
const char *username, *user_mask = NULL;
unsigned int i;
- if (auth_socket_path == NULL) {
- auth_socket_path = t_strconcat(doveadm_settings->base_dir,
- "/auth-userdb", NULL);
- }
-
if (users[0] != NULL && users[1] == NULL)
user_mask = users[0];
- conn = auth_master_init(auth_socket_path, 0);
ctx = auth_master_user_list_init(conn, user_mask, &input->info);
while ((username = auth_master_user_list_next(ctx)) != NULL) {
for (i = 0; users[i] != NULL; i++) {
}
if (auth_master_user_list_deinit(&ctx) < 0)
i_fatal("user listing failed");
- auth_master_deinit(&conn);
}
static void cmd_auth_cache_flush(int argc, char *argv[])
{
- const char *auth_socket_path = NULL;
+ const char *master_socket_path = NULL;
struct auth_master_connection *conn;
unsigned int count;
int c;
while ((c = getopt(argc, argv, "a:")) > 0) {
switch (c) {
case 'a':
- auth_socket_path = optarg;
+ master_socket_path = optarg;
break;
default:
auth_cmd_help(cmd_auth_cache_flush);
}
argv += optind;
- if (auth_socket_path == NULL) {
- auth_socket_path = t_strconcat(doveadm_settings->base_dir,
- "/auth-master", NULL);
+ if (master_socket_path == NULL) {
+ master_socket_path = t_strconcat(doveadm_settings->base_dir,
+ "auth-master", NULL);
}
- conn = auth_master_init(auth_socket_path, 0);
+ conn = doveadm_get_auth_master_conn(master_socket_path);
if (auth_master_cache_flush(conn, (void *)argv, &count) < 0) {
i_error("Cache flush failed");
doveadm_exit_code = EX_TEMPFAIL;
static void cmd_auth_lookup(int argc, char *argv[])
{
- const char *auth_socket_path = NULL;
+ const char *auth_socket_path = doveadm_settings->auth_socket_path;
+ struct auth_master_connection *conn;
struct authtest_input input;
const char *show_field = NULL;
bool first = TRUE;
if (optind == argc)
auth_cmd_help(cmd_auth_lookup);
+ conn = doveadm_get_auth_master_conn(auth_socket_path);
while ((input.username = argv[optind++]) != NULL) {
if (first)
first = FALSE;
else
putchar('\n');
- ret = cmd_user_input(auth_socket_path, &input, show_field, FALSE);
+ ret = cmd_user_input(conn, &input, show_field, FALSE);
switch (ret) {
case -1:
doveadm_exit_code = EX_TEMPFAIL;
break;
}
}
+ auth_master_deinit(&conn);
}
static void cmd_user_mail_input_field(const char *key, const char *value,
static void cmd_user(int argc, char *argv[])
{
- const char *auth_socket_path = NULL;
+ const char *auth_socket_path = doveadm_settings->auth_socket_path;
+ struct auth_master_connection *conn;
struct authtest_input input;
const char *show_field = NULL;
struct mail_storage_service_ctx *storage_service = NULL;
if (optind == argc)
auth_cmd_help(cmd_user);
+ conn = doveadm_get_auth_master_conn(auth_socket_path);
+
have_wildcards = FALSE;
for (i = optind; argv[i] != NULL; i++) {
if (strchr(argv[i], '*') != NULL ||
}
if (have_wildcards) {
- cmd_user_list(auth_socket_path, &input, argv + optind);
+ cmd_user_list(conn, &input, argv + optind);
+ auth_master_deinit(&conn);
return;
}
MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS |
MAIL_STORAGE_SERVICE_FLAG_NO_NAMESPACES |
MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP);
+ mail_storage_service_set_auth_conn(storage_service, conn);
+ conn = NULL;
}
while ((input.username = argv[optind++]) != NULL) {
ret = !userdb_only ?
cmd_user_mail_input(storage_service, &input, show_field) :
- cmd_user_input(auth_socket_path, &input, show_field, TRUE);
+ cmd_user_input(conn, &input, show_field, TRUE);
switch (ret) {
case -1:
doveadm_exit_code = EX_TEMPFAIL;
}
if (storage_service != NULL)
mail_storage_service_deinit(&storage_service);
+ if (conn != NULL)
+ auth_master_deinit(&conn);
}
struct doveadm_cmd doveadm_cmd_auth[] = {
DEF(SET_STR, libexec_dir),
DEF(SET_STR, mail_plugins),
DEF(SET_STR, mail_plugin_dir),
+ DEF(SET_STR, auth_socket_path),
DEF(SET_STR, doveadm_socket_path),
DEF(SET_UINT, doveadm_worker_count),
DEF(SET_UINT, doveadm_port),
.libexec_dir = PKG_LIBEXECDIR,
.mail_plugins = "",
.mail_plugin_dir = MODULEDIR,
+ .auth_socket_path = "auth-userdb",
.doveadm_socket_path = "doveadm-server",
.doveadm_worker_count = 0,
.doveadm_port = 0,
struct doveadm_settings *set = _set;
#ifndef CONFIG_BINARY
+ fix_base_path(set, pool, &set->auth_socket_path);
fix_base_path(set, pool, &set->doveadm_socket_path);
#endif
if (*set->dsync_alt_char == '\0') {