mail-storage-settings.c revision de83c1e095ba081ef80f630bcd933e5e28aff94b
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2005-2012 Dovecot authors, see the included COPYING file */
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainenstatic bool mail_storage_settings_check(void *_set, pool_t pool, const char **error_r);
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainenstatic bool namespace_settings_check(void *_set, pool_t pool, const char **error_r);
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainenstatic bool mailbox_settings_check(void *_set, pool_t pool, const char **error_r);
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainenstatic bool mail_user_settings_check(void *_set, pool_t pool, const char **error_r);
1a5573ebc32fae2fe576ec544e1781323c1db609Timo Sirainen { type, #name, offsetof(struct mail_storage_settings, name), NULL }
82d1fe3d5d04fb11e3e89cce03dc4de191e58f75Timo Sirainenstatic const struct setting_define mail_storage_setting_defines[] = {
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainenconst struct mail_storage_settings mail_storage_default_settings = {
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainenconst struct setting_parser_info mail_storage_setting_parser_info = {
4ba9a1d3facc515b3feb5238a16bcf91f76fac61Timo Sirainen .struct_size = sizeof(struct mail_storage_settings),
d46a1e3f999dda802dc5137e883adcd7a6629cd3Timo Sirainen { type, #name, offsetof(struct mailbox_settings, name), NULL }
d46a1e3f999dda802dc5137e883adcd7a6629cd3Timo Sirainenstatic const struct setting_define mailbox_setting_defines[] = {
d1e843e77f4760e303c53d9fce10123fc8d230a1Timo Sirainen { SET_ENUM, "auto", offsetof(struct mailbox_settings, autocreate), NULL } ,
08e9fd42eb8007e1f9db62c088eef74f906114a5Josef 'Jeff' Sipekconst struct mailbox_settings mailbox_default_settings = {
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainenconst struct setting_parser_info mailbox_setting_parser_info = {
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen .type_offset = offsetof(struct mailbox_settings, name),
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen .struct_size = sizeof(struct mailbox_settings),
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen { type, #name, offsetof(struct mail_namespace_settings, name), NULL }
afe1da042382720393eca6497253106e4eec75e0Timo Sirainen offsetof(struct mail_namespace_settings, field), defines }
afe1da042382720393eca6497253106e4eec75e0Timo Sirainenstatic const struct setting_define mail_namespace_setting_defines[] = {
7900eb30bac4a46b259522c58362884661483d7cJosef 'Jeff' Sipek DEFLIST_UNIQUE(mailboxes, "mailbox", &mailbox_setting_parser_info),
98c217499d578495e982ea6010ebff831e9669aeMartti Rannanjärviconst struct mail_namespace_settings mail_namespace_default_settings = {
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainenconst struct setting_parser_info mail_namespace_setting_parser_info = {
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen .type_offset = offsetof(struct mail_namespace_settings, name),
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo Sirainen .struct_size = sizeof(struct mail_namespace_settings),
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen .parent_offset = offsetof(struct mail_namespace_settings, user_set),
98c217499d578495e982ea6010ebff831e9669aeMartti Rannanjärvi .parent = &mail_user_setting_parser_info,
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen { type, #name, offsetof(struct mail_user_settings, name), NULL }
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen offsetof(struct mail_user_settings, field), defines }
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainenstatic const struct setting_define mail_user_setting_defines[] = {
f318b3dbe2acc177b8ee1c160e4b5b14e7f2cd41Timo Sirainen DEFLIST_UNIQUE(namespaces, "namespace", &mail_namespace_setting_parser_info),
f318b3dbe2acc177b8ee1c160e4b5b14e7f2cd41Timo Sirainen { SET_STRLIST, "plugin", offsetof(struct mail_user_settings, plugin_envs), NULL },
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainenstatic const struct mail_user_settings mail_user_default_settings = {
c0d069950af1dbc6a4e5c3de3bf2e437796e3ae0Timo Sirainenconst struct setting_parser_info mail_user_setting_parser_info = {
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen .struct_size = sizeof(struct mail_user_settings),
4b41116563110d00330896a568eff1078c382827Timo Sirainenmail_user_set_get_driver_settings(const struct setting_parser_info *info,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen dset = settings_find_dynamic(info, set, driver);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen i_panic("Default settings not found for storage driver %s",
8a13b020f90e080570658b18c042e7e352c8b14fTimo Sirainenmail_user_set_get_storage_set(struct mail_user *user)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen return mail_user_set_get_driver_settings(user->set_info, user->set,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenconst void *mail_storage_get_driver_settings(struct mail_storage *storage)
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen return mail_user_set_get_driver_settings(storage->user->set_info,
f3bb2fbe87425dc89a839908985af496f7f65702Timo Sirainenmail_storage_settings_to_index_flags(const struct mail_storage_settings *set)
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen index_flags |= MAIL_INDEX_OPEN_FLAG_MMAP_DISABLE;
2ebeb22b9a8a8bb7fbe2f2e2908478a220792b87Timo Sirainen index_flags |= MAIL_INDEX_OPEN_FLAG_DOTLOCK_USE_EXCL;
bd4d0a1a7c0626452b8d82f37e3ec07267ac9896Timo Sirainen index_flags |= MAIL_INDEX_OPEN_FLAG_NFS_FLUSH;
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen unsigned int i, j, count;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen storages = array_get(&mail_storage_classes, &count);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen parsers = p_new(pool, struct dynamic_settings_parser, count + 1);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen parsers[0].name = MAIL_STORAGE_SET_DRIVER_NAME;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen parsers[0].info = &mail_storage_setting_parser_info;
0177594fa5217b02001f4ec8752154fd2b05c545Timo Sirainen if (storages[i]->v.get_setting_parser_info == NULL)
0177594fa5217b02001f4ec8752154fd2b05c545Timo Sirainen parsers[j].info = storages[i]->v.get_setting_parser_info();
2c70086138fe7ac9abf52cd4223c224fe0bbb488Timo Sirainenfix_base_path(struct mail_user_settings *set, pool_t pool, const char **str)
2b9dbb270ad82e58d5f3581436e6f143176d5819Timo Sirainen if (*str != NULL && **str != '\0' && **str != '/')
2b9dbb270ad82e58d5f3581436e6f143176d5819Timo Sirainen *str = p_strconcat(pool, set->base_dir, "/", *str, NULL);
1ae5d61ec366fdb2f3c5b150ca378d6141b0f4bdTimo Sirainen/* <settings checks> */
1ae5d61ec366fdb2f3c5b150ca378d6141b0f4bdTimo Sirainenstatic bool mail_storage_settings_check(void *_set, pool_t pool ATTR_UNUSED,
1ae5d61ec366fdb2f3c5b150ca378d6141b0f4bdTimo Sirainen const char **error_r)
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen const char *p, *error;
b644a77b00ce21c67a7becda974a12dfe3a946e4Timo Sirainen if (strcmp(set->mail_fsync, "optimized") == 0)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen set->parsed_fsync_mode = FSYNC_MODE_OPTIMIZED;
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen else if (strcmp(set->mail_fsync, "never") == 0)
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen else if (strcmp(set->mail_fsync, "always") == 0)
eecb235c14b49c01774134ea593c266f2d2c2be1Timo Sirainen *error_r = t_strdup_printf("Unknown mail_fsync: %s",
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen if (set->mail_nfs_index && !set->mmap_disable) {
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen *error_r = "mail_nfs_index=yes requires mmap_disable=yes";
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen set->parsed_fsync_mode != FSYNC_MODE_ALWAYS) {
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen *error_r = "mail_nfs_index=yes requires mail_fsync=always";
546335814920fb6b5b44c68c7803e654eefeae9dTimo Sirainen *error_r = t_strdup_printf("Unknown lock_method: %s",
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen for (p = set->pop3_uidl_format; *p != '\0'; p++) {
2b9dbb270ad82e58d5f3581436e6f143176d5819Timo Sirainen "Unknown pop3_uidl_format variable: %%%c", c);
817d027593510c3ba70ad542ce0011f5f6916d1eTimo Sirainen *error_r = "pop3_uidl_format setting doesn't contain any "
817d027593510c3ba70ad542ce0011f5f6916d1eTimo Sirainen "%% variables.";
6ae329de09afb7214c906d762320847e05469d53Timo Sirainen if (strchr(set->mail_attachment_hash, '/') != NULL) {
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen "must not contain '/' characters";
7e2671b295927b461adc8b6c4ed6a1c4761fb323Timo Sirainen if (hash_format_init(set->mail_attachment_hash, &format, &error) < 0) {
7e2671b295927b461adc8b6c4ed6a1c4761fb323Timo Sirainen *error_r = t_strconcat("Invalid mail_attachment_hash setting: ",
fcfe85637e1ee14a9fc39c41fd6ceca106301542Timo Sirainen if (strchr(set->mail_attachment_hash, '-') != NULL) {
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen "must not contain '-' characters";
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainenstatic bool namespace_settings_check(void *_set, pool_t pool ATTR_UNUSED,
4bbd396aa6198c84f3f7763b6e8a63a26e97e141Timo Sirainen const char **error_r)
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen struct mail_namespace_settings *const *namespaces;
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen unsigned int i, count;
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen if (ns->separator[0] != '\0' && ns->separator[1] != '\0') {
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen "Hierarchy separator must be only one character long",
eb64c3586d854cddd693f0b811d897399076a441Timo Sirainen if (array_is_created(&ns->user_set->namespaces)) {
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen namespaces = array_get(&ns->user_set->namespaces,
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen for (i = 0; i < count; i++) {
b3484b5b1f47e4cf112f0e371478a2d7794b31bbTimo Sirainen if (strcmp(namespaces[i]->prefix, ns->alias_for) == 0)
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen "Namespace '%s': alias_for points to "
4e3bcf7fdaeef92dd07a2acb1ded58422a907e87Timo Sirainen "unknown namespace: %s", name, ns->alias_for);
540555c5b435203e1c26c8e7b924b2643ae07ae3Timo Sirainen "Namespace '%s': alias_for chaining isn't "
aa247243412a49f9bdebf7255e131dc6ece4ed46Timo Sirainenstatic bool mailbox_special_use_exists(const char *name)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenmailbox_special_use_check(struct mailbox_settings *set, pool_t pool,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char **error_r)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen unsigned int i;
6df0ab0c1ab91f06b6418cb30eff44405a1b8f02Timo Sirainen uses = t_strsplit_spaces(set->special_use, " ");
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen "mailbox %s: unknown special_use: %s",
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen /* make sure there are no extra spaces */
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenstatic bool mailbox_settings_check(void *_set, pool_t pool,
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen const char **error_r)
0206dc57f2c04da69599dea5816235cfeb2b897aMartti Rannanjärvi *error_r = t_strdup_printf("mailbox %s: name isn't valid UTF-8",
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen if (!mailbox_special_use_check(set, pool, error_r))
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstatic bool mail_user_settings_check(void *_set, pool_t pool ATTR_UNUSED,
13e130c3af3032982de6b1d13c6dcddda9164848Timo Sirainen fix_base_path(set, pool, &set->auth_socket_path);
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen access(set->mail_plugin_dir, R_OK | X_OK) < 0) {
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen "mail_plugin_dir: access(%s) failed: %m",
2c8ca7e88ec881c473fb90e5f647c1f563877164Timo Sirainen/* </settings checks> */