1import ./make-test-python.nix (
2 { pkgs, ... }:
3
4 let
5 adminPrivateKey = pkgs.writeText "id_ed25519" ''
6 -----BEGIN OPENSSH PRIVATE KEY-----
7 b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
8 QyNTUxOQAAACDu7qxYQAPdAU6RrhB3llk2N1v4PTwcVzcX1oX265uC3gAAAJBJiYxDSYmM
9 QwAAAAtzc2gtZWQyNTUxOQAAACDu7qxYQAPdAU6RrhB3llk2N1v4PTwcVzcX1oX265uC3g
10 AAAEDE1W6vMwSEUcF1r7Hyypm/+sCOoDmKZgPxi3WOa1mD2u7urFhAA90BTpGuEHeWWTY3
11 W/g9PBxXNxfWhfbrm4LeAAAACGJmb0BtaW5pAQIDBAU=
12 -----END OPENSSH PRIVATE KEY-----
13 '';
14
15 adminPublicKey = ''
16 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO7urFhAA90BTpGuEHeWWTY3W/g9PBxXNxfWhfbrm4Le root@client
17 '';
18
19 alicePrivateKey = pkgs.writeText "id_ed25519" ''
20 -----BEGIN OPENSSH PRIVATE KEY-----
21 b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
22 QyNTUxOQAAACBbeWvHh/AWGWI6EIc1xlSihyXtacNQ9KeztlW/VUy8wQAAAJAwVQ5VMFUO
23 VQAAAAtzc2gtZWQyNTUxOQAAACBbeWvHh/AWGWI6EIc1xlSihyXtacNQ9KeztlW/VUy8wQ
24 AAAEB7lbfkkdkJoE+4TKHPdPQWBKLSx+J54Eg8DaTr+3KoSlt5a8eH8BYZYjoQhzXGVKKH
25 Je1pw1D0p7O2Vb9VTLzBAAAACGJmb0BtaW5pAQIDBAU=
26 -----END OPENSSH PRIVATE KEY-----
27 '';
28
29 alicePublicKey = pkgs.writeText "id_ed25519.pub" ''
30 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFt5a8eH8BYZYjoQhzXGVKKHJe1pw1D0p7O2Vb9VTLzB alice@client
31 '';
32
33 bobPrivateKey = pkgs.writeText "id_ed25519" ''
34 -----BEGIN OPENSSH PRIVATE KEY-----
35 b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
36 QyNTUxOQAAACCWTaJ1D9Xjxy6759FvQ9oXTes1lmWBciXPkEeqTikBMAAAAJDQBmNV0AZj
37 VQAAAAtzc2gtZWQyNTUxOQAAACCWTaJ1D9Xjxy6759FvQ9oXTes1lmWBciXPkEeqTikBMA
38 AAAEDM1IYYFUwk/IVxauha9kuR6bbRtT3gZ6ZA0GLb9txb/pZNonUP1ePHLrvn0W9D2hdN
39 6zWWZYFyJc+QR6pOKQEwAAAACGJmb0BtaW5pAQIDBAU=
40 -----END OPENSSH PRIVATE KEY-----
41 '';
42
43 bobPublicKey = pkgs.writeText "id_ed25519.pub" ''
44 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJZNonUP1ePHLrvn0W9D2hdN6zWWZYFyJc+QR6pOKQEw bob@client
45 '';
46
47 gitoliteAdminConfSnippet = pkgs.writeText "gitolite-admin-conf-snippet" ''
48 repo alice-project
49 RW+ = alice
50 '';
51 in
52 {
53 name = "gitolite";
54
55 meta = with pkgs.lib.maintainers; {
56 maintainers = [ bjornfor ];
57 };
58
59 nodes = {
60
61 server =
62 { ... }:
63 {
64 services.gitolite = {
65 enable = true;
66 adminPubkey = adminPublicKey;
67 };
68 services.openssh.enable = true;
69 };
70
71 client =
72 { pkgs, ... }:
73 {
74 environment.systemPackages = [ pkgs.git ];
75 programs.ssh.extraConfig = ''
76 Host *
77 UserKnownHostsFile /dev/null
78 StrictHostKeyChecking no
79 # there's nobody around that can input password
80 PreferredAuthentications publickey
81 '';
82 users.users.alice = {
83 isNormalUser = true;
84 };
85 users.users.bob = {
86 isNormalUser = true;
87 };
88 };
89
90 };
91
92 testScript = ''
93 start_all()
94
95 with subtest("can setup ssh keys on system"):
96 client.succeed(
97 "mkdir -p ~root/.ssh",
98 "cp ${adminPrivateKey} ~root/.ssh/id_ed25519",
99 "chmod 600 ~root/.ssh/id_ed25519",
100 )
101 client.succeed(
102 "sudo -u alice mkdir -p ~alice/.ssh",
103 "sudo -u alice cp ${alicePrivateKey} ~alice/.ssh/id_ed25519",
104 "sudo -u alice chmod 600 ~alice/.ssh/id_ed25519",
105 )
106 client.succeed(
107 "sudo -u bob mkdir -p ~bob/.ssh",
108 "sudo -u bob cp ${bobPrivateKey} ~bob/.ssh/id_ed25519",
109 "sudo -u bob chmod 600 ~bob/.ssh/id_ed25519",
110 )
111
112 with subtest("gitolite server starts"):
113 server.wait_for_unit("gitolite-init.service")
114 server.wait_for_unit("sshd.service")
115 client.succeed("ssh -n gitolite@server info")
116
117 with subtest("admin can clone and configure gitolite-admin.git"):
118 client.succeed(
119 "git clone gitolite@server:gitolite-admin.git",
120 "git config --global user.name 'System Administrator'",
121 "git config --global user.email root\@domain.example",
122 "cp ${alicePublicKey} gitolite-admin/keydir/alice.pub",
123 "cp ${bobPublicKey} gitolite-admin/keydir/bob.pub",
124 "(cd gitolite-admin && git add . && git commit -m 'Add keys for alice, bob' && git push)",
125 "cat ${gitoliteAdminConfSnippet} >> gitolite-admin/conf/gitolite.conf",
126 "(cd gitolite-admin && git add . && git commit -m 'Add repo for alice' && git push)",
127 )
128
129 with subtest("non-admins cannot clone gitolite-admin.git"):
130 client.fail("sudo -i -u alice git clone gitolite@server:gitolite-admin.git")
131 client.fail("sudo -i -u bob git clone gitolite@server:gitolite-admin.git")
132
133 with subtest("non-admins can clone testing.git"):
134 client.succeed("sudo -i -u alice git clone gitolite@server:testing.git")
135 client.succeed("sudo -i -u bob git clone gitolite@server:testing.git")
136
137 with subtest("alice can clone alice-project.git"):
138 client.succeed("sudo -i -u alice git clone gitolite@server:alice-project.git")
139
140 with subtest("bob cannot clone alice-project.git"):
141 client.fail("sudo -i -u bob git clone gitolite@server:alice-project.git")
142 '';
143 }
144)