summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2023-05-28 15:01:36 +0000
committerAlyssa Ross <hi@alyssa.is>2023-05-28 16:01:22 +0000
commite3e4975c4954b239b324375d2ed778c4e56e67ab (patch)
tree1423d2ac6dc2fe3b57a62d6e4a3248a436248931
parentnixos/public-inbox: don't set RootDirectory= (diff)
downloadnixpkgs-origin/public-inbox-DynamicUser.tar.gz
nixos/public-inbox: use DynamicUser for readersorigin/public-inbox-DynamicUser
public-inbox-{http,nntp,imap}d only need to be able to read the repositories, so they don't need to run as the public-inbox user, which has write permission for /var/lib/public-inbox. Annoyingly, confinement is currently not compatible with DynamicUser, so we can't enable both at the same time.
-rw-r--r--nixos/modules/services/mail/public-inbox.nix25
1 files changed, 21 insertions, 4 deletions
diff --git a/nixos/modules/services/mail/public-inbox.nix b/nixos/modules/services/mail/public-inbox.nix
index 4875a20d8775..07ba15cc1b66 100644
--- a/nixos/modules/services/mail/public-inbox.nix
+++ b/nixos/modules/services/mail/public-inbox.nix
@@ -53,7 +53,9 @@ let
# if running simultaneous services.
NonBlocking = true;
#LimitNOFILE = 30000;
- User = config.users.users."public-inbox".name;
+ User =
+ lib.mkIf config.systemd.services."public-inbox-${srv}".confinement.enable
+ config.users.users."public-inbox".name;
Group = config.users.groups."public-inbox".name;
RuntimeDirectory = [
"public-inbox-${srv}/perl-inline"
@@ -61,9 +63,7 @@ let
RuntimeDirectoryMode = "700";
# This is for BindPaths= and BindReadOnlyPaths=
# to allow traversal of directories they create inside RootDirectory=
- UMask = "0066";
- StateDirectory = ["public-inbox"];
- StateDirectoryMode = "0750";
+ UMask = "0026";
WorkingDirectory = stateDir;
BindReadOnlyPaths = [
"/etc"
@@ -433,8 +433,10 @@ in
(mkIf cfg.imap.enable
{ public-inbox-imapd = mkMerge [(serviceConfig "imapd") {
after = [ "public-inbox-init.service" "public-inbox-watch.service" ];
+ environment.PI_DIR = "/var/lib/public-inbox/.public-inbox";
requires = [ "public-inbox-init.service" ];
serviceConfig = {
+ DynamicUser = !config.systemd.services."public-inbox-imapd".confinement.enable;
ExecStart = escapeShellArgs (
[ "${cfg.package}/bin/public-inbox-imapd" ] ++
cfg.imap.args ++
@@ -447,8 +449,10 @@ in
(mkIf cfg.http.enable
{ public-inbox-httpd = mkMerge [(serviceConfig "httpd") {
after = [ "public-inbox-init.service" "public-inbox-watch.service" ];
+ environment.PI_DIR = "/var/lib/public-inbox/.public-inbox";
requires = [ "public-inbox-init.service" ];
serviceConfig = {
+ DynamicUser = !config.systemd.services."public-inbox-httpd".confinement.enable;
ExecStart = escapeShellArgs (
[ "${cfg.package}/bin/public-inbox-httpd" ] ++
cfg.http.args ++
@@ -486,8 +490,10 @@ in
(mkIf cfg.nntp.enable
{ public-inbox-nntpd = mkMerge [(serviceConfig "nntpd") {
after = [ "public-inbox-init.service" "public-inbox-watch.service" ];
+ environment.PI_DIR = "/var/lib/public-inbox/.public-inbox";
requires = [ "public-inbox-init.service" ];
serviceConfig = {
+ DynamicUser = !config.systemd.services."public-inbox-nntpd".confinement.enable;
ExecStart = escapeShellArgs (
[ "${cfg.package}/bin/public-inbox-nntpd" ] ++
cfg.nntp.args ++
@@ -508,6 +514,10 @@ in
serviceConfig = {
ExecStart = "${cfg.package}/bin/public-inbox-watch";
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
+ StateDirectory = ["public-inbox"];
+ StateDirectoryMode = "0750";
+ User = config.users.users."public-inbox".name;
+ Group = config.users.groups."public-inbox".name;
};
}];
})
@@ -561,15 +571,22 @@ in
ls -1 "$inbox" | grep -q '^xap' ||
${cfg.package}/bin/public-inbox-index "$inbox"
done
+
+ # Older versions of the module did not make inboxes group-readable.
+ # chmod -R g+r ${stateDir}/inboxes
'';
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
StateDirectory = [
+ "public-inbox"
"public-inbox/.public-inbox"
"public-inbox/.public-inbox/emergency"
"public-inbox/inboxes"
];
+ StateDirectoryMode = "0750";
+ User = config.users.users."public-inbox".name;
+ Group = config.users.groups."public-inbox".name;
};
}];
})