mail-storage-settings.c revision de83c1e095ba081ef80f630bcd933e5e28aff94b
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2005-2012 Dovecot authors, see the included COPYING file */
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen#include "array.h"
d9076f5939edf5d20a261494b1a861dcbb0d32e2Timo Sirainen#include "hash-format.h"
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen#include "var-expand.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "unichar.h"
5666a3d6a7ea89362b8d9e8b39b15424cd9d6388Timo Sirainen#include "settings-parser.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "mail-index.h"
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch#include "mail-user.h"
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen#include "mail-namespace.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mail-storage-private.h"
2039bdca260cd123832ddda9b2b6862a4abc53aaTimo Sirainen#include "mail-storage-settings.h"
2039bdca260cd123832ddda9b2b6862a4abc53aaTimo Sirainen
2039bdca260cd123832ddda9b2b6862a4abc53aaTimo Sirainen#include <stddef.h>
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainen
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);
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen
3ed2d0f6b5e67e2663d44489d9da3176823789a8Timo Sirainen#undef DEF
65f8fb656051f1059f7b5a2da9c5555adcc30439Timo Sirainen#define DEF(type, name) \
1a5573ebc32fae2fe576ec544e1781323c1db609Timo Sirainen { type, #name, offsetof(struct mail_storage_settings, name), NULL }
1a5573ebc32fae2fe576ec544e1781323c1db609Timo Sirainen
82d1fe3d5d04fb11e3e89cce03dc4de191e58f75Timo Sirainenstatic const struct setting_define mail_storage_setting_defines[] = {
82d1fe3d5d04fb11e3e89cce03dc4de191e58f75Timo Sirainen DEF(SET_STR_VARS, mail_location),
82d1fe3d5d04fb11e3e89cce03dc4de191e58f75Timo Sirainen { SET_ALIAS, "mail", 0, NULL },
8049d5792631981b50b0ad226a03298445e305c7Timo Sirainen DEF(SET_STR_VARS, mail_attachment_fs),
8049d5792631981b50b0ad226a03298445e305c7Timo Sirainen DEF(SET_STR_VARS, mail_attachment_dir),
8049d5792631981b50b0ad226a03298445e305c7Timo Sirainen DEF(SET_STR, mail_attachment_hash),
8049d5792631981b50b0ad226a03298445e305c7Timo Sirainen DEF(SET_SIZE, mail_attachment_min_size),
8049d5792631981b50b0ad226a03298445e305c7Timo Sirainen DEF(SET_UINT, mail_prefetch_count),
8049d5792631981b50b0ad226a03298445e305c7Timo Sirainen DEF(SET_STR, mail_cache_fields),
b42817ce16a8660cbcc4adfc8bccc3db1c6d00c7Timo Sirainen DEF(SET_STR, mail_never_cache_fields),
b42817ce16a8660cbcc4adfc8bccc3db1c6d00c7Timo Sirainen DEF(SET_UINT, mail_cache_min_mail_count),
b42817ce16a8660cbcc4adfc8bccc3db1c6d00c7Timo Sirainen DEF(SET_TIME, mailbox_idle_check_interval),
b42817ce16a8660cbcc4adfc8bccc3db1c6d00c7Timo Sirainen DEF(SET_UINT, mail_max_keyword_length),
82d1fe3d5d04fb11e3e89cce03dc4de191e58f75Timo Sirainen DEF(SET_TIME, mail_max_lock_timeout),
82d1fe3d5d04fb11e3e89cce03dc4de191e58f75Timo Sirainen DEF(SET_BOOL, mail_save_crlf),
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen DEF(SET_ENUM, mail_fsync),
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen DEF(SET_BOOL, mmap_disable),
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen DEF(SET_BOOL, dotlock_use_excl),
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen DEF(SET_BOOL, mail_nfs_storage),
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen DEF(SET_BOOL, mail_nfs_index),
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen DEF(SET_BOOL, mailbox_list_index),
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen DEF(SET_BOOL, mail_debug),
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen DEF(SET_BOOL, mail_full_filesystem_access),
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen DEF(SET_BOOL, maildir_stat_dirs),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_ENUM, lock_method),
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen DEF(SET_STR, pop3_uidl_format),
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen SETTING_DEFINE_LIST_END
2dd39e478269d6fb0bb26d12b394aa30ee965e38Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainenconst struct mail_storage_settings mail_storage_default_settings = {
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen .mail_location = "",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen .mail_attachment_fs = "sis posix",
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen .mail_attachment_dir = "",
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen .mail_attachment_hash = "%{sha1}",
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen .mail_attachment_min_size = 1024*128,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen .mail_prefetch_count = 0,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen .mail_cache_fields = "flags",
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen .mail_never_cache_fields = "imap.envelope",
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen .mail_cache_min_mail_count = 0,
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen .mailbox_idle_check_interval = 30,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen .mail_max_keyword_length = 50,
3e564425db51f3921ce4de11859777135fdedd15Timo Sirainen .mail_max_lock_timeout = 0,
82d1fe3d5d04fb11e3e89cce03dc4de191e58f75Timo Sirainen .mail_save_crlf = FALSE,
857c471c13ca215f4be9dd4b336b742b8d434e31Timo Sirainen .mail_fsync = "optimized:never:always",
857c471c13ca215f4be9dd4b336b742b8d434e31Timo Sirainen .mmap_disable = FALSE,
82d1fe3d5d04fb11e3e89cce03dc4de191e58f75Timo Sirainen .dotlock_use_excl = TRUE,
82d1fe3d5d04fb11e3e89cce03dc4de191e58f75Timo Sirainen .mail_nfs_storage = FALSE,
82d1fe3d5d04fb11e3e89cce03dc4de191e58f75Timo Sirainen .mail_nfs_index = FALSE,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen .mailbox_list_index = FALSE,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen .mail_debug = FALSE,
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen .mail_full_filesystem_access = FALSE,
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen .maildir_stat_dirs = FALSE,
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen .lock_method = "fcntl:flock:dotlock",
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen .pop3_uidl_format = "%08Xu%08Xv"
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen};
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainenconst struct setting_parser_info mail_storage_setting_parser_info = {
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen .module_name = "mail",
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen .defines = mail_storage_setting_defines,
e5fd6dfd0a492e4708d4dbb7971d7fc5d7b8fd85Timo Sirainen .defaults = &mail_storage_default_settings,
e5fd6dfd0a492e4708d4dbb7971d7fc5d7b8fd85Timo Sirainen
4ba9a1d3facc515b3feb5238a16bcf91f76fac61Timo Sirainen .type_offset = (size_t)-1,
4ba9a1d3facc515b3feb5238a16bcf91f76fac61Timo Sirainen .struct_size = sizeof(struct mail_storage_settings),
dfaefeabae939803ceb8c503101e86b5496541d1Timo Sirainen
dfaefeabae939803ceb8c503101e86b5496541d1Timo Sirainen .parent_offset = (size_t)-1,
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen .parent = &mail_user_setting_parser_info,
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen
8b31f966d9688e07672ef1958dcbdb7686523c04Timo Sirainen .check_func = mail_storage_settings_check
8b31f966d9688e07672ef1958dcbdb7686523c04Timo Sirainen};
9847ec56efa15fa063eea9988eee2d4ed9ec7d58Timo Sirainen
9847ec56efa15fa063eea9988eee2d4ed9ec7d58Timo Sirainen#undef DEF
9847ec56efa15fa063eea9988eee2d4ed9ec7d58Timo Sirainen#define DEF(type, name) \
d46a1e3f999dda802dc5137e883adcd7a6629cd3Timo Sirainen { type, #name, offsetof(struct mailbox_settings, name), NULL }
d46a1e3f999dda802dc5137e883adcd7a6629cd3Timo Sirainen
d46a1e3f999dda802dc5137e883adcd7a6629cd3Timo Sirainenstatic const struct setting_define mailbox_setting_defines[] = {
d1e843e77f4760e303c53d9fce10123fc8d230a1Timo Sirainen DEF(SET_STR, name),
d1e843e77f4760e303c53d9fce10123fc8d230a1Timo Sirainen { SET_ENUM, "auto", offsetof(struct mailbox_settings, autocreate), NULL } ,
d1e843e77f4760e303c53d9fce10123fc8d230a1Timo Sirainen DEF(SET_STR, special_use),
291ce16fffca75e8598a8c9dceb08613413dcb07Timo Sirainen
291ce16fffca75e8598a8c9dceb08613413dcb07Timo Sirainen SETTING_DEFINE_LIST_END
291ce16fffca75e8598a8c9dceb08613413dcb07Timo Sirainen};
08e9fd42eb8007e1f9db62c088eef74f906114a5Josef 'Jeff' Sipek
08e9fd42eb8007e1f9db62c088eef74f906114a5Josef 'Jeff' Sipekconst struct mailbox_settings mailbox_default_settings = {
08e9fd42eb8007e1f9db62c088eef74f906114a5Josef 'Jeff' Sipek .name = "",
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen .autocreate = MAILBOX_SET_AUTO_NO":"
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen MAILBOX_SET_AUTO_CREATE":"
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen MAILBOX_SET_AUTO_SUBSCRIBE,
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen .special_use = ""
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen};
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainenconst struct setting_parser_info mailbox_setting_parser_info = {
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen .defines = mailbox_setting_defines,
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen .defaults = &mailbox_default_settings,
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen .type_offset = offsetof(struct mailbox_settings, name),
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen .struct_size = sizeof(struct mailbox_settings),
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen
97ae33602db7d5bc8eede82512a965d49ab8853bTimo Sirainen .parent_offset = (size_t)-1,
97ae33602db7d5bc8eede82512a965d49ab8853bTimo Sirainen .parent = &mail_user_setting_parser_info,
97ae33602db7d5bc8eede82512a965d49ab8853bTimo Sirainen
30d50c7e8706f2d750215e009504109ca19cd485Timo Sirainen .check_func = mailbox_settings_check
30d50c7e8706f2d750215e009504109ca19cd485Timo Sirainen};
97ae33602db7d5bc8eede82512a965d49ab8853bTimo Sirainen
97ae33602db7d5bc8eede82512a965d49ab8853bTimo Sirainen#undef DEF
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen#undef DEFLIST_UNIQUE
57a8c6a95e4bce3eeaba36985adb81c07dd683ffTimo Sirainen#define DEF(type, name) \
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen { type, #name, offsetof(struct mail_namespace_settings, name), NULL }
afe1da042382720393eca6497253106e4eec75e0Timo Sirainen#define DEFLIST_UNIQUE(field, name, defines) \
afe1da042382720393eca6497253106e4eec75e0Timo Sirainen { SET_DEFLIST_UNIQUE, name, \
afe1da042382720393eca6497253106e4eec75e0Timo Sirainen offsetof(struct mail_namespace_settings, field), defines }
afe1da042382720393eca6497253106e4eec75e0Timo Sirainen
afe1da042382720393eca6497253106e4eec75e0Timo Sirainenstatic const struct setting_define mail_namespace_setting_defines[] = {
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen DEF(SET_STR, name),
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen DEF(SET_ENUM, type),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen DEF(SET_STR, separator),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen DEF(SET_STR_VARS, prefix),
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen DEF(SET_STR_VARS, location),
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen { SET_ALIAS, "mail", 0, NULL },
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen { SET_ALIAS, "mail_location", 0, NULL },
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen DEF(SET_STR_VARS, alias_for),
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen DEF(SET_BOOL, inbox),
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen DEF(SET_BOOL, hidden),
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen DEF(SET_ENUM, list),
eecb235c14b49c01774134ea593c266f2d2c2be1Timo Sirainen DEF(SET_BOOL, subscriptions),
eecb235c14b49c01774134ea593c266f2d2c2be1Timo Sirainen DEF(SET_BOOL, ignore_on_failure),
7900eb30bac4a46b259522c58362884661483d7cJosef 'Jeff' Sipek
7900eb30bac4a46b259522c58362884661483d7cJosef 'Jeff' Sipek DEFLIST_UNIQUE(mailboxes, "mailbox", &mailbox_setting_parser_info),
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen SETTING_DEFINE_LIST_END
98c217499d578495e982ea6010ebff831e9669aeMartti Rannanjärvi};
98c217499d578495e982ea6010ebff831e9669aeMartti Rannanjärvi
98c217499d578495e982ea6010ebff831e9669aeMartti Rannanjärviconst struct mail_namespace_settings mail_namespace_default_settings = {
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen .name = "",
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen .type = "private:shared:public",
97ae33602db7d5bc8eede82512a965d49ab8853bTimo Sirainen .separator = "",
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen .prefix = "",
f1743785713e7632459d623d5df2108f4b93accbTimo Sirainen .location = "",
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen .alias_for = NULL,
70ead6466f9baa8294e71fc2fba0a4f54f488b5eTimo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen .inbox = FALSE,
ccc895c0358108d2304239063e940b7d75f364abTimo Sirainen .hidden = FALSE,
8d630c15a8ed6f85553467c3a231a273defca5f6Timo Sirainen .list = "yes:no:children",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen .subscriptions = TRUE,
ee116df08d0fdab703483e18fe8076b2ef9fd9d7Timo Sirainen .ignore_on_failure = FALSE,
c5ab90cfad9cc3e33bcb1baeb30ffc82a7b7053aTimo Sirainen
c5ab90cfad9cc3e33bcb1baeb30ffc82a7b7053aTimo Sirainen .mailboxes = ARRAY_INIT
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen};
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainenconst struct setting_parser_info mail_namespace_setting_parser_info = {
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen .defines = mail_namespace_setting_defines,
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen .defaults = &mail_namespace_default_settings,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen .type_offset = offsetof(struct mail_namespace_settings, name),
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo Sirainen .struct_size = sizeof(struct mail_namespace_settings),
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen .parent_offset = offsetof(struct mail_namespace_settings, user_set),
98c217499d578495e982ea6010ebff831e9669aeMartti Rannanjärvi .parent = &mail_user_setting_parser_info,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen .check_func = namespace_settings_check
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen};
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen#undef DEF
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen#undef DEFLIST_UNIQUE
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen#define DEF(type, name) \
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen { type, #name, offsetof(struct mail_user_settings, name), NULL }
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen#define DEFLIST_UNIQUE(field, name, defines) \
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen { SET_DEFLIST_UNIQUE, name, \
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen offsetof(struct mail_user_settings, field), defines }
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainenstatic const struct setting_define mail_user_setting_defines[] = {
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen DEF(SET_STR, base_dir),
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen DEF(SET_STR, auth_socket_path),
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen DEF(SET_STR_VARS, mail_temp_dir),
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen DEF(SET_STR, mail_uid),
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen DEF(SET_STR, mail_gid),
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen DEF(SET_STR_VARS, mail_home),
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen DEF(SET_STR_VARS, mail_chroot),
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen DEF(SET_STR, mail_access_groups),
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen DEF(SET_STR, mail_privileged_group),
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen DEF(SET_STR, valid_chroot_dirs),
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen DEF(SET_UINT, first_valid_uid),
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen DEF(SET_UINT, last_valid_uid),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen DEF(SET_UINT, first_valid_gid),
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen DEF(SET_UINT, last_valid_gid),
cff1f182205e674285cf3ff446a0dcf7afea277dTimo Sirainen
cff1f182205e674285cf3ff446a0dcf7afea277dTimo Sirainen DEF(SET_STR, mail_plugins),
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen DEF(SET_STR, mail_plugin_dir),
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen
e03d986a74128f5ba30fcfda9f6e36578f5d8decTimo Sirainen DEF(SET_STR, mail_log_prefix),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
f318b3dbe2acc177b8ee1c160e4b5b14e7f2cd41Timo Sirainen DEFLIST_UNIQUE(namespaces, "namespace", &mail_namespace_setting_parser_info),
f318b3dbe2acc177b8ee1c160e4b5b14e7f2cd41Timo Sirainen { SET_STRLIST, "plugin", offsetof(struct mail_user_settings, plugin_envs), NULL },
f318b3dbe2acc177b8ee1c160e4b5b14e7f2cd41Timo Sirainen
f318b3dbe2acc177b8ee1c160e4b5b14e7f2cd41Timo Sirainen SETTING_DEFINE_LIST_END
f318b3dbe2acc177b8ee1c160e4b5b14e7f2cd41Timo Sirainen};
f318b3dbe2acc177b8ee1c160e4b5b14e7f2cd41Timo Sirainen
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainenstatic const struct mail_user_settings mail_user_default_settings = {
d3280fe317a4598c0868cc440e7a1191c06d0db3Timo Sirainen .base_dir = PKG_RUNDIR,
d3280fe317a4598c0868cc440e7a1191c06d0db3Timo Sirainen .auth_socket_path = "auth-userdb",
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen .mail_temp_dir = "/tmp",
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen .mail_uid = "",
6469cf211a57433335641725dc236ebb2b9fdd3bTimo Sirainen .mail_gid = "",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen .mail_home = "",
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen .mail_chroot = "",
6cc4cce2078aca138fbce19305e69e77edcee614Timo Sirainen .mail_access_groups = "",
bd6a8056771b6150685dea319ab5a94e021d17f1Josef 'Jeff' Sipek .mail_privileged_group = "",
9f37ef2a9192e7d47e3d7ac959080fd01120f2e9Aki Tuomi .valid_chroot_dirs = "",
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen
bd6a8056771b6150685dea319ab5a94e021d17f1Josef 'Jeff' Sipek .first_valid_uid = 500,
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainen .last_valid_uid = 0,
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainen .first_valid_gid = 1,
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainen .last_valid_gid = 0,
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainen
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainen .mail_plugins = "",
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainen .mail_plugin_dir = MODULEDIR,
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainen
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen .mail_log_prefix = "%s(%u): ",
aa47c9bd1d1fc70cd699c49fd1ca92dbc7615953Timo Sirainen
aa47c9bd1d1fc70cd699c49fd1ca92dbc7615953Timo Sirainen .namespaces = ARRAY_INIT,
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen .plugin_envs = ARRAY_INIT
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen};
aa47c9bd1d1fc70cd699c49fd1ca92dbc7615953Timo Sirainen
c0d069950af1dbc6a4e5c3de3bf2e437796e3ae0Timo Sirainenconst struct setting_parser_info mail_user_setting_parser_info = {
c0d069950af1dbc6a4e5c3de3bf2e437796e3ae0Timo Sirainen .module_name = "mail",
c0d069950af1dbc6a4e5c3de3bf2e437796e3ae0Timo Sirainen .defines = mail_user_setting_defines,
c0d069950af1dbc6a4e5c3de3bf2e437796e3ae0Timo Sirainen .defaults = &mail_user_default_settings,
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen .type_offset = (size_t)-1,
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen .struct_size = sizeof(struct mail_user_settings),
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
c979eeda1f46483d9c963e265786b701d7683d77Timo Sirainen .parent_offset = (size_t)-1,
c979eeda1f46483d9c963e265786b701d7683d77Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen .check_func = mail_user_settings_check
2584e86cc2d8c31ba30a4109cf4ba09d1e37e28aTimo Sirainen};
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
4b41116563110d00330896a568eff1078c382827Timo Sirainenconst void *
4b41116563110d00330896a568eff1078c382827Timo Sirainenmail_user_set_get_driver_settings(const struct setting_parser_info *info,
4b41116563110d00330896a568eff1078c382827Timo Sirainen const struct mail_user_settings *set,
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen const char *driver)
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen{
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen const void *dset;
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen dset = settings_find_dynamic(info, set, driver);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (dset == NULL) {
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen i_panic("Default settings not found for storage driver %s",
c6ce2e251ac75fa650c7fbfa52150eae69386293Martti Rannanjärvi driver);
c6ce2e251ac75fa650c7fbfa52150eae69386293Martti Rannanjärvi }
b2c1349cf07410aefab0f5b17153af9e5cfcf48fTimo Sirainen return dset;
96308127e006bb3b1108093bcf4cc1fd9481cb7aTimo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
dbe64f3893616a4005c8946be75d2dc8f6823d72Timo Sirainenconst struct mail_storage_settings *
8a13b020f90e080570658b18c042e7e352c8b14fTimo Sirainenmail_user_set_get_storage_set(struct mail_user *user)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen return mail_user_set_get_driver_settings(user->set_info, user->set,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen MAIL_STORAGE_SET_DRIVER_NAME);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenconst void *mail_storage_get_driver_settings(struct mail_storage *storage)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen return mail_user_set_get_driver_settings(storage->user->set_info,
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen storage->user->set,
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen storage->name);
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen}
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenenum mail_index_open_flags
f3bb2fbe87425dc89a839908985af496f7f65702Timo Sirainenmail_storage_settings_to_index_flags(const struct mail_storage_settings *set)
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen{
a3ee5ce6ecc8e228ee69300fdd562d7ac8be89a7Timo Sirainen enum mail_index_open_flags index_flags = 0;
bd1b2615928a1e8be190cb0405754f0aec8cac2fTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#ifndef MMAP_CONFLICTS_WRITE
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen if (set->mmap_disable)
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen#endif
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen index_flags |= MAIL_INDEX_OPEN_FLAG_MMAP_DISABLE;
a423d985ba7261661475811c22b21b80ec765a71Timo Sirainen if (set->dotlock_use_excl)
2ebeb22b9a8a8bb7fbe2f2e2908478a220792b87Timo Sirainen index_flags |= MAIL_INDEX_OPEN_FLAG_DOTLOCK_USE_EXCL;
a423d985ba7261661475811c22b21b80ec765a71Timo Sirainen if (set->mail_nfs_index)
bd4d0a1a7c0626452b8d82f37e3ec07267ac9896Timo Sirainen index_flags |= MAIL_INDEX_OPEN_FLAG_NFS_FLUSH;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return index_flags;
1460ef7a18c53216ddb4a94bb62fba96076aae8eTimo Sirainen}
1460ef7a18c53216ddb4a94bb62fba96076aae8eTimo Sirainen
1460ef7a18c53216ddb4a94bb62fba96076aae8eTimo Sirainenconst struct dynamic_settings_parser *
1460ef7a18c53216ddb4a94bb62fba96076aae8eTimo Sirainenmail_storage_get_dynamic_parsers(pool_t pool)
1460ef7a18c53216ddb4a94bb62fba96076aae8eTimo Sirainen{
1460ef7a18c53216ddb4a94bb62fba96076aae8eTimo Sirainen struct dynamic_settings_parser *parsers;
1460ef7a18c53216ddb4a94bb62fba96076aae8eTimo Sirainen struct mail_storage *const *storages;
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen unsigned int i, j, count;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
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;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen for (i = 0, j = 1; i < count; i++) {
0177594fa5217b02001f4ec8752154fd2b05c545Timo Sirainen if (storages[i]->v.get_setting_parser_info == NULL)
0177594fa5217b02001f4ec8752154fd2b05c545Timo Sirainen continue;
0177594fa5217b02001f4ec8752154fd2b05c545Timo Sirainen
0177594fa5217b02001f4ec8752154fd2b05c545Timo Sirainen parsers[j].name = storages[i]->name;
0177594fa5217b02001f4ec8752154fd2b05c545Timo Sirainen parsers[j].info = storages[i]->v.get_setting_parser_info();
0177594fa5217b02001f4ec8752154fd2b05c545Timo Sirainen j++;
2c70086138fe7ac9abf52cd4223c224fe0bbb488Timo Sirainen }
2c70086138fe7ac9abf52cd4223c224fe0bbb488Timo Sirainen return parsers;
2c70086138fe7ac9abf52cd4223c224fe0bbb488Timo Sirainen}
2c70086138fe7ac9abf52cd4223c224fe0bbb488Timo Sirainen
2c70086138fe7ac9abf52cd4223c224fe0bbb488Timo Sirainenstatic void
2c70086138fe7ac9abf52cd4223c224fe0bbb488Timo Sirainenfix_base_path(struct mail_user_settings *set, pool_t pool, const char **str)
2b9dbb270ad82e58d5f3581436e6f143176d5819Timo Sirainen{
2b9dbb270ad82e58d5f3581436e6f143176d5819Timo Sirainen if (*str != NULL && **str != '\0' && **str != '/')
2b9dbb270ad82e58d5f3581436e6f143176d5819Timo Sirainen *str = p_strconcat(pool, set->base_dir, "/", *str, NULL);
2b9dbb270ad82e58d5f3581436e6f143176d5819Timo Sirainen}
1ae5d61ec366fdb2f3c5b150ca378d6141b0f4bdTimo Sirainen
1ae5d61ec366fdb2f3c5b150ca378d6141b0f4bdTimo Sirainen/* <settings checks> */
1ae5d61ec366fdb2f3c5b150ca378d6141b0f4bdTimo Sirainenstatic bool mail_storage_settings_check(void *_set, pool_t pool ATTR_UNUSED,
1ae5d61ec366fdb2f3c5b150ca378d6141b0f4bdTimo Sirainen const char **error_r)
1ae5d61ec366fdb2f3c5b150ca378d6141b0f4bdTimo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_storage_settings *set = _set;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen struct hash_format *format;
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen const char *p, *error;
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen bool uidl_format_ok;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen char c;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
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 set->parsed_fsync_mode = FSYNC_MODE_NEVER;
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen else if (strcmp(set->mail_fsync, "always") == 0)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen set->parsed_fsync_mode = FSYNC_MODE_ALWAYS;
d938e9e4ec4c0f326dffd5ebe42c1ad893ce7e52Timo Sirainen else {
eecb235c14b49c01774134ea593c266f2d2c2be1Timo Sirainen *error_r = t_strdup_printf("Unknown mail_fsync: %s",
eecb235c14b49c01774134ea593c266f2d2c2be1Timo Sirainen set->mail_fsync);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen return FALSE;
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen }
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen if (set->mail_nfs_index && !set->mmap_disable) {
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen *error_r = "mail_nfs_index=yes requires mmap_disable=yes";
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen return FALSE;
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen }
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen if (set->mail_nfs_index &&
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen set->parsed_fsync_mode != FSYNC_MODE_ALWAYS) {
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen *error_r = "mail_nfs_index=yes requires mail_fsync=always";
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen return FALSE;
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen }
9fc97c8aa8190df87624d214bcc5d0b5362bec93Timo Sirainen
9fc97c8aa8190df87624d214bcc5d0b5362bec93Timo Sirainen if (!file_lock_method_parse(set->lock_method,
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen &set->parsed_lock_method)) {
546335814920fb6b5b44c68c7803e654eefeae9dTimo Sirainen *error_r = t_strdup_printf("Unknown lock_method: %s",
546335814920fb6b5b44c68c7803e654eefeae9dTimo Sirainen set->lock_method);
546335814920fb6b5b44c68c7803e654eefeae9dTimo Sirainen return FALSE;
4b41218f9e09386ad5d8f279355aad1dfb64392dTimo Sirainen }
4b41218f9e09386ad5d8f279355aad1dfb64392dTimo Sirainen
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen uidl_format_ok = FALSE;
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen for (p = set->pop3_uidl_format; *p != '\0'; p++) {
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen if (p[0] != '%' || p[1] == '\0')
eb1572d7c44ebc7b0b039d085c3dbab2ef7043ddTimo Sirainen continue;
eb1572d7c44ebc7b0b039d085c3dbab2ef7043ddTimo Sirainen
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen c = var_get_key(++p);
bd4e36a8cd7257cca7d1434c49a1e343ed7c5100Timo Sirainen switch (c) {
bd4e36a8cd7257cca7d1434c49a1e343ed7c5100Timo Sirainen case 'v':
bd4e36a8cd7257cca7d1434c49a1e343ed7c5100Timo Sirainen case 'u':
bd4e36a8cd7257cca7d1434c49a1e343ed7c5100Timo Sirainen case 'm':
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen case 'f':
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen case 'g':
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen uidl_format_ok = TRUE;
42507d758b053bb483de58fba55c73a9eb5d3fbaTimo Sirainen break;
c0c346d0e6a76137ba5006857ed03b1227804170Timo Sirainen case '%':
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen break;
0177594fa5217b02001f4ec8752154fd2b05c545Timo Sirainen default:
382f23541ce657be87b079abd6784d376fb4eb43Timo Sirainen *error_r = t_strdup_printf(
2b9dbb270ad82e58d5f3581436e6f143176d5819Timo Sirainen "Unknown pop3_uidl_format variable: %%%c", c);
97a5e150cacf7da9dd200e317b75460352038d65Timo Sirainen return FALSE;
3743948b65bd079cd6f2502d35bd21666c1a2f5aAki Tuomi }
134987bc3b685d7ec71c04e9337f7125cff0698fTimo Sirainen }
42507d758b053bb483de58fba55c73a9eb5d3fbaTimo Sirainen if (!uidl_format_ok) {
817d027593510c3ba70ad542ce0011f5f6916d1eTimo Sirainen *error_r = "pop3_uidl_format setting doesn't contain any "
817d027593510c3ba70ad542ce0011f5f6916d1eTimo Sirainen "%% variables.";
817d027593510c3ba70ad542ce0011f5f6916d1eTimo Sirainen return FALSE;
817d027593510c3ba70ad542ce0011f5f6916d1eTimo Sirainen }
817d027593510c3ba70ad542ce0011f5f6916d1eTimo Sirainen
6ae329de09afb7214c906d762320847e05469d53Timo Sirainen if (strchr(set->mail_attachment_hash, '/') != NULL) {
6ae329de09afb7214c906d762320847e05469d53Timo Sirainen *error_r = "mail_attachment_hash setting "
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen "must not contain '/' characters";
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen return FALSE;
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen }
7e2671b295927b461adc8b6c4ed6a1c4761fb323Timo Sirainen if (hash_format_init(set->mail_attachment_hash, &format, &error) < 0) {
7e2671b295927b461adc8b6c4ed6a1c4761fb323Timo Sirainen *error_r = t_strconcat("Invalid mail_attachment_hash setting: ",
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen error, NULL);
fcfe85637e1ee14a9fc39c41fd6ceca106301542Timo Sirainen return FALSE;
fcfe85637e1ee14a9fc39c41fd6ceca106301542Timo Sirainen }
fcfe85637e1ee14a9fc39c41fd6ceca106301542Timo Sirainen if (strchr(set->mail_attachment_hash, '-') != NULL) {
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen *error_r = "mail_attachment_hash setting "
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen "must not contain '-' characters";
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen return FALSE;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen }
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen hash_format_deinit_free(&format);
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen return TRUE;
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen}
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainenstatic bool namespace_settings_check(void *_set, pool_t pool ATTR_UNUSED,
4bbd396aa6198c84f3f7763b6e8a63a26e97e141Timo Sirainen const char **error_r)
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen{
7baab0b0b60df7ce9093d0881cd322dff1e79491Timo Sirainen struct mail_namespace_settings *ns = _set;
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen struct mail_namespace_settings *const *namespaces;
3f91e60401495a4046c73992fabaa5e77200a451Timo Sirainen const char *name;
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen unsigned int i, count;
3857e2945a3b6744d603f0f5a656849ed8436ba3Timo Sirainen
3857e2945a3b6744d603f0f5a656849ed8436ba3Timo Sirainen name = ns->prefix != NULL ? ns->prefix : "";
f90cbe597c41d5cc91debd371f8648bd8e6ffbc2Timo Sirainen
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen if (ns->separator[0] != '\0' && ns->separator[1] != '\0') {
33b469d1ca66dd2cc496d2d990b8b98e72952a29Timo Sirainen *error_r = t_strdup_printf("Namespace '%s': "
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen "Hierarchy separator must be only one character long",
58ba0fe5a6904d3a65cfe268411f4cbb881234eeTimo Sirainen name);
58ba0fe5a6904d3a65cfe268411f4cbb881234eeTimo Sirainen return FALSE;
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen }
6b0d8106ae51ffc6ce45636b34d2e21cbefca7fdTimo Sirainen
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen if (ns->alias_for != NULL) {
eb64c3586d854cddd693f0b811d897399076a441Timo Sirainen if (array_is_created(&ns->user_set->namespaces)) {
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen namespaces = array_get(&ns->user_set->namespaces,
eb64c3586d854cddd693f0b811d897399076a441Timo Sirainen &count);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen } else {
7f735cb86b2d8abd8f230089065eacfc24e9e5d6Timo Sirainen namespaces = NULL;
7f735cb86b2d8abd8f230089065eacfc24e9e5d6Timo Sirainen count = 0;
7f735cb86b2d8abd8f230089065eacfc24e9e5d6Timo Sirainen }
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen for (i = 0; i < count; i++) {
b3484b5b1f47e4cf112f0e371478a2d7794b31bbTimo Sirainen if (strcmp(namespaces[i]->prefix, ns->alias_for) == 0)
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen break;
d81131d3bbb4f0befb62a661d1785cf8c84a17e2Timo Sirainen }
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen if (i == count) {
9456a4a3e74929f9d3d5b00b93be6d8eb69bc52aTimo Sirainen *error_r = t_strdup_printf(
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen "Namespace '%s': alias_for points to "
4e3bcf7fdaeef92dd07a2acb1ded58422a907e87Timo Sirainen "unknown namespace: %s", name, ns->alias_for);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen return FALSE;
19e161dd9e2c3a2ffc96ee8852bec0720cb30d1cTimo Sirainen }
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen if (namespaces[i]->alias_for != NULL) {
540555c5b435203e1c26c8e7b924b2643ae07ae3Timo Sirainen *error_r = t_strdup_printf(
540555c5b435203e1c26c8e7b924b2643ae07ae3Timo Sirainen "Namespace '%s': alias_for chaining isn't "
540555c5b435203e1c26c8e7b924b2643ae07ae3Timo Sirainen "allowed: %s -> %s", name, ns->alias_for,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen namespaces[i]->alias_for);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen return FALSE;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen }
0d86aa0d47f7393c669c084b34c0537b193688adTimo Sirainen }
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen return TRUE;
7631f16156aca373004953fe6b01a7f343fb47e0Timo Sirainen}
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen
aa247243412a49f9bdebf7255e131dc6ece4ed46Timo Sirainenstatic bool mailbox_special_use_exists(const char *name)
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen{
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen if (name[0] != '\\')
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen return FALSE;
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen name++;
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen if (strcasecmp(name, "All") == 0)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen return TRUE;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen if (strcasecmp(name, "Archive") == 0)
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen return TRUE;
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen if (strcasecmp(name, "Drafts") == 0)
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen return TRUE;
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen if (strcasecmp(name, "Flagged") == 0)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return TRUE;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (strcasecmp(name, "Junk") == 0)
c0225f7f6b43d34dc58c17d3304f0fd60ab89894Timo Sirainen return TRUE;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (strcasecmp(name, "Sent") == 0)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return TRUE;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (strcasecmp(name, "Trash") == 0)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return TRUE;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return FALSE;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen}
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenstatic bool
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenmailbox_special_use_check(struct mailbox_settings *set, pool_t pool,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char **error_r)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen{
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char *const *uses, *str;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen unsigned int i;
6df0ab0c1ab91f06b6418cb30eff44405a1b8f02Timo Sirainen
6df0ab0c1ab91f06b6418cb30eff44405a1b8f02Timo Sirainen uses = t_strsplit_spaces(set->special_use, " ");
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen for (i = 0; uses[i] != NULL; i++) {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (!mailbox_special_use_exists(uses[i])) {
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen *error_r = t_strdup_printf(
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen "mailbox %s: unknown special_use: %s",
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen set->name, uses[i]);
e53ab6c7081246c865917f9aa0eff031a08ad1e7Timo Sirainen return FALSE;
e53ab6c7081246c865917f9aa0eff031a08ad1e7Timo Sirainen }
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen }
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen /* make sure there are no extra spaces */
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen str = t_strarray_join(uses, " ");
21aaa6affb9f134112b75b5db737309fc35ef1cfMartti Rannanjärvi if (strcmp(str, set->special_use) != 0)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen set->special_use = p_strdup(pool, str);
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen return TRUE;
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen}
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenstatic bool mailbox_settings_check(void *_set, pool_t pool,
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen const char **error_r)
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen{
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen struct mailbox_settings *set = _set;
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen if (!uni_utf8_str_is_valid(set->name)) {
0206dc57f2c04da69599dea5816235cfeb2b897aMartti Rannanjärvi *error_r = t_strdup_printf("mailbox %s: name isn't valid UTF-8",
0206dc57f2c04da69599dea5816235cfeb2b897aMartti Rannanjärvi set->name);
6564208826b0f46a00f010d1b5711d85944c3c88Timo Sirainen return FALSE;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen }
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen if (*set->special_use != '\0') {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen if (!mailbox_special_use_check(set, pool, error_r))
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen return FALSE;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen }
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen return TRUE;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstatic bool mail_user_settings_check(void *_set, pool_t pool ATTR_UNUSED,
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen const char **error_r ATTR_UNUSED)
13e130c3af3032982de6b1d13c6dcddda9164848Timo Sirainen{
13e130c3af3032982de6b1d13c6dcddda9164848Timo Sirainen struct mail_user_settings *set = _set;
13e130c3af3032982de6b1d13c6dcddda9164848Timo Sirainen
13e130c3af3032982de6b1d13c6dcddda9164848Timo Sirainen#ifndef CONFIG_BINARY
13e130c3af3032982de6b1d13c6dcddda9164848Timo Sirainen fix_base_path(set, pool, &set->auth_socket_path);
13e130c3af3032982de6b1d13c6dcddda9164848Timo Sirainen#else
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen if (*set->mail_plugins != '\0' &&
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen access(set->mail_plugin_dir, R_OK | X_OK) < 0) {
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen *error_r = t_strdup_printf(
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen "mail_plugin_dir: access(%s) failed: %m",
310767ca33e7636d40ec45dee68a2c319a5fa3c0Timo Sirainen set->mail_plugin_dir);
310767ca33e7636d40ec45dee68a2c319a5fa3c0Timo Sirainen return FALSE;
310767ca33e7636d40ec45dee68a2c319a5fa3c0Timo Sirainen }
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen#endif
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen return TRUE;
2c8ca7e88ec881c473fb90e5f647c1f563877164Timo Sirainen}
2c8ca7e88ec881c473fb90e5f647c1f563877164Timo Sirainen/* </settings checks> */
6c51e3c3dc8dc5dc6fef2280b7c2c9ebef3de8f0Aki Tuomi