diff --git a/modules/programs/mbsync-accounts.nix b/modules/programs/mbsync-accounts.nix index a983b7ff..4a1a51c4 100644 --- a/modules/programs/mbsync-accounts.nix +++ b/modules/programs/mbsync-accounts.nix @@ -2,6 +2,12 @@ with lib; +let + + extraConfigType = with lib.types; attrsOf (either (either str int) bool); + +in + { options.mbsync = { enable = mkEnableOption "synchronization using mbsync"; @@ -53,5 +59,35 @@ with lib; Pattern of mailboxes to synchronize. ''; }; + + extraConfig.channel = mkOption { + type = extraConfigType; + default = {}; + example = literalExample '' + { + MaxMessages = 10000; + MaxSize = "1m"; + }; + ''; + description = '' + Per channel extra configuration. + ''; + }; + + extraConfig.local = mkOption { + type = extraConfigType; + default = {}; + description = '' + Local store extra configuration. + ''; + }; + + extraConfig.remote = mkOption { + type = extraConfigType; + default = {}; + description = '' + Remote store extra configuration. + ''; + }; }; } diff --git a/modules/programs/mbsync.nix b/modules/programs/mbsync.nix index 4abfc7b3..fc850377 100644 --- a/modules/programs/mbsync.nix +++ b/modules/programs/mbsync.nix @@ -33,10 +33,14 @@ let genSection = header: entries: let escapeValue = escape [ "\"" ]; + hasSpace = v: builtins.match ".* .*" v != null; genValue = v: if isList v then concatMapStringsSep " " genValue v - else "\"${escapeValue v}\""; + else if isBool v then (if v then "yes" else "no") + else if isInt v then toString v + else if hasSpace v then "\"${escapeValue v}\"" + else v; in '' ${header} @@ -54,15 +58,16 @@ let User = userName; PassCmd = toString passwordCommand; } - // - genTlsConfig imap.tls - // - optionalAttrs (imap.port != null) { Port = toString imap.port; } + // genTlsConfig imap.tls + // optionalAttrs (imap.port != null) { Port = toString imap.port; } ) + "\n" - + genSection "IMAPStore ${name}-remote" { - Account = name; - } + + genSection "IMAPStore ${name}-remote" ( + { + Account = name; + } + // mbsync.extraConfig.remote + ) + "\n" + genSection "MaildirStore ${name}-local" ( { @@ -70,19 +75,22 @@ let Inbox = "${maildir.absPath}/${folders.inbox}"; SubFolders = "Verbatim"; } - // - optionalAttrs (mbsync.flatten != null) { Flatten = mbsync.flatten; } + // optionalAttrs (mbsync.flatten != null) { Flatten = mbsync.flatten; } + // mbsync.extraConfig.local ) + "\n" - + genSection "Channel ${name}" { - Master = ":${name}-remote:"; - Slave = ":${name}-local:"; - Patterns = mbsync.patterns; - Create = masterSlaveMapping.${mbsync.create}; - Remove = masterSlaveMapping.${mbsync.remove}; - Expunge = masterSlaveMapping.${mbsync.expunge}; - SyncState = "*"; - } + + genSection "Channel ${name}" ( + { + Master = ":${name}-remote:"; + Slave = ":${name}-local:"; + Patterns = mbsync.patterns; + Create = masterSlaveMapping.${mbsync.create}; + Remove = masterSlaveMapping.${mbsync.remove}; + Expunge = masterSlaveMapping.${mbsync.expunge}; + SyncState = "*"; + } + // mbsync.extraConfig.channel + ) + "\n"; genGroupConfig = name: channels: