Compare commits
253 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d93801795 | ||
|
|
f8682e43af | ||
|
|
290ecd7fb9 | ||
|
|
26aeb33d0e | ||
|
|
9f6a6ef771 | ||
|
|
8e72c77151 | ||
|
|
0931e8bfad | ||
|
|
8bfcb263ce | ||
|
|
94bd140d92 | ||
|
|
55fb3bde18 | ||
|
|
b8c2e4b286 | ||
|
|
422f2b5f35 | ||
|
|
25c9352df2 | ||
|
|
478f3580a6 | ||
|
|
58d82345cf | ||
|
|
49a2dbbea9 | ||
|
|
e5df109acc | ||
|
|
fd80c93278 | ||
|
|
8b56a68dd0 | ||
|
|
e99b0d9a5d | ||
|
|
9394b4a02e | ||
|
|
b93b5621a8 | ||
|
|
028c6645f6 | ||
|
|
29b721457f | ||
|
|
436ff4266d | ||
|
|
b60557ea14 | ||
|
|
cc40cbbfcb | ||
|
|
53a48ceeb4 | ||
|
|
de750591bb | ||
|
|
7f53673d66 | ||
|
|
a4e9b9a6d1 | ||
|
|
abafe0b579 | ||
|
|
b8a59ebb69 | ||
|
|
e41486e1b4 | ||
|
|
7fee626dbb | ||
|
|
de3ae78346 | ||
|
|
9cb28d29dc | ||
|
|
4fc1c3cef0 | ||
|
|
0d55a94c8d | ||
|
|
0868614791 | ||
|
|
8041a9fcef | ||
|
|
4ef20a8f08 | ||
|
|
d898f229c8 | ||
|
|
75efef6cbb | ||
|
|
3ca3794cc1 | ||
|
|
58fe826905 | ||
|
|
2d8b58a66b | ||
|
|
80ea999dcf | ||
|
|
d57e637ac7 | ||
|
|
4becdfaf1a | ||
|
|
2ed3fd8eb1 | ||
|
|
8a7e098f4f | ||
|
|
5a73f8790c | ||
|
|
1c8bd95bf8 | ||
|
|
da68486f69 | ||
|
|
e338d70303 | ||
|
|
0e793468aa | ||
|
|
1ed71044fd | ||
|
|
61f6bf7e11 | ||
|
|
08ce8185b7 | ||
|
|
7f405a1e6b | ||
|
|
630b30e9cd | ||
|
|
7ceec54658 | ||
|
|
9ff85f5103 | ||
|
|
3402ad2131 | ||
|
|
5410b2b017 | ||
|
|
c9814e25db | ||
|
|
89eb13fa70 | ||
|
|
e8316ee377 | ||
|
|
6603220ece | ||
|
|
9b790d39b7 | ||
|
|
6fbd0e437c | ||
|
|
f03c4e5243 | ||
|
|
3969cc4fe5 | ||
|
|
d4356d2e75 | ||
|
|
3f416461fb | ||
|
|
f951536f97 | ||
|
|
213dcc79bf | ||
|
|
43631d9042 | ||
|
|
7889bd5bba | ||
|
|
a29ec53ef8 | ||
|
|
ff7dc454d1 | ||
|
|
9e0b281b9f | ||
|
|
44dbaf4e5f | ||
|
|
d124978826 | ||
|
|
d2366dca87 | ||
|
|
18c22f35ea | ||
|
|
98c21db158 | ||
|
|
3649849e1c | ||
|
|
f450beb46f | ||
|
|
b4c4b76e52 | ||
|
|
8cb161e997 | ||
|
|
5fdccc8df9 | ||
|
|
9e387f7915 | ||
|
|
a3584e777e | ||
|
|
d1867c7ba6 | ||
|
|
4b6d902230 | ||
|
|
2774e37e72 | ||
|
|
f3f7bec506 | ||
|
|
9735318be9 | ||
|
|
b06afd8e63 | ||
|
|
6403278d37 | ||
|
|
3e2d60a34c | ||
|
|
b02f6409cb | ||
|
|
29e23bd85e | ||
|
|
eed12bfe0b | ||
|
|
1a30c1864d | ||
|
|
cf8933b222 | ||
|
|
9d1d46c30f | ||
|
|
8ca2a5c12a | ||
|
|
2ea3d1b3c8 | ||
|
|
4a48d7978b | ||
|
|
b636aff2ae | ||
|
|
2f4a5d9d5a | ||
|
|
fd18a30b94 | ||
|
|
0dd99f211c | ||
|
|
807c03724d | ||
|
|
90bed040d5 | ||
|
|
82bc13b9cc | ||
|
|
faa3e64bc9 | ||
|
|
898f2db57b | ||
|
|
03e34a374a | ||
|
|
cfbd1cd54e | ||
|
|
429625a920 | ||
|
|
e2a6fd55a2 | ||
|
|
23d4c1106a | ||
|
|
99612d5740 | ||
|
|
2f3b5edfbc | ||
|
|
35ee043100 | ||
|
|
ed9a5d5cd5 | ||
|
|
d9e1eca30e | ||
|
|
ea99f2f4a5 | ||
|
|
35c31e2512 | ||
|
|
370f256143 | ||
|
|
f5a5440cc8 | ||
|
|
e226002bf3 | ||
|
|
9c84c6424f | ||
|
|
97eebecf37 | ||
|
|
0c32ddde1f | ||
|
|
24680e18af | ||
|
|
97e11820b7 | ||
|
|
700d3b23cb | ||
|
|
2859cc73d0 | ||
|
|
aae5a5eecd | ||
|
|
9ed6f56792 | ||
|
|
404f794d10 | ||
|
|
8d5978a8e0 | ||
|
|
c380911b76 | ||
|
|
ac332c311a | ||
|
|
6f78e44bf2 | ||
|
|
2c407c2f3c | ||
|
|
1069750c78 | ||
|
|
99b08d6c0a | ||
|
|
b2e7800788 | ||
|
|
e915c9837c | ||
|
|
8b9c4141a2 | ||
|
|
760a37bdb2 | ||
|
|
d4f05c3748 | ||
|
|
401535ce2d | ||
|
|
fbf2ac8ef4 | ||
|
|
4d0bfd8bf1 | ||
|
|
0d8f2eab6f | ||
|
|
0bc489a337 | ||
|
|
ce0f8eb9be | ||
|
|
f47064f648 | ||
|
|
75d97f2bb3 | ||
|
|
43f64a052d | ||
|
|
27e6c5a442 | ||
|
|
8983e8fcee | ||
|
|
4ec76880a0 | ||
|
|
01ed3cc5ab | ||
|
|
6e4c16ba2e | ||
|
|
b2f3950795 | ||
|
|
2844b64621 | ||
|
|
20582a7fe6 | ||
|
|
de875e14f6 | ||
|
|
6ca10fe63d | ||
|
|
08e65a0769 | ||
|
|
bc031e515e | ||
|
|
ce74f2b418 | ||
|
|
292ffd482b | ||
|
|
8267b04c4f | ||
|
|
4ab831470b | ||
|
|
203fcc8baf | ||
|
|
dbb03144dd | ||
|
|
3e384b6ea4 | ||
|
|
2b70590b4f | ||
|
|
f32618bc44 | ||
|
|
63389b8969 | ||
|
|
2faf4a83c1 | ||
|
|
0de4fcd2c1 | ||
|
|
4501f517cd | ||
|
|
50b81437a3 | ||
|
|
cb2effd01e | ||
|
|
8a0741d6a2 | ||
|
|
8605a2801f | ||
|
|
39b8fe59e8 | ||
|
|
ab0335ff1a | ||
|
|
e6d27ee341 | ||
|
|
306ee5dadb | ||
|
|
e6b9d6cafb | ||
|
|
8e02930fbd | ||
|
|
8c3209768d | ||
|
|
cdab116284 | ||
|
|
092b466ff4 | ||
|
|
6177240cf6 | ||
|
|
cf22aa6ae7 | ||
|
|
aa02b23016 | ||
|
|
2cd92623e2 | ||
|
|
ee7878d3d2 | ||
|
|
33dca51dcd | ||
|
|
122b16805f | ||
|
|
3a69b0c615 | ||
|
|
f27425775e | ||
|
|
47855846f5 | ||
|
|
96bfd2839c | ||
|
|
e6f8f7b246 | ||
|
|
426035f1d5 | ||
|
|
c2d2f9bd03 | ||
|
|
4e5fb767f6 | ||
|
|
feb0208b8d | ||
|
|
ec4900372c | ||
|
|
340a757d88 | ||
|
|
93ec693780 | ||
|
|
668112e865 | ||
|
|
233a26a8db | ||
|
|
5703b98d6f | ||
|
|
ee10da9df5 | ||
|
|
7123688a92 | ||
|
|
38cd11c0b7 | ||
|
|
d06f83a567 | ||
|
|
fb83f5a54e | ||
|
|
ad4d18e706 | ||
|
|
80425602a3 | ||
|
|
de44651747 | ||
|
|
79c17c17f1 | ||
|
|
605a809a32 | ||
|
|
b5963b4276 | ||
|
|
a6c93ac360 | ||
|
|
b5662ec4dc | ||
|
|
6775418daf | ||
|
|
66231bcae5 | ||
|
|
acd9e9cbf6 | ||
|
|
f7a3528db0 | ||
|
|
affa9850a3 | ||
|
|
ad9429c622 | ||
|
|
208b5b689d | ||
|
|
54428229bb | ||
|
|
805349b360 | ||
|
|
47dcff5e35 | ||
|
|
260198817d | ||
|
|
f9f5353f42 | ||
|
|
4d0ef3f614 |
423
CHANGELOG
423
CHANGELOG
@@ -1,423 +0,0 @@
|
|||||||
[0.1.0]
|
|
||||||
* Initial version
|
|
||||||
|
|
||||||
[0.1.1]
|
|
||||||
* Removed the Riot part of the installation due to security
|
|
||||||
* Changed from Sqlite to Postgres
|
|
||||||
* Added LDAP support
|
|
||||||
* Fixed upload limit in nginx_matrix.conf
|
|
||||||
* Added bogus index.html so cloudron recognizes the matrix server as online
|
|
||||||
* Added coturn as TURN server
|
|
||||||
|
|
||||||
[0.1.2]
|
|
||||||
* Updated logo (transparent)
|
|
||||||
* Enabled email settings
|
|
||||||
|
|
||||||
[0.1.3]
|
|
||||||
* Changed log location of nginx due to backup crashes
|
|
||||||
|
|
||||||
[0.1.4]
|
|
||||||
* Changed log location of synapse due to backup crashes
|
|
||||||
* Updated some configs
|
|
||||||
|
|
||||||
[0.1.5]
|
|
||||||
* Update to synapse v0.31.2
|
|
||||||
|
|
||||||
[0.1.6]
|
|
||||||
* Update to synapse v0.33.8
|
|
||||||
|
|
||||||
[0.1.7]
|
|
||||||
* Update to synapse v0.33.9
|
|
||||||
|
|
||||||
[0.1.8]
|
|
||||||
* Update to synapse v0.99.0
|
|
||||||
* Fixed missing LDAP stuff
|
|
||||||
|
|
||||||
[0.1.9]
|
|
||||||
* Update to synapse v0.99.3
|
|
||||||
|
|
||||||
[0.2.0]
|
|
||||||
* Update to synapse v0.99.4
|
|
||||||
|
|
||||||
[0.2.1]
|
|
||||||
* Update to synapse v0.99.5.1
|
|
||||||
|
|
||||||
[0.2.2]
|
|
||||||
* Update to synapse v0.99.5.2
|
|
||||||
|
|
||||||
[0.2.3]
|
|
||||||
* Update to synapse v1.0.0
|
|
||||||
* Fixed url preview
|
|
||||||
* Fixed voip
|
|
||||||
|
|
||||||
[0.2.4]
|
|
||||||
* Fixed federation
|
|
||||||
|
|
||||||
[0.2.5]
|
|
||||||
* Update to synapse v1.1.0
|
|
||||||
|
|
||||||
[0.2.6]
|
|
||||||
* Update to synapse v1.2.1
|
|
||||||
|
|
||||||
[0.2.7]
|
|
||||||
* Update to synapse v1.3.0
|
|
||||||
|
|
||||||
[0.2.8]
|
|
||||||
* Update to synapse v1.3.1
|
|
||||||
|
|
||||||
[0.2.9]
|
|
||||||
* Update to synapse v1.4.0 (lots of changes)
|
|
||||||
|
|
||||||
[0.3.0]
|
|
||||||
* Update to synapse v1.4.1
|
|
||||||
|
|
||||||
[0.3.1]
|
|
||||||
* Update to synapse v1.5.1
|
|
||||||
|
|
||||||
[0.3.3]
|
|
||||||
* Update to synapse v1.6.0
|
|
||||||
|
|
||||||
[0.3.4]
|
|
||||||
* Update to synapse v1.6.1
|
|
||||||
|
|
||||||
[0.3.5]
|
|
||||||
* Update to synapse v1.8.0
|
|
||||||
|
|
||||||
[0.3.6]
|
|
||||||
* Update to synapse v1.9.1
|
|
||||||
|
|
||||||
[0.3.7]
|
|
||||||
* Update to synapse v1.10.0
|
|
||||||
|
|
||||||
[0.3.8]
|
|
||||||
* Update to synapse v1.11.0
|
|
||||||
|
|
||||||
[0.4.0]
|
|
||||||
* Update to synapse v1.12.0
|
|
||||||
|
|
||||||
[0.4.1]
|
|
||||||
* Update to synapse v1.12.2
|
|
||||||
|
|
||||||
[0.5.0]
|
|
||||||
* New reworked app
|
|
||||||
|
|
||||||
[0.6.0]
|
|
||||||
* Fix title
|
|
||||||
|
|
||||||
[0.7.0]
|
|
||||||
* Set turn_uris to an array and not a string
|
|
||||||
|
|
||||||
[0.7.1]
|
|
||||||
* Users will now automatically join the #discuss channel (only in new installations)
|
|
||||||
|
|
||||||
[1.0.0]
|
|
||||||
* Use latest base image
|
|
||||||
* Update to synapse v1.12.4
|
|
||||||
|
|
||||||
[1.1.0]
|
|
||||||
* Update Synapse to 1.13.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.13.0)
|
|
||||||
* Set Referrer-Policy header to no-referrer on media downloads. (#7009)
|
|
||||||
* Admin API POST /_synapse/admin/v1/join/<roomIdOrAlias> to join users to a room like auto_join_rooms for creation of users. (#7051)
|
|
||||||
* Add options to prevent users from changing their profile or associated 3PIDs. (#7096)
|
|
||||||
* Allow server admins to define and enforce a password policy (MSC2000). (#7118)
|
|
||||||
* Improve the support for SSO authentication on the login fallback page. (#7152, #7235)
|
|
||||||
* Always whitelist the login fallback in the SSO configuration if public_baseurl is set. (#7153)
|
|
||||||
* Admin users are no longer required to be in a room to create an alias for it. (#7191)
|
|
||||||
* Require admin privileges to enable room encryption by default. This does not affect existing rooms. (#7230)
|
|
||||||
|
|
||||||
[1.2.0]
|
|
||||||
* Update Synapse to 1.14.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.14.0)
|
|
||||||
|
|
||||||
[1.3.0]
|
|
||||||
* Add optional sso support
|
|
||||||
|
|
||||||
[1.4.0]
|
|
||||||
* Update Synapse to 1.15.1
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.15.0)
|
|
||||||
* Advertise support for Client-Server API r0.6.0 and remove related unstable feature flags. (#6585)
|
|
||||||
* Add an option to disable autojoining rooms for guest accounts. (#6637)
|
|
||||||
* Add admin APIs to allow server admins to manage users' devices. Contributed by @dklimpel. (#7481)
|
|
||||||
* Add support for generating thumbnails for WebP images. Previously, users would see an empty box instead of preview image. Contributed by @WGH-. (#7586)
|
|
||||||
* Support the standardized m.login.sso user-interactive authentication flow. (#7630)
|
|
||||||
|
|
||||||
[1.5.0]
|
|
||||||
* Update Synapse to 1.15.2
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.15.2)
|
|
||||||
* A malicious homeserver could force Synapse to reset the state in a room to a small subset of the correct state. This affects all Synapse deployments which federate with untrusted servers. (96e9afe6)
|
|
||||||
* HTML pages served via Synapse were vulnerable to clickjacking attacks. This predominantly affects homeservers with single-sign-on enabled, but all server administrators are encouraged to upgrade. (ea26e9a9)
|
|
||||||
|
|
||||||
[1.6.0]
|
|
||||||
* Update Synapse to 1.16.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.16.0)
|
|
||||||
* Add an option to enable encryption by default for new rooms. (#7639)
|
|
||||||
* Add support for running multiple media repository workers. See docs/workers.md for instructions. (#7706)
|
|
||||||
* Media can now be marked as safe from quarantined. (#7718)
|
|
||||||
* Expand the configuration options for auto-join rooms. (#7763)
|
|
||||||
|
|
||||||
[1.6.1]
|
|
||||||
* Update Synapse to 1.16.1
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.16.1)
|
|
||||||
* Drop table local_rejections_stream which was incorrectly added in Synapse 1.16.0. (#7816, b1beb3ff5)
|
|
||||||
|
|
||||||
[1.7.0]
|
|
||||||
* Update Synapse to 1.17.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.17.0)
|
|
||||||
* Fix inconsistent handling of upper and lower case in email addresses when used as identifiers for login, etc. Contributed by @dklimpel. (#7021)
|
|
||||||
* Fix "Tried to close a non-active scope!" error messages when opentracing is enabled. (#7732)
|
|
||||||
* Fix incorrect error message when database CTYPE was set incorrectly. (#7760)
|
|
||||||
* Fix to not ignore set_tweak actions in Push Rules that have no value, as permitted by the specification. (#7766)
|
|
||||||
* Fix synctl to handle empty config files correctly. Contributed by @kotovalexarian. (#7779)
|
|
||||||
* Fixes a long standing bug in worker mode where worker information was saved in the devices table instead of the original IP address and user agent. (#7797)
|
|
||||||
* Fix 'stuck invites' which happen when we are unable to reject a room invite received over federation. (#7804, #7809, #7810)
|
|
||||||
|
|
||||||
[1.8.0]
|
|
||||||
* Update Synapse to 1.18.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.18.0)
|
|
||||||
* Include room states on invite events that are sent to application services. Contributed by @Sorunome. (#6455)
|
|
||||||
* Add delete room admin endpoint (POST /_synapse/admin/v1/rooms/<room_id>/delete). Contributed by @dklimpel. (#7613, #7953)
|
|
||||||
* Add experimental support for running multiple federation sender processes. (#7798)
|
|
||||||
* Add the option to validate the iss and aud claims for JWT logins. (#7827)
|
|
||||||
* Add support for handling registration requests across multiple client reader workers. (#7830)
|
|
||||||
* Add an admin API to list the users in a room. Contributed by Awesome Technologies Innovationslabor GmbH. (#7842)
|
|
||||||
* Allow email subjects to be customised through Synapse's configuration. (#7846)
|
|
||||||
* Add the ability to re-activate an account from the admin API. (#7847, #7908)
|
|
||||||
* Support oEmbed for media previews. (#7920)
|
|
||||||
|
|
||||||
[1.9.0]
|
|
||||||
* Update Synapse to 1.19.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.19.0)
|
|
||||||
* Add option to allow server admins to join rooms which fail complexity checks. Contributed by @lugino-emeritus. (#7902)
|
|
||||||
* Add an option to purge room or not with delete room admin endpoint (POST /_synapse/admin/v1/rooms/<room_id>/delete). Contributed by @dklimpel. (#7964)
|
|
||||||
* Add rate limiting to users joining rooms. (#8008)
|
|
||||||
* Add a /health endpoint to every configured HTTP listener that can be used as a health check endpoint by load balancers. (#8048)
|
|
||||||
* Allow login to be blocked based on the values of SAML attributes. (#8052)
|
|
||||||
* Allow guest access to the GET /_matrix/client/r0/rooms/{room_id}/members endpoint, according to MSC2689. Contributed by Awesome Technologies Innovationslabor GmbH. (#7314)
|
|
||||||
|
|
||||||
[1.9.1]
|
|
||||||
* Update Synapse to 1.19.1
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.19.1)
|
|
||||||
* Fix a bug introduced in v1.19.0 where appservices with ratelimiting disabled would still be ratelimited when joining rooms. (#8139)
|
|
||||||
* Fix a bug introduced in v1.19.0 that would cause e.g. profile updates to fail due to incorrect application of rate limits on join requests. (#8153)
|
|
||||||
|
|
||||||
[1.10.0]
|
|
||||||
* Update Synapse to 1.19.3
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.19.3)
|
|
||||||
* Partially mitigate bug where newly joined servers couldn't get past events in a room when there is a malformed event. (#8350)
|
|
||||||
* Make index.html customizable
|
|
||||||
|
|
||||||
[1.11.0]
|
|
||||||
* Update Synapse to 1.20.1
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.20.0)
|
|
||||||
* Add an endpoint to query your shared rooms with another user as an implementation of MSC2666. (#7785)
|
|
||||||
* Iteratively encode JSON to avoid blocking the reactor. (#8013, #8116)
|
|
||||||
* Add support for shadow-banning users (ignoring any message send requests). (#8034, #8092, #8095, #8142, #8152, #8157, #8158, #8176)
|
|
||||||
* Use the default template file when its equivalent is not found in a custom template directory. (#8037, #8107, #8252)
|
|
||||||
* Add unread messages count to sync responses, as specified in MSC2654. (#8059, #8254, #8270, #8274)
|
|
||||||
* Optimise /federation/v1/user/devices/ API by only returning devices with encryption keys. (#8198)
|
|
||||||
|
|
||||||
[1.12.0]
|
|
||||||
* Update Synapse to 1.21.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.21.0)
|
|
||||||
* Require the user to confirm that their password should be reset after clicking the email confirmation link. (#8004)
|
|
||||||
* Add an admin API GET /_synapse/admin/v1/event_reports to read entries of table event_reports. Contributed by @dklimpel. (#8217)
|
|
||||||
* Consolidate the SSO error template across all configuration. (#8248, #8405)
|
|
||||||
* Add a configuration option to specify a whitelist of domains that a user can be redirected to after validating their email or phone number. (#8275, #8417)
|
|
||||||
* Add experimental support for sharding event persister. (#8294, #8387, #8396, #8419)
|
|
||||||
* Add the room topic and avatar to the room details admin API. (#8305)
|
|
||||||
* Add an admin API for querying rooms where a user is a member. Contributed by @dklimpel. (#8306)
|
|
||||||
|
|
||||||
[1.12.1]
|
|
||||||
* Updat Synapse to 1.21.1
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.21.1)
|
|
||||||
|
|
||||||
[1.12.2]
|
|
||||||
* Update Synapse to 1.21.2
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.21.2)
|
|
||||||
* Security: HTML pages served via Synapse were vulnerable to cross-site scripting (XSS) attacks. All server administrators are encouraged to upgrade
|
|
||||||
* Fix rare bug where sending an event would fail due to a racey assertion. (#8530)
|
|
||||||
|
|
||||||
[1.13.0]
|
|
||||||
* Update Synapse to 1.22.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.22.0)
|
|
||||||
* Add ability for ThirdPartyEventRules modules to query and manipulate whether a room is in the public rooms directory. (#8292, #8467)
|
|
||||||
* Add support for olm fallback keys (MSC2732). (#8312, #8501)
|
|
||||||
* Add support for running background tasks in a separate worker process. (#8369, #8458, #8489, #8513, #8544, #8599)
|
|
||||||
* Add support for device dehydration (MSC2697). (#8380)
|
|
||||||
* Add support for MSC2409, which allows sending typing, read receipts, and presence events to appservices. (#8437, #8590)
|
|
||||||
* Change default room version to "6", per MSC2788. (#8461)
|
|
||||||
* Add the ability to send non-membership events into a room via the ModuleApi. (#8479)
|
|
||||||
* Increase default upload size limit from 10M to 50M. Contributed by @Akkowicz. (#8502)
|
|
||||||
* Add support for modifying event content in ThirdPartyRules modules. (#8535, #8564)
|
|
||||||
|
|
||||||
[1.13.1]
|
|
||||||
* Update Synapse to 1.22.1
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.22.1)
|
|
||||||
* Fix a bug where an appservice may not be forwarded events for a room it was recently invited to. Broke in v1.22.0. (#8676)
|
|
||||||
* Fix Object of type frozendict is not JSON serializable exceptions when using third-party event rules. Broke in v1.22.0. (#8678)
|
|
||||||
|
|
||||||
[1.14.0]
|
|
||||||
* Update Synapse to 1.23.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.23.0)
|
|
||||||
* Add a push rule that highlights when a jitsi conference is created in a room. (#8286)
|
|
||||||
* Add an admin api to delete a single file or files that were not used for a defined time from server. Contributed by @dklimpel. (#8519)
|
|
||||||
* Split admin API for reported events (GET /_synapse/admin/v1/event_reports) into detail and list endpoints. This is a breaking change to #8217 which was introduced in Synapse v1.21.0. Those who already use this API should check their scripts. Contributed by @dklimpel. (#8539)
|
|
||||||
* Support generating structured logs via the standard logging configuration. (#8607, #8685)
|
|
||||||
* Add an admin API to allow server admins to list users' pushers. Contributed by @dklimpel. (#8610, #8689)
|
|
||||||
* Add an admin API GET /_synapse/admin/v1/users/<user_id>/media to get information about uploaded media. Contributed by @dklimpel. (#8647)
|
|
||||||
* Add an admin API for local user media statistics. Contributed by @dklimpel. (#8700)
|
|
||||||
* Add displayname to Shared-Secret Registration for admins. (#8722)
|
|
||||||
|
|
||||||
[1.14.1]
|
|
||||||
* Update Synapse to 1.23.1
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.23.1)
|
|
||||||
* There is a denial of service attack (CVE-2020-26257) against the federation APIs in which future events will not be correctly sent to other servers over federation. This affects all servers that participate in open federation. (Fixed in #8776).
|
|
||||||
|
|
||||||
[1.15.0]
|
|
||||||
* Update Synapse to 1.24.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.24.0)
|
|
||||||
* Add a maximum version for pysaml2 on Python 3.5
|
|
||||||
|
|
||||||
[1.16.0]
|
|
||||||
* Update Synapse to 1.25.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.25.0)
|
|
||||||
* Add an admin API that lets server admins get power in rooms in which local users have power. (#8756)
|
|
||||||
* Add optional HTTP authentication to replication endpoints. (#8853)
|
|
||||||
* Improve the error messages printed as a result of configuration problems for extension modules. (#8874)
|
|
||||||
* Add the number of local devices to Room Details Admin API. Contributed by @dklimpel. (#8886)
|
|
||||||
* Add X-Robots-Tag header to stop web crawlers from indexing media. Contributed by Aaron Raimist. (#8887)
|
|
||||||
* Spam-checkers may now define their methods as async. (#8890)
|
|
||||||
* Add support for allowing users to pick their own user ID during a single-sign-on login. (#8897, #8900, #8911, #8938, #8941, #8942, #8951)
|
|
||||||
* Add an email.invite_client_location configuration option to send a web client location to the invite endpoint on the identity server which allows customisation of the email template. (#8930)
|
|
||||||
* The search term in the list room and list user Admin APIs is now treated as case-insensitive. (#8931)
|
|
||||||
* Apply an IP range blacklist to push and key revocation requests. (#8821, #8870, #8954)
|
|
||||||
* Add an option to allow re-use of user-interactive authentication sessions for a period of time. (#8970)
|
|
||||||
* Allow running the redact endpoint on workers. (#8994)
|
|
||||||
|
|
||||||
[1.17.0]
|
|
||||||
* Update Synapse to 1.26.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.26.0)
|
|
||||||
* During user-interactive authentication via single-sign-on, give a better error if the user uses the wrong account on the SSO IdP. (#9091)
|
|
||||||
* Give the public_baseurl a default value, if it is not explicitly set in the configuration file. (#9159)
|
|
||||||
* Improve performance when calculating ignored users in large rooms. (#9024)
|
|
||||||
* Implement MSC2176 in an experimental room version. (#8984)
|
|
||||||
* Add an admin API for protecting local media from quarantine. (#9086)
|
|
||||||
* Remove a user's avatar URL and display name when deactivated with the Admin API. (#8932)
|
|
||||||
|
|
||||||
[1.18.0]
|
|
||||||
* Update Synapse to 1.27.0
|
|
||||||
* Use base image v3
|
|
||||||
* Update python to 3.8
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.27.0)
|
|
||||||
* Add an admin API for getting and deleting forward extremities for a room. (#9062)
|
|
||||||
* Add an admin API for retrieving the current room state of a room. (#9168)
|
|
||||||
* Add an admin API endpoint for shadow-banning users. (#9209)
|
|
||||||
|
|
||||||
[1.19.0]
|
|
||||||
* Update Synapse to 1.28.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.28.0)
|
|
||||||
* New admin API to get the context of an event: /_synapse/admin/rooms/{roomId}/context/{eventId}. (#9150)
|
|
||||||
* Further improvements to the user experience of registration via single sign-on. (#9300, #9301)
|
|
||||||
* Add hook to spam checker modules that allow checking file uploads and remote downloads. (#9311)
|
|
||||||
* Add support for receiving OpenID Connect authentication responses via form POSTs rather than GETs. (#9376)
|
|
||||||
* Add the shadow-banning status to the admin API for user info. (#9400)
|
|
||||||
|
|
||||||
[1.20.0]
|
|
||||||
* Update Synapse to 1.29.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.29.0)
|
|
||||||
* Add rate limiters to cross-user key sharing requests. (#8957)
|
|
||||||
* Add order_by to the admin API GET /_synapse/admin/v1/users/<user_id>/media. Contributed by @dklimpel. (#8978)
|
|
||||||
* Add some configuration settings to make users' profile data more private. (#9203)
|
|
||||||
* The no_proxy and NO_PROXY environment variables are now respected in proxied HTTP clients with the lowercase form taking precedence if both are present. Additionally, the lowercase https_proxy environment variable is now respected in proxied HTTP clients on top of existing support for the uppercase HTTPS_PROXY form and takes precedence if both are present. Contributed by Timothy Leung. (#9372)
|
|
||||||
* Add a configuration option, user_directory.prefer_local_users, which when enabled will make it more likely for users on the same server as you to appear above other users. (#9383, #9385)
|
|
||||||
* Add support for regenerating thumbnails if they have been deleted but the original image is still stored. (#9438)
|
|
||||||
|
|
||||||
[1.21.0]
|
|
||||||
* Update Synapse to 1.30.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.30.0)
|
|
||||||
* Add prometheus metrics for number of users successfully registering and logging in. (#9510, #9511, #9573)
|
|
||||||
* Add synapse_federation_last_sent_pdu_time and synapse_federation_last_received_pdu_time prometheus metrics, which monitor federation delays by reporting the timestamps of messages sent and received to a set of remote servers. (#9540)
|
|
||||||
* Add support for generating JSON Web Tokens dynamically for use as OIDC client secrets. (#9549)
|
|
||||||
* Optimise handling of incomplete room history for incoming federation. (#9601)
|
|
||||||
* Finalise support for allowing clients to pick an SSO Identity Provider (MSC2858). (#9617)
|
|
||||||
* Tell spam checker modules about the SSO IdP a user registered through if one was used. (#9626)
|
|
||||||
|
|
||||||
[1.21.1]
|
|
||||||
* Update Synapse to 1.30.1
|
|
||||||
|
|
||||||
[1.22.0]
|
|
||||||
* Update Synapse to 1.31.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.31.0)
|
|
||||||
* Add support to OpenID Connect login for requiring attributes on the userinfo response. Contributed by Hubbe King. (#9609)
|
|
||||||
* Add initial experimental support for a "space summary" API. (#9643, #9652, #9653)
|
|
||||||
* Add support for the busy presence state as described in MSC3026. (#9644)
|
|
||||||
* Add support for credentials for proxy authentication in the HTTPS_PROXY environment variable. (#9657)
|
|
||||||
|
|
||||||
[1.22.1]
|
|
||||||
* Update Synapse to 1.32.0
|
|
||||||
* Add a Synapse module for routing presence updates between users. (#9491)
|
|
||||||
* Add an admin API to manage ratelimit for a specific user. (#9648)
|
|
||||||
* Include request information in structured logging output. (#9654)
|
|
||||||
* Add order_by to the admin API GET /_synapse/admin/v2/users. Contributed by @dklimpel. (#9691)
|
|
||||||
* Replace the room_invite_state_types configuration setting with room_prejoin_state. (#9700)
|
|
||||||
* Add experimental support for MSC3083: restricting room access via group membership. (#9717, #9735)
|
|
||||||
* Update experimental support for Spaces: include m.room.create in the room state sent with room-invites. (#9710)
|
|
||||||
* Synapse now requires Python 3.6 or later. It also requires Postgres 9.6 or later or SQLite 3.22 or later. (#9766)
|
|
||||||
* Prevent synapse_forward_extremities and synapse_excess_extremity_events Prometheus metrics from initially reporting zero-values after startup. (#8926)
|
|
||||||
* Fix recently added ratelimits to correctly honour the application service rate_limited flag. (#9711)
|
|
||||||
* Fix longstanding bug which caused duplicate key value violates unique constraint "remote_media_cache_thumbnails_media_origin_media_id_thumbna_key" errors. (#9725)
|
|
||||||
* Fix bug where sharded federation senders could get stuck repeatedly querying the DB in a loop, using lots of CPU. (#9770)
|
|
||||||
* Fix duplicate logging of exceptions thrown during federation transaction processing. (#9780)
|
|
||||||
|
|
||||||
[1.22.2]
|
|
||||||
* Update Synapse to 1.32.0
|
|
||||||
* Add a Synapse module for routing presence updates between users. (#9491)
|
|
||||||
* Add an admin API to manage ratelimit for a specific user. (#9648)
|
|
||||||
* Include request information in structured logging output. (#9654)
|
|
||||||
* Add order_by to the admin API GET /_synapse/admin/v2/users. Contributed by @dklimpel. (#9691)
|
|
||||||
* Replace the room_invite_state_types configuration setting with room_prejoin_state. (#9700)
|
|
||||||
* Add experimental support for MSC3083: restricting room access via group membership. (#9717, #9735)
|
|
||||||
* Update experimental support for Spaces: include m.room.create in the room state sent with room-invites. (#9710)
|
|
||||||
* Synapse now requires Python 3.6 or later. It also requires Postgres 9.6 or later or SQLite 3.22 or later. (#9766)
|
|
||||||
* Prevent synapse_forward_extremities and synapse_excess_extremity_events Prometheus metrics from initially reporting zero-values after startup. (#8926)
|
|
||||||
* Fix recently added ratelimits to correctly honour the application service rate_limited flag. (#9711)
|
|
||||||
* Fix longstanding bug which caused duplicate key value violates unique constraint "remote_media_cache_thumbnails_media_origin_media_id_thumbna_key" errors. (#9725)
|
|
||||||
* Fix bug where sharded federation senders could get stuck repeatedly querying the DB in a loop, using lots of CPU. (#9770)
|
|
||||||
* Fix duplicate logging of exceptions thrown during federation transaction processing. (#9780)
|
|
||||||
|
|
||||||
[1.22.3]
|
|
||||||
* Update Synapse to 1.32.1
|
|
||||||
* Fix a regression in Synapse 1.32.0 which caused Synapse to report large numbers of Prometheus time series, potentially overwhelming Prometheus instances. (#9854)
|
|
||||||
|
|
||||||
[1.22.4]
|
|
||||||
* Update Synapse to 1.32.2
|
|
||||||
* Fix a regression in Synapse 1.32.0 and 1.32.1 which caused LoggingContext errors in plugins. (#9857)
|
|
||||||
|
|
||||||
[1.23.0]
|
|
||||||
* Update Synapse to 1.33.0
|
|
||||||
* Update experimental support for MSC3083: restricting room access via group membership. (#9800, #9814)
|
|
||||||
* Add experimental support for handling presence on a worker. (#9819, #9820, #9828, #9850)
|
|
||||||
* Return a new template when an user attempts to renew their account multiple times with the same token, stating that their account is set to expire. This replaces the invalid token template that would previously be shown in this case. This change concerns the optional account validity feature. (#9832)
|
|
||||||
* Fixes the OIDC SSO flow when using a public_baseurl value including a non-root URL path. (#9726)
|
|
||||||
* Fix thumbnail generation for some sites with non-standard content types. Contributed by @rkfg. (#9788)
|
|
||||||
* Add some sanity checks to identity server passed to 3PID bind/unbind endpoints. (#9802)
|
|
||||||
* Limit the size of HTTP responses read over federation. (#9833)
|
|
||||||
* Fix a bug which could cause Synapse to get stuck in a loop of resyncing device lists. (#9867)
|
|
||||||
* Fix a long-standing bug where errors from federation did not propagate to the client. (#9868)
|
|
||||||
|
|
||||||
[1.23.1]
|
|
||||||
* Update Synapse to 1.33.1
|
|
||||||
* Fix bug where /sync would break if using the latest version of attrs dependency, by pinning to a previous version. (#9937)
|
|
||||||
|
|
||||||
[1.23.2]
|
|
||||||
* Update Synapse to 1.33.2
|
|
||||||
* This release fixes a denial of service attack (CVE-2021-29471) against Synapse's push rules implementation.
|
|
||||||
|
|
||||||
[1.24.0]
|
|
||||||
* Update Synapse to 1.34.0
|
|
||||||
* [Full changelog](https://github.com/matrix-org/synapse/releases/tag/v1.34.0)
|
|
||||||
* Add support for DELETE /_synapse/admin/v1/rooms/<room_id>. (#9889)
|
|
||||||
* Improve performance after joining a large room when presence is enabled. (#9910, #9916)
|
|
||||||
* Support stable identifiers for MSC1772 Spaces. m.space.child events will now be taken into account when populating the experimental spaces summary response. Please see the upgrade notes if you have customised room_invite_state_types in your configuration. (#9915, #9966)
|
|
||||||
* Improve performance of backfilling in large rooms. (#9935)
|
|
||||||
1265
CHANGELOG.md
Normal file
1265
CHANGELOG.md
Normal file
File diff suppressed because it is too large
Load Diff
@@ -3,18 +3,19 @@
|
|||||||
"title": "Matrix Synapse",
|
"title": "Matrix Synapse",
|
||||||
"author": "Matrix synapse authors",
|
"author": "Matrix synapse authors",
|
||||||
"description": "file://DESCRIPTION.md",
|
"description": "file://DESCRIPTION.md",
|
||||||
"changelog": "file://CHANGELOG",
|
"changelog": "file://CHANGELOG.md",
|
||||||
"tagline": "Secure & decentralized communication",
|
"tagline": "Secure & decentralized communication",
|
||||||
"version": "1.24.0",
|
"version": "1.97.1",
|
||||||
|
"upstreamVersion": "1.111.1",
|
||||||
"healthCheckPath": "/",
|
"healthCheckPath": "/",
|
||||||
"httpPort": 8008,
|
"httpPort": 8008,
|
||||||
"memoryLimit": 536870912,
|
"memoryLimit": 536870912,
|
||||||
"addons": {
|
"addons": {
|
||||||
"localstorage": {},
|
"localstorage": {},
|
||||||
"ldap": {},
|
"oidc": { "loginRedirectUri": "/_synapse/client/oidc/callback" },
|
||||||
"postgresql": {},
|
"postgresql": {},
|
||||||
"sendmail": {},
|
"sendmail": { "supportsDisplayName": true },
|
||||||
"turn": {}
|
"turn": { "optional": true }
|
||||||
},
|
},
|
||||||
"manifestVersion": 2,
|
"manifestVersion": 2,
|
||||||
"website": "https://matrix.org",
|
"website": "https://matrix.org",
|
||||||
@@ -28,9 +29,8 @@
|
|||||||
"https://screenshots.cloudron.io/org.matrix.synapse/2.png",
|
"https://screenshots.cloudron.io/org.matrix.synapse/2.png",
|
||||||
"https://screenshots.cloudron.io/org.matrix.synapse/3.png"
|
"https://screenshots.cloudron.io/org.matrix.synapse/3.png"
|
||||||
],
|
],
|
||||||
"changelog": "file://CHANGELOG",
|
|
||||||
"postInstallMessage": "file://POSTINSTALL.md",
|
"postInstallMessage": "file://POSTINSTALL.md",
|
||||||
"minBoxVersion": "5.3.0",
|
"minBoxVersion": "7.5.1",
|
||||||
"forumUrl": "https://forum.cloudron.io/category/50/matrix-synapse-riot",
|
"forumUrl": "https://forum.cloudron.io/category/50/matrix-synapse-riot",
|
||||||
"documentationUrl": "https://docs.cloudron.io/apps/synapse/",
|
"documentationUrl": "https://docs.cloudron.io/apps/synapse/",
|
||||||
"optionalSso": true
|
"optionalSso": true
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
This app packages Synapse <upstream>1.34.0</upstream>.
|
|
||||||
|
|
||||||
**This package only provides the Matrix backend. A variety of clients are available
|
**This package only provides the Matrix backend. A variety of clients are available
|
||||||
[here](https://matrix.org/clients/). Riot is a popular web frontend for Matrix and
|
[here](https://matrix.org/clients/). Riot is a popular web frontend for Matrix and
|
||||||
is available as a separate app.**
|
is available as a separate app.**
|
||||||
|
|
||||||
Matrix is an ambitious new ecosystem for open federated Instant Messaging and VoIP.
|
## About
|
||||||
|
|
||||||
## Matrix
|
Matrix is an ambitious new ecosystem for open federated Instant Messaging and VoIP.
|
||||||
|
|
||||||
Matrix specifies a set of pragmatic RESTful HTTP JSON APIs as an open standard, which handle:
|
Matrix specifies a set of pragmatic RESTful HTTP JSON APIs as an open standard, which handle:
|
||||||
|
|
||||||
@@ -18,7 +16,7 @@ Matrix specifies a set of pragmatic RESTful HTTP JSON APIs as an open standard,
|
|||||||
* Using 3rd Party IDs (3PIDs) such as email addresses, phone numbers, Facebook accounts to authenticate, identify and discover users on Matrix.
|
* Using 3rd Party IDs (3PIDs) such as email addresses, phone numbers, Facebook accounts to authenticate, identify and discover users on Matrix.
|
||||||
* Placing 1:1 VoIP and Video calls
|
* Placing 1:1 VoIP and Video calls
|
||||||
|
|
||||||
## Synapse
|
## What is Synapse?
|
||||||
|
|
||||||
Synapse is a reference "homeserver" implementation of Matrix from the core development
|
Synapse is a reference "homeserver" implementation of Matrix from the core development
|
||||||
team at matrix.org, written in Python/Twisted.
|
team at matrix.org, written in Python/Twisted.
|
||||||
|
|||||||
14
Dockerfile
14
Dockerfile
@@ -1,4 +1,4 @@
|
|||||||
FROM cloudron/base:3.0.0@sha256:455c70428723e3a823198c57472785437eb6eab082e79b3ff04ea584faf46e92
|
FROM cloudron/base:4.2.0@sha256:46da2fffb36353ef714f97ae8e962bd2c212ca091108d768ba473078319a47f4
|
||||||
|
|
||||||
RUN mkdir -p /app/pkg
|
RUN mkdir -p /app/pkg
|
||||||
|
|
||||||
@@ -9,15 +9,21 @@ RUN virtualenv -p python3 /app/code/env
|
|||||||
ENV VIRTUAL_ENV=/app/code/env
|
ENV VIRTUAL_ENV=/app/code/env
|
||||||
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
||||||
|
|
||||||
ARG VERSION=v1.34.0
|
ARG VERSION=1.111.1
|
||||||
|
|
||||||
|
# https://github.com/matrix-org/synapse-s3-storage-provider
|
||||||
|
ARG STORAGE_PROVIDER_VERSION=1beb6af95e1f5caedb8e6e7e1cc176cdb2106d37
|
||||||
|
|
||||||
# Synapse (https://github.com/matrix-org/synapse/blob/master/INSTALL.md)
|
# Synapse (https://github.com/matrix-org/synapse/blob/master/INSTALL.md)
|
||||||
# lxml - required for previews
|
# lxml - required for previews
|
||||||
RUN pip install --upgrade pip && \
|
RUN pip install --upgrade pip && \
|
||||||
pip install --upgrade setuptools && \
|
pip install --upgrade setuptools && \
|
||||||
pip install matrix-synapse==${VERSION} psycopg2-binary python-ldap matrix-synapse-ldap3 lxml publicsuffix2
|
pip install matrix-synapse==v${VERSION} psycopg2-binary python-ldap matrix-synapse-ldap3 lxml publicsuffix2 git+https://github.com/matrix-org/synapse-s3-storage-provider.git@${STORAGE_PROVIDER_VERSION} matrix-synapse[oidc]
|
||||||
|
|
||||||
RUN ln -sf /app/data/index.html /app/code/env/lib/python3.8/site-packages/synapse/static/index.html
|
# Updated suffix list
|
||||||
|
RUN curl -L https://publicsuffix.org/list/public_suffix_list.dat -o /app/code/env/lib/python3.10/site-packages/publicsuffix2/public_suffix_list.dat
|
||||||
|
|
||||||
|
RUN ln -sf /app/data/index.html /app/code/env/lib/python3.10/site-packages/synapse/static/index.html
|
||||||
|
|
||||||
RUN chown -R cloudron.cloudron /app/code
|
RUN chown -R cloudron.cloudron /app/code
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
Account ids are created with the username and the second level domain under which the
|
Account ids are created with the username and the second level domain under which the
|
||||||
app is installed e.g. `@$CLOUDRON-USERNAME@$CLOUDRON-APP-DOMAIN`.
|
app is installed e.g. `@$CLOUDRON-USERNAME:$CLOUDRON-APP-DOMAIN`.
|
||||||
|
|
||||||
For federation to work, the second level domain has to be configured to serve up the
|
For federation to work, the delegation URI `https://$CLOUDRON-APP-DOMAIN/.well-known/matrix/server`
|
||||||
`.well-known/domain.com/matrix` URI. See the
|
must be configured. See the [docs](https://docs.cloudron.io/apps/synapse/#post-installation) on how to do this.
|
||||||
[federation docs](https://cloudron.io/documentation/apps/synapse/) on
|
|
||||||
how to do this.
|
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ federation_ip_range_blacklist:
|
|||||||
- 'fc00::/7'
|
- 'fc00::/7'
|
||||||
|
|
||||||
enable_registration: false
|
enable_registration: false
|
||||||
|
enable_registration_without_verification: true
|
||||||
registration_shared_secret: "somesecret"
|
registration_shared_secret: "somesecret"
|
||||||
allow_guest_access: false
|
allow_guest_access: false
|
||||||
|
|
||||||
|
|||||||
55
start.sh
55
start.sh
@@ -22,7 +22,10 @@ if [[ ! -f /app/data/configs/homeserver.yaml ]]; then
|
|||||||
cp /app/pkg/homeserver.yaml.template /app/data/configs/homeserver.yaml
|
cp /app/pkg/homeserver.yaml.template /app/data/configs/homeserver.yaml
|
||||||
mv /app/data/configs/${server_name}.log.config /app/data/configs/log.config
|
mv /app/data/configs/${server_name}.log.config /app/data/configs/log.config
|
||||||
yq eval -i ".log_config=\"/app/data/configs/log.config\"" /app/data/configs/homeserver.yaml
|
yq eval -i ".log_config=\"/app/data/configs/log.config\"" /app/data/configs/homeserver.yaml
|
||||||
yq eval -i ".handlers.file.filename=\"/run/synapse/homeserver.log\"" /app/data/configs/log.config
|
|
||||||
|
# delete default file and buffer handlers
|
||||||
|
yq eval -i "del(.handlers.file)" /app/data/configs/log.config
|
||||||
|
yq eval -i "del(.handlers.buffer)" /app/data/configs/log.config
|
||||||
|
|
||||||
mv /app/data/configs/${server_name}.signing.key /app/data/configs/signing.key
|
mv /app/data/configs/${server_name}.signing.key /app/data/configs/signing.key
|
||||||
|
|
||||||
@@ -32,12 +35,18 @@ if [[ ! -f /app/data/configs/homeserver.yaml ]]; then
|
|||||||
yq eval -i ".auto_join_rooms=[]" /app/data/configs/homeserver.yaml
|
yq eval -i ".auto_join_rooms=[]" /app/data/configs/homeserver.yaml
|
||||||
yq eval -i ".auto_join_rooms[0]=\"#discuss:${server_name}\"" /app/data/configs/homeserver.yaml
|
yq eval -i ".auto_join_rooms[0]=\"#discuss:${server_name}\"" /app/data/configs/homeserver.yaml
|
||||||
|
|
||||||
if [[ -z "${CLOUDRON_LDAP_SERVER:-}" ]]; then
|
if [[ -z "${CLOUDRON_OIDC_ISSUER:-}" ]]; then
|
||||||
yq eval -i ".enable_registration=true" /app/data/configs/homeserver.yaml
|
yq eval -i ".enable_registration=true" /app/data/configs/homeserver.yaml
|
||||||
yq eval -i ".password_config.pepper=\"$(pwgen -1s 12)\"" /app/data/configs/homeserver.yaml
|
# just setting enabled to false is not enough. see https://github.com/matrix-org/matrix-synapse-ldap3/issues/123
|
||||||
|
yq eval -i "del(.password_providers)" /app/data/configs/homeserver.yaml
|
||||||
fi
|
fi
|
||||||
|
yq eval -i ".password_config.pepper=\"$(pwgen -1s 12)\"" /app/data/configs/homeserver.yaml # always set this so that users can enable password login if needed
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo "==> Ensure we log to console"
|
||||||
|
yq eval -i ".root.handlers=[\"console\"]" /app/data/configs/log.config
|
||||||
|
yq eval -i ".loggers.twisted.handlers=[\"console\"]" /app/data/configs/log.config
|
||||||
|
|
||||||
[[ ! -f /app/data/index.html ]] && cp /app/pkg/index.html /app/data/index.html
|
[[ ! -f /app/data/index.html ]] && cp /app/pkg/index.html /app/data/index.html
|
||||||
|
|
||||||
echo "==> Configuring synapse"
|
echo "==> Configuring synapse"
|
||||||
@@ -54,26 +63,40 @@ yq eval -i ".email.smtp_host=\"${CLOUDRON_MAIL_SMTP_SERVER}\"" /app/data/configs
|
|||||||
yq eval -i ".email.smtp_port=${CLOUDRON_MAIL_SMTP_PORT}" /app/data/configs/homeserver.yaml
|
yq eval -i ".email.smtp_port=${CLOUDRON_MAIL_SMTP_PORT}" /app/data/configs/homeserver.yaml
|
||||||
yq eval -i ".email.smtp_user=\"${CLOUDRON_MAIL_SMTP_USERNAME}\"" /app/data/configs/homeserver.yaml
|
yq eval -i ".email.smtp_user=\"${CLOUDRON_MAIL_SMTP_USERNAME}\"" /app/data/configs/homeserver.yaml
|
||||||
yq eval -i ".email.smtp_pass=\"${CLOUDRON_MAIL_SMTP_PASSWORD}\"" /app/data/configs/homeserver.yaml
|
yq eval -i ".email.smtp_pass=\"${CLOUDRON_MAIL_SMTP_PASSWORD}\"" /app/data/configs/homeserver.yaml
|
||||||
yq eval -i ".email.notif_from=\"%(app)s <${CLOUDRON_MAIL_FROM}>\"" /app/data/configs/homeserver.yaml
|
yq eval -i ".email.notif_from=\"${CLOUDRON_MAIL_FROM_DISPLAY_NAME:-Matrix} <${CLOUDRON_MAIL_FROM}>\"" /app/data/configs/homeserver.yaml
|
||||||
|
|
||||||
# ldap
|
# oidc
|
||||||
if [[ -n "${CLOUDRON_LDAP_SERVER:-}" ]]; then
|
if [[ -n "${CLOUDRON_OIDC_ISSUER:-}" ]]; then
|
||||||
yq eval -i ".password_providers[0].config.uri=\"${CLOUDRON_LDAP_URL}\"" /app/data/configs/homeserver.yaml
|
yq eval -i "del(.password_providers)" /app/data/configs/homeserver.yaml # remove old ldap config
|
||||||
yq eval -i ".password_providers[0].config.start_tls=false" /app/data/configs/homeserver.yaml
|
echo " ==> Configuring OIDC auth"
|
||||||
yq eval -i ".password_providers[0].config.base=\"${CLOUDRON_LDAP_USERS_BASE_DN}\"" /app/data/configs/homeserver.yaml
|
yq eval -i ".oidc_providers[0].idp_id=\"cloudron\"" /app/data/configs/homeserver.yaml
|
||||||
yq eval -i ".password_providers[0].config.bind_dn=\"${CLOUDRON_LDAP_BIND_DN}\"" /app/data/configs/homeserver.yaml
|
yq eval -i ".oidc_providers[0].idp_name=\"Cloudron\"" /app/data/configs/homeserver.yaml
|
||||||
yq eval -i ".password_providers[0].config.bind_password=\"${CLOUDRON_LDAP_BIND_PASSWORD}\"" /app/data/configs/homeserver.yaml
|
yq eval -i ".oidc_providers[0].issuer=\"${CLOUDRON_OIDC_ISSUER}\"" /app/data/configs/homeserver.yaml
|
||||||
yq eval -i ".password_providers[0].config.filter=\"(objectClass=user)\"" /app/data/configs/homeserver.yaml
|
yq eval -i ".oidc_providers[0].client_id=\"${CLOUDRON_OIDC_CLIENT_ID}\"" /app/data/configs/homeserver.yaml
|
||||||
|
yq eval -i ".oidc_providers[0].client_secret=\"${CLOUDRON_OIDC_CLIENT_SECRET}\"" /app/data/configs/homeserver.yaml
|
||||||
|
|
||||||
|
yq eval -i ".oidc_providers[0].scopes=[\"openid\", \"email\", \"profile\"]" /app/data/configs/homeserver.yaml
|
||||||
|
yq eval -i ".oidc_providers[0].authorization_endpoint=\"${CLOUDRON_OIDC_AUTH_ENDPOINT}\"" /app/data/configs/homeserver.yaml
|
||||||
|
yq eval -i ".oidc_providers[0].token_endpoint=\"${CLOUDRON_OIDC_TOKEN_ENDPOINT}\"" /app/data/configs/homeserver.yaml
|
||||||
|
yq eval -i ".oidc_providers[0].userinfo_endpoint=\"${CLOUDRON_OIDC_PROFILE_ENDPOINT}\"" /app/data/configs/homeserver.yaml
|
||||||
|
# https://s3lph.me/ldap-to-oidc-migration-3-matrix.html
|
||||||
|
yq eval -i ".oidc_providers[0].allow_existing_users=true" /app/data/configs/homeserver.yaml
|
||||||
|
yq eval -i ".oidc_providers[0].skip_verification=true" /app/data/configs/homeserver.yaml
|
||||||
|
yq eval -i ".oidc_providers[0].user_mapping_provider.config.localpart_template=\"{{ user.sub }}\"" /app/data/configs/homeserver.yaml
|
||||||
|
yq eval -i ".oidc_providers[0].user_mapping_provider.config.display_name_template=\"{{ user.name }}\"" /app/data/configs/homeserver.yaml
|
||||||
else
|
else
|
||||||
yq eval -i ".password_config.localdb_enabled=true" /app/data/configs/homeserver.yaml
|
yq eval -i ".password_config.localdb_enabled=true" /app/data/configs/homeserver.yaml
|
||||||
|
# just setting enabled to false is not enough. see https://github.com/matrix-org/matrix-synapse-ldap3/issues/123
|
||||||
|
yq eval -i "del(.password_providers)" /app/data/configs/homeserver.yaml
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# turn (https://github.com/matrix-org/synapse/blob/master/docs/turn-howto.md#synapse-setup)
|
# turn (https://github.com/matrix-org/synapse/blob/master/docs/turn-howto.md#synapse-setup)
|
||||||
yq eval -i ".turn_uris=[]" /app/data/configs/homeserver.yaml
|
if [[ -n "${CLOUDRON_TURN_SERVER:-}" ]]; then
|
||||||
yq eval -i ".turn_uris[0]=\"turn:${CLOUDRON_TURN_SERVER}:${CLOUDRON_TURN_TLS_PORT}?transport=udp\"" /app/data/configs/homeserver.yaml
|
yq eval -i ".turn_uris=[]" /app/data/configs/homeserver.yaml
|
||||||
yq eval -i ".turn_uris[1]=\"turn:${CLOUDRON_TURN_SERVER}:${CLOUDRON_TURN_TLS_PORT}?transport=tcp\"" /app/data/configs/homeserver.yaml
|
yq eval -i ".turn_uris[0]=\"turn:${CLOUDRON_TURN_SERVER}:${CLOUDRON_TURN_TLS_PORT}?transport=udp\"" /app/data/configs/homeserver.yaml
|
||||||
yq eval -i ".turn_shared_secret=\"${CLOUDRON_TURN_SECRET}\"" /app/data/configs/homeserver.yaml
|
yq eval -i ".turn_uris[1]=\"turn:${CLOUDRON_TURN_SERVER}:${CLOUDRON_TURN_TLS_PORT}?transport=tcp\"" /app/data/configs/homeserver.yaml
|
||||||
|
yq eval -i ".turn_shared_secret=\"${CLOUDRON_TURN_SECRET}\"" /app/data/configs/homeserver.yaml
|
||||||
|
fi
|
||||||
|
|
||||||
# fix permissions
|
# fix permissions
|
||||||
echo "==> Fixing permissions"
|
echo "==> Fixing permissions"
|
||||||
|
|||||||
2520
test/package-lock.json
generated
2520
test/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,11 +9,9 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chromedriver": "^90.0.0",
|
"chromedriver": "^127.0.0",
|
||||||
"expect.js": "^0.3.1",
|
"expect.js": "^0.3.1",
|
||||||
"mocha": "^8.4.0",
|
"mocha": "^10.7.0",
|
||||||
"selenium-server-standalone-jar": "^3.141.59",
|
"selenium-webdriver": "^4.23.0"
|
||||||
"selenium-webdriver": "^3.6.0",
|
|
||||||
"superagent": "^6.1.0"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
480
test/test.js
480
test/test.js
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
/* jslint node:true */
|
/* jshint esversion: 8 */
|
||||||
/* global it:false */
|
/* global it:false */
|
||||||
/* global xit:false */
|
/* global xit:false */
|
||||||
/* global describe:false */
|
/* global describe:false */
|
||||||
@@ -11,246 +11,352 @@
|
|||||||
|
|
||||||
require('chromedriver');
|
require('chromedriver');
|
||||||
|
|
||||||
var execSync = require('child_process').execSync,
|
const execSync = require('child_process').execSync,
|
||||||
expect = require('expect.js'),
|
expect = require('expect.js'),
|
||||||
path = require('path'),
|
path = require('path'),
|
||||||
superagent = require('superagent'),
|
{ Builder, By, Key, until } = require('selenium-webdriver'),
|
||||||
webdriver = require('selenium-webdriver');
|
{ Options } = require('selenium-webdriver/chrome');
|
||||||
|
|
||||||
var by = require('selenium-webdriver').By,
|
|
||||||
until = require('selenium-webdriver').until,
|
if (!process.env.USERNAME || !process.env.PASSWORD) {
|
||||||
Key = require('selenium-webdriver').Key;
|
console.log('USERNAME and PASSWORD env vars need to be set');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
describe('Application life cycle test', function () {
|
describe('Application life cycle test', function () {
|
||||||
this.timeout(0);
|
this.timeout(0);
|
||||||
var server, browser = new webdriver.Builder().forBrowser('chrome').build();
|
|
||||||
|
|
||||||
var LOCATION = 'test';
|
const ELEMENT_LOCATION = 'element-test';
|
||||||
var app;
|
const LOCATION = 'test';
|
||||||
var username = process.env.USERNAME;
|
const TEST_TIMEOUT = parseInt(process.env.TIMEOUT, 10) || 10000;
|
||||||
var password = process.env.PASSWORD;
|
const EXEC_ARGS = { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' };
|
||||||
var TIMEOUT = process.env.TIMEOUT | 30000;
|
const USERNAME = process.env.USERNAME;
|
||||||
var token, roomId;
|
const PASSWORD = process.env.PASSWORD;
|
||||||
|
const ROOM_ID = Math.floor((Math.random() * 100) + 1);
|
||||||
|
const ROOM_NAME = 'Test room ' + ROOM_ID;
|
||||||
|
const MSG_TEXT = 'Test message ';
|
||||||
|
|
||||||
before(function (done) {
|
let browser, app;
|
||||||
if (!process.env.USERNAME) return done(new Error('USERNAME env var not set'));
|
let athenticated_by_oidc = false;
|
||||||
if (!process.env.PASSWORD) return done(new Error('PASSWORD env var not set'));
|
|
||||||
|
|
||||||
var seleniumJar= require('selenium-server-standalone-jar');
|
before(function () {
|
||||||
var SeleniumServer = require('selenium-webdriver/remote').SeleniumServer;
|
const options = new Options().windowSize({ width: 1280, height: 1024 });
|
||||||
server = new SeleniumServer(seleniumJar.path, { port: 4444 });
|
if (process.env.HEADLESS) options.addArguments('headless');
|
||||||
server.start();
|
|
||||||
|
|
||||||
done();
|
browser = new Builder().forBrowser('chrome').setChromeOptions(options).build();
|
||||||
});
|
});
|
||||||
|
|
||||||
after(function (done) {
|
after(function () {
|
||||||
browser.quit();
|
browser.quit();
|
||||||
server.stop();
|
|
||||||
done();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function checkLandingPage(done) {
|
function sleep(millis) {
|
||||||
browser.get('https://' + app.fqdn).then(function () {
|
return new Promise(resolve => setTimeout(resolve, millis));
|
||||||
return browser.wait(until.elementLocated(by.xpath('//h1[contains(text(),"Synapse is running")]')), TIMEOUT);
|
|
||||||
}).then(function () {
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://matrix.org/docs/spec/client_server/latest#user-interactive-api-in-the-rest-api
|
async function waitForElement(elem) {
|
||||||
function registerUser(done) {
|
await browser.wait(until.elementLocated(elem), TEST_TIMEOUT);
|
||||||
superagent.post('https://' + app.fqdn + '/_matrix/client/r0/register?kind=user').send({
|
await browser.wait(until.elementIsVisible(browser.findElement(elem)), TEST_TIMEOUT);
|
||||||
username: username,
|
|
||||||
password: password,
|
|
||||||
inhibit_login: false
|
|
||||||
}).end(function (error, result) {
|
|
||||||
// we will first get a 401
|
|
||||||
let session = result.body.session;
|
|
||||||
console.log('session is', session);
|
|
||||||
if (result.statusCode !== 401) return done(new Error('Expecting a 401 ' + result.statusCode));
|
|
||||||
|
|
||||||
superagent.post('https://' + app.fqdn + '/_matrix/client/r0/register?kind=user').send({
|
|
||||||
auth: {
|
|
||||||
type: 'm.login.dummy',
|
|
||||||
session: session
|
|
||||||
},
|
|
||||||
username: username,
|
|
||||||
password: password,
|
|
||||||
inhibit_login: false
|
|
||||||
}).end(function (error, result) {
|
|
||||||
if (error) return done(error);
|
|
||||||
if (result.statusCode !== 200) return done(new Error('Login failed with status ' + result.statusCode));
|
|
||||||
|
|
||||||
console.log('registered user with id', result.user_id);
|
|
||||||
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://matrix.org/docs/spec/client_server/latest
|
function getAppInfo() {
|
||||||
function checkLogin(done) {
|
const inspect = JSON.parse(execSync('cloudron inspect'));
|
||||||
superagent.post('https://' + app.fqdn + '/_matrix/client/r0/login').send({
|
app = inspect.apps.filter(function (a) { return a.location.indexOf(LOCATION) === 0; })[0];
|
||||||
type: 'm.login.password',
|
expect(app).to.be.an('object');
|
||||||
user: username,
|
|
||||||
password: password
|
|
||||||
}).end(function (error, result) {
|
|
||||||
if (error) return done(error);
|
|
||||||
if (result.statusCode !== 200) return done(new Error('Login failed with status ' + result.statusCode));
|
|
||||||
|
|
||||||
token = result.body.access_token;
|
|
||||||
if (!token) return done(new Error('No token'));
|
|
||||||
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkAutoJoinRoom(done) {
|
function getElementAppInfo() {
|
||||||
superagent.get('https://' + app.fqdn + '/_matrix/client/r0/joined_rooms?access_token=' + token).end(function (error, result) {
|
const inspect = JSON.parse(execSync('cloudron inspect'));
|
||||||
if (error) return done(error);
|
app = inspect.apps.filter(function (a) { return a.location.indexOf(ELEMENT_LOCATION) === 0; })[0];
|
||||||
if (result.statusCode !== 200) return done(new Error('Room listing failed with status ' + result.statusCode));
|
expect(app).to.be.an('object');
|
||||||
|
|
||||||
if (result.body.joined_rooms.length !== 1) return done(new Error('User must have auto-joined discuss channel:' + result.statusCode));
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function createRoom(done) {
|
function getMessage() {
|
||||||
superagent.post('https://' + app.fqdn + '/_matrix/client/r0/createRoom?access_token=' + token).send({
|
return MSG_TEXT + Math.floor((Math.random() * 100) + 1);
|
||||||
room_alias_name: 'general'
|
|
||||||
}).end(function (error, result) {
|
|
||||||
if (error) return done(error);
|
|
||||||
if (result.statusCode !== 200) return done(new Error('Room creation failed with status ' + result.statusCode));
|
|
||||||
|
|
||||||
roomId = result.body.room_id;
|
|
||||||
if (!roomId) return done(new Error('No room id'));
|
|
||||||
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkRoom(done) {
|
async function updateSynapseConfig() {
|
||||||
superagent.get('https://' + app.fqdn + '/_matrix/client/r0/joined_rooms?access_token=' + token).end(function (error, result) {
|
console.log(`Setting Synapse Matrix server location to "https://${app.fqdn}"`);
|
||||||
if (error) return done(error);
|
execSync(`cloudron exec --app ${ELEMENT_LOCATION} -- bash -c "jq '.default_server_config[\\"m.homeserver\\"].base_url = \\"https://${app.fqdn}\\"' /app/data/config.json | sponge /app/data/config.json"`);
|
||||||
if (result.statusCode !== 200) return done(new Error('Room listing failed with status ' + result.statusCode));
|
execSync(`cloudron restart --app ${ELEMENT_LOCATION}`);
|
||||||
|
// wait when all services are up and running
|
||||||
if (!result.body.joined_rooms.includes(roomId)) return done(new Error('No room in list: ' + JSON.stringify(result.body)));
|
await sleep(15000);
|
||||||
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
xit('build app', function () {
|
async function checkLandingPage() {
|
||||||
execSync('cloudron build', { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
await browser.get(`https://${app.fqdn}`);
|
||||||
});
|
await browser.wait(until.elementLocated(By.xpath('//h1[contains(text(),"Synapse is running")]')), TEST_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function registerUser() {
|
||||||
|
await browser.get(`https://${app.fqdn}/#/register`);
|
||||||
|
await waitForElement(By.xpath('//input[@label="Username"]'));
|
||||||
|
await browser.findElement(By.xpath('//input[@label="Username"]')).sendKeys(USERNAME);
|
||||||
|
await browser.sleep(2000);
|
||||||
|
await browser.findElement(By.xpath('//input[@label="Password"]')).sendKeys(PASSWORD);
|
||||||
|
await browser.sleep(2000);
|
||||||
|
await browser.findElement(By.xpath('//input[@label="Confirm password"]')).sendKeys(PASSWORD);
|
||||||
|
await browser.sleep(2000);
|
||||||
|
await browser.findElement(By.xpath('//input[@value="Register"]')).click();
|
||||||
|
await browser.sleep(2000);
|
||||||
|
await waitForElement(By.xpath('//h1[text()="You\'re in"]'));
|
||||||
|
await browser.sleep(2000);
|
||||||
|
await browser.findElement(By.xpath('//div[@role="button" and text()="Skip"]')).click();
|
||||||
|
await browser.sleep(2000);
|
||||||
|
await waitForElement(By.xpath(`//h1[contains(., "Welcome")]`));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loginOIDC(username, password) {
|
||||||
|
browser.manage().deleteAllCookies();
|
||||||
|
await browser.get(`https://${app.fqdn}/#/login`);
|
||||||
|
await browser.sleep(6000);
|
||||||
|
|
||||||
|
await waitForElement(By.xpath('//div[@role="button" and contains(., "Continue with Cloudron")]'));
|
||||||
|
await browser.findElement(By.xpath('//div[@role="button" and contains(., "Continue with Cloudron")]')).click();
|
||||||
|
await browser.sleep(2000);
|
||||||
|
|
||||||
|
if (!athenticated_by_oidc) {
|
||||||
|
await waitForElement(By.xpath('//input[@name="username"]'));
|
||||||
|
await browser.findElement(By.xpath('//input[@name="username"]')).sendKeys(username);
|
||||||
|
await browser.findElement(By.xpath('//input[@name="password"]')).sendKeys(password);
|
||||||
|
await browser.sleep(2000);
|
||||||
|
await browser.findElement(By.id('loginSubmitButton')).click();
|
||||||
|
await browser.sleep(2000);
|
||||||
|
|
||||||
|
athenticated_by_oidc = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
await waitForElement(By.xpath('//p[@class="confirm-trust" and contains(., "Continuing will grant ")]'));
|
||||||
|
await browser.findElement(By.xpath('//a[contains(., "Continue")]')).click();
|
||||||
|
await browser.sleep(2000);
|
||||||
|
|
||||||
|
//if (await browser.findElements(By.xpath('//div[@aria-label="Skip verification for now"]')).then(found => !!found.length)) {
|
||||||
|
// await skipVerification();
|
||||||
|
//}
|
||||||
|
|
||||||
|
await browser.sleep(3000);
|
||||||
|
await waitForElement(By.xpath(`//h1[contains(., "Welcome")]`));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function login() {
|
||||||
|
await browser.get('https://' + app.fqdn + '/#/login');
|
||||||
|
await browser.wait(until.elementLocated(By.xpath('//input[@value="Sign in"]')), TEST_TIMEOUT);
|
||||||
|
await browser.findElement(By.xpath('//input[@name="username"]')).sendKeys(USERNAME);
|
||||||
|
await browser.findElement(By.xpath('//input[@name="password"]')).sendKeys(PASSWORD);
|
||||||
|
await browser.findElement(By.xpath('//input[@value="Sign in"]')).click();
|
||||||
|
await browser.sleep(5000);
|
||||||
|
|
||||||
|
if (await browser.findElements(By.xpath('//div[@aria-label="Skip verification for now"]')).then(found => !!found.length)) {
|
||||||
|
await skipVerification();
|
||||||
|
}
|
||||||
|
|
||||||
|
await browser.wait(until.elementLocated(By.xpath('//span[text()="Rooms"]')), TEST_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function skipVerification() {
|
||||||
|
await browser.wait(until.elementLocated(By.xpath('//div[@aria-label="Skip verification for now"]')), TEST_TIMEOUT);
|
||||||
|
await browser.sleep(5000);
|
||||||
|
await browser.findElement(By.xpath('//div[@aria-label="Skip verification for now"]')).click();
|
||||||
|
await browser.wait(until.elementLocated(By.xpath('//div[contains(text(), "verify later")]')), TEST_TIMEOUT);
|
||||||
|
await browser.sleep(5000);
|
||||||
|
await browser.findElement(By.xpath('//div[contains(text(), "verify later")]')).click();
|
||||||
|
await browser.sleep(5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function logout() {
|
||||||
|
await browser.get('https://' + app.fqdn + '/#/home');
|
||||||
|
await browser.sleep(5000);
|
||||||
|
await waitForElement(By.xpath('//div[@role="button" and @aria-label="User menu"]'));
|
||||||
|
|
||||||
|
await browser.findElement(By.xpath('//div[@role="button" and @aria-label="User menu"]')).click();
|
||||||
|
await browser.sleep(2000);
|
||||||
|
|
||||||
|
await browser.findElement(By.xpath('//li[@role="menuitem" and @aria-label="Sign out"]')).click();
|
||||||
|
await browser.sleep(2000);
|
||||||
|
|
||||||
|
// if (await browser.findElements(By.xpath('//button[contains(text(), "I don\'t want my encrypted messages")]')).then(found => !!found.length)) {
|
||||||
|
await browser.findElement(By.xpath('//button[contains(text(), "I don\'t want my encrypted messages")]')).click();
|
||||||
|
await browser.sleep(3000);
|
||||||
|
// }
|
||||||
|
|
||||||
|
await waitForElement(By.xpath('//h1[text()="Sign in"]'));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function isLoggedIn() {
|
||||||
|
await browser.get('https://' + app.fqdn + '/#/home');
|
||||||
|
await browser.wait(until.elementLocated(By.xpath('//span[text()="Rooms"]')), TEST_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function createRoom() {
|
||||||
|
await browser.get('https://' + app.fqdn + '/#/home');
|
||||||
|
await browser.sleep(4000);
|
||||||
|
await waitForElement(By.xpath('//div[@role="button" and @aria-label="Add room"]'));
|
||||||
|
await browser.findElement(By.xpath('//div[@role="button" and @aria-label="Add room"]')).click();
|
||||||
|
await browser.sleep(2000);
|
||||||
|
await browser.findElement(By.xpath('//li[@role="menuitem" and @aria-label="New room"]')).click();
|
||||||
|
await browser.sleep(2000);
|
||||||
|
|
||||||
|
await browser.findElement(By.xpath('//input[@label="Name"]')).sendKeys(ROOM_NAME);
|
||||||
|
await browser.sleep(2000);
|
||||||
|
|
||||||
|
await browser.findElement(By.xpath('//button[text()="Create room"]')).click();
|
||||||
|
await browser.sleep(2000);
|
||||||
|
|
||||||
|
await waitForElement(By.xpath('//div[@role="button" and @aria-label="Add room"]'));
|
||||||
|
|
||||||
|
await waitForElement(By.xpath('//div[@class="mx_RoomTile_titleContainer"]/div[@title="' + ROOM_NAME + '"]'));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function checkRoom() {
|
||||||
|
await browser.get('https://' + app.fqdn + '/#/home');
|
||||||
|
await browser.sleep(4000);
|
||||||
|
await waitForElement(By.xpath('//div[@role="treeitem" and @aria-label="' + ROOM_NAME + '"]'));
|
||||||
|
await browser.findElement(By.xpath('//div[@role="treeitem" and @aria-label="' + ROOM_NAME + '"]')).click();
|
||||||
|
await browser.sleep(2000);
|
||||||
|
await waitForElement(By.xpath('//h2[text()="' + ROOM_NAME + '"]'));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function sendMessage() {
|
||||||
|
await checkRoom();
|
||||||
|
|
||||||
|
await browser.findElement(By.xpath('//div[contains(@class, "mx_BasicMessageComposer_input")]')).sendKeys(getMessage());
|
||||||
|
await browser.sleep(2000);
|
||||||
|
|
||||||
|
await browser.findElement(By.xpath('//div[@role="button" and @aria-label="Send message"]')).click();
|
||||||
|
await browser.sleep(2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
xit('build app', function () { execSync('cloudron build', EXEC_ARGS); });
|
||||||
|
|
||||||
// No SSO
|
// No SSO
|
||||||
it('install app (no sso)', function () {
|
it('install app (no sso)', function () { execSync('cloudron install --no-sso --location ' + LOCATION, EXEC_ARGS); });
|
||||||
execSync('cloudron install --no-sso --location ' + LOCATION, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
it('can get app information', getAppInfo);
|
||||||
});
|
|
||||||
|
|
||||||
it('can get app information', function () {
|
|
||||||
var inspect = JSON.parse(execSync('cloudron inspect'));
|
|
||||||
|
|
||||||
app = inspect.apps.filter(function (a) { return a.location === LOCATION; })[0];
|
|
||||||
|
|
||||||
expect(app).to.be.an('object');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('check landing page', checkLandingPage);
|
it('check landing page', checkLandingPage);
|
||||||
it('can register new user', registerUser);
|
|
||||||
it('can login', checkLogin);
|
|
||||||
it('check autojoin', checkAutoJoinRoom);
|
|
||||||
it('create room', createRoom);
|
|
||||||
it('check room', checkRoom);
|
|
||||||
|
|
||||||
it('uninstall app', function () {
|
it('can install element-web app (no sso)', function () { execSync('cloudron install --appstore-id im.riot.cloudronapp --location ' + ELEMENT_LOCATION, EXEC_ARGS); });
|
||||||
execSync('cloudron uninstall --app ' + app.id, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
it('update element-app config', updateSynapseConfig);
|
||||||
|
|
||||||
|
it('can get Element app info', getElementAppInfo);
|
||||||
|
it('can register new user', registerUser);
|
||||||
|
it('create room', createRoom);
|
||||||
|
it('can send message', sendMessage);
|
||||||
|
|
||||||
|
it('can logout', logout);
|
||||||
|
|
||||||
|
it('can login', login);
|
||||||
|
it('check room', checkRoom);
|
||||||
|
it('can logout', logout);
|
||||||
|
|
||||||
|
it('can get app info', getAppInfo);
|
||||||
|
|
||||||
|
it('uninstall element-web app', async function () {
|
||||||
|
await browser.get('about:blank');
|
||||||
|
execSync(`cloudron uninstall --app ${ELEMENT_LOCATION}`, EXEC_ARGS);
|
||||||
});
|
});
|
||||||
|
it('uninstall app', function () { execSync('cloudron uninstall --app ' + app.id, EXEC_ARGS); });
|
||||||
|
|
||||||
// SSO
|
// SSO
|
||||||
it('install app', function () {
|
it('install app (sso)', function () { execSync('cloudron install --location ' + LOCATION, EXEC_ARGS); });
|
||||||
execSync('cloudron install --location ' + LOCATION, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
it('can get app info', getAppInfo);
|
||||||
});
|
|
||||||
|
|
||||||
it('can get app information', function () {
|
it('can install element-web app (sso)', function () { execSync('cloudron install --appstore-id im.riot.cloudronapp --location ' + ELEMENT_LOCATION, EXEC_ARGS); });
|
||||||
var inspect = JSON.parse(execSync('cloudron inspect'));
|
it('update element-app config', updateSynapseConfig);
|
||||||
|
|
||||||
app = inspect.apps.filter(function (a) { return a.location === LOCATION; })[0];
|
it('can get Element app info', getElementAppInfo);
|
||||||
|
it('can login via OIDC', loginOIDC.bind(null, USERNAME, PASSWORD));
|
||||||
expect(app).to.be.an('object');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('check landing page', checkLandingPage);
|
|
||||||
it('can login', checkLogin);
|
|
||||||
it('check autojoin', checkAutoJoinRoom);
|
|
||||||
it('create room', createRoom);
|
it('create room', createRoom);
|
||||||
it('check room', checkRoom);
|
it('can send message', sendMessage);
|
||||||
|
it('can get app info', getAppInfo);
|
||||||
|
|
||||||
it('can restart app', function (done) {
|
it('can restart app', function () { execSync(`cloudron restart ${app.id}`); });
|
||||||
execSync('cloudron restart');
|
|
||||||
done();
|
it('backup app', function () { execSync(`cloudron backup create --app ${app.id}`, EXEC_ARGS); });
|
||||||
|
|
||||||
|
it('can get Element app info', getElementAppInfo);
|
||||||
|
it('is logged in', isLoggedIn);
|
||||||
|
it('check room', checkRoom);
|
||||||
|
it('can get app info', getAppInfo);
|
||||||
|
|
||||||
|
it('restore app', async function () {
|
||||||
|
const backups = JSON.parse(execSync(`cloudron backup list --raw --app ${app.id}`));
|
||||||
|
|
||||||
|
await browser.get('about:blank');
|
||||||
|
execSync(`cloudron uninstall --app ${app.id}`, EXEC_ARGS);
|
||||||
|
execSync(`cloudron install --location ${LOCATION}`, EXEC_ARGS);
|
||||||
|
|
||||||
|
getAppInfo();
|
||||||
|
|
||||||
|
execSync(`cloudron restore --backup ${backups[0].id} --app ${app.id}`, EXEC_ARGS);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('check landing page', checkLandingPage);
|
it('can get Element app info', getElementAppInfo);
|
||||||
|
it('is logged in', isLoggedIn);
|
||||||
it('check room', checkRoom);
|
it('check room', checkRoom);
|
||||||
|
it('can send message', sendMessage);
|
||||||
|
it('can logout', logout);
|
||||||
|
it('can get app info', getAppInfo);
|
||||||
|
|
||||||
it('backup app', function () {
|
it('move to different location', async function () {
|
||||||
execSync('cloudron backup create --app ' + app.id, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
|
||||||
});
|
|
||||||
|
|
||||||
it('check landing page', checkLandingPage);
|
|
||||||
it('check room', checkRoom);
|
|
||||||
|
|
||||||
it('restore app', function () {
|
|
||||||
const backups = JSON.parse(execSync('cloudron backup list --raw'));
|
|
||||||
execSync('cloudron uninstall --app ' + app.id, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
|
||||||
execSync('cloudron install --location ' + LOCATION, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
|
||||||
var inspect = JSON.parse(execSync('cloudron inspect'));
|
|
||||||
app = inspect.apps.filter(function (a) { return a.location === LOCATION; })[0];
|
|
||||||
execSync(`cloudron restore --backup ${backups[0].id} --app ${app.id}`, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
|
||||||
});
|
|
||||||
|
|
||||||
it('check landing page', checkLandingPage);
|
|
||||||
it('check room', checkRoom);
|
|
||||||
|
|
||||||
it('move to different location', function () {
|
|
||||||
browser.manage().deleteAllCookies();
|
browser.manage().deleteAllCookies();
|
||||||
execSync('cloudron configure --location ' + LOCATION + '2', { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
await browser.get('about:blank');
|
||||||
var inspect = JSON.parse(execSync('cloudron inspect'));
|
|
||||||
app = inspect.apps.filter(function (a) { return a.location === LOCATION + '2'; })[0];
|
execSync(`cloudron configure --location ${LOCATION}2`, EXEC_ARGS);
|
||||||
expect(app).to.be.an('object');
|
getAppInfo();
|
||||||
|
// wait when all services are up and running
|
||||||
|
await sleep(15000);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('check landing page', checkLandingPage);
|
it('update element-app config', updateSynapseConfig);
|
||||||
it('check room', checkRoom);
|
|
||||||
|
|
||||||
it('uninstall app', function () {
|
it('can get Element app info', getElementAppInfo);
|
||||||
execSync('cloudron uninstall --app ' + app.id, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
it('can login via OIDC', loginOIDC.bind(null, USERNAME, PASSWORD));
|
||||||
|
it('check room', checkRoom);
|
||||||
|
it('can send message', sendMessage);
|
||||||
|
|
||||||
|
it('can logout', logout);
|
||||||
|
it('can get app info', getAppInfo);
|
||||||
|
|
||||||
|
it('uninstall app', async function () {
|
||||||
|
await browser.get('about:blank');
|
||||||
|
execSync(`cloudron uninstall --app ${app.id}`, EXEC_ARGS);
|
||||||
});
|
});
|
||||||
|
|
||||||
// test update
|
// test update
|
||||||
it('can install app', function () {
|
it('can install app for update', function () { execSync('cloudron install --appstore-id org.matrix.synapse --location ' + LOCATION, EXEC_ARGS); });
|
||||||
execSync('cloudron install --appstore-id org.matrix.synapse --location ' + LOCATION, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
it('can install element-web app (update)', function () { execSync('cloudron install --appstore-id im.riot.cloudronapp --location ' + ELEMENT_LOCATION, EXEC_ARGS); });
|
||||||
var inspect = JSON.parse(execSync('cloudron inspect'));
|
|
||||||
app = inspect.apps.filter(function (a) { return a.location === LOCATION; })[0];
|
|
||||||
expect(app).to.be.an('object');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('check landing page', checkLandingPage);
|
it('can get app info', getAppInfo);
|
||||||
it('can login', checkLogin);
|
it('update element-app config', updateSynapseConfig);
|
||||||
|
|
||||||
|
it('can get Element app info', getElementAppInfo);
|
||||||
|
|
||||||
|
it('can login via OIDC', loginOIDC.bind(null, USERNAME, PASSWORD));
|
||||||
|
it('is logged in', isLoggedIn);
|
||||||
it('create room', createRoom);
|
it('create room', createRoom);
|
||||||
it('check room', checkRoom);
|
it('can send message', sendMessage);
|
||||||
|
it('can logout', logout);
|
||||||
|
it('can get app info', getAppInfo);
|
||||||
|
|
||||||
it('can update', function () {
|
it('can update', async function () {
|
||||||
execSync('cloudron update --app ' + LOCATION, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
await browser.get('about:blank');
|
||||||
|
execSync(`cloudron update --app ${app.id}`, EXEC_ARGS);
|
||||||
|
// wait when all services are up and running
|
||||||
|
await sleep(15000);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('check landing page', checkLandingPage);
|
it('can get Element app info', getElementAppInfo);
|
||||||
|
it('can login via OIDC', loginOIDC.bind(null, USERNAME, PASSWORD));
|
||||||
|
it('is logged in', isLoggedIn);
|
||||||
it('check room', checkRoom);
|
it('check room', checkRoom);
|
||||||
it('uninstall app', function () {
|
it('can send message', sendMessage);
|
||||||
execSync('cloudron uninstall --app ' + app.id, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
|
it('can get app info', getAppInfo);
|
||||||
|
|
||||||
|
it('uninstall app', async function () {
|
||||||
|
await browser.get('about:blank');
|
||||||
|
execSync(`cloudron uninstall --app ${app.id}`, EXEC_ARGS);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('uninstall element-web app', function () {
|
||||||
|
execSync(`cloudron uninstall --app ${ELEMENT_LOCATION}`, EXEC_ARGS);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user