1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 7 cfg = config.services.xserver.displayManager; 8 gnome3 = config.environment.gnome3.packageSet; 9 gdm = gnome3.gdm; 10 11in 12 13{ 14 15 ###### interface 16 17 options = { 18 19 services.xserver.displayManager.gdm = { 20 21 enable = mkOption { 22 type = types.bool; 23 default = false; 24 example = true; 25 description = '' 26 Whether to enable GDM as the display manager. 27 <emphasis>GDM is very experimental and may render system unusable.</emphasis> 28 ''; 29 }; 30 31 }; 32 33 }; 34 35 36 ###### implementation 37 38 config = mkIf cfg.gdm.enable { 39 40 services.xserver.displayManager.slim.enable = false; 41 42 users.extraUsers.gdm = 43 { name = "gdm"; 44 uid = config.ids.uids.gdm; 45 group = "gdm"; 46 home = "/run/gdm"; 47 description = "GDM user"; 48 }; 49 50 users.extraGroups.gdm.gid = config.ids.gids.gdm; 51 52 services.xserver.displayManager.job = 53 { 54 environment = { 55 GDM_X_SERVER = "${cfg.xserverBin} ${cfg.xserverArgs}"; 56 GDM_SESSIONS_DIR = "${cfg.session.desktops}"; 57 XDG_CONFIG_DIRS = "${gnome3.gnome_settings_daemon}/etc/xdg"; 58 # Find the mouse 59 XCURSOR_PATH = "~/.icons:${config.system.path}/share/icons"; 60 }; 61 execCmd = "exec ${gdm}/bin/gdm"; 62 }; 63 64 # Because sd_login_monitor_new requires /run/systemd/machines 65 systemd.services.display-manager.wants = [ "systemd-machined.service" ]; 66 systemd.services.display-manager.after = [ "systemd-machined.service" ]; 67 68 systemd.services.display-manager.path = [ gnome3.gnome_shell gnome3.caribou pkgs.xlibs.xhost pkgs.dbus_tools ]; 69 70 services.dbus.packages = [ gdm ]; 71 72 programs.dconf.profiles.gdm = "${gdm}/share/dconf/profile/gdm"; 73 74 # GDM LFS PAM modules, adapted somehow to NixOS 75 security.pam.services = { 76 gdm-launch-environment.text = '' 77 auth required pam_succeed_if.so audit quiet_success user = gdm 78 auth optional pam_permit.so 79 80 account required pam_succeed_if.so audit quiet_success user = gdm 81 account sufficient pam_unix.so 82 83 password required pam_deny.so 84 85 session required pam_succeed_if.so audit quiet_success user = gdm 86 session required pam_env.so envfile=${config.system.build.pamEnvironment} 87 session optional ${pkgs.systemd}/lib/security/pam_systemd.so 88 session optional pam_keyinit.so force revoke 89 session optional pam_permit.so 90 ''; 91 92 gdm.text = '' 93 auth requisite pam_nologin.so 94 auth required pam_env.so 95 96 auth required pam_succeed_if.so uid >= 1000 quiet 97 auth optional ${gnome3.gnome_keyring}/lib/security/pam_gnome_keyring.so 98 auth ${if config.security.pam.enableEcryptfs then "required" else "sufficient"} pam_unix.so nullok likeauth 99 ${optionalString config.security.pam.enableEcryptfs 100 "auth required ${pkgs.ecryptfs}/lib/security/pam_ecryptfs.so unwrap"} 101 102 ${optionalString (! config.security.pam.enableEcryptfs) 103 "auth required pam_deny.so"} 104 105 account sufficient pam_unix.so 106 107 password requisite pam_unix.so nullok sha512 108 ${optionalString config.security.pam.enableEcryptfs 109 "password optional ${pkgs.ecryptfs}/lib/security/pam_ecryptfs.so"} 110 111 session required pam_env.so envfile=${config.system.build.pamEnvironment} 112 session required pam_unix.so 113 ${optionalString config.security.pam.enableEcryptfs 114 "session optional ${pkgs.ecryptfs}/lib/security/pam_ecryptfs.so"} 115 session required pam_loginuid.so 116 session optional ${pkgs.systemd}/lib/security/pam_systemd.so 117 session optional ${gnome3.gnome_keyring}/lib/security/pam_gnome_keyring.so auto_start 118 ''; 119 120 gdm-password.text = '' 121 auth requisite pam_nologin.so 122 auth required pam_env.so envfile=${config.system.build.pamEnvironment} 123 124 auth required pam_succeed_if.so uid >= 1000 quiet 125 auth optional ${gnome3.gnome_keyring}/lib/security/pam_gnome_keyring.so 126 auth ${if config.security.pam.enableEcryptfs then "required" else "sufficient"} pam_unix.so nullok likeauth 127 ${optionalString config.security.pam.enableEcryptfs 128 "auth required ${pkgs.ecryptfs}/lib/security/pam_ecryptfs.so unwrap"} 129 ${optionalString (! config.security.pam.enableEcryptfs) 130 "auth required pam_deny.so"} 131 132 account sufficient pam_unix.so 133 134 password requisite pam_unix.so nullok sha512 135 ${optionalString config.security.pam.enableEcryptfs 136 "password optional ${pkgs.ecryptfs}/lib/security/pam_ecryptfs.so"} 137 138 session required pam_env.so envfile=${config.system.build.pamEnvironment} 139 session required pam_unix.so 140 ${optionalString config.security.pam.enableEcryptfs 141 "session optional ${pkgs.ecryptfs}/lib/security/pam_ecryptfs.so"} 142 session required pam_loginuid.so 143 session optional ${pkgs.systemd}/lib/security/pam_systemd.so 144 session optional ${gnome3.gnome_keyring}/lib/security/pam_gnome_keyring.so auto_start 145 ''; 146 147 gdm-autologin.text = '' 148 auth requisite pam_nologin.so 149 150 auth required pam_succeed_if.so uid >= 1000 quiet 151 auth required pam_permit.so 152 153 account sufficient pam_unix.so 154 155 password requisite pam_unix.so nullok sha512 156 157 session optional pam_keyinit.so revoke 158 session required pam_env.so envfile=${config.system.build.pamEnvironment} 159 session required pam_unix.so 160 session required pam_loginuid.so 161 session optional ${pkgs.systemd}/lib/security/pam_systemd.so 162 ''; 163 164 }; 165 166 }; 167 168}