1{ ... }:
2let
3 adminPassword = "mySecretPassword";
4in
5{
6 name = "lldap";
7
8 nodes.machine =
9 { pkgs, lib, ... }:
10 {
11 services.lldap = {
12 enable = true;
13
14 settings = {
15 verbose = true;
16 ldap_base_dn = "dc=example,dc=com";
17
18 ldap_user_pass = "password";
19 };
20 };
21 environment.systemPackages = [ pkgs.openldap ];
22
23 specialisation = {
24 differentAdminPassword.configuration =
25 { ... }:
26 {
27 services.lldap.settings = {
28 ldap_user_pass = lib.mkForce null;
29 ldap_user_pass_file = lib.mkForce (toString (pkgs.writeText "adminPasswordFile" adminPassword));
30 force_ldap_user_pass_reset = "always";
31 };
32 };
33
34 changeAdminPassword.configuration =
35 { ... }:
36 {
37 services.lldap.settings = {
38 ldap_user_pass = lib.mkForce null;
39 ldap_user_pass_file = toString (pkgs.writeText "adminPasswordFile" "password");
40 force_ldap_user_pass_reset = false;
41 };
42 };
43 };
44 };
45
46 testScript =
47 { nodes, ... }:
48 let
49 specializations = "${nodes.machine.system.build.toplevel}/specialisation";
50 in
51 ''
52 machine.wait_for_unit("lldap.service")
53 machine.wait_for_open_port(3890)
54 machine.wait_for_open_port(17170)
55
56 machine.succeed("curl --location --fail http://localhost:17170/")
57
58 adminPassword="${adminPassword}"
59
60 def try_login(user, password, expect_success=True):
61 cmd = f'ldapsearch -H ldap://localhost:3890 -D uid={user},ou=people,dc=example,dc=com -b "ou=people,dc=example,dc=com" -w {password}'
62 code, response = machine.execute(cmd)
63 print(cmd)
64 print(response)
65 if expect_success:
66 if code != 0:
67 raise Exception(f"Expected success, had failure {code}")
68 else:
69 if code == 0:
70 raise Exception("Expected failure, had success")
71 return response
72
73 with subtest("default admin password"):
74 try_login("admin", "password", expect_success=True)
75 try_login("admin", adminPassword, expect_success=False)
76
77 with subtest("different admin password"):
78 machine.succeed('${specializations}/differentAdminPassword/bin/switch-to-configuration test')
79 try_login("admin", "password", expect_success=False)
80 try_login("admin", adminPassword, expect_success=True)
81
82 with subtest("change admin password has no effect"):
83 machine.succeed('${specializations}/differentAdminPassword/bin/switch-to-configuration test')
84 try_login("admin", "password", expect_success=False)
85 try_login("admin", adminPassword, expect_success=True)
86 '';
87}