dotfiles

My PC Dotfiles & Website

modules/system/user/default.nix (5207B)


  1## User Configuration ##
  2{
  3  config,
  4  inputs,
  5  ...
  6}: let
  7  inherit (config.flake) files modules;
  8  inherit (config) util;
  9in {
 10  flake.modules = {
 11    # Base User Configuration
 12    nixos.user = {
 13      imports = [modules.nixos.user-cli];
 14      system.homeModules = [modules.homeManager.default];
 15    };
 16
 17    nixos.user-cli = {
 18      config,
 19      lib,
 20      ...
 21    }: let
 22      inherit (lib) mkIf;
 23    in {
 24      imports = [inputs.home-manager.nixosModules.home-manager];
 25
 26      options.system.homeModules = lib.mkOption {
 27        type = lib.types.listOf lib.types.deferredModule;
 28        default = [modules.homeManager.cli];
 29        description = "Shared system Home Manager modules";
 30      };
 31
 32      config = {
 33        users.mutableUsers = false;
 34        users.extraUsers.root = {
 35          isNormalUser = false;
 36          extraGroups = ["wheel"];
 37          hashedPasswordFile = mkIf (config.sops.secrets ? "root.secret") config.sops.secrets."root.secret".path;
 38        };
 39
 40        # User Passwords
 41        sops.secrets =
 42          lib.filterAttrs (
 43            name: _: builtins.hasAttr (lib.removeSuffix ".secret" name) config.users.users
 44          ) (util.map.secrets {
 45            directory = ../../../secrets/passwords;
 46            neededForUsers = true;
 47          });
 48
 49        # Home Manager settings
 50        home-manager = {
 51          useGlobalPkgs = true;
 52          useUserPackages = true;
 53          backupFileExtension = "bak";
 54          extraSpecialArgs = {inherit inputs;};
 55
 56          # Default Modules
 57          sharedModules = config.system.homeModules;
 58        };
 59
 60        # XDG directories
 61        environment.sessionVariables = {
 62          "XDG_CACHE_HOME" = "$HOME/.cache";
 63          "XDG_CONFIG_HOME" = "$HOME/.config";
 64          "XDG_DATA_HOME" = "$HOME/.local/share";
 65          "XDG_BIN_HOME" = "$HOME/.local/bin";
 66        };
 67      };
 68    };
 69
 70    # Global Home Manager Configuration
 71    homeManager.user = {
 72      config,
 73      lib,
 74      ...
 75    }: {
 76      imports = [modules.homeManager.user-cli];
 77      config = {
 78        # Environment Settings
 79        home.file = {
 80          ".local/share/backgrounds".source = files.wallpapers.path;
 81          ".config/gtk-3.0/bookmarks" = {
 82            text = lib.mkBefore ''
 83              file://${config.home.homeDirectory}/Downloads Downloads
 84              file://${config.home.homeDirectory}/Pictures Pictures
 85              file://${config.home.homeDirectory}/Documents Documents
 86            '';
 87            force = true;
 88          };
 89        };
 90
 91        # User Directories
 92        xdg = {
 93          enable = true;
 94          mime.enable = true;
 95          mimeApps.enable = true;
 96          configFile."mimeapps.list".force = true;
 97          userDirs = {
 98            enable = true;
 99            createDirectories = true;
100            desktop = "$HOME/Desktop";
101            documents = "$HOME/Documents";
102            download = "$HOME/Downloads";
103            music = "$HOME/Music";
104            pictures = "$HOME/Pictures";
105            publicShare = "$HOME/Public";
106            templates = "$HOME/Templates";
107            videos = "$HOME/Videos";
108            extraConfig."SCREENSHOTS" = "$HOME/Pictures/Screenshots";
109          };
110        };
111      };
112    };
113
114    homeManager.user-cli = {
115      config,
116      lib,
117      ...
118    }: let
119      inherit (lib) mkIf mkOption types;
120      cfg = config.credentials;
121    in {
122      # Mutable file support
123      imports = [(import ./_mutable.nix)];
124
125      # User Identity
126      options.credentials = {
127        name = mkOption {
128          description = "Work User Name";
129          type = types.str;
130          default = config.home.username;
131        };
132
133        fullname = mkOption {
134          description = "Full User Name";
135          type = types.str;
136          default = "Default User";
137        };
138
139        mail = mkOption {
140          description = "User Mail ID";
141          type = types.str;
142          default = "";
143          example = "user@email.com";
144        };
145
146        key = mkOption {
147          description = "User GPG Key";
148          type = types.str;
149          default = "";
150          example = "Use 'gpg --list-signatures --keyid-format short'";
151        };
152      };
153
154      config = {
155        xdg.enable = true;
156
157        # Update News
158        news.display = "show";
159
160        # User Services
161        systemd.user = {
162          enable = true;
163          startServices = true;
164        };
165
166        # GPG Keys
167        programs.gpg = {
168          settings = mkIf (cfg.key != "") {
169            default-key = cfg.key;
170            default-recipient-self = true;
171            auto-key-locate = "local,wkd,keyserver";
172            keyserver = "hkps://keys.openpgp.org";
173            auto-key-retrieve = true;
174            auto-key-import = true;
175            keyserver-options = "honor-keyserver-url";
176          };
177
178          publicKeys =
179            map
180            (source: {
181              inherit source;
182              trust = "ultimate";
183            })
184            (
185              builtins.attrValues (
186                util.map.files {
187                  directory = ../../../secrets/keys;
188                  extension = ".gpg";
189                }
190              )
191            );
192        };
193      };
194    };
195  };
196}