if (IS_STANDALONE())
service_flags |= MASTER_SERVICE_FLAG_STANDALONE;
- else
- storage_service_flags |= MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT;
+ else {
+ storage_service_flags |=
+ MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT |
+ MAIL_STORAGE_SERVICE_FLAG_RESTRICT_BY_ENV;
+ }
dump_capability = getenv("DUMP_CAPABILITY") != NULL;
if (dump_capability) {
if (seteuid(setuid_uid) < 0)
i_fatal("seteuid(%s) failed: %m", dec2str(setuid_uid));
}
- if (rset.chroot_dir == NULL) {
- /* enable core dumps only when we can be sure that the core
- file is written to a safe directory. with chrooting we're
- chrooting to user's home dir. */
- restrict_access_allow_coredumps(TRUE);
- }
}
static void
user_set->mail_plugins, TRUE,
master_service_get_version_string(service));
- if ((flags & MAIL_STORAGE_SERVICE_FLAG_NO_RESTRICT_ACCESS) == 0) {
+ if ((flags & MAIL_STORAGE_SERVICE_FLAG_NO_RESTRICT_ACCESS) != 0) {
+ /* no changes */
+ } else if ((flags & MAIL_STORAGE_SERVICE_FLAG_RESTRICT_BY_ENV) != 0) {
+ restrict_access_by_env(home,
+ (flags & MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT) != 0);
+ } else {
service_drop_privileges(user_set, system_groups_user, home,
(flags & MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT) != 0,
FALSE);
}
/* privileges are now dropped */
+ restrict_access_allow_coredumps(TRUE);
dict_drivers_register_builtin();
module_dir_init(modules);
MAIL_STORAGE_SERVICE_FLAG_DEBUG = 0x04,
/* Keep the current process permissions */
MAIL_STORAGE_SERVICE_FLAG_NO_RESTRICT_ACCESS = 0x08,
+ /* Get the process permissions from environment */
+ MAIL_STORAGE_SERVICE_FLAG_RESTRICT_BY_ENV = 0x10,
/* Don't chdir() to user's home */
- MAIL_STORAGE_SERVICE_FLAG_NO_CHDIR = 0x10
+ MAIL_STORAGE_SERVICE_FLAG_NO_CHDIR = 0x20
};
struct mail_storage_service_input {
if (IS_STANDALONE())
service_flags |= MASTER_SERVICE_FLAG_STANDALONE;
- else
- storage_service_flags |= MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT;
+ else {
+ storage_service_flags |=
+ MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT |
+ MAIL_STORAGE_SERVICE_FLAG_RESTRICT_BY_ENV;
+ }
master_service = master_service_init("pop3", service_flags, argc, argv);
while ((c = getopt(argc, argv, master_service_getopt_string())) > 0) {