# Copyright : # - Tom Hubrecht 2023 # # Ce logiciel est un programme informatique servant à déployer des # configurations de serveurs via NixOS. # # Ce logiciel est régi par la licence CeCILL soumise au droit français et # respectant les principes de diffusion des logiciels libres. Vous pouvez # utiliser, modifier et/ou redistribuer ce programme sous les conditions # de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA # sur le site "http://www.cecill.info". # # En contrepartie de l'accessibilité au code source et des droits de copie, # de modification et de redistribution accordés par cette licence, il n'est # offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, # seule une responsabilité restreinte pèse sur l'auteur du programme, le # titulaire des droits patrimoniaux et les concédants successifs. # # A cet égard l'attention de l'utilisateur est attirée sur les risques # associés au chargement, à l'utilisation, à la modification et/ou au # développement et à la reproduction du logiciel par l'utilisateur étant # donné sa spécificité de logiciel libre, qui peut le rendre complexe à # manipuler et qui le réserve donc à des développeurs et des professionnels # avertis possédant des connaissances informatiques approfondies. Les # utilisateurs sont donc invités à charger et tester l'adéquation du # logiciel à leurs besoins dans des conditions permettant d'assurer la # sécurité de leurs systèmes et ou de leurs données et, plus généralement, # à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. # # Le fait que vous puissiez accéder à cet en-tête signifie que vous avez # pris connaissance de la licence CeCILL, et que vous en avez accepté les # termes. { config, lib, dgn-keys, meta, nodeMeta, ... }: let inherit (lib) mkDefault mkEnableOption mkIf mkMerge mkOption optionalAttrs types ; admins = meta.organization.groups.root ++ nodeMeta.admins ++ (builtins.concatMap (g: meta.organization.groups.${g}) nodeMeta.adminGroups); cfg = config.dgn-access-control; in { options.dgn-access-control = { enable = mkEnableOption "DGNum access control." // { default = true; }; users = mkOption { type = with types; attrsOf (listOf str); default = { }; description = '' Attribute set describing which member has access to which user on the node. Members must be declared in `meta/members.nix`. ''; example = '' { user1 = [ "member1" "member2" ]; } ''; }; }; config = mkIf cfg.enable (mkMerge [ { # Admins have root access to the node dgn-access-control.users.root = mkDefault admins; } (optionalAttrs (nodeMeta.nixpkgs.system == "nixos") { users.mutableUsers = false; users.users = builtins.mapAttrs ( username: members: { openssh.authorizedKeys.keys = dgn-keys.getKeys members; } // optionalAttrs (username == "root") { inherit (nodeMeta) hashedPassword; } ) cfg.users; }) (optionalAttrs (nodeMeta.nixpkgs.system == "zyxel-nwa50ax") { users = builtins.mapAttrs (_: members: { openssh.authorizedKeys.keys = dgn-keys.getKeys members; }) cfg.users; }) ]); }