# 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-lib, ... }: let inherit (lib) mkOption types; inherit (dgn-lib) getSecrets mkBaseSecrets recursiveFuse; cfg = config.dgn-secrets; optionsType = with types; submodule ({ config, ... }: { options = { mode = mkOption { type = str; default = "0400"; description = '' Permissions mode of the decrypted secret in a format understood by chmod. ''; }; owner = mkOption { type = str; default = "0"; description = '' User of the decrypted secret. ''; }; group = mkOption { type = str; default = config.users.${config.owner}.group or "0"; description = '' Group of the decrypted secret. ''; }; }; }); in { options.dgn-secrets = { sources = mkOption { type = with types; listOf path; default = [ ]; description = '' List of directories containing secrets managed with agenix. ''; }; options = mkOption { type = with types; listOf (attrsOf optionsType); default = [ ]; description = '' List of attribute sets of secrets' configuration overrides. ''; }; names = mkOption { type = with types; listOf str; default = builtins.foldl' (acc: dir: acc ++ (dgn-lib.getSecrets dir)) [ ] cfg.sources; description = '' List of the names of the secrets. ''; }; matches = mkOption { type = with types; attrsOf optionsType; default = { }; description = '' Matches of secret names associated to options. ''; }; }; config = { dgn-secrets.options = builtins.concatLists (builtins.attrValues (builtins.mapAttrs (pattern: options: builtins.map (secret: { ${secret} = options; }) (builtins.filter (secret: builtins.match pattern secret != null) cfg.names)) cfg.matches)); age.secrets = recursiveFuse (cfg.options ++ (builtins.map (dir: mkBaseSecrets dir (getSecrets dir)) cfg.sources)); }; }