doveadm-settings.c revision 8c5d1951a2e5bced3bfcb7fc6c2fac8d4bf47341
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2010-2013 Dovecot authors, see the included COPYING file */
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen#include "lib.h"
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen#include "buffer.h"
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen#include "settings-parser.h"
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen#include "service-settings.h"
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen#include "mail-storage-settings.h"
be1ce4990d3e5eda1e80a032e355e41aabc29d6fTimo Sirainen#include "doveadm-settings.h"
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainenstatic bool doveadm_settings_check(void *_set, pool_t pool, const char **error_r);
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen/* <settings checks> */
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainenstatic struct file_listener_settings doveadm_unix_listeners_array[] = {
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen { "doveadm-server", 0600, "", "" }
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen};
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainenstatic struct file_listener_settings *doveadm_unix_listeners[] = {
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen &doveadm_unix_listeners_array[0]
9e808b253bf5c20878fedfb44e4f2273db31da7cTimo Sirainen};
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainenstatic buffer_t doveadm_unix_listeners_buf = {
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen doveadm_unix_listeners, sizeof(doveadm_unix_listeners), { 0, }
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen};
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen/* </settings checks> */
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
ccd4a548556a72a74a8183fa46cdd616dceae456Timo Sirainenstruct service_settings doveadm_service_settings = {
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen .name = "doveadm",
8c0e314c57b91253c8b2c3491e162967bd3a2cd3Timo Sirainen .protocol = "",
8c0e314c57b91253c8b2c3491e162967bd3a2cd3Timo Sirainen .type = "",
8c0e314c57b91253c8b2c3491e162967bd3a2cd3Timo Sirainen .executable = "doveadm-server",
08a0b7b0d0444875001847ef2b1b7b76122620abTimo Sirainen .user = "",
e50c1eb31159d8ccc116d8fb487a5e231d2033a1Timo Sirainen .group = "",
e50c1eb31159d8ccc116d8fb487a5e231d2033a1Timo Sirainen .privileged_group = "",
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen .extra_groups = "",
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen .chroot = "",
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen .drop_priv_before_exec = FALSE,
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
08a0b7b0d0444875001847ef2b1b7b76122620abTimo Sirainen .process_min_avail = 0,
08a0b7b0d0444875001847ef2b1b7b76122620abTimo Sirainen .process_limit = 0,
da9f6acdcb303d0fe5160b669668aedf39c8f45aTimo Sirainen .client_limit = 1,
08a0b7b0d0444875001847ef2b1b7b76122620abTimo Sirainen .service_count = 1,
08a0b7b0d0444875001847ef2b1b7b76122620abTimo Sirainen .idle_kill = 0,
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen .vsz_limit = (uoff_t)-1,
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen .unix_listeners = { { &doveadm_unix_listeners_buf,
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen sizeof(doveadm_unix_listeners[0]) } },
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen .fifo_listeners = ARRAY_INIT,
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen .inet_listeners = ARRAY_INIT
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen};
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen#undef DEF
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen#define DEF(type, name) \
14f172fb8fc5585ec450ae3c233c676a033e5324Timo Sirainen { type, #name, offsetof(struct doveadm_settings, name), NULL }
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
04870054863757edf048c81dcce3c5e7dec453cdTimo Sirainenstatic const struct setting_define doveadm_setting_defines[] = {
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen DEF(SET_STR, base_dir),
14f172fb8fc5585ec450ae3c233c676a033e5324Timo Sirainen DEF(SET_STR, libexec_dir),
14f172fb8fc5585ec450ae3c233c676a033e5324Timo Sirainen DEF(SET_STR, mail_plugins),
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen DEF(SET_STR, mail_plugin_dir),
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen DEF(SET_STR, doveadm_socket_path),
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen DEF(SET_UINT, doveadm_worker_count),
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen DEF(SET_UINT, doveadm_port),
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen { SET_ALIAS, "doveadm_proxy_port", 0, NULL },
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen DEF(SET_STR, doveadm_password),
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen DEF(SET_STR, doveadm_allowed_commands),
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen DEF(SET_STR, dsync_alt_char),
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen DEF(SET_STR, dsync_remote_cmd),
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen DEF(SET_STR, ssl_client_ca_dir),
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen DEF(SET_STR, ssl_crypto_device),
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen { SET_STRLIST, "plugin", offsetof(struct doveadm_settings, plugin_envs), NULL },
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen SETTING_DEFINE_LIST_END
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen};
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainenconst struct doveadm_settings doveadm_default_settings = {
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen .base_dir = PKG_RUNDIR,
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen .libexec_dir = PKG_LIBEXECDIR,
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen .mail_plugins = "",
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen .mail_plugin_dir = MODULEDIR,
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen .doveadm_socket_path = "doveadm-server",
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen .doveadm_worker_count = 0,
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen .doveadm_port = 0,
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen .doveadm_password = "",
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen .doveadm_allowed_commands = "",
9e808b253bf5c20878fedfb44e4f2273db31da7cTimo Sirainen .dsync_alt_char = "_",
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen .dsync_remote_cmd = "ssh -l%{login} %{host} doveadm dsync-server -u%u",
9e808b253bf5c20878fedfb44e4f2273db31da7cTimo Sirainen
e7ca5f820d6a1a8fe549a2966ac707a60e055ef4Timo Sirainen .ssl_client_ca_dir = "",
7dc2c953377fdf3f98e392c2eb7c9caa3dfc5d4fTimo Sirainen .ssl_crypto_device = "",
9e808b253bf5c20878fedfb44e4f2273db31da7cTimo Sirainen
9fa54323c1382c969190ec46eb1c7ca783aec9b9Timo Sirainen .plugin_envs = ARRAY_INIT
9fa54323c1382c969190ec46eb1c7ca783aec9b9Timo Sirainen};
9fa54323c1382c969190ec46eb1c7ca783aec9b9Timo Sirainen
9e808b253bf5c20878fedfb44e4f2273db31da7cTimo Sirainenstatic const struct setting_parser_info *doveadm_setting_dependencies[] = {
9e808b253bf5c20878fedfb44e4f2273db31da7cTimo Sirainen &mail_user_setting_parser_info,
9e808b253bf5c20878fedfb44e4f2273db31da7cTimo Sirainen NULL
9e808b253bf5c20878fedfb44e4f2273db31da7cTimo Sirainen};
9e808b253bf5c20878fedfb44e4f2273db31da7cTimo Sirainen
9e808b253bf5c20878fedfb44e4f2273db31da7cTimo Sirainenconst struct setting_parser_info doveadm_setting_parser_info = {
9e808b253bf5c20878fedfb44e4f2273db31da7cTimo Sirainen .module_name = "doveadm",
9e808b253bf5c20878fedfb44e4f2273db31da7cTimo Sirainen .defines = doveadm_setting_defines,
e5acc283bf030b0b5c79ca4e52d315c516a299faPascal Volk .defaults = &doveadm_default_settings,
e5acc283bf030b0b5c79ca4e52d315c516a299faPascal Volk
9e808b253bf5c20878fedfb44e4f2273db31da7cTimo Sirainen .type_offset = (size_t)-1,
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen .struct_size = sizeof(struct doveadm_settings),
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen .parent_offset = (size_t)-1,
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen .check_func = doveadm_settings_check,
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen .dependencies = doveadm_setting_dependencies
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen};
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen
395ad9a760c494a2106fada1392c5432a1629de6Timo Sirainenstruct doveadm_settings *doveadm_settings;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainenconst struct master_service_settings *service_set;
395ad9a760c494a2106fada1392c5432a1629de6Timo Sirainen
395ad9a760c494a2106fada1392c5432a1629de6Timo Sirainenstatic void
395ad9a760c494a2106fada1392c5432a1629de6Timo Sirainenfix_base_path(struct doveadm_settings *set, pool_t pool, const char **str)
395ad9a760c494a2106fada1392c5432a1629de6Timo Sirainen{
395ad9a760c494a2106fada1392c5432a1629de6Timo Sirainen if (*str != NULL && **str != '\0' && **str != '/')
395ad9a760c494a2106fada1392c5432a1629de6Timo Sirainen *str = p_strconcat(pool, set->base_dir, "/", *str, NULL);
395ad9a760c494a2106fada1392c5432a1629de6Timo Sirainen}
395ad9a760c494a2106fada1392c5432a1629de6Timo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen/* <settings checks> */
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainenstatic bool doveadm_settings_check(void *_set, pool_t pool ATTR_UNUSED,
da9f6acdcb303d0fe5160b669668aedf39c8f45aTimo Sirainen const char **error_r)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen{
da9f6acdcb303d0fe5160b669668aedf39c8f45aTimo Sirainen struct doveadm_settings *set = _set;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
da9f6acdcb303d0fe5160b669668aedf39c8f45aTimo Sirainen#ifndef CONFIG_BINARY
da9f6acdcb303d0fe5160b669668aedf39c8f45aTimo Sirainen fix_base_path(set, pool, &set->doveadm_socket_path);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen#endif
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen if (*set->dsync_alt_char == '\0') {
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen *error_r = "dsync_alt_char must not be empty";
da9f6acdcb303d0fe5160b669668aedf39c8f45aTimo Sirainen return FALSE;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen }
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen return TRUE;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen}
da9f6acdcb303d0fe5160b669668aedf39c8f45aTimo Sirainen/* </settings checks> */
da9f6acdcb303d0fe5160b669668aedf39c8f45aTimo Sirainen