python312Packages.dissect-extfs: 3.11 -> 3.12
[NixPkgs.git] / nixos / tests / openldap.nix
blob47d6a91843f115341bfda2fd4793638387b3f343
1 import ./make-test-python.nix ({ pkgs, ... }: let
2   dbContents = ''
3     dn: dc=example
4     objectClass: domain
5     dc: example
7     dn: ou=users,dc=example
8     objectClass: organizationalUnit
9     ou: users
10   '';
12   ldifConfig = ''
13     dn: cn=config
14     cn: config
15     objectClass: olcGlobal
16     olcLogLevel: stats
18     dn: cn=schema,cn=config
19     cn: schema
20     objectClass: olcSchemaConfig
22     include: file://${pkgs.openldap}/etc/schema/core.ldif
23     include: file://${pkgs.openldap}/etc/schema/cosine.ldif
24     include: file://${pkgs.openldap}/etc/schema/inetorgperson.ldif
26     dn: olcDatabase={0}config,cn=config
27     olcDatabase: {0}config
28     objectClass: olcDatabaseConfig
29     olcRootDN: cn=root,cn=config
30     olcRootPW: configpassword
32     dn: olcDatabase={1}mdb,cn=config
33     objectClass: olcDatabaseConfig
34     objectClass: olcMdbConfig
35     olcDatabase: {1}mdb
36     olcDbDirectory: /var/db/openldap
37     olcDbIndex: objectClass eq
38     olcSuffix: dc=example
39     olcRootDN: cn=root,dc=example
40     olcRootPW: notapassword
41   '';
43   ldapClientConfig = {
44     enable = true;
45     loginPam = false;
46     nsswitch = false;
47     server = "ldap://";
48     base = "dc=example";
49   };
51 in {
52   name = "openldap";
54   nodes.machine = { pkgs, ... }: {
55     environment.etc."openldap/root_password".text = "notapassword";
57     users.ldap = ldapClientConfig;
59     services.openldap = {
60       enable = true;
61       urlList = [ "ldapi:///" "ldap://" ];
62       settings = {
63         children = {
64           "cn=schema".includes = [
65             "${pkgs.openldap}/etc/schema/core.ldif"
66             "${pkgs.openldap}/etc/schema/cosine.ldif"
67             "${pkgs.openldap}/etc/schema/inetorgperson.ldif"
68             "${pkgs.openldap}/etc/schema/nis.ldif"
69           ];
70           "olcDatabase={0}config" = {
71             attrs = {
72               objectClass = [ "olcDatabaseConfig" ];
73               olcDatabase = "{0}config";
74               olcRootDN = "cn=root,cn=config";
75               olcRootPW = "configpassword";
76             };
77           };
78           "olcDatabase={1}mdb" = {
79             # This tests string, base64 and path values, as well as lists of string values
80             attrs = {
81               objectClass = [ "olcDatabaseConfig" "olcMdbConfig" ];
82               olcDatabase = "{1}mdb";
83               olcDbDirectory = "/var/lib/openldap/db";
84               olcSuffix = "dc=example";
85               olcRootDN = {
86                 # cn=root,dc=example
87                 base64 = "Y249cm9vdCxkYz1leGFtcGxl";
88               };
89               olcRootPW = {
90                 path = "/etc/openldap/root_password";
91               };
92             };
93           };
94         };
95       };
96     };
98     specialisation = {
99       declarativeContents.configuration = { ... }: {
100         services.openldap.declarativeContents."dc=example" = dbContents;
101       };
102       mutableConfig.configuration = { ... }: {
103         services.openldap = {
104           declarativeContents."dc=example" = dbContents;
105           mutableConfig = true;
106         };
107       };
108       manualConfigDir = {
109         inheritParentConfig = false;
110         configuration = { ... }: {
111           users.ldap = ldapClientConfig;
112           services.openldap = {
113             enable = true;
114             configDir = "/var/db/slapd.d";
115           };
116         };
117       };
118     };
119   };
120   testScript = { nodes, ... }: let
121     specializations = "${nodes.machine.system.build.toplevel}/specialisation";
122     changeRootPw = ''
123       dn: olcDatabase={1}mdb,cn=config
124       changetype: modify
125       replace: olcRootPW
126       olcRootPW: foobar
127     '';
128   in ''
129     # Test startup with empty DB
130     machine.wait_for_unit("openldap.service")
132     with subtest("declarative contents"):
133       machine.succeed('${specializations}/declarativeContents/bin/switch-to-configuration test')
134       machine.wait_for_unit("openldap.service")
135       machine.succeed('ldapsearch -LLL -D "cn=root,dc=example" -w notapassword')
136       machine.fail('ldapmodify -D cn=root,cn=config -w configpassword -f ${pkgs.writeText "rootpw.ldif" changeRootPw}')
138     with subtest("mutable config"):
139       machine.succeed('${specializations}/mutableConfig/bin/switch-to-configuration test')
140       machine.succeed('ldapsearch -LLL -D "cn=root,dc=example" -w notapassword')
141       machine.succeed('ldapmodify -D cn=root,cn=config -w configpassword -f ${pkgs.writeText "rootpw.ldif" changeRootPw}')
142       machine.succeed('ldapsearch -LLL -D "cn=root,dc=example" -w foobar')
144     with subtest("manual config dir"):
145       machine.succeed(
146         'mkdir /var/db/slapd.d /var/db/openldap',
147         'slapadd -F /var/db/slapd.d -n0 -l ${pkgs.writeText "config.ldif" ldifConfig}',
148         'slapadd -F /var/db/slapd.d -n1 -l ${pkgs.writeText "contents.ldif" dbContents}',
149         'chown -R openldap:openldap /var/db/slapd.d /var/db/openldap',
150         '${specializations}/manualConfigDir/bin/switch-to-configuration test',
151       )
152       machine.succeed('ldapsearch -LLL -D "cn=root,dc=example" -w notapassword')
153       machine.succeed('ldapmodify -D cn=root,cn=config -w configpassword -f ${pkgs.writeText "rootpw.ldif" changeRootPw}')
154       machine.succeed('ldapsearch -LLL -D "cn=root,dc=example" -w foobar')
155   '';