doveadm-settings.c revision 905780639d25a7d21b8a794f8735cadc34d20c2a
89a126810703c666309310d0f3189e9834d70b5bTimo Sirainen/* Copyright (c) 2010-2016 Dovecot authors, see the included COPYING file */
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen#include "lib.h"
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen#include "buffer.h"
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen#include "settings-parser.h"
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen#include "service-settings.h"
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen#include "mail-storage-settings.h"
6246b93fb37890dcb2f4df9896438f3f376ab284Timo Sirainen#include "doveadm-settings.h"
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainenstatic bool doveadm_settings_check(void *_set, pool_t pool, const char **error_r);
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen/* <settings checks> */
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainenstatic struct file_listener_settings doveadm_unix_listeners_array[] = {
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen { "doveadm-server", 0600, "", "" }
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen};
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainenstatic struct file_listener_settings *doveadm_unix_listeners[] = {
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen &doveadm_unix_listeners_array[0]
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen};
660b4d36110c44b1e4b4b45a78c22d1569ccdb54Timo Sirainenstatic buffer_t doveadm_unix_listeners_buf = {
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen doveadm_unix_listeners, sizeof(doveadm_unix_listeners), { NULL, }
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen};
283ccfe110ed62e48f36e0d84e47da8cae5106beTimo Sirainen/* </settings checks> */
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainenstruct service_settings doveadm_service_settings = {
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .name = "doveadm",
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .protocol = "",
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .type = "",
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .executable = "doveadm-server",
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen .user = "",
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .group = "",
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .privileged_group = "",
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .extra_groups = "",
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .chroot = "",
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .drop_priv_before_exec = FALSE,
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .process_min_avail = 0,
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .process_limit = 0,
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .client_limit = 1,
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .service_count = 1,
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .idle_kill = 0,
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .vsz_limit = (uoff_t)-1,
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .unix_listeners = { { &doveadm_unix_listeners_buf,
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen sizeof(doveadm_unix_listeners[0]) } },
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .fifo_listeners = ARRAY_INIT,
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .inet_listeners = ARRAY_INIT
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen};
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen#undef DEF
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen#define DEF(type, name) \
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen { type, #name, offsetof(struct doveadm_settings, name), NULL }
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainenstatic const struct setting_define doveadm_setting_defines[] = {
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen DEF(SET_STR, base_dir),
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen DEF(SET_STR, libexec_dir),
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen DEF(SET_STR, mail_plugins),
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen DEF(SET_STR, mail_plugin_dir),
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen DEF(SET_BOOL, auth_debug),
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen DEF(SET_STR, auth_socket_path),
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen DEF(SET_STR, doveadm_socket_path),
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen DEF(SET_UINT, doveadm_worker_count),
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen DEF(SET_IN_PORT, doveadm_port),
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen { SET_ALIAS, "doveadm_proxy_port", 0, NULL },
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen DEF(SET_STR, doveadm_username),
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen DEF(SET_STR, doveadm_password),
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen DEF(SET_STR, doveadm_allowed_commands),
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen DEF(SET_STR, dsync_alt_char),
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen DEF(SET_STR, dsync_remote_cmd),
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen DEF(SET_STR, ssl_client_ca_dir),
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen DEF(SET_STR, ssl_client_ca_file),
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen DEF(SET_STR, director_username_hash),
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen DEF(SET_STR, doveadm_api_key),
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen DEF(SET_STR, dsync_features),
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen { SET_STRLIST, "plugin", offsetof(struct doveadm_settings, plugin_envs), NULL },
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen SETTING_DEFINE_LIST_END
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen};
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainenconst struct doveadm_settings doveadm_default_settings = {
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .base_dir = PKG_RUNDIR,
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .libexec_dir = PKG_LIBEXECDIR,
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .mail_plugins = "",
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .mail_plugin_dir = MODULEDIR,
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen .auth_debug = FALSE,
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen .auth_socket_path = "auth-userdb",
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .doveadm_socket_path = "doveadm-server",
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .doveadm_worker_count = 0,
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .doveadm_port = 0,
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen .doveadm_username = "doveadm",
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen .doveadm_password = "",
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen .doveadm_allowed_commands = "",
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .dsync_alt_char = "_",
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .dsync_remote_cmd = "ssh -l%{login} %{host} doveadm dsync-server -u%u -U",
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .dsync_features = "",
d6500661eb699ff335ac570c8646b6e067e1aac6Timo Sirainen .ssl_client_ca_dir = "",
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen .ssl_client_ca_file = "",
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .director_username_hash = "%Lu",
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen .doveadm_api_key = "",
d514e6e6ea2320c18c58e0ade9184f5aa67d491bTimo Sirainen
d514e6e6ea2320c18c58e0ade9184f5aa67d491bTimo Sirainen .plugin_envs = ARRAY_INIT
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen};
36d2b3dc8766ef336a289a51075ca2f3236ef1efTimo Sirainen
36d2b3dc8766ef336a289a51075ca2f3236ef1efTimo Sirainenstatic const struct setting_parser_info *doveadm_setting_dependencies[] = {
5561fe7754843250d0f2701332f63467f77f71dbTimo Sirainen &mail_user_setting_parser_info,
5561fe7754843250d0f2701332f63467f77f71dbTimo Sirainen NULL
5561fe7754843250d0f2701332f63467f77f71dbTimo Sirainen};
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainenconst struct setting_parser_info doveadm_setting_parser_info = {
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .module_name = "doveadm",
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .defines = doveadm_setting_defines,
d6500661eb699ff335ac570c8646b6e067e1aac6Timo Sirainen .defaults = &doveadm_default_settings,
d6500661eb699ff335ac570c8646b6e067e1aac6Timo Sirainen
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen .type_offset = (size_t)-1,
d6500661eb699ff335ac570c8646b6e067e1aac6Timo Sirainen .struct_size = sizeof(struct doveadm_settings),
d6500661eb699ff335ac570c8646b6e067e1aac6Timo Sirainen
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen .parent_offset = (size_t)-1,
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen .check_func = doveadm_settings_check,
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen .dependencies = doveadm_setting_dependencies
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen};
283ccfe110ed62e48f36e0d84e47da8cae5106beTimo Sirainen
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainenstruct doveadm_settings *doveadm_settings;
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainenconst struct master_service_settings *service_set;
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainenstatic void
d6500661eb699ff335ac570c8646b6e067e1aac6Timo Sirainenfix_base_path(struct doveadm_settings *set, pool_t pool, const char **str)
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen{
d514e6e6ea2320c18c58e0ade9184f5aa67d491bTimo Sirainen if (*str != NULL && **str != '\0' && **str != '/')
d514e6e6ea2320c18c58e0ade9184f5aa67d491bTimo Sirainen *str = p_strconcat(pool, set->base_dir, "/", *str, NULL);
d514e6e6ea2320c18c58e0ade9184f5aa67d491bTimo Sirainen}
d514e6e6ea2320c18c58e0ade9184f5aa67d491bTimo Sirainen
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen/* <settings checks> */
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainenstruct dsync_feature_list {
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen const char *name;
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen enum dsync_features num;
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen};
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen
2a4e8f370c566ffd360922227fc73d0ee36abee7Timo Sirainenstatic const struct dsync_feature_list dsync_feature_list[] = {
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen { "empty-header-workaround", DSYNC_FEATURE_EMPTY_HDR_WORKAROUND },
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen { NULL, 0 }
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen};
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainenstatic int
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainendsync_settings_parse_features(struct doveadm_settings *set,
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen const char **error_r)
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen{
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen enum dsync_features features = 0;
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen const struct dsync_feature_list *list;
6246b93fb37890dcb2f4df9896438f3f376ab284Timo Sirainen const char *const *str;
6246b93fb37890dcb2f4df9896438f3f376ab284Timo Sirainen
c8b29548f94160e0fe2f02e66d899d9e6cb495b3Timo Sirainen str = t_strsplit_spaces(set->dsync_features, " ,");
c8b29548f94160e0fe2f02e66d899d9e6cb495b3Timo Sirainen for (; *str != NULL; str++) {
c8b29548f94160e0fe2f02e66d899d9e6cb495b3Timo Sirainen list = dsync_feature_list;
c8b29548f94160e0fe2f02e66d899d9e6cb495b3Timo Sirainen for (; list->name != NULL; list++) {
c8b29548f94160e0fe2f02e66d899d9e6cb495b3Timo Sirainen if (strcasecmp(*str, list->name) == 0) {
c8b29548f94160e0fe2f02e66d899d9e6cb495b3Timo Sirainen features |= list->num;
d6500661eb699ff335ac570c8646b6e067e1aac6Timo Sirainen break;
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen }
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen }
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen if (list->name == NULL) {
d6500661eb699ff335ac570c8646b6e067e1aac6Timo Sirainen *error_r = t_strdup_printf("dsync_features: "
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen "Unknown feature: %s", *str);
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen return -1;
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen }
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen }
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen set->parsed_features = features;
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen return 0;
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen}
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainenstatic bool doveadm_settings_check(void *_set, pool_t pool ATTR_UNUSED,
6246b93fb37890dcb2f4df9896438f3f376ab284Timo Sirainen const char **error_r)
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen{
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen struct doveadm_settings *set = _set;
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen#ifndef CONFIG_BINARY
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen fix_base_path(set, pool, &set->auth_socket_path);
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen fix_base_path(set, pool, &set->doveadm_socket_path);
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen#endif
if (*set->dsync_alt_char == '\0') {
*error_r = "dsync_alt_char must not be empty";
return FALSE;
}
if (dsync_settings_parse_features(set, error_r) != 0)
return FALSE;
return TRUE;
}
/* </settings checks> */