diff --git a/modules/default.nix b/modules/default.nix index 7f5f48b58..b9a4be4d9 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -8,6 +8,7 @@ let modules = [ ./home-environment.nix ./manual.nix + ./misc/pam.nix ./programs/bash.nix ./programs/beets.nix ./programs/eclipse.nix diff --git a/modules/home-environment.nix b/modules/home-environment.nix index c4dda2ef8..3623bc203 100644 --- a/modules/home-environment.nix +++ b/modules/home-environment.nix @@ -150,7 +150,24 @@ in default = {}; type = types.attrs; example = { EDITOR = "emacs"; GS_OPTIONS = "-sPAPERSIZE=a4"; }; - description = "Environment variables to always set at login."; + description = '' + Environment variables to always set at login. + ''; + }; + + home.sessionVariableSetter = mkOption { + default = "pam"; + type = types.enum [ "pam" "bash" ]; + example = "bash"; + description = '' + Identifies the module that should set the session variables. + + If "bash" is set then config.bash.enable + must also be enabled. + + If "pam" is set then PAM must be used to set the system + environment. + ''; }; home.packages = mkOption { diff --git a/modules/misc/pam.nix b/modules/misc/pam.nix new file mode 100644 index 000000000..89040aa84 --- /dev/null +++ b/modules/misc/pam.nix @@ -0,0 +1,20 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + homeCfg = config.home; + +in + +{ + options = {}; + + config = mkIf (homeCfg.sessionVariableSetter == "pam") { + home.file.".pam_environment".text = + concatStringsSep "\n" ( + mapAttrsToList (n: v: "${n} OVERRIDE=${v}") homeCfg.sessionVariables + ) + "\n"; + }; +} diff --git a/modules/programs/bash.nix b/modules/programs/bash.nix index a2000274c..a8004580d 100644 --- a/modules/programs/bash.nix +++ b/modules/programs/bash.nix @@ -127,7 +127,8 @@ in home.file.".profile".text = '' # -*- mode: sh -*- - ${envVarsStr} + ${optionalString (config.home.sessionVariableSetter == "bash") + envVarsStr} ${cfg.profileExtra} ''; diff --git a/modules/xsession.nix b/modules/xsession.nix index 3b36a5b53..f498d5178 100644 --- a/modules/xsession.nix +++ b/modules/xsession.nix @@ -72,8 +72,12 @@ in home.file.".xsession" = { mode = "555"; text = '' - # Rely on Bash to set session variables. - . "$HOME/.profile" + ${ + # If we want bash to set the session variables then we need + # to pull in .profile since that's where they are. + optionalString (config.home.sessionVariableSetter == "bash") + ". \"$HOME/.profile\"" + } systemctl --user import-environment DBUS_SESSION_BUS_ADDRESS systemctl --user import-environment DISPLAY