Merge branch 'dev/user-maildir' into 'master'

Support customized maildir type and location per virtual user

See merge request simple-nixos-mailserver/nixos-mailserver!347
This commit is contained in:
Leon Schuermann 2025-03-24 20:40:32 +00:00
commit 035c6891a6
2 changed files with 72 additions and 6 deletions

View File

@ -140,6 +140,60 @@ in
'';
};
customMaildir = mkOption {
type = types.nullOr (types.submodule ({ name, ...}: {
options = {
uid = mkOption {
type = types.int;
example = 1000;
description = ''
User ID for files and directories in the maildir. Files and
directories created by Dovecot will be assigned this UID.
'';
};
gid = mkOption {
type = types.int;
example = 1000;
description = ''
Group ID for files and directories in the maildir. Files and
directories created by Dovecot will be assigned this GID.
'';
};
dovecotHome = mkOption {
type = types.str;
example = "/home/myusername";
description = ''
Home directory for Dovecot virtual user. This is used to
maintain mail user's private state. This MUST be different
for each Dovecot virtual user and MUST be an absolute path.
Refer to the Dovecot documentation for further information
on this configuration option:
https://wiki.dovecot.org/VirtualUsers/Home
'';
};
mailDirectorySpec = mkOption {
type = types.str;
example = "maildir:~/mail";
description = ''
Dovecot mail location specification. Refer to the Dovecot
documentation for further information on this configuration
option:
https://doc.dovecot.org/configuration_manual/mail_location/
'';
};
};
}));
default = null;
description = ''
Configuration options for a custom Maildir location. For instance,
this can be used to implement home-directory Maildirs for specific
users only. If null, a Maildir under /var/vmail will be assigned.
'';
};
sieveScript = mkOption {
type = with types; nullOr lines;
default = null;

View File

@ -123,12 +123,24 @@ let
EOF
cat <<EOF > ${userdbFile}
${lib.concatStringsSep "\n" (lib.mapAttrsToList (name: value:
"${name}:::::::"
+ (if lib.isString value.quota
then "userdb_quota_rule=*:storage=${value.quota}"
else "")
) cfg.loginAccounts)}
${lib.concatStringsSep "\n" (lib.mapAttrsToList (name: value: (
if value.customMaildir == null then (
"${name}:::::::"
) else (
"${name}:"
+ ":${builtins.toString value.customMaildir.uid}"
+ ":${builtins.toString value.customMaildir.gid}"
+ ":"
+ ":${value.customMaildir.dovecotHome}"
+ ":/run/current-system/sw/bin/nologin"
+ ":userdb_mail=${value.customMaildir.mailDirectorySpec}"
)
) + (
if lib.isString value.quota then
" userdb_quota_rule=*:storage=${value.quota}"
else
""
)) cfg.loginAccounts)}
EOF
'';