python3Packages.xknx: 1.1.0 -> 1.2.0
[NixPkgs.git] / nixos / tests / matrix / synapse.nix
blob698d67c793e3aef3123ed37b1e2c63bebb5dcf8c
1 import ../make-test-python.nix ({ pkgs, ... } : let
4   runWithOpenSSL = file: cmd: pkgs.runCommand file {
5     buildInputs = [ pkgs.openssl ];
6   } cmd;
9   ca_key = runWithOpenSSL "ca-key.pem" "openssl genrsa -out $out 2048";
10   ca_pem = runWithOpenSSL "ca.pem" ''
11     openssl req \
12       -x509 -new -nodes -key ${ca_key} \
13       -days 10000 -out $out -subj "/CN=snakeoil-ca"
14   '';
15   key = runWithOpenSSL "matrix_key.pem" "openssl genrsa -out $out 2048";
16   csr = runWithOpenSSL "matrix.csr" ''
17     openssl req \
18        -new -key ${key} \
19        -out $out -subj "/CN=localhost" \
20   '';
21   cert = runWithOpenSSL "matrix_cert.pem" ''
22     openssl x509 \
23       -req -in ${csr} \
24       -CA ${ca_pem} -CAkey ${ca_key} \
25       -CAcreateserial -out $out \
26       -days 365
27   '';
30   mailerCerts = import ../common/acme/server/snakeoil-certs.nix;
31   mailerDomain = mailerCerts.domain;
32   registrationSharedSecret = "unsecure123";
33   testUser = "alice";
34   testPassword = "alicealice";
35   testEmail = "alice@example.com";
37   listeners = [ {
38     port = 8448;
39     bind_addresses = [
40       "127.0.0.1"
41       "::1"
42     ];
43     type = "http";
44     tls = true;
45     x_forwarded = false;
46     resources = [ {
47       names = [
48         "client"
49       ];
50       compress = true;
51     } {
52       names = [
53         "federation"
54       ];
55       compress = false;
56     } ];
57   } ];
59 in {
61   name = "matrix-synapse";
62   meta = with pkgs.lib; {
63     maintainers = teams.matrix.members;
64   };
66   nodes = {
67     # Since 0.33.0, matrix-synapse doesn't allow underscores in server names
68     serverpostgres = { pkgs, nodes, ... }: let
69       mailserverIP = nodes.mailserver.config.networking.primaryIPAddress;
70     in
71     {
72       services.matrix-synapse = {
73         enable = true;
74         settings = {
75           inherit listeners;
76           database = {
77             name = "psycopg2";
78             args.password = "synapse";
79           };
80           tls_certificate_path = "${cert}";
81           tls_private_key_path = "${key}";
82           registration_shared_secret = registrationSharedSecret;
83           public_baseurl = "https://example.com";
84           email = {
85             smtp_host = mailerDomain;
86             smtp_port = 25;
87             require_transport_security = true;
88             notif_from = "matrix <matrix@${mailerDomain}>";
89             app_name = "Matrix";
90           };
91         };
92       };
93       services.postgresql = {
94         enable = true;
96         # The database name and user are configured by the following options:
97         #   - services.matrix-synapse.database_name
98         #   - services.matrix-synapse.database_user
99         #
100         # The values used here represent the default values of the module.
101         initialScript = pkgs.writeText "synapse-init.sql" ''
102           CREATE ROLE "matrix-synapse" WITH LOGIN PASSWORD 'synapse';
103           CREATE DATABASE "matrix-synapse" WITH OWNER "matrix-synapse"
104             TEMPLATE template0
105             LC_COLLATE = "C"
106             LC_CTYPE = "C";
107         '';
108       };
110       networking.extraHosts = ''
111         ${mailserverIP} ${mailerDomain}
112       '';
114       security.pki.certificateFiles = [
115         mailerCerts.ca.cert ca_pem
116       ];
118       environment.systemPackages = let
119         sendTestMailStarttls = pkgs.writeScriptBin "send-testmail-starttls" ''
120           #!${pkgs.python3.interpreter}
121           import smtplib
122           import ssl
124           ctx = ssl.create_default_context()
126           with smtplib.SMTP('${mailerDomain}') as smtp:
127             smtp.ehlo()
128             smtp.starttls(context=ctx)
129             smtp.ehlo()
130             smtp.sendmail('matrix@${mailerDomain}', '${testEmail}', 'Subject: Test STARTTLS\n\nTest data.')
131             smtp.quit()
132          '';
134         obtainTokenAndRegisterEmail = let
135           # adding the email through the API is quite complicated as it involves more than one step and some
136           # client-side calculation
137           insertEmailForAlice = pkgs.writeText "alice-email.sql" ''
138             INSERT INTO user_threepids (user_id, medium, address, validated_at, added_at) VALUES ('${testUser}@serverpostgres', 'email', '${testEmail}', '1629149927271', '1629149927270');
139           '';
140         in
141         pkgs.writeScriptBin "obtain-token-and-register-email" ''
142           #!${pkgs.runtimeShell}
143           set -o errexit
144           set -o pipefail
145           set -o nounset
146           su postgres -c "psql -d matrix-synapse -f ${insertEmailForAlice}"
147           curl --fail -XPOST 'https://localhost:8448/_matrix/client/r0/account/password/email/requestToken' -d '{"email":"${testEmail}","client_secret":"foobar","send_attempt":1}' -v
148         '';
149         in [ sendTestMailStarttls pkgs.matrix-synapse obtainTokenAndRegisterEmail ];
150     };
152     # test mail delivery
153     mailserver = args: let
154     in
155     {
156       security.pki.certificateFiles = [
157         mailerCerts.ca.cert
158       ];
160       networking.firewall.enable = false;
162       services.postfix = {
163         enable = true;
164         hostname = "${mailerDomain}";
165         # open relay for subnet
166         networksStyle = "subnet";
167         enableSubmission = true;
168         tlsTrustedAuthorities = "${mailerCerts.ca.cert}";
169         sslCert = "${mailerCerts.${mailerDomain}.cert}";
170         sslKey = "${mailerCerts.${mailerDomain}.key}";
172         # blackhole transport
173         transport = "example.com discard:silently";
175         config = {
176           debug_peer_level = "10";
177           smtpd_relay_restrictions = [
178             "permit_mynetworks" "reject_unauth_destination"
179           ];
181           # disable obsolete protocols, something old versions of twisted are still using
182           smtpd_tls_protocols = "TLSv1.3, TLSv1.2, !TLSv1.1, !TLSv1, !SSLv2, !SSLv3";
183           smtp_tls_protocols = "TLSv1.3, TLSv1.2, !TLSv1.1, !TLSv1, !SSLv2, !SSLv3";
184           smtpd_tls_mandatory_protocols = "TLSv1.3, TLSv1.2, !TLSv1.1, !TLSv1, !SSLv2, !SSLv3";
185           smtp_tls_mandatory_protocols = "TLSv1.3, TLSv1.2, !TLSv1.1, !TLSv1, !SSLv2, !SSLv3";
186         };
187       };
188     };
190     serversqlite = args: {
191       services.matrix-synapse = {
192         enable = true;
193         settings = {
194           inherit listeners;
195           database.name = "sqlite3";
196           tls_certificate_path = "${cert}";
197           tls_private_key_path = "${key}";
198         };
199       };
200     };
201   };
203   testScript = ''
204     start_all()
205     mailserver.wait_for_unit("postfix.service")
206     serverpostgres.succeed("send-testmail-starttls")
207     serverpostgres.wait_for_unit("matrix-synapse.service")
208     serverpostgres.wait_until_succeeds(
209         "curl --fail -L --cacert ${ca_pem} https://localhost:8448/"
210     )
211     serverpostgres.require_unit_state("postgresql.service")
212     serverpostgres.succeed("register_new_matrix_user -u ${testUser} -p ${testPassword} -a -k ${registrationSharedSecret} https://localhost:8448/")
213     serverpostgres.succeed("obtain-token-and-register-email")
214     serversqlite.wait_for_unit("matrix-synapse.service")
215     serversqlite.wait_until_succeeds(
216         "curl --fail -L --cacert ${ca_pem} https://localhost:8448/"
217     )
218     serversqlite.succeed("[ -e /var/lib/matrix-synapse/homeserver.db ]")
219   '';