matrix-synapse 1.145.0rc2__cp310-abi3-manylinux_2_28_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of matrix-synapse might be problematic. Click here for more details.

Files changed (1636) hide show
  1. AUTHORS.rst +51 -0
  2. CHANGES.md +1732 -0
  3. CONTRIBUTING.md +3 -0
  4. Cargo.lock +1923 -0
  5. Cargo.toml +6 -0
  6. INSTALL.md +7 -0
  7. LICENSE-AGPL-3.0 +661 -0
  8. LICENSE-COMMERCIAL +6 -0
  9. UPGRADE.rst +7 -0
  10. book.toml +47 -0
  11. changelog.d/.gitignore +1 -0
  12. demo/.gitignore +4 -0
  13. demo/clean.sh +22 -0
  14. demo/start.sh +173 -0
  15. demo/stop.sh +14 -0
  16. docs/.sample_config_header.yaml +12 -0
  17. docs/CAPTCHA_SETUP.md +37 -0
  18. docs/README.md +86 -0
  19. docs/SUMMARY.md +126 -0
  20. docs/admin_api/README.rst +13 -0
  21. docs/admin_api/account_validity.md +47 -0
  22. docs/admin_api/client_server_api_extensions.md +67 -0
  23. docs/admin_api/event_reports.md +185 -0
  24. docs/admin_api/experimental_features.md +52 -0
  25. docs/admin_api/fetch_event.md +53 -0
  26. docs/admin_api/media_admin_api.md +372 -0
  27. docs/admin_api/purge_history_api.md +77 -0
  28. docs/admin_api/register_api.md +92 -0
  29. docs/admin_api/room_membership.md +35 -0
  30. docs/admin_api/rooms.md +1190 -0
  31. docs/admin_api/scheduled_tasks.md +54 -0
  32. docs/admin_api/server_notices.md +48 -0
  33. docs/admin_api/statistics.md +132 -0
  34. docs/admin_api/user_admin_api.md +1602 -0
  35. docs/admin_api/version_api.md +23 -0
  36. docs/ancient_architecture_notes.md +81 -0
  37. docs/application_services.md +36 -0
  38. docs/architecture.md +65 -0
  39. docs/auth_chain_diff.dot +32 -0
  40. docs/auth_chain_diff.dot.png +0 -0
  41. docs/auth_chain_difference_algorithm.md +141 -0
  42. docs/changelogs/CHANGES-2019.md +1039 -0
  43. docs/changelogs/CHANGES-2020.md +2145 -0
  44. docs/changelogs/CHANGES-2021.md +2573 -0
  45. docs/changelogs/CHANGES-2022.md +2766 -0
  46. docs/changelogs/CHANGES-2023.md +2202 -0
  47. docs/changelogs/CHANGES-2024.md +1586 -0
  48. docs/changelogs/CHANGES-pre-1.0.md +3641 -0
  49. docs/changelogs/README.md +1 -0
  50. docs/code_style.md +119 -0
  51. docs/consent_tracking.md +197 -0
  52. docs/delegate.md +111 -0
  53. docs/deprecation_policy.md +89 -0
  54. docs/development/cas.md +64 -0
  55. docs/development/contributing_guide.md +554 -0
  56. docs/development/database_schema.md +404 -0
  57. docs/development/demo.md +42 -0
  58. docs/development/dependencies.md +326 -0
  59. docs/development/experimental_features.md +37 -0
  60. docs/development/git.md +148 -0
  61. docs/development/img/git/branches.jpg +0 -0
  62. docs/development/img/git/clean.png +0 -0
  63. docs/development/img/git/squash.png +0 -0
  64. docs/development/internal_documentation/README.md +12 -0
  65. docs/development/internal_documentation/release_notes_review_checklist.md +12 -0
  66. docs/development/releases.md +37 -0
  67. docs/development/reviews.md +41 -0
  68. docs/development/room-dag-concepts.md +115 -0
  69. docs/development/saml.md +40 -0
  70. docs/development/synapse_architecture/cancellation.md +392 -0
  71. docs/development/synapse_architecture/faster_joins.md +375 -0
  72. docs/development/synapse_architecture/streams.md +198 -0
  73. docs/element_logo_white_bg.svg +94 -0
  74. docs/favicon.png +0 -0
  75. docs/favicon.svg +58 -0
  76. docs/federate.md +67 -0
  77. docs/jwt.md +105 -0
  78. docs/log_contexts.md +566 -0
  79. docs/manhole.md +101 -0
  80. docs/media_repository.md +78 -0
  81. docs/message_retention_policies.md +207 -0
  82. docs/metrics-howto.md +315 -0
  83. docs/modules/account_data_callbacks.md +106 -0
  84. docs/modules/account_validity_callbacks.md +57 -0
  85. docs/modules/add_extra_fields_to_client_events_unsigned.md +32 -0
  86. docs/modules/background_update_controller_callbacks.md +71 -0
  87. docs/modules/index.md +53 -0
  88. docs/modules/media_repository_callbacks.md +131 -0
  89. docs/modules/password_auth_provider_callbacks.md +270 -0
  90. docs/modules/porting_legacy_module.md +20 -0
  91. docs/modules/presence_router_callbacks.md +112 -0
  92. docs/modules/ratelimit_callbacks.md +43 -0
  93. docs/modules/spam_checker_callbacks.md +517 -0
  94. docs/modules/third_party_rules_callbacks.md +350 -0
  95. docs/modules/writing_a_module.md +141 -0
  96. docs/openid.md +783 -0
  97. docs/opentracing.md +99 -0
  98. docs/other/running_synapse_on_single_board_computers.md +75 -0
  99. docs/password_auth_providers.md +129 -0
  100. docs/postgres.md +269 -0
  101. docs/presence_router_module.md +247 -0
  102. docs/privacy_policy_templates/en/1.0.html +26 -0
  103. docs/privacy_policy_templates/en/success.html +11 -0
  104. docs/replication.md +36 -0
  105. docs/reverse_proxy.md +327 -0
  106. docs/room_and_user_statistics.md +22 -0
  107. docs/sample_config.yaml +47 -0
  108. docs/sample_log_config.yaml +75 -0
  109. docs/server_notices.md +66 -0
  110. docs/setup/forward_proxy.md +89 -0
  111. docs/setup/installation.md +656 -0
  112. docs/setup/security.md +41 -0
  113. docs/setup/turn/coturn.md +197 -0
  114. docs/setup/turn/eturnal.md +170 -0
  115. docs/spam_checker.md +122 -0
  116. docs/sso_mapping_providers.md +208 -0
  117. docs/structured_logging.md +80 -0
  118. docs/synctl_workers.md +36 -0
  119. docs/systemd-with-workers/README.md +101 -0
  120. docs/systemd-with-workers/system/matrix-synapse-worker@.service +26 -0
  121. docs/systemd-with-workers/system/matrix-synapse.service +23 -0
  122. docs/systemd-with-workers/system/matrix-synapse.target +6 -0
  123. docs/systemd-with-workers/workers/background_worker.yaml +4 -0
  124. docs/systemd-with-workers/workers/event_persister.yaml +20 -0
  125. docs/systemd-with-workers/workers/federation_sender.yaml +4 -0
  126. docs/systemd-with-workers/workers/generic_worker.yaml +11 -0
  127. docs/systemd-with-workers/workers/media_worker.yaml +11 -0
  128. docs/systemd-with-workers/workers/pusher_worker.yaml +4 -0
  129. docs/tcp_replication.md +258 -0
  130. docs/templates.md +254 -0
  131. docs/turn-howto.md +168 -0
  132. docs/upgrade.md +2876 -0
  133. docs/usage/administration/README.md +7 -0
  134. docs/usage/administration/admin_api/README.md +47 -0
  135. docs/usage/administration/admin_api/background_updates.md +109 -0
  136. docs/usage/administration/admin_api/federation.md +212 -0
  137. docs/usage/administration/admin_api/registration_tokens.md +298 -0
  138. docs/usage/administration/admin_faq.md +294 -0
  139. docs/usage/administration/backups.md +125 -0
  140. docs/usage/administration/database_maintenance_tools.md +18 -0
  141. docs/usage/administration/monitoring/reporting_homeserver_usage_statistics.md +77 -0
  142. docs/usage/administration/monthly_active_users.md +84 -0
  143. docs/usage/administration/request_log.md +44 -0
  144. docs/usage/administration/state_groups.md +25 -0
  145. docs/usage/administration/understanding_synapse_through_grafana_graphs.md +83 -0
  146. docs/usage/administration/useful_sql_for_admins.md +216 -0
  147. docs/usage/configuration/README.md +4 -0
  148. docs/usage/configuration/config_documentation.md +4768 -0
  149. docs/usage/configuration/homeserver_sample_config.md +17 -0
  150. docs/usage/configuration/logging_sample_config.md +19 -0
  151. docs/usage/configuration/user_authentication/README.md +15 -0
  152. docs/usage/configuration/user_authentication/refresh_tokens.md +139 -0
  153. docs/usage/configuration/user_authentication/single_sign_on/README.md +5 -0
  154. docs/usage/configuration/user_authentication/single_sign_on/cas.md +8 -0
  155. docs/usage/configuration/user_authentication/single_sign_on/saml.md +8 -0
  156. docs/user_directory.md +130 -0
  157. docs/website_files/README.md +35 -0
  158. docs/website_files/indent-section-headers.css +7 -0
  159. docs/website_files/remove-nav-buttons.css +8 -0
  160. docs/website_files/table-of-contents.css +47 -0
  161. docs/website_files/table-of-contents.js +148 -0
  162. docs/website_files/theme/index.hbs +324 -0
  163. docs/website_files/version-picker.css +78 -0
  164. docs/website_files/version-picker.js +147 -0
  165. docs/website_files/version.js +1 -0
  166. docs/welcome_and_overview.md +67 -0
  167. docs/workers.md +897 -0
  168. matrix_synapse-1.145.0rc2.dist-info/METADATA +260 -0
  169. matrix_synapse-1.145.0rc2.dist-info/RECORD +1636 -0
  170. matrix_synapse-1.145.0rc2.dist-info/WHEEL +5 -0
  171. matrix_synapse-1.145.0rc2.dist-info/entry_points.txt +13 -0
  172. matrix_synapse-1.145.0rc2.dist-info/licenses/AUTHORS.rst +51 -0
  173. matrix_synapse-1.145.0rc2.dist-info/licenses/LICENSE-AGPL-3.0 +661 -0
  174. matrix_synapse-1.145.0rc2.dist-info/licenses/LICENSE-COMMERCIAL +6 -0
  175. mypy.ini +115 -0
  176. rust/Cargo.toml +63 -0
  177. rust/build.rs +45 -0
  178. scripts-dev/build_debian_packages.py +228 -0
  179. scripts-dev/check-newsfragment.sh +62 -0
  180. scripts-dev/check_line_terminators.sh +29 -0
  181. scripts-dev/check_locked_deps_have_sdists.py +64 -0
  182. scripts-dev/check_schema_delta.py +240 -0
  183. scripts-dev/complement.sh +332 -0
  184. scripts-dev/config-lint.sh +15 -0
  185. scripts-dev/database-save.sh +15 -0
  186. scripts-dev/docker_update_debian_changelog.sh +70 -0
  187. scripts-dev/dump_macaroon.py +25 -0
  188. scripts-dev/federation_client.py +428 -0
  189. scripts-dev/gen_config_documentation.py +510 -0
  190. scripts-dev/generate_sample_config.sh +28 -0
  191. scripts-dev/lint.sh +141 -0
  192. scripts-dev/make_full_schema.sh +310 -0
  193. scripts-dev/mypy_synapse_plugin.py +918 -0
  194. scripts-dev/next_github_number.sh +9 -0
  195. scripts-dev/release.py +986 -0
  196. scripts-dev/schema_versions.py +182 -0
  197. scripts-dev/sign_json.py +172 -0
  198. synapse/__init__.py +97 -0
  199. synapse/_scripts/__init__.py +0 -0
  200. synapse/_scripts/export_signing_key.py +109 -0
  201. synapse/_scripts/generate_config.py +83 -0
  202. synapse/_scripts/generate_log_config.py +56 -0
  203. synapse/_scripts/generate_signing_key.py +55 -0
  204. synapse/_scripts/generate_workers_map.py +318 -0
  205. synapse/_scripts/hash_password.py +95 -0
  206. synapse/_scripts/move_remote_media_to_new_store.py +128 -0
  207. synapse/_scripts/register_new_matrix_user.py +402 -0
  208. synapse/_scripts/review_recent_signups.py +212 -0
  209. synapse/_scripts/synapse_port_db.py +1604 -0
  210. synapse/_scripts/synctl.py +365 -0
  211. synapse/_scripts/update_synapse_database.py +130 -0
  212. synapse/api/__init__.py +20 -0
  213. synapse/api/auth/__init__.py +207 -0
  214. synapse/api/auth/base.py +406 -0
  215. synapse/api/auth/internal.py +299 -0
  216. synapse/api/auth/mas.py +436 -0
  217. synapse/api/auth/msc3861_delegated.py +617 -0
  218. synapse/api/auth_blocking.py +144 -0
  219. synapse/api/constants.py +379 -0
  220. synapse/api/errors.py +913 -0
  221. synapse/api/filtering.py +537 -0
  222. synapse/api/presence.py +102 -0
  223. synapse/api/ratelimiting.py +481 -0
  224. synapse/api/room_versions.py +535 -0
  225. synapse/api/urls.py +118 -0
  226. synapse/app/__init__.py +62 -0
  227. synapse/app/_base.py +906 -0
  228. synapse/app/admin_cmd.py +388 -0
  229. synapse/app/appservice.py +30 -0
  230. synapse/app/client_reader.py +30 -0
  231. synapse/app/complement_fork_starter.py +206 -0
  232. synapse/app/event_creator.py +29 -0
  233. synapse/app/federation_reader.py +30 -0
  234. synapse/app/federation_sender.py +30 -0
  235. synapse/app/frontend_proxy.py +30 -0
  236. synapse/app/generic_worker.py +475 -0
  237. synapse/app/homeserver.py +505 -0
  238. synapse/app/media_repository.py +30 -0
  239. synapse/app/phone_stats_home.py +292 -0
  240. synapse/app/pusher.py +30 -0
  241. synapse/app/synchrotron.py +30 -0
  242. synapse/app/user_dir.py +31 -0
  243. synapse/appservice/__init__.py +458 -0
  244. synapse/appservice/api.py +567 -0
  245. synapse/appservice/scheduler.py +565 -0
  246. synapse/config/__init__.py +27 -0
  247. synapse/config/__main__.py +62 -0
  248. synapse/config/_base.py +1154 -0
  249. synapse/config/_base.pyi +216 -0
  250. synapse/config/_util.py +99 -0
  251. synapse/config/account_validity.py +116 -0
  252. synapse/config/api.py +141 -0
  253. synapse/config/appservice.py +210 -0
  254. synapse/config/auth.py +80 -0
  255. synapse/config/auto_accept_invites.py +43 -0
  256. synapse/config/background_updates.py +44 -0
  257. synapse/config/cache.py +231 -0
  258. synapse/config/captcha.py +90 -0
  259. synapse/config/cas.py +116 -0
  260. synapse/config/consent.py +73 -0
  261. synapse/config/database.py +184 -0
  262. synapse/config/emailconfig.py +367 -0
  263. synapse/config/experimental.py +601 -0
  264. synapse/config/federation.py +114 -0
  265. synapse/config/homeserver.py +141 -0
  266. synapse/config/jwt.py +55 -0
  267. synapse/config/key.py +447 -0
  268. synapse/config/logger.py +390 -0
  269. synapse/config/mas.py +192 -0
  270. synapse/config/matrixrtc.py +66 -0
  271. synapse/config/metrics.py +93 -0
  272. synapse/config/modules.py +40 -0
  273. synapse/config/oembed.py +185 -0
  274. synapse/config/oidc.py +509 -0
  275. synapse/config/password_auth_providers.py +82 -0
  276. synapse/config/push.py +64 -0
  277. synapse/config/ratelimiting.py +260 -0
  278. synapse/config/redis.py +74 -0
  279. synapse/config/registration.py +296 -0
  280. synapse/config/repository.py +311 -0
  281. synapse/config/retention.py +162 -0
  282. synapse/config/room.py +88 -0
  283. synapse/config/room_directory.py +165 -0
  284. synapse/config/saml2.py +251 -0
  285. synapse/config/server.py +1139 -0
  286. synapse/config/server_notices.py +84 -0
  287. synapse/config/spam_checker.py +66 -0
  288. synapse/config/sso.py +121 -0
  289. synapse/config/stats.py +54 -0
  290. synapse/config/third_party_event_rules.py +40 -0
  291. synapse/config/tls.py +192 -0
  292. synapse/config/tracer.py +71 -0
  293. synapse/config/user_directory.py +47 -0
  294. synapse/config/user_types.py +42 -0
  295. synapse/config/voip.py +59 -0
  296. synapse/config/workers.py +642 -0
  297. synapse/crypto/__init__.py +20 -0
  298. synapse/crypto/context_factory.py +278 -0
  299. synapse/crypto/event_signing.py +194 -0
  300. synapse/crypto/keyring.py +980 -0
  301. synapse/event_auth.py +1266 -0
  302. synapse/events/__init__.py +667 -0
  303. synapse/events/auto_accept_invites.py +216 -0
  304. synapse/events/builder.py +387 -0
  305. synapse/events/presence_router.py +243 -0
  306. synapse/events/snapshot.py +559 -0
  307. synapse/events/utils.py +924 -0
  308. synapse/events/validator.py +305 -0
  309. synapse/federation/__init__.py +22 -0
  310. synapse/federation/federation_base.py +382 -0
  311. synapse/federation/federation_client.py +2133 -0
  312. synapse/federation/federation_server.py +1543 -0
  313. synapse/federation/persistence.py +70 -0
  314. synapse/federation/send_queue.py +532 -0
  315. synapse/federation/sender/__init__.py +1165 -0
  316. synapse/federation/sender/per_destination_queue.py +886 -0
  317. synapse/federation/sender/transaction_manager.py +210 -0
  318. synapse/federation/transport/__init__.py +28 -0
  319. synapse/federation/transport/client.py +1199 -0
  320. synapse/federation/transport/server/__init__.py +334 -0
  321. synapse/federation/transport/server/_base.py +429 -0
  322. synapse/federation/transport/server/federation.py +910 -0
  323. synapse/federation/units.py +133 -0
  324. synapse/handlers/__init__.py +20 -0
  325. synapse/handlers/account.py +162 -0
  326. synapse/handlers/account_data.py +360 -0
  327. synapse/handlers/account_validity.py +362 -0
  328. synapse/handlers/admin.py +615 -0
  329. synapse/handlers/appservice.py +989 -0
  330. synapse/handlers/auth.py +2482 -0
  331. synapse/handlers/cas.py +413 -0
  332. synapse/handlers/deactivate_account.py +363 -0
  333. synapse/handlers/delayed_events.py +607 -0
  334. synapse/handlers/device.py +1869 -0
  335. synapse/handlers/devicemessage.py +399 -0
  336. synapse/handlers/directory.py +545 -0
  337. synapse/handlers/e2e_keys.py +1835 -0
  338. synapse/handlers/e2e_room_keys.py +455 -0
  339. synapse/handlers/event_auth.py +390 -0
  340. synapse/handlers/events.py +203 -0
  341. synapse/handlers/federation.py +2042 -0
  342. synapse/handlers/federation_event.py +2420 -0
  343. synapse/handlers/identity.py +812 -0
  344. synapse/handlers/initial_sync.py +528 -0
  345. synapse/handlers/jwt.py +120 -0
  346. synapse/handlers/message.py +2357 -0
  347. synapse/handlers/oidc.py +1801 -0
  348. synapse/handlers/pagination.py +811 -0
  349. synapse/handlers/password_policy.py +102 -0
  350. synapse/handlers/presence.py +2634 -0
  351. synapse/handlers/profile.py +656 -0
  352. synapse/handlers/push_rules.py +164 -0
  353. synapse/handlers/read_marker.py +79 -0
  354. synapse/handlers/receipts.py +351 -0
  355. synapse/handlers/register.py +1059 -0
  356. synapse/handlers/relations.py +623 -0
  357. synapse/handlers/reports.py +98 -0
  358. synapse/handlers/room.py +2449 -0
  359. synapse/handlers/room_list.py +632 -0
  360. synapse/handlers/room_member.py +2366 -0
  361. synapse/handlers/room_member_worker.py +146 -0
  362. synapse/handlers/room_policy.py +186 -0
  363. synapse/handlers/room_summary.py +1057 -0
  364. synapse/handlers/saml.py +524 -0
  365. synapse/handlers/search.py +723 -0
  366. synapse/handlers/send_email.py +209 -0
  367. synapse/handlers/set_password.py +71 -0
  368. synapse/handlers/sliding_sync/__init__.py +1961 -0
  369. synapse/handlers/sliding_sync/extensions.py +969 -0
  370. synapse/handlers/sliding_sync/room_lists.py +2317 -0
  371. synapse/handlers/sliding_sync/store.py +126 -0
  372. synapse/handlers/sso.py +1291 -0
  373. synapse/handlers/state_deltas.py +82 -0
  374. synapse/handlers/stats.py +322 -0
  375. synapse/handlers/sync.py +3096 -0
  376. synapse/handlers/thread_subscriptions.py +190 -0
  377. synapse/handlers/typing.py +612 -0
  378. synapse/handlers/ui_auth/__init__.py +48 -0
  379. synapse/handlers/ui_auth/checkers.py +332 -0
  380. synapse/handlers/user_directory.py +786 -0
  381. synapse/handlers/worker_lock.py +371 -0
  382. synapse/http/__init__.py +105 -0
  383. synapse/http/additional_resource.py +62 -0
  384. synapse/http/client.py +1377 -0
  385. synapse/http/connectproxyclient.py +316 -0
  386. synapse/http/federation/__init__.py +19 -0
  387. synapse/http/federation/matrix_federation_agent.py +490 -0
  388. synapse/http/federation/srv_resolver.py +196 -0
  389. synapse/http/federation/well_known_resolver.py +368 -0
  390. synapse/http/matrixfederationclient.py +1874 -0
  391. synapse/http/proxy.py +290 -0
  392. synapse/http/proxyagent.py +497 -0
  393. synapse/http/replicationagent.py +203 -0
  394. synapse/http/request_metrics.py +309 -0
  395. synapse/http/server.py +1111 -0
  396. synapse/http/servlet.py +1018 -0
  397. synapse/http/site.py +952 -0
  398. synapse/http/types.py +27 -0
  399. synapse/logging/__init__.py +31 -0
  400. synapse/logging/_remote.py +261 -0
  401. synapse/logging/_terse_json.py +95 -0
  402. synapse/logging/context.py +1209 -0
  403. synapse/logging/formatter.py +62 -0
  404. synapse/logging/handlers.py +99 -0
  405. synapse/logging/loggers.py +25 -0
  406. synapse/logging/opentracing.py +1132 -0
  407. synapse/logging/scopecontextmanager.py +160 -0
  408. synapse/media/_base.py +831 -0
  409. synapse/media/filepath.py +417 -0
  410. synapse/media/media_repository.py +1595 -0
  411. synapse/media/media_storage.py +703 -0
  412. synapse/media/oembed.py +277 -0
  413. synapse/media/preview_html.py +556 -0
  414. synapse/media/storage_provider.py +195 -0
  415. synapse/media/thumbnailer.py +833 -0
  416. synapse/media/url_previewer.py +884 -0
  417. synapse/metrics/__init__.py +748 -0
  418. synapse/metrics/_gc.py +219 -0
  419. synapse/metrics/_reactor_metrics.py +171 -0
  420. synapse/metrics/_types.py +38 -0
  421. synapse/metrics/background_process_metrics.py +555 -0
  422. synapse/metrics/common_usage_metrics.py +95 -0
  423. synapse/metrics/jemalloc.py +248 -0
  424. synapse/module_api/__init__.py +2131 -0
  425. synapse/module_api/callbacks/__init__.py +50 -0
  426. synapse/module_api/callbacks/account_validity_callbacks.py +106 -0
  427. synapse/module_api/callbacks/media_repository_callbacks.py +157 -0
  428. synapse/module_api/callbacks/ratelimit_callbacks.py +78 -0
  429. synapse/module_api/callbacks/spamchecker_callbacks.py +991 -0
  430. synapse/module_api/callbacks/third_party_event_rules_callbacks.py +592 -0
  431. synapse/module_api/errors.py +42 -0
  432. synapse/notifier.py +969 -0
  433. synapse/push/__init__.py +212 -0
  434. synapse/push/bulk_push_rule_evaluator.py +635 -0
  435. synapse/push/clientformat.py +126 -0
  436. synapse/push/emailpusher.py +334 -0
  437. synapse/push/httppusher.py +565 -0
  438. synapse/push/mailer.py +1009 -0
  439. synapse/push/presentable_names.py +216 -0
  440. synapse/push/push_tools.py +114 -0
  441. synapse/push/push_types.py +141 -0
  442. synapse/push/pusher.py +87 -0
  443. synapse/push/pusherpool.py +501 -0
  444. synapse/push/rulekinds.py +33 -0
  445. synapse/py.typed +0 -0
  446. synapse/replication/__init__.py +20 -0
  447. synapse/replication/http/__init__.py +68 -0
  448. synapse/replication/http/_base.py +469 -0
  449. synapse/replication/http/account_data.py +297 -0
  450. synapse/replication/http/deactivate_account.py +81 -0
  451. synapse/replication/http/delayed_events.py +62 -0
  452. synapse/replication/http/devices.py +254 -0
  453. synapse/replication/http/federation.py +334 -0
  454. synapse/replication/http/login.py +106 -0
  455. synapse/replication/http/membership.py +364 -0
  456. synapse/replication/http/presence.py +133 -0
  457. synapse/replication/http/push.py +156 -0
  458. synapse/replication/http/register.py +172 -0
  459. synapse/replication/http/send_events.py +182 -0
  460. synapse/replication/http/state.py +82 -0
  461. synapse/replication/http/streams.py +101 -0
  462. synapse/replication/tcp/__init__.py +56 -0
  463. synapse/replication/tcp/client.py +553 -0
  464. synapse/replication/tcp/commands.py +569 -0
  465. synapse/replication/tcp/context.py +41 -0
  466. synapse/replication/tcp/external_cache.py +156 -0
  467. synapse/replication/tcp/handler.py +922 -0
  468. synapse/replication/tcp/protocol.py +611 -0
  469. synapse/replication/tcp/redis.py +510 -0
  470. synapse/replication/tcp/resource.py +349 -0
  471. synapse/replication/tcp/streams/__init__.py +96 -0
  472. synapse/replication/tcp/streams/_base.py +765 -0
  473. synapse/replication/tcp/streams/events.py +287 -0
  474. synapse/replication/tcp/streams/federation.py +92 -0
  475. synapse/replication/tcp/streams/partial_state.py +80 -0
  476. synapse/res/providers.json +29 -0
  477. synapse/res/templates/_base.html +29 -0
  478. synapse/res/templates/account_previously_renewed.html +6 -0
  479. synapse/res/templates/account_renewed.html +6 -0
  480. synapse/res/templates/add_threepid.html +8 -0
  481. synapse/res/templates/add_threepid.txt +6 -0
  482. synapse/res/templates/add_threepid_failure.html +7 -0
  483. synapse/res/templates/add_threepid_success.html +6 -0
  484. synapse/res/templates/already_in_use.html +12 -0
  485. synapse/res/templates/already_in_use.txt +10 -0
  486. synapse/res/templates/auth_success.html +21 -0
  487. synapse/res/templates/invalid_token.html +6 -0
  488. synapse/res/templates/mail-Element.css +7 -0
  489. synapse/res/templates/mail-Vector.css +7 -0
  490. synapse/res/templates/mail-expiry.css +4 -0
  491. synapse/res/templates/mail.css +156 -0
  492. synapse/res/templates/notice_expiry.html +46 -0
  493. synapse/res/templates/notice_expiry.txt +7 -0
  494. synapse/res/templates/notif.html +51 -0
  495. synapse/res/templates/notif.txt +22 -0
  496. synapse/res/templates/notif_mail.html +59 -0
  497. synapse/res/templates/notif_mail.txt +10 -0
  498. synapse/res/templates/password_reset.html +10 -0
  499. synapse/res/templates/password_reset.txt +7 -0
  500. synapse/res/templates/password_reset_confirmation.html +15 -0
  501. synapse/res/templates/password_reset_failure.html +7 -0
  502. synapse/res/templates/password_reset_success.html +6 -0
  503. synapse/res/templates/recaptcha.html +42 -0
  504. synapse/res/templates/registration.html +12 -0
  505. synapse/res/templates/registration.txt +10 -0
  506. synapse/res/templates/registration_failure.html +6 -0
  507. synapse/res/templates/registration_success.html +6 -0
  508. synapse/res/templates/registration_token.html +18 -0
  509. synapse/res/templates/room.html +33 -0
  510. synapse/res/templates/room.txt +9 -0
  511. synapse/res/templates/sso.css +129 -0
  512. synapse/res/templates/sso_account_deactivated.html +25 -0
  513. synapse/res/templates/sso_auth_account_details.html +186 -0
  514. synapse/res/templates/sso_auth_account_details.js +116 -0
  515. synapse/res/templates/sso_auth_bad_user.html +26 -0
  516. synapse/res/templates/sso_auth_confirm.html +27 -0
  517. synapse/res/templates/sso_auth_success.html +26 -0
  518. synapse/res/templates/sso_error.html +71 -0
  519. synapse/res/templates/sso_footer.html +19 -0
  520. synapse/res/templates/sso_login_idp_picker.html +60 -0
  521. synapse/res/templates/sso_new_user_consent.html +30 -0
  522. synapse/res/templates/sso_partial_profile.html +19 -0
  523. synapse/res/templates/sso_redirect_confirm.html +39 -0
  524. synapse/res/templates/style.css +33 -0
  525. synapse/res/templates/terms.html +27 -0
  526. synapse/rest/__init__.py +197 -0
  527. synapse/rest/admin/__init__.py +395 -0
  528. synapse/rest/admin/_base.py +72 -0
  529. synapse/rest/admin/background_updates.py +171 -0
  530. synapse/rest/admin/devices.py +221 -0
  531. synapse/rest/admin/event_reports.py +173 -0
  532. synapse/rest/admin/events.py +69 -0
  533. synapse/rest/admin/experimental_features.py +137 -0
  534. synapse/rest/admin/federation.py +243 -0
  535. synapse/rest/admin/media.py +540 -0
  536. synapse/rest/admin/registration_tokens.py +358 -0
  537. synapse/rest/admin/rooms.py +1092 -0
  538. synapse/rest/admin/scheduled_tasks.py +70 -0
  539. synapse/rest/admin/server_notice_servlet.py +132 -0
  540. synapse/rest/admin/statistics.py +132 -0
  541. synapse/rest/admin/username_available.py +58 -0
  542. synapse/rest/admin/users.py +1634 -0
  543. synapse/rest/client/__init__.py +20 -0
  544. synapse/rest/client/_base.py +113 -0
  545. synapse/rest/client/account.py +937 -0
  546. synapse/rest/client/account_data.py +319 -0
  547. synapse/rest/client/account_validity.py +103 -0
  548. synapse/rest/client/appservice_ping.py +125 -0
  549. synapse/rest/client/auth.py +218 -0
  550. synapse/rest/client/auth_metadata.py +122 -0
  551. synapse/rest/client/capabilities.py +121 -0
  552. synapse/rest/client/delayed_events.py +165 -0
  553. synapse/rest/client/devices.py +587 -0
  554. synapse/rest/client/directory.py +211 -0
  555. synapse/rest/client/events.py +116 -0
  556. synapse/rest/client/filter.py +112 -0
  557. synapse/rest/client/initial_sync.py +65 -0
  558. synapse/rest/client/keys.py +678 -0
  559. synapse/rest/client/knock.py +104 -0
  560. synapse/rest/client/login.py +750 -0
  561. synapse/rest/client/login_token_request.py +127 -0
  562. synapse/rest/client/logout.py +93 -0
  563. synapse/rest/client/matrixrtc.py +52 -0
  564. synapse/rest/client/media.py +307 -0
  565. synapse/rest/client/mutual_rooms.py +145 -0
  566. synapse/rest/client/notifications.py +137 -0
  567. synapse/rest/client/openid.py +109 -0
  568. synapse/rest/client/password_policy.py +69 -0
  569. synapse/rest/client/presence.py +131 -0
  570. synapse/rest/client/profile.py +291 -0
  571. synapse/rest/client/push_rule.py +331 -0
  572. synapse/rest/client/pusher.py +181 -0
  573. synapse/rest/client/read_marker.py +104 -0
  574. synapse/rest/client/receipts.py +165 -0
  575. synapse/rest/client/register.py +1072 -0
  576. synapse/rest/client/relations.py +138 -0
  577. synapse/rest/client/rendezvous.py +76 -0
  578. synapse/rest/client/reporting.py +207 -0
  579. synapse/rest/client/room.py +1763 -0
  580. synapse/rest/client/room_keys.py +426 -0
  581. synapse/rest/client/room_upgrade_rest_servlet.py +112 -0
  582. synapse/rest/client/sendtodevice.py +85 -0
  583. synapse/rest/client/sync.py +1131 -0
  584. synapse/rest/client/tags.py +129 -0
  585. synapse/rest/client/thirdparty.py +130 -0
  586. synapse/rest/client/thread_subscriptions.py +247 -0
  587. synapse/rest/client/tokenrefresh.py +52 -0
  588. synapse/rest/client/transactions.py +150 -0
  589. synapse/rest/client/user_directory.py +99 -0
  590. synapse/rest/client/versions.py +193 -0
  591. synapse/rest/client/voip.py +88 -0
  592. synapse/rest/consent/__init__.py +0 -0
  593. synapse/rest/consent/consent_resource.py +210 -0
  594. synapse/rest/health.py +38 -0
  595. synapse/rest/key/__init__.py +20 -0
  596. synapse/rest/key/v2/__init__.py +40 -0
  597. synapse/rest/key/v2/local_key_resource.py +125 -0
  598. synapse/rest/key/v2/remote_key_resource.py +302 -0
  599. synapse/rest/media/__init__.py +0 -0
  600. synapse/rest/media/config_resource.py +53 -0
  601. synapse/rest/media/create_resource.py +90 -0
  602. synapse/rest/media/download_resource.py +110 -0
  603. synapse/rest/media/media_repository_resource.py +113 -0
  604. synapse/rest/media/preview_url_resource.py +77 -0
  605. synapse/rest/media/thumbnail_resource.py +142 -0
  606. synapse/rest/media/upload_resource.py +187 -0
  607. synapse/rest/media/v1/__init__.py +39 -0
  608. synapse/rest/media/v1/_base.py +23 -0
  609. synapse/rest/media/v1/media_storage.py +23 -0
  610. synapse/rest/media/v1/storage_provider.py +23 -0
  611. synapse/rest/synapse/__init__.py +20 -0
  612. synapse/rest/synapse/client/__init__.py +93 -0
  613. synapse/rest/synapse/client/federation_whitelist.py +66 -0
  614. synapse/rest/synapse/client/jwks.py +77 -0
  615. synapse/rest/synapse/client/new_user_consent.py +115 -0
  616. synapse/rest/synapse/client/oidc/__init__.py +45 -0
  617. synapse/rest/synapse/client/oidc/backchannel_logout_resource.py +42 -0
  618. synapse/rest/synapse/client/oidc/callback_resource.py +48 -0
  619. synapse/rest/synapse/client/password_reset.py +129 -0
  620. synapse/rest/synapse/client/pick_idp.py +107 -0
  621. synapse/rest/synapse/client/pick_username.py +153 -0
  622. synapse/rest/synapse/client/rendezvous.py +58 -0
  623. synapse/rest/synapse/client/saml2/__init__.py +42 -0
  624. synapse/rest/synapse/client/saml2/metadata_resource.py +46 -0
  625. synapse/rest/synapse/client/saml2/response_resource.py +52 -0
  626. synapse/rest/synapse/client/sso_register.py +56 -0
  627. synapse/rest/synapse/client/unsubscribe.py +88 -0
  628. synapse/rest/synapse/mas/__init__.py +71 -0
  629. synapse/rest/synapse/mas/_base.py +55 -0
  630. synapse/rest/synapse/mas/devices.py +239 -0
  631. synapse/rest/synapse/mas/users.py +469 -0
  632. synapse/rest/well_known.py +148 -0
  633. synapse/server.py +1279 -0
  634. synapse/server_notices/__init__.py +0 -0
  635. synapse/server_notices/consent_server_notices.py +136 -0
  636. synapse/server_notices/resource_limits_server_notices.py +215 -0
  637. synapse/server_notices/server_notices_manager.py +388 -0
  638. synapse/server_notices/server_notices_sender.py +67 -0
  639. synapse/server_notices/worker_server_notices_sender.py +46 -0
  640. synapse/spam_checker_api/__init__.py +31 -0
  641. synapse/state/__init__.py +1023 -0
  642. synapse/state/v1.py +369 -0
  643. synapse/state/v2.py +985 -0
  644. synapse/static/client/login/index.html +47 -0
  645. synapse/static/client/login/js/jquery-3.4.1.min.js +2 -0
  646. synapse/static/client/login/js/login.js +291 -0
  647. synapse/static/client/login/spinner.gif +0 -0
  648. synapse/static/client/login/style.css +79 -0
  649. synapse/static/index.html +63 -0
  650. synapse/storage/__init__.py +43 -0
  651. synapse/storage/_base.py +245 -0
  652. synapse/storage/admin_client_config.py +25 -0
  653. synapse/storage/background_updates.py +1189 -0
  654. synapse/storage/controllers/__init__.py +57 -0
  655. synapse/storage/controllers/persist_events.py +1237 -0
  656. synapse/storage/controllers/purge_events.py +456 -0
  657. synapse/storage/controllers/state.py +950 -0
  658. synapse/storage/controllers/stats.py +119 -0
  659. synapse/storage/database.py +2720 -0
  660. synapse/storage/databases/__init__.py +175 -0
  661. synapse/storage/databases/main/__init__.py +420 -0
  662. synapse/storage/databases/main/account_data.py +1073 -0
  663. synapse/storage/databases/main/appservice.py +473 -0
  664. synapse/storage/databases/main/cache.py +912 -0
  665. synapse/storage/databases/main/censor_events.py +226 -0
  666. synapse/storage/databases/main/client_ips.py +816 -0
  667. synapse/storage/databases/main/delayed_events.py +577 -0
  668. synapse/storage/databases/main/deviceinbox.py +1272 -0
  669. synapse/storage/databases/main/devices.py +2579 -0
  670. synapse/storage/databases/main/directory.py +212 -0
  671. synapse/storage/databases/main/e2e_room_keys.py +689 -0
  672. synapse/storage/databases/main/end_to_end_keys.py +1894 -0
  673. synapse/storage/databases/main/event_federation.py +2511 -0
  674. synapse/storage/databases/main/event_push_actions.py +1936 -0
  675. synapse/storage/databases/main/events.py +3765 -0
  676. synapse/storage/databases/main/events_bg_updates.py +2910 -0
  677. synapse/storage/databases/main/events_forward_extremities.py +126 -0
  678. synapse/storage/databases/main/events_worker.py +2787 -0
  679. synapse/storage/databases/main/experimental_features.py +130 -0
  680. synapse/storage/databases/main/filtering.py +231 -0
  681. synapse/storage/databases/main/keys.py +291 -0
  682. synapse/storage/databases/main/lock.py +554 -0
  683. synapse/storage/databases/main/media_repository.py +1068 -0
  684. synapse/storage/databases/main/metrics.py +461 -0
  685. synapse/storage/databases/main/monthly_active_users.py +443 -0
  686. synapse/storage/databases/main/openid.py +60 -0
  687. synapse/storage/databases/main/presence.py +509 -0
  688. synapse/storage/databases/main/profile.py +539 -0
  689. synapse/storage/databases/main/purge_events.py +521 -0
  690. synapse/storage/databases/main/push_rule.py +970 -0
  691. synapse/storage/databases/main/pusher.py +793 -0
  692. synapse/storage/databases/main/receipts.py +1341 -0
  693. synapse/storage/databases/main/registration.py +3071 -0
  694. synapse/storage/databases/main/rejections.py +37 -0
  695. synapse/storage/databases/main/relations.py +1116 -0
  696. synapse/storage/databases/main/room.py +2779 -0
  697. synapse/storage/databases/main/roommember.py +2132 -0
  698. synapse/storage/databases/main/search.py +939 -0
  699. synapse/storage/databases/main/session.py +152 -0
  700. synapse/storage/databases/main/signatures.py +94 -0
  701. synapse/storage/databases/main/sliding_sync.py +842 -0
  702. synapse/storage/databases/main/state.py +1002 -0
  703. synapse/storage/databases/main/state_deltas.py +360 -0
  704. synapse/storage/databases/main/stats.py +789 -0
  705. synapse/storage/databases/main/stream.py +2589 -0
  706. synapse/storage/databases/main/tags.py +360 -0
  707. synapse/storage/databases/main/task_scheduler.py +225 -0
  708. synapse/storage/databases/main/thread_subscriptions.py +589 -0
  709. synapse/storage/databases/main/transactions.py +676 -0
  710. synapse/storage/databases/main/ui_auth.py +420 -0
  711. synapse/storage/databases/main/user_directory.py +1330 -0
  712. synapse/storage/databases/main/user_erasure_store.py +117 -0
  713. synapse/storage/databases/state/__init__.py +22 -0
  714. synapse/storage/databases/state/bg_updates.py +497 -0
  715. synapse/storage/databases/state/deletion.py +557 -0
  716. synapse/storage/databases/state/store.py +948 -0
  717. synapse/storage/engines/__init__.py +70 -0
  718. synapse/storage/engines/_base.py +154 -0
  719. synapse/storage/engines/postgres.py +261 -0
  720. synapse/storage/engines/sqlite.py +199 -0
  721. synapse/storage/invite_rule.py +152 -0
  722. synapse/storage/keys.py +40 -0
  723. synapse/storage/prepare_database.py +730 -0
  724. synapse/storage/push_rule.py +28 -0
  725. synapse/storage/roommember.py +88 -0
  726. synapse/storage/schema/README.md +4 -0
  727. synapse/storage/schema/__init__.py +186 -0
  728. synapse/storage/schema/common/delta/25/00background_updates.sql +40 -0
  729. synapse/storage/schema/common/delta/35/00background_updates_add_col.sql +36 -0
  730. synapse/storage/schema/common/delta/58/00background_update_ordering.sql +38 -0
  731. synapse/storage/schema/common/full_schemas/72/full.sql.postgres +8 -0
  732. synapse/storage/schema/common/full_schemas/72/full.sql.sqlite +6 -0
  733. synapse/storage/schema/common/schema_version.sql +60 -0
  734. synapse/storage/schema/main/delta/12/v12.sql +82 -0
  735. synapse/storage/schema/main/delta/13/v13.sql +38 -0
  736. synapse/storage/schema/main/delta/14/v14.sql +42 -0
  737. synapse/storage/schema/main/delta/15/appservice_txns.sql +50 -0
  738. synapse/storage/schema/main/delta/15/presence_indices.sql +2 -0
  739. synapse/storage/schema/main/delta/15/v15.sql +24 -0
  740. synapse/storage/schema/main/delta/16/events_order_index.sql +4 -0
  741. synapse/storage/schema/main/delta/16/remote_media_cache_index.sql +2 -0
  742. synapse/storage/schema/main/delta/16/remove_duplicates.sql +9 -0
  743. synapse/storage/schema/main/delta/16/room_alias_index.sql +3 -0
  744. synapse/storage/schema/main/delta/16/unique_constraints.sql +72 -0
  745. synapse/storage/schema/main/delta/16/users.sql +56 -0
  746. synapse/storage/schema/main/delta/17/drop_indexes.sql +37 -0
  747. synapse/storage/schema/main/delta/17/server_keys.sql +43 -0
  748. synapse/storage/schema/main/delta/17/user_threepids.sql +9 -0
  749. synapse/storage/schema/main/delta/18/server_keys_bigger_ints.sql +51 -0
  750. synapse/storage/schema/main/delta/19/event_index.sql +38 -0
  751. synapse/storage/schema/main/delta/20/dummy.sql +1 -0
  752. synapse/storage/schema/main/delta/20/pushers.py +93 -0
  753. synapse/storage/schema/main/delta/21/end_to_end_keys.sql +53 -0
  754. synapse/storage/schema/main/delta/21/receipts.sql +57 -0
  755. synapse/storage/schema/main/delta/22/receipts_index.sql +41 -0
  756. synapse/storage/schema/main/delta/22/user_threepids_unique.sql +19 -0
  757. synapse/storage/schema/main/delta/24/stats_reporting.sql +37 -0
  758. synapse/storage/schema/main/delta/25/fts.py +81 -0
  759. synapse/storage/schema/main/delta/25/guest_access.sql +44 -0
  760. synapse/storage/schema/main/delta/25/history_visibility.sql +44 -0
  761. synapse/storage/schema/main/delta/25/tags.sql +57 -0
  762. synapse/storage/schema/main/delta/26/account_data.sql +36 -0
  763. synapse/storage/schema/main/delta/27/account_data.sql +55 -0
  764. synapse/storage/schema/main/delta/27/forgotten_memberships.sql +45 -0
  765. synapse/storage/schema/main/delta/27/ts.py +61 -0
  766. synapse/storage/schema/main/delta/28/event_push_actions.sql +46 -0
  767. synapse/storage/schema/main/delta/28/events_room_stream.sql +39 -0
  768. synapse/storage/schema/main/delta/28/public_roms_index.sql +39 -0
  769. synapse/storage/schema/main/delta/28/receipts_user_id_index.sql +41 -0
  770. synapse/storage/schema/main/delta/28/upgrade_times.sql +40 -0
  771. synapse/storage/schema/main/delta/28/users_is_guest.sql +41 -0
  772. synapse/storage/schema/main/delta/29/push_actions.sql +54 -0
  773. synapse/storage/schema/main/delta/30/alias_creator.sql +35 -0
  774. synapse/storage/schema/main/delta/30/as_users.py +82 -0
  775. synapse/storage/schema/main/delta/30/deleted_pushers.sql +44 -0
  776. synapse/storage/schema/main/delta/30/presence_stream.sql +49 -0
  777. synapse/storage/schema/main/delta/30/public_rooms.sql +42 -0
  778. synapse/storage/schema/main/delta/30/push_rule_stream.sql +57 -0
  779. synapse/storage/schema/main/delta/30/threepid_guest_access_tokens.sql +43 -0
  780. synapse/storage/schema/main/delta/31/invites.sql +61 -0
  781. synapse/storage/schema/main/delta/31/local_media_repository_url_cache.sql +46 -0
  782. synapse/storage/schema/main/delta/31/pushers_0.py +92 -0
  783. synapse/storage/schema/main/delta/31/pushers_index.sql +41 -0
  784. synapse/storage/schema/main/delta/31/search_update.py +65 -0
  785. synapse/storage/schema/main/delta/32/events.sql +35 -0
  786. synapse/storage/schema/main/delta/32/openid.sql +9 -0
  787. synapse/storage/schema/main/delta/32/pusher_throttle.sql +42 -0
  788. synapse/storage/schema/main/delta/32/remove_indices.sql +52 -0
  789. synapse/storage/schema/main/delta/32/reports.sql +44 -0
  790. synapse/storage/schema/main/delta/33/access_tokens_device_index.sql +36 -0
  791. synapse/storage/schema/main/delta/33/devices.sql +40 -0
  792. synapse/storage/schema/main/delta/33/devices_for_e2e_keys.sql +38 -0
  793. synapse/storage/schema/main/delta/33/devices_for_e2e_keys_clear_unknown_device.sql +39 -0
  794. synapse/storage/schema/main/delta/33/event_fields.py +61 -0
  795. synapse/storage/schema/main/delta/33/remote_media_ts.py +43 -0
  796. synapse/storage/schema/main/delta/33/user_ips_index.sql +36 -0
  797. synapse/storage/schema/main/delta/34/appservice_stream.sql +42 -0
  798. synapse/storage/schema/main/delta/34/cache_stream.py +50 -0
  799. synapse/storage/schema/main/delta/34/device_inbox.sql +43 -0
  800. synapse/storage/schema/main/delta/34/push_display_name_rename.sql +39 -0
  801. synapse/storage/schema/main/delta/34/received_txn_purge.py +36 -0
  802. synapse/storage/schema/main/delta/35/contains_url.sql +36 -0
  803. synapse/storage/schema/main/delta/35/device_outbox.sql +58 -0
  804. synapse/storage/schema/main/delta/35/device_stream_id.sql +40 -0
  805. synapse/storage/schema/main/delta/35/event_push_actions_index.sql +36 -0
  806. synapse/storage/schema/main/delta/35/public_room_list_change_stream.sql +52 -0
  807. synapse/storage/schema/main/delta/35/stream_order_to_extrem.sql +56 -0
  808. synapse/storage/schema/main/delta/36/readd_public_rooms.sql +45 -0
  809. synapse/storage/schema/main/delta/37/remove_auth_idx.py +89 -0
  810. synapse/storage/schema/main/delta/37/user_threepids.sql +71 -0
  811. synapse/storage/schema/main/delta/38/postgres_fts_gist.sql +38 -0
  812. synapse/storage/schema/main/delta/39/appservice_room_list.sql +48 -0
  813. synapse/storage/schema/main/delta/39/device_federation_stream_idx.sql +35 -0
  814. synapse/storage/schema/main/delta/39/event_push_index.sql +36 -0
  815. synapse/storage/schema/main/delta/39/federation_out_position.sql +41 -0
  816. synapse/storage/schema/main/delta/39/membership_profile.sql +39 -0
  817. synapse/storage/schema/main/delta/40/current_state_idx.sql +36 -0
  818. synapse/storage/schema/main/delta/40/device_inbox.sql +40 -0
  819. synapse/storage/schema/main/delta/40/device_list_streams.sql +79 -0
  820. synapse/storage/schema/main/delta/40/event_push_summary.sql +57 -0
  821. synapse/storage/schema/main/delta/40/pushers.sql +58 -0
  822. synapse/storage/schema/main/delta/41/device_list_stream_idx.sql +36 -0
  823. synapse/storage/schema/main/delta/41/device_outbound_index.sql +35 -0
  824. synapse/storage/schema/main/delta/41/event_search_event_id_idx.sql +36 -0
  825. synapse/storage/schema/main/delta/41/ratelimit.sql +41 -0
  826. synapse/storage/schema/main/delta/42/current_state_delta.sql +48 -0
  827. synapse/storage/schema/main/delta/42/device_list_last_id.sql +52 -0
  828. synapse/storage/schema/main/delta/42/event_auth_state_only.sql +36 -0
  829. synapse/storage/schema/main/delta/42/user_dir.py +88 -0
  830. synapse/storage/schema/main/delta/43/blocked_rooms.sql +40 -0
  831. synapse/storage/schema/main/delta/43/quarantine_media.sql +36 -0
  832. synapse/storage/schema/main/delta/43/url_cache.sql +35 -0
  833. synapse/storage/schema/main/delta/43/user_share.sql +52 -0
  834. synapse/storage/schema/main/delta/44/expire_url_cache.sql +60 -0
  835. synapse/storage/schema/main/delta/45/group_server.sql +186 -0
  836. synapse/storage/schema/main/delta/45/profile_cache.sql +47 -0
  837. synapse/storage/schema/main/delta/46/drop_refresh_tokens.sql +36 -0
  838. synapse/storage/schema/main/delta/46/drop_unique_deleted_pushers.sql +54 -0
  839. synapse/storage/schema/main/delta/46/group_server.sql +51 -0
  840. synapse/storage/schema/main/delta/46/local_media_repository_url_idx.sql +43 -0
  841. synapse/storage/schema/main/delta/46/user_dir_null_room_ids.sql +54 -0
  842. synapse/storage/schema/main/delta/46/user_dir_typos.sql +43 -0
  843. synapse/storage/schema/main/delta/47/last_access_media.sql +35 -0
  844. synapse/storage/schema/main/delta/47/postgres_fts_gin.sql +36 -0
  845. synapse/storage/schema/main/delta/47/push_actions_staging.sql +47 -0
  846. synapse/storage/schema/main/delta/48/add_user_consent.sql +37 -0
  847. synapse/storage/schema/main/delta/48/add_user_ips_last_seen_index.sql +36 -0
  848. synapse/storage/schema/main/delta/48/deactivated_users.sql +44 -0
  849. synapse/storage/schema/main/delta/48/group_unique_indexes.py +67 -0
  850. synapse/storage/schema/main/delta/48/groups_joinable.sql +41 -0
  851. synapse/storage/schema/main/delta/49/add_user_consent_server_notice_sent.sql +39 -0
  852. synapse/storage/schema/main/delta/49/add_user_daily_visits.sql +40 -0
  853. synapse/storage/schema/main/delta/49/add_user_ips_last_seen_only_index.sql +36 -0
  854. synapse/storage/schema/main/delta/50/add_creation_ts_users_index.sql +38 -0
  855. synapse/storage/schema/main/delta/50/erasure_store.sql +40 -0
  856. synapse/storage/schema/main/delta/50/make_event_content_nullable.py +102 -0
  857. synapse/storage/schema/main/delta/51/e2e_room_keys.sql +58 -0
  858. synapse/storage/schema/main/delta/51/monthly_active_users.sql +46 -0
  859. synapse/storage/schema/main/delta/52/add_event_to_state_group_index.sql +38 -0
  860. synapse/storage/schema/main/delta/52/device_list_streams_unique_idx.sql +55 -0
  861. synapse/storage/schema/main/delta/52/e2e_room_keys.sql +72 -0
  862. synapse/storage/schema/main/delta/53/add_user_type_to_users.sql +38 -0
  863. synapse/storage/schema/main/delta/53/drop_sent_transactions.sql +35 -0
  864. synapse/storage/schema/main/delta/53/event_format_version.sql +35 -0
  865. synapse/storage/schema/main/delta/53/user_dir_populate.sql +49 -0
  866. synapse/storage/schema/main/delta/53/user_ips_index.sql +49 -0
  867. synapse/storage/schema/main/delta/53/user_share.sql +63 -0
  868. synapse/storage/schema/main/delta/53/user_threepid_id.sql +48 -0
  869. synapse/storage/schema/main/delta/53/users_in_public_rooms.sql +47 -0
  870. synapse/storage/schema/main/delta/54/account_validity_with_renewal.sql +49 -0
  871. synapse/storage/schema/main/delta/54/add_validity_to_server_keys.sql +42 -0
  872. synapse/storage/schema/main/delta/54/delete_forward_extremities.sql +42 -0
  873. synapse/storage/schema/main/delta/54/drop_legacy_tables.sql +49 -0
  874. synapse/storage/schema/main/delta/54/drop_presence_list.sql +35 -0
  875. synapse/storage/schema/main/delta/54/relations.sql +46 -0
  876. synapse/storage/schema/main/delta/54/stats.sql +99 -0
  877. synapse/storage/schema/main/delta/54/stats2.sql +47 -0
  878. synapse/storage/schema/main/delta/55/access_token_expiry.sql +37 -0
  879. synapse/storage/schema/main/delta/55/track_threepid_validations.sql +50 -0
  880. synapse/storage/schema/main/delta/55/users_alter_deactivated.sql +38 -0
  881. synapse/storage/schema/main/delta/56/add_spans_to_device_lists.sql +39 -0
  882. synapse/storage/schema/main/delta/56/current_state_events_membership.sql +41 -0
  883. synapse/storage/schema/main/delta/56/current_state_events_membership_mk2.sql +43 -0
  884. synapse/storage/schema/main/delta/56/delete_keys_from_deleted_backups.sql +44 -0
  885. synapse/storage/schema/main/delta/56/destinations_failure_ts.sql +44 -0
  886. synapse/storage/schema/main/delta/56/destinations_retry_interval_type.sql.postgres +18 -0
  887. synapse/storage/schema/main/delta/56/device_stream_id_insert.sql +39 -0
  888. synapse/storage/schema/main/delta/56/devices_last_seen.sql +43 -0
  889. synapse/storage/schema/main/delta/56/drop_unused_event_tables.sql +39 -0
  890. synapse/storage/schema/main/delta/56/event_expiry.sql +40 -0
  891. synapse/storage/schema/main/delta/56/event_labels.sql +49 -0
  892. synapse/storage/schema/main/delta/56/event_labels_background_update.sql +36 -0
  893. synapse/storage/schema/main/delta/56/fix_room_keys_index.sql +37 -0
  894. synapse/storage/schema/main/delta/56/hidden_devices.sql +37 -0
  895. synapse/storage/schema/main/delta/56/hidden_devices_fix.sql.sqlite +42 -0
  896. synapse/storage/schema/main/delta/56/nuke_empty_communities_from_db.sql +48 -0
  897. synapse/storage/schema/main/delta/56/public_room_list_idx.sql +35 -0
  898. synapse/storage/schema/main/delta/56/redaction_censor.sql +35 -0
  899. synapse/storage/schema/main/delta/56/redaction_censor2.sql +41 -0
  900. synapse/storage/schema/main/delta/56/redaction_censor3_fix_update.sql.postgres +25 -0
  901. synapse/storage/schema/main/delta/56/redaction_censor4.sql +35 -0
  902. synapse/storage/schema/main/delta/56/remove_tombstoned_rooms_from_directory.sql +38 -0
  903. synapse/storage/schema/main/delta/56/room_key_etag.sql +36 -0
  904. synapse/storage/schema/main/delta/56/room_membership_idx.sql +37 -0
  905. synapse/storage/schema/main/delta/56/room_retention.sql +52 -0
  906. synapse/storage/schema/main/delta/56/signing_keys.sql +75 -0
  907. synapse/storage/schema/main/delta/56/signing_keys_nonunique_signatures.sql +41 -0
  908. synapse/storage/schema/main/delta/56/stats_separated.sql +175 -0
  909. synapse/storage/schema/main/delta/56/unique_user_filter_index.py +46 -0
  910. synapse/storage/schema/main/delta/56/user_external_ids.sql +43 -0
  911. synapse/storage/schema/main/delta/56/users_in_public_rooms_idx.sql +36 -0
  912. synapse/storage/schema/main/delta/57/delete_old_current_state_events.sql +41 -0
  913. synapse/storage/schema/main/delta/57/device_list_remote_cache_stale.sql +44 -0
  914. synapse/storage/schema/main/delta/57/local_current_membership.py +111 -0
  915. synapse/storage/schema/main/delta/57/remove_sent_outbound_pokes.sql +40 -0
  916. synapse/storage/schema/main/delta/57/rooms_version_column.sql +43 -0
  917. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.postgres +35 -0
  918. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.sqlite +22 -0
  919. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.postgres +39 -0
  920. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.sqlite +23 -0
  921. synapse/storage/schema/main/delta/58/02remove_dup_outbound_pokes.sql +41 -0
  922. synapse/storage/schema/main/delta/58/03persist_ui_auth.sql +55 -0
  923. synapse/storage/schema/main/delta/58/05cache_instance.sql.postgres +30 -0
  924. synapse/storage/schema/main/delta/58/06dlols_unique_idx.py +83 -0
  925. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.postgres +33 -0
  926. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.sqlite +44 -0
  927. synapse/storage/schema/main/delta/58/07persist_ui_auth_ips.sql +44 -0
  928. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.postgres +18 -0
  929. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.sqlite +18 -0
  930. synapse/storage/schema/main/delta/58/09shadow_ban.sql +37 -0
  931. synapse/storage/schema/main/delta/58/10_pushrules_enabled_delete_obsolete.sql +47 -0
  932. synapse/storage/schema/main/delta/58/10drop_local_rejections_stream.sql +41 -0
  933. synapse/storage/schema/main/delta/58/10federation_pos_instance_name.sql +41 -0
  934. synapse/storage/schema/main/delta/58/11dehydration.sql +39 -0
  935. synapse/storage/schema/main/delta/58/11fallback.sql +43 -0
  936. synapse/storage/schema/main/delta/58/11user_id_seq.py +38 -0
  937. synapse/storage/schema/main/delta/58/12room_stats.sql +51 -0
  938. synapse/storage/schema/main/delta/58/13remove_presence_allow_inbound.sql +36 -0
  939. synapse/storage/schema/main/delta/58/14events_instance_name.sql +35 -0
  940. synapse/storage/schema/main/delta/58/14events_instance_name.sql.postgres +28 -0
  941. synapse/storage/schema/main/delta/58/15_catchup_destination_rooms.sql +61 -0
  942. synapse/storage/schema/main/delta/58/15unread_count.sql +45 -0
  943. synapse/storage/schema/main/delta/58/16populate_stats_process_rooms_fix.sql +41 -0
  944. synapse/storage/schema/main/delta/58/17_catchup_last_successful.sql +40 -0
  945. synapse/storage/schema/main/delta/58/18stream_positions.sql +41 -0
  946. synapse/storage/schema/main/delta/58/19instance_map.sql.postgres +25 -0
  947. synapse/storage/schema/main/delta/58/19txn_id.sql +59 -0
  948. synapse/storage/schema/main/delta/58/20instance_name_event_tables.sql +36 -0
  949. synapse/storage/schema/main/delta/58/20user_daily_visits.sql +37 -0
  950. synapse/storage/schema/main/delta/58/21as_device_stream.sql +36 -0
  951. synapse/storage/schema/main/delta/58/21drop_device_max_stream_id.sql +1 -0
  952. synapse/storage/schema/main/delta/58/22puppet_token.sql +36 -0
  953. synapse/storage/schema/main/delta/58/22users_have_local_media.sql +2 -0
  954. synapse/storage/schema/main/delta/58/23e2e_cross_signing_keys_idx.sql +36 -0
  955. synapse/storage/schema/main/delta/58/24drop_event_json_index.sql +38 -0
  956. synapse/storage/schema/main/delta/58/25user_external_ids_user_id_idx.sql +36 -0
  957. synapse/storage/schema/main/delta/58/26access_token_last_validated.sql +37 -0
  958. synapse/storage/schema/main/delta/58/27local_invites.sql +37 -0
  959. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.postgres +16 -0
  960. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.sqlite +62 -0
  961. synapse/storage/schema/main/delta/59/01ignored_user.py +85 -0
  962. synapse/storage/schema/main/delta/59/02shard_send_to_device.sql +37 -0
  963. synapse/storage/schema/main/delta/59/03shard_send_to_device_sequence.sql.postgres +25 -0
  964. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql +71 -0
  965. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql.postgres +16 -0
  966. synapse/storage/schema/main/delta/59/04drop_account_data.sql +36 -0
  967. synapse/storage/schema/main/delta/59/05cache_invalidation.sql +36 -0
  968. synapse/storage/schema/main/delta/59/06chain_cover_index.sql +36 -0
  969. synapse/storage/schema/main/delta/59/06shard_account_data.sql +39 -0
  970. synapse/storage/schema/main/delta/59/06shard_account_data.sql.postgres +32 -0
  971. synapse/storage/schema/main/delta/59/07shard_account_data_fix.sql +37 -0
  972. synapse/storage/schema/main/delta/59/08delete_pushers_for_deactivated_accounts.sql +39 -0
  973. synapse/storage/schema/main/delta/59/08delete_stale_pushers.sql +39 -0
  974. synapse/storage/schema/main/delta/59/09rejected_events_metadata.sql +45 -0
  975. synapse/storage/schema/main/delta/59/10delete_purged_chain_cover.sql +36 -0
  976. synapse/storage/schema/main/delta/59/11add_knock_members_to_stats.sql +39 -0
  977. synapse/storage/schema/main/delta/59/11drop_thumbnail_constraint.sql.postgres +22 -0
  978. synapse/storage/schema/main/delta/59/12account_validity_token_used_ts_ms.sql +37 -0
  979. synapse/storage/schema/main/delta/59/12presence_stream_instance.sql +37 -0
  980. synapse/storage/schema/main/delta/59/12presence_stream_instance_seq.sql.postgres +20 -0
  981. synapse/storage/schema/main/delta/59/13users_to_send_full_presence_to.sql +53 -0
  982. synapse/storage/schema/main/delta/59/14refresh_tokens.sql +53 -0
  983. synapse/storage/schema/main/delta/59/15locks.sql +56 -0
  984. synapse/storage/schema/main/delta/59/16federation_inbound_staging.sql +51 -0
  985. synapse/storage/schema/main/delta/60/01recreate_stream_ordering.sql.postgres +45 -0
  986. synapse/storage/schema/main/delta/60/02change_stream_ordering_columns.sql.postgres +30 -0
  987. synapse/storage/schema/main/delta/61/01change_appservices_txns.sql.postgres +23 -0
  988. synapse/storage/schema/main/delta/61/01insertion_event_lookups.sql +68 -0
  989. synapse/storage/schema/main/delta/61/02drop_redundant_room_depth_index.sql +37 -0
  990. synapse/storage/schema/main/delta/61/03recreate_min_depth.py +74 -0
  991. synapse/storage/schema/main/delta/62/01insertion_event_extremities.sql +43 -0
  992. synapse/storage/schema/main/delta/63/01create_registration_tokens.sql +42 -0
  993. synapse/storage/schema/main/delta/63/02delete_unlinked_email_pushers.sql +39 -0
  994. synapse/storage/schema/main/delta/63/02populate-rooms-creator.sql +36 -0
  995. synapse/storage/schema/main/delta/63/03session_store.sql +42 -0
  996. synapse/storage/schema/main/delta/63/04add_presence_stream_not_offline_index.sql +37 -0
  997. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.postgres +23 -0
  998. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.sqlite +37 -0
  999. synapse/storage/schema/main/delta/65/01msc2716_insertion_event_edges.sql +38 -0
  1000. synapse/storage/schema/main/delta/65/03remove_hidden_devices_from_device_inbox.sql +41 -0
  1001. synapse/storage/schema/main/delta/65/04_local_group_updates.sql +37 -0
  1002. synapse/storage/schema/main/delta/65/05_remove_room_stats_historical_and_user_stats_historical.sql +38 -0
  1003. synapse/storage/schema/main/delta/65/06remove_deleted_devices_from_device_inbox.sql +53 -0
  1004. synapse/storage/schema/main/delta/65/07_arbitrary_relations.sql +37 -0
  1005. synapse/storage/schema/main/delta/65/08_device_inbox_background_updates.sql +37 -0
  1006. synapse/storage/schema/main/delta/65/10_expirable_refresh_tokens.sql +47 -0
  1007. synapse/storage/schema/main/delta/65/11_devices_auth_provider_session.sql +46 -0
  1008. synapse/storage/schema/main/delta/67/01drop_public_room_list_stream.sql +37 -0
  1009. synapse/storage/schema/main/delta/68/01event_columns.sql +45 -0
  1010. synapse/storage/schema/main/delta/68/02_msc2409_add_device_id_appservice_stream_type.sql +40 -0
  1011. synapse/storage/schema/main/delta/68/03_delete_account_data_for_deactivated_accounts.sql +39 -0
  1012. synapse/storage/schema/main/delta/68/04_refresh_tokens_index_next_token_id.sql +47 -0
  1013. synapse/storage/schema/main/delta/68/04partial_state_rooms.sql +60 -0
  1014. synapse/storage/schema/main/delta/68/05_delete_non_strings_from_event_search.sql.sqlite +22 -0
  1015. synapse/storage/schema/main/delta/68/05partial_state_rooms_triggers.py +80 -0
  1016. synapse/storage/schema/main/delta/68/06_msc3202_add_device_list_appservice_stream_type.sql +42 -0
  1017. synapse/storage/schema/main/delta/69/01as_txn_seq.py +54 -0
  1018. synapse/storage/schema/main/delta/69/01device_list_oubound_by_room.sql +57 -0
  1019. synapse/storage/schema/main/delta/69/02cache_invalidation_index.sql +37 -0
  1020. synapse/storage/schema/main/delta/70/01clean_table_purged_rooms.sql +39 -0
  1021. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.postgres +43 -0
  1022. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.sqlite +47 -0
  1023. synapse/storage/schema/main/delta/71/01remove_noop_background_updates.sql +80 -0
  1024. synapse/storage/schema/main/delta/71/02event_push_summary_unique.sql +37 -0
  1025. synapse/storage/schema/main/delta/72/01add_room_type_to_state_stats.sql +38 -0
  1026. synapse/storage/schema/main/delta/72/01event_push_summary_receipt.sql +54 -0
  1027. synapse/storage/schema/main/delta/72/02event_push_actions_index.sql +38 -0
  1028. synapse/storage/schema/main/delta/72/03bg_populate_events_columns.py +57 -0
  1029. synapse/storage/schema/main/delta/72/03drop_event_reference_hashes.sql +36 -0
  1030. synapse/storage/schema/main/delta/72/03remove_groups.sql +50 -0
  1031. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.postgres +17 -0
  1032. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.sqlite +40 -0
  1033. synapse/storage/schema/main/delta/72/05receipts_event_stream_ordering.sql +38 -0
  1034. synapse/storage/schema/main/delta/72/05remove_unstable_private_read_receipts.sql +38 -0
  1035. synapse/storage/schema/main/delta/72/06add_consent_ts_to_users.sql +35 -0
  1036. synapse/storage/schema/main/delta/72/06thread_notifications.sql +49 -0
  1037. synapse/storage/schema/main/delta/72/07force_update_current_state_events_membership.py +67 -0
  1038. synapse/storage/schema/main/delta/72/07thread_receipts.sql.postgres +30 -0
  1039. synapse/storage/schema/main/delta/72/07thread_receipts.sql.sqlite +70 -0
  1040. synapse/storage/schema/main/delta/72/08begin_cache_invalidation_seq_at_2.sql.postgres +23 -0
  1041. synapse/storage/schema/main/delta/72/08thread_receipts.sql +39 -0
  1042. synapse/storage/schema/main/delta/72/09partial_indices.sql.sqlite +56 -0
  1043. synapse/storage/schema/main/delta/73/01event_failed_pull_attempts.sql +48 -0
  1044. synapse/storage/schema/main/delta/73/02add_pusher_enabled.sql +35 -0
  1045. synapse/storage/schema/main/delta/73/02room_id_indexes_for_purging.sql +41 -0
  1046. synapse/storage/schema/main/delta/73/03pusher_device_id.sql +39 -0
  1047. synapse/storage/schema/main/delta/73/03users_approved_column.sql +39 -0
  1048. synapse/storage/schema/main/delta/73/04partial_join_details.sql +42 -0
  1049. synapse/storage/schema/main/delta/73/04pending_device_list_updates.sql +47 -0
  1050. synapse/storage/schema/main/delta/73/05old_push_actions.sql.postgres +22 -0
  1051. synapse/storage/schema/main/delta/73/05old_push_actions.sql.sqlite +24 -0
  1052. synapse/storage/schema/main/delta/73/06thread_notifications_thread_id_idx.sql +42 -0
  1053. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.postgres +23 -0
  1054. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.sqlite +76 -0
  1055. synapse/storage/schema/main/delta/73/09partial_joined_via_destination.sql +37 -0
  1056. synapse/storage/schema/main/delta/73/09threads_table.sql +49 -0
  1057. synapse/storage/schema/main/delta/73/10_update_sqlite_fts4_tokenizer.py +71 -0
  1058. synapse/storage/schema/main/delta/73/10login_tokens.sql +54 -0
  1059. synapse/storage/schema/main/delta/73/11event_search_room_id_n_distinct.sql.postgres +33 -0
  1060. synapse/storage/schema/main/delta/73/12refactor_device_list_outbound_pokes.sql +72 -0
  1061. synapse/storage/schema/main/delta/73/13add_device_lists_index.sql +39 -0
  1062. synapse/storage/schema/main/delta/73/20_un_partial_stated_room_stream.sql +51 -0
  1063. synapse/storage/schema/main/delta/73/21_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  1064. synapse/storage/schema/main/delta/73/22_rebuild_user_dir_stats.sql +48 -0
  1065. synapse/storage/schema/main/delta/73/22_un_partial_stated_event_stream.sql +53 -0
  1066. synapse/storage/schema/main/delta/73/23_fix_thread_index.sql +52 -0
  1067. synapse/storage/schema/main/delta/73/23_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  1068. synapse/storage/schema/main/delta/73/24_events_jump_to_date_index.sql +36 -0
  1069. synapse/storage/schema/main/delta/73/25drop_presence.sql +36 -0
  1070. synapse/storage/schema/main/delta/74/01_user_directory_stale_remote_users.sql +58 -0
  1071. synapse/storage/schema/main/delta/74/02_set_device_id_for_pushers_bg_update.sql +38 -0
  1072. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.postgres +29 -0
  1073. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.sqlite +23 -0
  1074. synapse/storage/schema/main/delta/74/03_room_membership_index.sql +38 -0
  1075. synapse/storage/schema/main/delta/74/04_delete_e2e_backup_keys_for_deactivated_users.sql +36 -0
  1076. synapse/storage/schema/main/delta/74/04_membership_tables_event_stream_ordering_triggers.py +87 -0
  1077. synapse/storage/schema/main/delta/74/05_events_txn_id_device_id.sql +72 -0
  1078. synapse/storage/schema/main/delta/74/90COMMENTS_destinations.sql.postgres +52 -0
  1079. synapse/storage/schema/main/delta/76/01_add_profiles_full_user_id_column.sql +39 -0
  1080. synapse/storage/schema/main/delta/76/02_add_user_filters_full_user_id_column.sql +39 -0
  1081. synapse/storage/schema/main/delta/76/03_per_user_experimental_features.sql +46 -0
  1082. synapse/storage/schema/main/delta/76/04_add_room_forgetter.sql +43 -0
  1083. synapse/storage/schema/main/delta/77/01_add_profiles_not_valid_check.sql.postgres +16 -0
  1084. synapse/storage/schema/main/delta/77/02_add_user_filters_not_valid_check.sql.postgres +16 -0
  1085. synapse/storage/schema/main/delta/77/03bg_populate_full_user_id_profiles.sql +35 -0
  1086. synapse/storage/schema/main/delta/77/04bg_populate_full_user_id_user_filters.sql +35 -0
  1087. synapse/storage/schema/main/delta/77/05thread_notifications_backfill.sql +67 -0
  1088. synapse/storage/schema/main/delta/77/06thread_notifications_not_null.sql.sqlite +102 -0
  1089. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions.sql.postgres +27 -0
  1090. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions_staging.sql.postgres +27 -0
  1091. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_summary.sql.postgres +29 -0
  1092. synapse/storage/schema/main/delta/77/14bg_indices_event_stream_ordering.sql +39 -0
  1093. synapse/storage/schema/main/delta/78/01_validate_and_update_profiles.py +99 -0
  1094. synapse/storage/schema/main/delta/78/02_validate_and_update_user_filters.py +100 -0
  1095. synapse/storage/schema/main/delta/78/03_remove_unused_indexes_user_filters.py +72 -0
  1096. synapse/storage/schema/main/delta/78/03event_extremities_constraints.py +65 -0
  1097. synapse/storage/schema/main/delta/78/04_add_full_user_id_index_user_filters.py +32 -0
  1098. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.postgres +102 -0
  1099. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.sqlite +72 -0
  1100. synapse/storage/schema/main/delta/79/04_mitigate_stream_ordering_update_race.py +70 -0
  1101. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.postgres +69 -0
  1102. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.sqlite +65 -0
  1103. synapse/storage/schema/main/delta/80/01_users_alter_locked.sql +35 -0
  1104. synapse/storage/schema/main/delta/80/02_read_write_locks_unlogged.sql.postgres +30 -0
  1105. synapse/storage/schema/main/delta/80/02_scheduled_tasks.sql +47 -0
  1106. synapse/storage/schema/main/delta/80/03_read_write_locks_triggers.sql.postgres +37 -0
  1107. synapse/storage/schema/main/delta/80/04_read_write_locks_deadlock.sql.postgres +71 -0
  1108. synapse/storage/schema/main/delta/82/02_scheduled_tasks_index.sql +35 -0
  1109. synapse/storage/schema/main/delta/82/04_add_indices_for_purging_rooms.sql +39 -0
  1110. synapse/storage/schema/main/delta/82/05gaps.sql +44 -0
  1111. synapse/storage/schema/main/delta/83/01_drop_old_tables.sql +43 -0
  1112. synapse/storage/schema/main/delta/83/03_instance_name_receipts.sql.sqlite +17 -0
  1113. synapse/storage/schema/main/delta/83/05_cross_signing_key_update_grant.sql +34 -0
  1114. synapse/storage/schema/main/delta/83/06_event_push_summary_room.sql +36 -0
  1115. synapse/storage/schema/main/delta/84/01_auth_links_stats.sql.postgres +20 -0
  1116. synapse/storage/schema/main/delta/84/02_auth_links_index.sql +16 -0
  1117. synapse/storage/schema/main/delta/84/03_auth_links_analyze.sql.postgres +16 -0
  1118. synapse/storage/schema/main/delta/84/04_access_token_index.sql +15 -0
  1119. synapse/storage/schema/main/delta/85/01_add_suspended.sql +14 -0
  1120. synapse/storage/schema/main/delta/85/02_add_instance_names.sql +27 -0
  1121. synapse/storage/schema/main/delta/85/03_new_sequences.sql.postgres +54 -0
  1122. synapse/storage/schema/main/delta/85/04_cleanup_device_federation_outbox.sql +15 -0
  1123. synapse/storage/schema/main/delta/85/05_add_instance_names_converted_pos.sql +16 -0
  1124. synapse/storage/schema/main/delta/85/06_add_room_reports.sql +20 -0
  1125. synapse/storage/schema/main/delta/86/01_authenticate_media.sql +15 -0
  1126. synapse/storage/schema/main/delta/86/02_receipts_event_id_index.sql +15 -0
  1127. synapse/storage/schema/main/delta/87/01_sliding_sync_memberships.sql +169 -0
  1128. synapse/storage/schema/main/delta/87/02_per_connection_state.sql +81 -0
  1129. synapse/storage/schema/main/delta/87/03_current_state_index.sql +19 -0
  1130. synapse/storage/schema/main/delta/88/01_add_delayed_events.sql +43 -0
  1131. synapse/storage/schema/main/delta/88/01_custom_profile_fields.sql +15 -0
  1132. synapse/storage/schema/main/delta/88/02_fix_sliding_sync_membership_snapshots_forgotten_column.sql +21 -0
  1133. synapse/storage/schema/main/delta/88/03_add_otk_ts_added_index.sql +18 -0
  1134. synapse/storage/schema/main/delta/88/04_current_state_delta_index.sql +18 -0
  1135. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.postgres +19 -0
  1136. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.sqlite +19 -0
  1137. synapse/storage/schema/main/delta/88/05_sliding_sync_room_config_index.sql +20 -0
  1138. synapse/storage/schema/main/delta/88/06_events_received_ts_index.sql +17 -0
  1139. synapse/storage/schema/main/delta/89/01_sliding_sync_membership_snapshot_index.sql +15 -0
  1140. synapse/storage/schema/main/delta/90/01_add_column_participant_room_memberships_table.sql +16 -0
  1141. synapse/storage/schema/main/delta/91/01_media_hash.sql +28 -0
  1142. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.postgres +16 -0
  1143. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.sqlite +16 -0
  1144. synapse/storage/schema/main/delta/92/02_remove_populate_participant_bg_update.sql +17 -0
  1145. synapse/storage/schema/main/delta/92/04_ss_membership_snapshot_idx.sql +16 -0
  1146. synapse/storage/schema/main/delta/92/04_thread_subscriptions.sql +59 -0
  1147. synapse/storage/schema/main/delta/92/04_thread_subscriptions_seq.sql.postgres +19 -0
  1148. synapse/storage/schema/main/delta/92/05_fixup_max_depth_cap.sql +17 -0
  1149. synapse/storage/schema/main/delta/92/05_thread_subscriptions_comments.sql.postgres +18 -0
  1150. synapse/storage/schema/main/delta/92/06_device_federation_inbox_index.sql +16 -0
  1151. synapse/storage/schema/main/delta/92/06_threads_last_sent_stream_ordering_comments.sql.postgres +24 -0
  1152. synapse/storage/schema/main/delta/92/07_add_user_reports.sql +22 -0
  1153. synapse/storage/schema/main/delta/92/07_event_txn_id_device_id_txn_id2.sql +15 -0
  1154. synapse/storage/schema/main/delta/92/08_room_ban_redactions.sql +21 -0
  1155. synapse/storage/schema/main/delta/92/08_thread_subscriptions_seq_fixup.sql.postgres +19 -0
  1156. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql +20 -0
  1157. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql.postgres +18 -0
  1158. synapse/storage/schema/main/delta/93/01_add_delayed_events.sql +15 -0
  1159. synapse/storage/schema/main/delta/93/02_sliding_sync_members.sql +60 -0
  1160. synapse/storage/schema/main/delta/93/03_sss_pos_last_used.sql +27 -0
  1161. synapse/storage/schema/main/full_schemas/72/full.sql.postgres +1344 -0
  1162. synapse/storage/schema/main/full_schemas/72/full.sql.sqlite +646 -0
  1163. synapse/storage/schema/state/delta/23/drop_state_index.sql +35 -0
  1164. synapse/storage/schema/state/delta/32/remove_state_indices.sql +38 -0
  1165. synapse/storage/schema/state/delta/35/add_state_index.sql +36 -0
  1166. synapse/storage/schema/state/delta/35/state.sql +41 -0
  1167. synapse/storage/schema/state/delta/35/state_dedupe.sql +36 -0
  1168. synapse/storage/schema/state/delta/47/state_group_seq.py +38 -0
  1169. synapse/storage/schema/state/delta/56/state_group_room_idx.sql +36 -0
  1170. synapse/storage/schema/state/delta/61/02state_groups_state_n_distinct.sql.postgres +34 -0
  1171. synapse/storage/schema/state/delta/70/08_state_group_edges_unique.sql +36 -0
  1172. synapse/storage/schema/state/delta/89/01_state_groups_deletion.sql +39 -0
  1173. synapse/storage/schema/state/delta/90/02_delete_unreferenced_state_groups.sql +16 -0
  1174. synapse/storage/schema/state/delta/90/03_remove_old_deletion_bg_update.sql +15 -0
  1175. synapse/storage/schema/state/full_schemas/72/full.sql.postgres +30 -0
  1176. synapse/storage/schema/state/full_schemas/72/full.sql.sqlite +20 -0
  1177. synapse/storage/types.py +183 -0
  1178. synapse/storage/util/__init__.py +20 -0
  1179. synapse/storage/util/id_generators.py +928 -0
  1180. synapse/storage/util/partial_state_events_tracker.py +194 -0
  1181. synapse/storage/util/sequence.py +315 -0
  1182. synapse/streams/__init__.py +43 -0
  1183. synapse/streams/config.py +91 -0
  1184. synapse/streams/events.py +203 -0
  1185. synapse/synapse_rust/__init__.pyi +3 -0
  1186. synapse/synapse_rust/acl.pyi +20 -0
  1187. synapse/synapse_rust/events.pyi +136 -0
  1188. synapse/synapse_rust/http_client.pyi +32 -0
  1189. synapse/synapse_rust/push.pyi +86 -0
  1190. synapse/synapse_rust/rendezvous.pyi +30 -0
  1191. synapse/synapse_rust/segmenter.pyi +1 -0
  1192. synapse/synapse_rust.abi3.so +0 -0
  1193. synapse/types/__init__.py +1600 -0
  1194. synapse/types/handlers/__init__.py +93 -0
  1195. synapse/types/handlers/policy_server.py +16 -0
  1196. synapse/types/handlers/sliding_sync.py +1004 -0
  1197. synapse/types/rest/__init__.py +25 -0
  1198. synapse/types/rest/client/__init__.py +413 -0
  1199. synapse/types/state.py +634 -0
  1200. synapse/types/storage/__init__.py +66 -0
  1201. synapse/util/__init__.py +160 -0
  1202. synapse/util/async_helpers.py +1048 -0
  1203. synapse/util/background_queue.py +142 -0
  1204. synapse/util/batching_queue.py +203 -0
  1205. synapse/util/caches/__init__.py +300 -0
  1206. synapse/util/caches/cached_call.py +143 -0
  1207. synapse/util/caches/deferred_cache.py +530 -0
  1208. synapse/util/caches/descriptors.py +692 -0
  1209. synapse/util/caches/dictionary_cache.py +346 -0
  1210. synapse/util/caches/expiringcache.py +250 -0
  1211. synapse/util/caches/lrucache.py +976 -0
  1212. synapse/util/caches/response_cache.py +323 -0
  1213. synapse/util/caches/stream_change_cache.py +370 -0
  1214. synapse/util/caches/treecache.py +189 -0
  1215. synapse/util/caches/ttlcache.py +197 -0
  1216. synapse/util/cancellation.py +63 -0
  1217. synapse/util/check_dependencies.py +335 -0
  1218. synapse/util/clock.py +592 -0
  1219. synapse/util/daemonize.py +165 -0
  1220. synapse/util/distributor.py +157 -0
  1221. synapse/util/duration.py +117 -0
  1222. synapse/util/events.py +134 -0
  1223. synapse/util/file_consumer.py +164 -0
  1224. synapse/util/frozenutils.py +57 -0
  1225. synapse/util/gai_resolver.py +178 -0
  1226. synapse/util/hash.py +38 -0
  1227. synapse/util/httpresourcetree.py +108 -0
  1228. synapse/util/iterutils.py +190 -0
  1229. synapse/util/json.py +56 -0
  1230. synapse/util/linked_list.py +156 -0
  1231. synapse/util/logcontext.py +46 -0
  1232. synapse/util/logformatter.py +28 -0
  1233. synapse/util/macaroons.py +325 -0
  1234. synapse/util/manhole.py +191 -0
  1235. synapse/util/metrics.py +339 -0
  1236. synapse/util/module_loader.py +116 -0
  1237. synapse/util/msisdn.py +51 -0
  1238. synapse/util/patch_inline_callbacks.py +250 -0
  1239. synapse/util/pydantic_models.py +63 -0
  1240. synapse/util/ratelimitutils.py +422 -0
  1241. synapse/util/retryutils.py +339 -0
  1242. synapse/util/rlimit.py +42 -0
  1243. synapse/util/rust.py +164 -0
  1244. synapse/util/sentinel.py +21 -0
  1245. synapse/util/stringutils.py +293 -0
  1246. synapse/util/task_scheduler.py +494 -0
  1247. synapse/util/templates.py +126 -0
  1248. synapse/util/threepids.py +123 -0
  1249. synapse/util/wheel_timer.py +112 -0
  1250. synapse/visibility.py +869 -0
  1251. synmark/__init__.py +47 -0
  1252. synmark/__main__.py +128 -0
  1253. synmark/suites/__init__.py +9 -0
  1254. synmark/suites/logging.py +154 -0
  1255. synmark/suites/lrucache.py +48 -0
  1256. synmark/suites/lrucache_evict.py +49 -0
  1257. sytest-blacklist +33 -0
  1258. tests/__init__.py +29 -0
  1259. tests/api/__init__.py +0 -0
  1260. tests/api/test_auth.py +548 -0
  1261. tests/api/test_errors.py +46 -0
  1262. tests/api/test_filtering.py +622 -0
  1263. tests/api/test_ratelimiting.py +505 -0
  1264. tests/api/test_urls.py +81 -0
  1265. tests/app/__init__.py +0 -0
  1266. tests/app/test_homeserver_shutdown.py +271 -0
  1267. tests/app/test_homeserver_start.py +49 -0
  1268. tests/app/test_openid_listener.py +139 -0
  1269. tests/app/test_phone_stats_home.py +248 -0
  1270. tests/appservice/__init__.py +20 -0
  1271. tests/appservice/test_api.py +253 -0
  1272. tests/appservice/test_appservice.py +259 -0
  1273. tests/appservice/test_scheduler.py +477 -0
  1274. tests/config/__init__.py +20 -0
  1275. tests/config/test___main__.py +38 -0
  1276. tests/config/test_api.py +146 -0
  1277. tests/config/test_appservice.py +48 -0
  1278. tests/config/test_background_update.py +65 -0
  1279. tests/config/test_base.py +151 -0
  1280. tests/config/test_cache.py +193 -0
  1281. tests/config/test_database.py +42 -0
  1282. tests/config/test_generate.py +72 -0
  1283. tests/config/test_load.py +322 -0
  1284. tests/config/test_oauth_delegation.py +454 -0
  1285. tests/config/test_ratelimiting.py +77 -0
  1286. tests/config/test_registration_config.py +203 -0
  1287. tests/config/test_room_directory.py +203 -0
  1288. tests/config/test_server.py +248 -0
  1289. tests/config/test_tls.py +209 -0
  1290. tests/config/test_util.py +59 -0
  1291. tests/config/test_workers.py +332 -0
  1292. tests/config/utils.py +66 -0
  1293. tests/crypto/__init__.py +20 -0
  1294. tests/crypto/test_event_signing.py +109 -0
  1295. tests/crypto/test_keyring.py +737 -0
  1296. tests/events/__init__.py +0 -0
  1297. tests/events/test_auto_accept_invites.py +827 -0
  1298. tests/events/test_presence_router.py +540 -0
  1299. tests/events/test_snapshot.py +121 -0
  1300. tests/events/test_utils.py +986 -0
  1301. tests/federation/__init__.py +0 -0
  1302. tests/federation/test_complexity.py +257 -0
  1303. tests/federation/test_federation_catch_up.py +585 -0
  1304. tests/federation/test_federation_client.py +316 -0
  1305. tests/federation/test_federation_devices.py +161 -0
  1306. tests/federation/test_federation_media.py +295 -0
  1307. tests/federation/test_federation_out_of_band_membership.py +671 -0
  1308. tests/federation/test_federation_sender.py +956 -0
  1309. tests/federation/test_federation_server.py +631 -0
  1310. tests/federation/transport/__init__.py +0 -0
  1311. tests/federation/transport/server/__init__.py +20 -0
  1312. tests/federation/transport/server/test__base.py +156 -0
  1313. tests/federation/transport/test_client.py +157 -0
  1314. tests/federation/transport/test_knocking.py +323 -0
  1315. tests/federation/transport/test_server.py +74 -0
  1316. tests/handlers/__init__.py +0 -0
  1317. tests/handlers/oidc_test_key.p8 +5 -0
  1318. tests/handlers/oidc_test_key.pub.pem +4 -0
  1319. tests/handlers/test_admin.py +361 -0
  1320. tests/handlers/test_appservice.py +1336 -0
  1321. tests/handlers/test_auth.py +248 -0
  1322. tests/handlers/test_cas.py +239 -0
  1323. tests/handlers/test_deactivate_account.py +485 -0
  1324. tests/handlers/test_device.py +665 -0
  1325. tests/handlers/test_directory.py +613 -0
  1326. tests/handlers/test_e2e_keys.py +2025 -0
  1327. tests/handlers/test_e2e_room_keys.py +569 -0
  1328. tests/handlers/test_federation.py +794 -0
  1329. tests/handlers/test_federation_event.py +1181 -0
  1330. tests/handlers/test_message.py +322 -0
  1331. tests/handlers/test_oauth_delegation.py +1314 -0
  1332. tests/handlers/test_oidc.py +1688 -0
  1333. tests/handlers/test_password_providers.py +987 -0
  1334. tests/handlers/test_presence.py +2144 -0
  1335. tests/handlers/test_profile.py +401 -0
  1336. tests/handlers/test_receipts.py +342 -0
  1337. tests/handlers/test_register.py +880 -0
  1338. tests/handlers/test_room.py +108 -0
  1339. tests/handlers/test_room_list.py +93 -0
  1340. tests/handlers/test_room_member.py +764 -0
  1341. tests/handlers/test_room_policy.py +468 -0
  1342. tests/handlers/test_room_summary.py +1248 -0
  1343. tests/handlers/test_saml.py +427 -0
  1344. tests/handlers/test_send_email.py +230 -0
  1345. tests/handlers/test_sliding_sync.py +5065 -0
  1346. tests/handlers/test_sso.py +152 -0
  1347. tests/handlers/test_stats.py +594 -0
  1348. tests/handlers/test_sync.py +1275 -0
  1349. tests/handlers/test_typing.py +557 -0
  1350. tests/handlers/test_user_directory.py +1435 -0
  1351. tests/handlers/test_worker_lock.py +126 -0
  1352. tests/http/__init__.py +196 -0
  1353. tests/http/ca.crt +19 -0
  1354. tests/http/ca.key +27 -0
  1355. tests/http/federation/__init__.py +19 -0
  1356. tests/http/federation/test_matrix_federation_agent.py +1855 -0
  1357. tests/http/federation/test_srv_resolver.py +220 -0
  1358. tests/http/server/__init__.py +20 -0
  1359. tests/http/server/_base.py +621 -0
  1360. tests/http/server.key +27 -0
  1361. tests/http/test_additional_resource.py +76 -0
  1362. tests/http/test_client.py +422 -0
  1363. tests/http/test_endpoint.py +62 -0
  1364. tests/http/test_matrixfederationclient.py +1092 -0
  1365. tests/http/test_proxy.py +75 -0
  1366. tests/http/test_proxyagent.py +1008 -0
  1367. tests/http/test_servlet.py +145 -0
  1368. tests/http/test_simple_client.py +188 -0
  1369. tests/http/test_site.py +247 -0
  1370. tests/logging/__init__.py +42 -0
  1371. tests/logging/test_loggers.py +127 -0
  1372. tests/logging/test_opentracing.py +524 -0
  1373. tests/logging/test_remote_handler.py +184 -0
  1374. tests/logging/test_terse_json.py +253 -0
  1375. tests/media/__init__.py +20 -0
  1376. tests/media/test_base.py +88 -0
  1377. tests/media/test_filepath.py +602 -0
  1378. tests/media/test_html_preview.py +565 -0
  1379. tests/media/test_media_retention.py +299 -0
  1380. tests/media/test_media_storage.py +1401 -0
  1381. tests/media/test_oembed.py +172 -0
  1382. tests/media/test_url_previewer.py +120 -0
  1383. tests/metrics/__init__.py +0 -0
  1384. tests/metrics/test_background_process_metrics.py +21 -0
  1385. tests/metrics/test_metrics.py +407 -0
  1386. tests/metrics/test_phone_home_stats.py +263 -0
  1387. tests/module_api/__init__.py +0 -0
  1388. tests/module_api/test_account_data_manager.py +171 -0
  1389. tests/module_api/test_api.py +1035 -0
  1390. tests/module_api/test_event_unsigned_addition.py +66 -0
  1391. tests/module_api/test_spamchecker.py +286 -0
  1392. tests/push/__init__.py +0 -0
  1393. tests/push/test_bulk_push_rule_evaluator.py +652 -0
  1394. tests/push/test_email.py +570 -0
  1395. tests/push/test_http.py +1247 -0
  1396. tests/push/test_presentable_names.py +238 -0
  1397. tests/push/test_push_rule_evaluator.py +1069 -0
  1398. tests/replication/__init__.py +20 -0
  1399. tests/replication/_base.py +619 -0
  1400. tests/replication/http/__init__.py +20 -0
  1401. tests/replication/http/test__base.py +113 -0
  1402. tests/replication/storage/__init__.py +20 -0
  1403. tests/replication/storage/_base.py +85 -0
  1404. tests/replication/storage/test_events.py +299 -0
  1405. tests/replication/tcp/__init__.py +19 -0
  1406. tests/replication/tcp/streams/__init__.py +19 -0
  1407. tests/replication/tcp/streams/test_account_data.py +133 -0
  1408. tests/replication/tcp/streams/test_events.py +565 -0
  1409. tests/replication/tcp/streams/test_federation.py +117 -0
  1410. tests/replication/tcp/streams/test_partial_state.py +72 -0
  1411. tests/replication/tcp/streams/test_receipts.py +110 -0
  1412. tests/replication/tcp/streams/test_thread_subscriptions.py +157 -0
  1413. tests/replication/tcp/streams/test_to_device.py +112 -0
  1414. tests/replication/tcp/streams/test_typing.py +223 -0
  1415. tests/replication/tcp/test_commands.py +50 -0
  1416. tests/replication/tcp/test_handler.py +211 -0
  1417. tests/replication/test_auth.py +120 -0
  1418. tests/replication/test_client_reader_shard.py +101 -0
  1419. tests/replication/test_federation_ack.py +88 -0
  1420. tests/replication/test_federation_sender_shard.py +352 -0
  1421. tests/replication/test_module_cache_invalidation.py +89 -0
  1422. tests/replication/test_multi_media_repo.py +496 -0
  1423. tests/replication/test_pusher_shard.py +192 -0
  1424. tests/replication/test_sharded_event_persister.py +332 -0
  1425. tests/replication/test_sharded_receipts.py +250 -0
  1426. tests/rest/__init__.py +20 -0
  1427. tests/rest/admin/__init__.py +19 -0
  1428. tests/rest/admin/test_admin.py +614 -0
  1429. tests/rest/admin/test_background_updates.py +375 -0
  1430. tests/rest/admin/test_device.py +600 -0
  1431. tests/rest/admin/test_event.py +74 -0
  1432. tests/rest/admin/test_event_reports.py +781 -0
  1433. tests/rest/admin/test_federation.py +863 -0
  1434. tests/rest/admin/test_jwks.py +106 -0
  1435. tests/rest/admin/test_media.py +1091 -0
  1436. tests/rest/admin/test_registration_tokens.py +729 -0
  1437. tests/rest/admin/test_room.py +3626 -0
  1438. tests/rest/admin/test_scheduled_tasks.py +192 -0
  1439. tests/rest/admin/test_server_notice.py +753 -0
  1440. tests/rest/admin/test_statistics.py +523 -0
  1441. tests/rest/admin/test_user.py +6061 -0
  1442. tests/rest/admin/test_username_available.py +82 -0
  1443. tests/rest/client/__init__.py +20 -0
  1444. tests/rest/client/sliding_sync/__init__.py +13 -0
  1445. tests/rest/client/sliding_sync/test_connection_tracking.py +505 -0
  1446. tests/rest/client/sliding_sync/test_extension_account_data.py +1056 -0
  1447. tests/rest/client/sliding_sync/test_extension_e2ee.py +459 -0
  1448. tests/rest/client/sliding_sync/test_extension_receipts.py +934 -0
  1449. tests/rest/client/sliding_sync/test_extension_thread_subscriptions.py +497 -0
  1450. tests/rest/client/sliding_sync/test_extension_to_device.py +294 -0
  1451. tests/rest/client/sliding_sync/test_extension_typing.py +500 -0
  1452. tests/rest/client/sliding_sync/test_extensions.py +306 -0
  1453. tests/rest/client/sliding_sync/test_lists_filters.py +1975 -0
  1454. tests/rest/client/sliding_sync/test_room_subscriptions.py +303 -0
  1455. tests/rest/client/sliding_sync/test_rooms_invites.py +528 -0
  1456. tests/rest/client/sliding_sync/test_rooms_meta.py +1338 -0
  1457. tests/rest/client/sliding_sync/test_rooms_required_state.py +2247 -0
  1458. tests/rest/client/sliding_sync/test_rooms_timeline.py +718 -0
  1459. tests/rest/client/sliding_sync/test_sliding_sync.py +1688 -0
  1460. tests/rest/client/test_account.py +1543 -0
  1461. tests/rest/client/test_account_data.py +81 -0
  1462. tests/rest/client/test_auth.py +1508 -0
  1463. tests/rest/client/test_auth_metadata.py +145 -0
  1464. tests/rest/client/test_capabilities.py +318 -0
  1465. tests/rest/client/test_consent.py +138 -0
  1466. tests/rest/client/test_delayed_events.py +553 -0
  1467. tests/rest/client/test_devices.py +634 -0
  1468. tests/rest/client/test_directory.py +249 -0
  1469. tests/rest/client/test_ephemeral_message.py +113 -0
  1470. tests/rest/client/test_events.py +165 -0
  1471. tests/rest/client/test_filter.py +124 -0
  1472. tests/rest/client/test_identity.py +67 -0
  1473. tests/rest/client/test_keys.py +516 -0
  1474. tests/rest/client/test_login.py +1881 -0
  1475. tests/rest/client/test_login_token_request.py +175 -0
  1476. tests/rest/client/test_matrixrtc.py +105 -0
  1477. tests/rest/client/test_media.py +3156 -0
  1478. tests/rest/client/test_models.py +83 -0
  1479. tests/rest/client/test_mutual_rooms.py +235 -0
  1480. tests/rest/client/test_notifications.py +231 -0
  1481. tests/rest/client/test_owned_state.py +308 -0
  1482. tests/rest/client/test_password_policy.py +186 -0
  1483. tests/rest/client/test_power_levels.py +295 -0
  1484. tests/rest/client/test_presence.py +149 -0
  1485. tests/rest/client/test_profile.py +925 -0
  1486. tests/rest/client/test_push_rule_attrs.py +510 -0
  1487. tests/rest/client/test_read_marker.py +151 -0
  1488. tests/rest/client/test_receipts.py +287 -0
  1489. tests/rest/client/test_redactions.py +657 -0
  1490. tests/rest/client/test_register.py +1314 -0
  1491. tests/rest/client/test_relations.py +1954 -0
  1492. tests/rest/client/test_rendezvous.py +468 -0
  1493. tests/rest/client/test_reporting.py +324 -0
  1494. tests/rest/client/test_retention.py +389 -0
  1495. tests/rest/client/test_rooms.py +5486 -0
  1496. tests/rest/client/test_sendtodevice.py +271 -0
  1497. tests/rest/client/test_shadow_banned.py +335 -0
  1498. tests/rest/client/test_sync.py +1147 -0
  1499. tests/rest/client/test_tags.py +161 -0
  1500. tests/rest/client/test_third_party_rules.py +1076 -0
  1501. tests/rest/client/test_thread_subscriptions.py +351 -0
  1502. tests/rest/client/test_transactions.py +204 -0
  1503. tests/rest/client/test_typing.py +114 -0
  1504. tests/rest/client/test_upgrade_room.py +433 -0
  1505. tests/rest/client/utils.py +985 -0
  1506. tests/rest/key/__init__.py +0 -0
  1507. tests/rest/key/v2/__init__.py +0 -0
  1508. tests/rest/key/v2/test_remote_key_resource.py +282 -0
  1509. tests/rest/media/__init__.py +19 -0
  1510. tests/rest/media/test_domain_blocking.py +148 -0
  1511. tests/rest/media/test_url_preview.py +1445 -0
  1512. tests/rest/synapse/__init__.py +12 -0
  1513. tests/rest/synapse/client/__init__.py +12 -0
  1514. tests/rest/synapse/client/test_federation_whitelist.py +118 -0
  1515. tests/rest/synapse/mas/__init__.py +12 -0
  1516. tests/rest/synapse/mas/_base.py +43 -0
  1517. tests/rest/synapse/mas/test_devices.py +693 -0
  1518. tests/rest/synapse/mas/test_users.py +1399 -0
  1519. tests/rest/test_health.py +35 -0
  1520. tests/rest/test_well_known.py +155 -0
  1521. tests/scripts/__init__.py +0 -0
  1522. tests/scripts/test_new_matrix_user.py +172 -0
  1523. tests/server.py +1374 -0
  1524. tests/server_notices/__init__.py +241 -0
  1525. tests/server_notices/test_consent.py +111 -0
  1526. tests/server_notices/test_resource_limits_server_notices.py +409 -0
  1527. tests/state/__init__.py +0 -0
  1528. tests/state/test_v2.py +1096 -0
  1529. tests/state/test_v21.py +506 -0
  1530. tests/storage/__init__.py +0 -0
  1531. tests/storage/databases/__init__.py +20 -0
  1532. tests/storage/databases/main/__init__.py +20 -0
  1533. tests/storage/databases/main/test_cache.py +124 -0
  1534. tests/storage/databases/main/test_deviceinbox.py +323 -0
  1535. tests/storage/databases/main/test_end_to_end_keys.py +127 -0
  1536. tests/storage/databases/main/test_events_worker.py +594 -0
  1537. tests/storage/databases/main/test_lock.py +499 -0
  1538. tests/storage/databases/main/test_metrics.py +88 -0
  1539. tests/storage/databases/main/test_receipts.py +218 -0
  1540. tests/storage/databases/main/test_room.py +192 -0
  1541. tests/storage/test__base.py +178 -0
  1542. tests/storage/test_account_data.py +186 -0
  1543. tests/storage/test_appservice.py +568 -0
  1544. tests/storage/test_background_update.py +671 -0
  1545. tests/storage/test_base.py +813 -0
  1546. tests/storage/test_cleanup_extrems.py +396 -0
  1547. tests/storage/test_client_ips.py +788 -0
  1548. tests/storage/test_database.py +288 -0
  1549. tests/storage/test_devices.py +353 -0
  1550. tests/storage/test_directory.py +74 -0
  1551. tests/storage/test_e2e_room_keys.py +87 -0
  1552. tests/storage/test_end_to_end_keys.py +120 -0
  1553. tests/storage/test_event_chain.py +826 -0
  1554. tests/storage/test_event_federation.py +1433 -0
  1555. tests/storage/test_event_push_actions.py +809 -0
  1556. tests/storage/test_events.py +591 -0
  1557. tests/storage/test_events_bg_updates.py +156 -0
  1558. tests/storage/test_id_generators.py +791 -0
  1559. tests/storage/test_invite_rule.py +171 -0
  1560. tests/storage/test_main.py +56 -0
  1561. tests/storage/test_monthly_active_users.py +500 -0
  1562. tests/storage/test_profile.py +134 -0
  1563. tests/storage/test_purge.py +459 -0
  1564. tests/storage/test_receipts.py +309 -0
  1565. tests/storage/test_redaction.py +462 -0
  1566. tests/storage/test_registration.py +277 -0
  1567. tests/storage/test_relations.py +118 -0
  1568. tests/storage/test_rollback_worker.py +132 -0
  1569. tests/storage/test_room.py +69 -0
  1570. tests/storage/test_room_search.py +383 -0
  1571. tests/storage/test_roommember.py +812 -0
  1572. tests/storage/test_sliding_sync_tables.py +5187 -0
  1573. tests/storage/test_state.py +959 -0
  1574. tests/storage/test_state_deletion.py +475 -0
  1575. tests/storage/test_stream.py +1533 -0
  1576. tests/storage/test_thread_subscriptions.py +369 -0
  1577. tests/storage/test_transactions.py +77 -0
  1578. tests/storage/test_txn_limit.py +49 -0
  1579. tests/storage/test_unsafe_locale.py +67 -0
  1580. tests/storage/test_user_directory.py +691 -0
  1581. tests/storage/test_user_filters.py +101 -0
  1582. tests/storage/util/__init__.py +20 -0
  1583. tests/storage/util/test_partial_state_events_tracker.py +181 -0
  1584. tests/synapse_rust/__init__.py +11 -0
  1585. tests/synapse_rust/test_http_client.py +225 -0
  1586. tests/test_distributor.py +74 -0
  1587. tests/test_event_auth.py +921 -0
  1588. tests/test_mau.py +347 -0
  1589. tests/test_phone_home.py +102 -0
  1590. tests/test_rust.py +11 -0
  1591. tests/test_server.py +557 -0
  1592. tests/test_state.py +902 -0
  1593. tests/test_terms_auth.py +128 -0
  1594. tests/test_types.py +201 -0
  1595. tests/test_utils/__init__.py +161 -0
  1596. tests/test_utils/event_injection.py +150 -0
  1597. tests/test_utils/html_parsers.py +59 -0
  1598. tests/test_utils/logging_setup.py +74 -0
  1599. tests/test_utils/oidc.py +370 -0
  1600. tests/test_visibility.py +712 -0
  1601. tests/types/__init__.py +0 -0
  1602. tests/types/test_init.py +51 -0
  1603. tests/types/test_state.py +627 -0
  1604. tests/unittest.py +1108 -0
  1605. tests/util/__init__.py +20 -0
  1606. tests/util/caches/__init__.py +20 -0
  1607. tests/util/caches/test_cached_call.py +168 -0
  1608. tests/util/caches/test_deferred_cache.py +317 -0
  1609. tests/util/caches/test_descriptors.py +1110 -0
  1610. tests/util/caches/test_response_cache.py +225 -0
  1611. tests/util/caches/test_ttlcache.py +90 -0
  1612. tests/util/test_async_helpers.py +808 -0
  1613. tests/util/test_background_queue.py +117 -0
  1614. tests/util/test_batching_queue.py +252 -0
  1615. tests/util/test_check_dependencies.py +243 -0
  1616. tests/util/test_dict_cache.py +130 -0
  1617. tests/util/test_events.py +118 -0
  1618. tests/util/test_expiring_cache.py +113 -0
  1619. tests/util/test_file_consumer.py +199 -0
  1620. tests/util/test_itertools.py +190 -0
  1621. tests/util/test_linearizer.py +264 -0
  1622. tests/util/test_logcontext.py +715 -0
  1623. tests/util/test_logformatter.py +44 -0
  1624. tests/util/test_lrucache.py +479 -0
  1625. tests/util/test_macaroons.py +126 -0
  1626. tests/util/test_mutable_overlay_mapping.py +189 -0
  1627. tests/util/test_ratelimitutils.py +146 -0
  1628. tests/util/test_retryutils.py +314 -0
  1629. tests/util/test_rwlock.py +401 -0
  1630. tests/util/test_stream_change_cache.py +304 -0
  1631. tests/util/test_stringutils.py +86 -0
  1632. tests/util/test_task_scheduler.py +227 -0
  1633. tests/util/test_threepids.py +55 -0
  1634. tests/util/test_treecache.py +93 -0
  1635. tests/util/test_wheel_timer.py +82 -0
  1636. tests/utils.py +342 -0
@@ -0,0 +1,1855 @@
1
+ #
2
+ # This file is licensed under the Affero General Public License (AGPL) version 3.
3
+ #
4
+ # Copyright (C) 2023 New Vector, Ltd
5
+ #
6
+ # This program is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as
8
+ # published by the Free Software Foundation, either version 3 of the
9
+ # License, or (at your option) any later version.
10
+ #
11
+ # See the GNU Affero General Public License for more details:
12
+ # <https://www.gnu.org/licenses/agpl-3.0.html>.
13
+ #
14
+ # Originally licensed under the Apache License, Version 2.0:
15
+ # <http://www.apache.org/licenses/LICENSE-2.0>.
16
+ #
17
+ # [This file includes modifications made by New Vector Limited]
18
+ #
19
+ #
20
+ import base64
21
+ import logging
22
+ import os
23
+ from typing import Generator, cast
24
+ from unittest.mock import AsyncMock, call, patch
25
+
26
+ import treq
27
+ from netaddr import IPSet
28
+ from service_identity import VerificationError
29
+ from zope.interface import implementer
30
+
31
+ from twisted.internet import defer
32
+ from twisted.internet._sslverify import ClientTLSOptions, OpenSSLCertificateOptions
33
+ from twisted.internet.defer import Deferred
34
+ from twisted.internet.endpoints import _WrappingProtocol
35
+ from twisted.internet.interfaces import (
36
+ IOpenSSLClientConnectionCreator,
37
+ IProtocolFactory,
38
+ )
39
+ from twisted.internet.protocol import Factory, Protocol
40
+ from twisted.protocols.tls import TLSMemoryBIOProtocol
41
+ from twisted.web._newclient import ResponseNeverReceived
42
+ from twisted.web.client import Agent
43
+ from twisted.web.http import HTTPChannel, Request
44
+ from twisted.web.http_headers import Headers
45
+ from twisted.web.iweb import IPolicyForHTTPS, IResponse
46
+
47
+ from synapse.config.homeserver import HomeServerConfig
48
+ from synapse.config.server import parse_proxy_config
49
+ from synapse.crypto.context_factory import FederationPolicyForHTTPS
50
+ from synapse.http.federation.matrix_federation_agent import MatrixFederationAgent
51
+ from synapse.http.federation.srv_resolver import Server, SrvResolver
52
+ from synapse.http.federation.well_known_resolver import (
53
+ WELL_KNOWN_MAX_SIZE,
54
+ WellKnownResolver,
55
+ _cache_period_from_headers,
56
+ )
57
+ from synapse.logging.context import (
58
+ SENTINEL_CONTEXT,
59
+ LoggingContext,
60
+ LoggingContextOrSentinel,
61
+ current_context,
62
+ )
63
+ from synapse.types import ISynapseReactor
64
+ from synapse.util.caches.ttlcache import TTLCache
65
+
66
+ from tests import unittest
67
+ from tests.http import dummy_address, get_test_ca_cert_file, wrap_server_factory_for_tls
68
+ from tests.server import FakeTransport, get_clock
69
+ from tests.utils import checked_cast, default_config
70
+
71
+ logger = logging.getLogger(__name__)
72
+
73
+
74
+ class MatrixFederationAgentTests(unittest.TestCase):
75
+ def setUp(self) -> None:
76
+ self.reactor, self.clock = get_clock()
77
+
78
+ self.mock_resolver = AsyncMock(spec=SrvResolver)
79
+
80
+ config_dict = default_config("test", parse=False)
81
+ config_dict["federation_custom_ca_list"] = [get_test_ca_cert_file()]
82
+
83
+ self._config = config = HomeServerConfig()
84
+ config.parse_config_dict(config_dict, "", "")
85
+
86
+ self.tls_factory = FederationPolicyForHTTPS(config)
87
+
88
+ self.well_known_cache: TTLCache[bytes, bytes | None] = TTLCache(
89
+ cache_name="test_cache",
90
+ server_name="test_server",
91
+ timer=self.reactor.seconds,
92
+ )
93
+ self.had_well_known_cache: TTLCache[bytes, bool] = TTLCache(
94
+ cache_name="test_cache",
95
+ server_name="test_server",
96
+ timer=self.reactor.seconds,
97
+ )
98
+ self.well_known_resolver = WellKnownResolver(
99
+ server_name="OUR_STUB_HOMESERVER_NAME",
100
+ reactor=self.reactor,
101
+ clock=self.clock,
102
+ agent=Agent(self.reactor, contextFactory=self.tls_factory),
103
+ user_agent=b"test-agent",
104
+ well_known_cache=self.well_known_cache,
105
+ had_well_known_cache=self.had_well_known_cache,
106
+ )
107
+
108
+ def _make_connection(
109
+ self,
110
+ client_factory: IProtocolFactory,
111
+ ssl: bool = True,
112
+ expected_sni: bytes | None = None,
113
+ tls_sanlist: list[bytes] | None = None,
114
+ ) -> HTTPChannel:
115
+ """Builds a test server, and completes the outgoing client connection
116
+ Args:
117
+ client_factory: the the factory that the
118
+ application is trying to use to make the outbound connection. We will
119
+ invoke it to build the client Protocol
120
+
121
+ ssl: If true, we will expect an ssl connection and wrap
122
+ server_factory with a TLSMemoryBIOFactory
123
+ False is set only for when proxy expect http connection.
124
+ Otherwise federation requests use always https.
125
+
126
+ expected_sni: the expected SNI value
127
+
128
+ tls_sanlist: list of SAN entries for the TLS cert presented by the server.
129
+
130
+ Returns:
131
+ the server Protocol returned by server_factory
132
+ """
133
+
134
+ # build the test server
135
+ server_factory = _get_test_protocol_factory()
136
+ if ssl:
137
+ server_factory = wrap_server_factory_for_tls(
138
+ server_factory,
139
+ self.reactor,
140
+ tls_sanlist
141
+ or [
142
+ b"DNS:testserv",
143
+ b"DNS:target-server",
144
+ b"DNS:xn--bcher-kva.com",
145
+ b"IP:1.2.3.4",
146
+ b"IP:::1",
147
+ ],
148
+ )
149
+
150
+ server_protocol = server_factory.buildProtocol(dummy_address)
151
+ assert server_protocol is not None
152
+ # now, tell the client protocol factory to build the client protocol (it will be a
153
+ # _WrappingProtocol, around a TLSMemoryBIOProtocol, around an
154
+ # HTTP11ClientProtocol) and wire the output of said protocol up to the server via
155
+ # a FakeTransport.
156
+ #
157
+ # Normally this would be done by the TCP socket code in Twisted, but we are
158
+ # stubbing that out here.
159
+ # NB: we use a checked_cast here to workaround https://github.com/Shoobx/mypy-zope/issues/91)
160
+ client_protocol = checked_cast(
161
+ _WrappingProtocol, client_factory.buildProtocol(dummy_address)
162
+ )
163
+ client_protocol.makeConnection(
164
+ FakeTransport(server_protocol, self.reactor, client_protocol)
165
+ )
166
+
167
+ # tell the server protocol to send its stuff back to the client, too
168
+ server_protocol.makeConnection(
169
+ FakeTransport(client_protocol, self.reactor, server_protocol)
170
+ )
171
+
172
+ if ssl:
173
+ assert isinstance(server_protocol, TLSMemoryBIOProtocol)
174
+ # fish the test server back out of the server-side TLS protocol.
175
+ http_protocol = server_protocol.wrappedProtocol
176
+ # grab a hold of the TLS connection, in case it gets torn down
177
+ tls_connection = server_protocol._tlsConnection
178
+ else:
179
+ http_protocol = server_protocol
180
+ tls_connection = None
181
+
182
+ assert isinstance(http_protocol, HTTPChannel)
183
+ # give the reactor a pump to get the TLS juices flowing (if needed)
184
+ self.reactor.advance(0)
185
+
186
+ # check the SNI
187
+ if expected_sni is not None:
188
+ server_name = tls_connection.get_servername()
189
+ self.assertEqual(
190
+ server_name,
191
+ expected_sni,
192
+ f"Expected SNI {expected_sni!s} but got {server_name!s}",
193
+ )
194
+
195
+ return http_protocol
196
+
197
+ @defer.inlineCallbacks
198
+ def _make_get_request(
199
+ self, uri: bytes
200
+ ) -> Generator["Deferred[object]", object, IResponse]:
201
+ """
202
+ Sends a simple GET request via the agent, and checks its logcontext management
203
+ """
204
+ with LoggingContext(
205
+ name="one",
206
+ server_name="test_server",
207
+ ) as context:
208
+ fetch_d: Deferred[IResponse] = self.agent.request(b"GET", uri)
209
+
210
+ # Nothing happened yet
211
+ self.assertNoResult(fetch_d)
212
+
213
+ # should have reset logcontext to the sentinel
214
+ _check_logcontext(SENTINEL_CONTEXT)
215
+
216
+ fetch_res: IResponse
217
+ try:
218
+ fetch_res = yield fetch_d # type: ignore[misc, assignment]
219
+ return fetch_res
220
+ except Exception as e:
221
+ logger.info("Fetch of %s failed: %s", uri.decode("ascii"), e)
222
+ raise
223
+ finally:
224
+ _check_logcontext(context)
225
+
226
+ def _handle_well_known_connection(
227
+ self,
228
+ client_factory: IProtocolFactory,
229
+ expected_sni: bytes,
230
+ content: bytes,
231
+ response_headers: dict | None = None,
232
+ ) -> HTTPChannel:
233
+ """Handle an outgoing HTTPs connection: wire it up to a server, check that the
234
+ request is for a .well-known, and send the response.
235
+
236
+ Args:
237
+ client_factory: outgoing connection
238
+ expected_sni: SNI that we expect the outgoing connection to send
239
+ content: content to send back as the .well-known
240
+ Returns:
241
+ server impl
242
+ """
243
+ # make the connection for .well-known
244
+ well_known_server = self._make_connection(
245
+ client_factory, expected_sni=expected_sni
246
+ )
247
+ # check the .well-known request and send a response
248
+ self.assertEqual(len(well_known_server.requests), 1)
249
+ request = well_known_server.requests[0]
250
+ self.assertEqual(
251
+ request.requestHeaders.getRawHeaders(b"user-agent"), [b"test-agent"]
252
+ )
253
+ self._send_well_known_response(request, content, headers=response_headers or {})
254
+ return well_known_server
255
+
256
+ def _send_well_known_response(
257
+ self,
258
+ request: Request,
259
+ content: bytes,
260
+ headers: dict | None = None,
261
+ ) -> None:
262
+ """Check that an incoming request looks like a valid .well-known request, and
263
+ send back the response.
264
+ """
265
+ self.assertEqual(request.method, b"GET")
266
+ self.assertEqual(request.path, b"/.well-known/matrix/server")
267
+ self.assertEqual(request.requestHeaders.getRawHeaders(b"host"), [b"testserv"])
268
+ # send back a response
269
+ for k, v in (headers or {}).items():
270
+ request.setHeader(k, v)
271
+ request.write(content)
272
+ request.finish()
273
+
274
+ self.reactor.pump((0.1,))
275
+
276
+ def _make_agent(self) -> MatrixFederationAgent:
277
+ """
278
+ If a proxy server is set, the MatrixFederationAgent must be created again
279
+ because it is created too early during setUp
280
+ """
281
+ return MatrixFederationAgent(
282
+ server_name="OUR_STUB_HOMESERVER_NAME",
283
+ reactor=cast(ISynapseReactor, self.reactor),
284
+ clock=self.clock,
285
+ tls_client_options_factory=self.tls_factory,
286
+ user_agent=b"test-agent", # Note that this is unused since _well_known_resolver is provided.
287
+ ip_allowlist=IPSet(),
288
+ ip_blocklist=IPSet(),
289
+ proxy_config=parse_proxy_config({}),
290
+ _srv_resolver=self.mock_resolver,
291
+ _well_known_resolver=self.well_known_resolver,
292
+ )
293
+
294
+ def test_get(self) -> None:
295
+ """happy-path test of a GET request with an explicit port"""
296
+ self._do_get()
297
+
298
+ @patch.dict(
299
+ os.environ,
300
+ {"https_proxy": "proxy.com", "no_proxy": "testserv"},
301
+ )
302
+ def test_get_bypass_proxy(self) -> None:
303
+ """test of a GET request with an explicit port and bypass proxy"""
304
+ self._do_get()
305
+
306
+ def _do_get(self) -> None:
307
+ """test of a GET request with an explicit port"""
308
+ self.agent = self._make_agent()
309
+
310
+ self.reactor.lookups["testserv"] = "1.2.3.4"
311
+ test_d = self._make_get_request(b"matrix-federation://testserv:8448/foo/bar")
312
+
313
+ # Nothing happened yet
314
+ self.assertNoResult(test_d)
315
+
316
+ # Make sure treq is trying to connect
317
+ clients = self.reactor.tcpClients
318
+ self.assertEqual(len(clients), 1)
319
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
320
+ self.assertEqual(host, "1.2.3.4")
321
+ self.assertEqual(port, 8448)
322
+
323
+ # make a test server, and wire up the client
324
+ http_server = self._make_connection(client_factory, expected_sni=b"testserv")
325
+
326
+ self.assertEqual(len(http_server.requests), 1)
327
+ request = http_server.requests[0]
328
+ self.assertEqual(request.method, b"GET")
329
+ self.assertEqual(request.path, b"/foo/bar")
330
+ self.assertEqual(
331
+ request.requestHeaders.getRawHeaders(b"host"), [b"testserv:8448"]
332
+ )
333
+ self.assertEqual(
334
+ request.requestHeaders.getRawHeaders(b"user-agent"), [b"test-agent"]
335
+ )
336
+ content = request.content.read()
337
+ self.assertEqual(content, b"")
338
+
339
+ # Deferred is still without a result
340
+ self.assertNoResult(test_d)
341
+
342
+ # send the headers
343
+ request.responseHeaders.setRawHeaders(b"Content-Type", [b"application/json"])
344
+ request.write("")
345
+
346
+ self.reactor.pump((0.1,))
347
+
348
+ response = self.successResultOf(test_d)
349
+
350
+ # that should give us a Response object
351
+ self.assertEqual(response.code, 200)
352
+
353
+ # Send the body
354
+ request.write(b'{ "a": 1 }')
355
+ request.finish()
356
+
357
+ self.reactor.pump((0.1,))
358
+
359
+ # check it can be read
360
+ json = self.successResultOf(treq.json_content(response))
361
+ self.assertEqual(json, {"a": 1})
362
+
363
+ @patch.dict(
364
+ os.environ, {"https_proxy": "http://proxy.com", "no_proxy": "unused.com"}
365
+ )
366
+ def test_get_via_http_proxy(self) -> None:
367
+ """test for federation request through a http proxy"""
368
+ self._do_get_via_proxy(expect_proxy_ssl=False, expected_auth_credentials=None)
369
+
370
+ @patch.dict(
371
+ os.environ,
372
+ {"https_proxy": "http://user:pass@proxy.com", "no_proxy": "unused.com"},
373
+ )
374
+ def test_get_via_http_proxy_with_auth(self) -> None:
375
+ """test for federation request through a http proxy with authentication"""
376
+ self._do_get_via_proxy(
377
+ expect_proxy_ssl=False, expected_auth_credentials=b"user:pass"
378
+ )
379
+
380
+ @patch.dict(
381
+ os.environ, {"https_proxy": "https://proxy.com", "no_proxy": "unused.com"}
382
+ )
383
+ def test_get_via_https_proxy(self) -> None:
384
+ """test for federation request through a https proxy"""
385
+ self._do_get_via_proxy(expect_proxy_ssl=True, expected_auth_credentials=None)
386
+
387
+ @patch.dict(
388
+ os.environ,
389
+ {"https_proxy": "https://user:pass@proxy.com", "no_proxy": "unused.com"},
390
+ )
391
+ def test_get_via_https_proxy_with_auth(self) -> None:
392
+ """test for federation request through a https proxy with authentication"""
393
+ self._do_get_via_proxy(
394
+ expect_proxy_ssl=True, expected_auth_credentials=b"user:pass"
395
+ )
396
+
397
+ def _do_get_via_proxy(
398
+ self,
399
+ expect_proxy_ssl: bool = False,
400
+ expected_auth_credentials: bytes | None = None,
401
+ ) -> None:
402
+ """Send a https federation request via an agent and check that it is correctly
403
+ received at the proxy and client. The proxy can use either http or https.
404
+ Args:
405
+ expect_proxy_ssl: True if we expect the request to connect to the proxy via https.
406
+ expected_auth_credentials: credentials we expect to be presented to authenticate at the proxy
407
+ """
408
+ self.agent = self._make_agent()
409
+
410
+ self.reactor.lookups["testserv"] = "1.2.3.4"
411
+ self.reactor.lookups["proxy.com"] = "9.9.9.9"
412
+ test_d = self._make_get_request(b"matrix-federation://testserv:8448/foo/bar")
413
+
414
+ # Nothing happened yet
415
+ self.assertNoResult(test_d)
416
+
417
+ # Make sure treq is trying to connect
418
+ clients = self.reactor.tcpClients
419
+ self.assertEqual(len(clients), 1)
420
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
421
+ # make sure we are connecting to the proxy
422
+ self.assertEqual(host, "9.9.9.9")
423
+ self.assertEqual(port, 1080)
424
+
425
+ # make a test server to act as the proxy, and wire up the client
426
+ proxy_server = self._make_connection(
427
+ client_factory,
428
+ ssl=expect_proxy_ssl,
429
+ tls_sanlist=[b"DNS:proxy.com"] if expect_proxy_ssl else None,
430
+ expected_sni=b"proxy.com" if expect_proxy_ssl else None,
431
+ )
432
+
433
+ assert isinstance(proxy_server, HTTPChannel)
434
+
435
+ # now there should be a pending CONNECT request
436
+ self.assertEqual(len(proxy_server.requests), 1)
437
+
438
+ request = proxy_server.requests[0]
439
+ self.assertEqual(request.method, b"CONNECT")
440
+ self.assertEqual(request.path, b"testserv:8448")
441
+
442
+ # Check whether auth credentials have been supplied to the proxy
443
+ proxy_auth_header_values = request.requestHeaders.getRawHeaders(
444
+ b"Proxy-Authorization"
445
+ )
446
+
447
+ if expected_auth_credentials is not None:
448
+ # Compute the correct header value for Proxy-Authorization
449
+ encoded_credentials = base64.b64encode(expected_auth_credentials)
450
+ expected_header_value = b"Basic " + encoded_credentials
451
+
452
+ # Validate the header's value
453
+ self.assertIn(expected_header_value, proxy_auth_header_values)
454
+ else:
455
+ # Check that the Proxy-Authorization header has not been supplied to the proxy
456
+ self.assertIsNone(proxy_auth_header_values)
457
+
458
+ # tell the proxy server not to close the connection
459
+ proxy_server.persistent = True
460
+
461
+ request.finish()
462
+
463
+ # now we make another test server to act as the upstream HTTP server.
464
+ server_ssl_protocol = wrap_server_factory_for_tls(
465
+ _get_test_protocol_factory(),
466
+ self.reactor,
467
+ sanlist=[
468
+ b"DNS:testserv",
469
+ b"DNS:target-server",
470
+ b"DNS:xn--bcher-kva.com",
471
+ b"IP:1.2.3.4",
472
+ b"IP:::1",
473
+ ],
474
+ ).buildProtocol(dummy_address)
475
+
476
+ # Tell the HTTP server to send outgoing traffic back via the proxy's transport.
477
+ proxy_server_transport = proxy_server.transport
478
+ assert proxy_server_transport is not None
479
+ server_ssl_protocol.makeConnection(proxy_server_transport)
480
+
481
+ # ... and replace the protocol on the proxy's transport with the
482
+ # TLSMemoryBIOProtocol for the test server, so that incoming traffic
483
+ # to the proxy gets sent over to the HTTP(s) server.
484
+
485
+ # See also comment at `_do_https_request_via_proxy`
486
+ # in ../test_proxyagent.py for more details
487
+ if expect_proxy_ssl:
488
+ assert isinstance(proxy_server_transport, TLSMemoryBIOProtocol)
489
+ proxy_server_transport.wrappedProtocol = server_ssl_protocol
490
+ else:
491
+ assert isinstance(proxy_server_transport, FakeTransport)
492
+ client_protocol = proxy_server_transport.other
493
+ assert isinstance(client_protocol, Protocol)
494
+ c2s_transport = checked_cast(FakeTransport, client_protocol.transport)
495
+ c2s_transport.other = server_ssl_protocol
496
+
497
+ self.reactor.advance(0)
498
+
499
+ server_name = server_ssl_protocol._tlsConnection.get_servername()
500
+ expected_sni = b"testserv"
501
+ self.assertEqual(
502
+ server_name,
503
+ expected_sni,
504
+ f"Expected SNI {expected_sni!s} but got {server_name!s}",
505
+ )
506
+
507
+ # now there should be a pending request
508
+ http_server = server_ssl_protocol.wrappedProtocol
509
+ assert isinstance(http_server, HTTPChannel)
510
+ self.assertEqual(len(http_server.requests), 1)
511
+
512
+ request = http_server.requests[0]
513
+ self.assertEqual(request.method, b"GET")
514
+ self.assertEqual(request.path, b"/foo/bar")
515
+ self.assertEqual(
516
+ request.requestHeaders.getRawHeaders(b"host"), [b"testserv:8448"]
517
+ )
518
+ self.assertEqual(
519
+ request.requestHeaders.getRawHeaders(b"user-agent"), [b"test-agent"]
520
+ )
521
+ # Check that the destination server DID NOT receive proxy credentials
522
+ self.assertIsNone(request.requestHeaders.getRawHeaders(b"Proxy-Authorization"))
523
+ content = request.content.read()
524
+ self.assertEqual(content, b"")
525
+
526
+ # Deferred is still without a result
527
+ self.assertNoResult(test_d)
528
+
529
+ # send the headers
530
+ request.responseHeaders.setRawHeaders(b"Content-Type", [b"application/json"])
531
+ request.write("")
532
+
533
+ self.reactor.pump((0.1,))
534
+
535
+ response = self.successResultOf(test_d)
536
+
537
+ # that should give us a Response object
538
+ self.assertEqual(response.code, 200)
539
+
540
+ # Send the body
541
+ request.write(b'{ "a": 1 }')
542
+ request.finish()
543
+
544
+ self.reactor.pump((0.1,))
545
+
546
+ # check it can be read
547
+ json = self.successResultOf(treq.json_content(response))
548
+ self.assertEqual(json, {"a": 1})
549
+
550
+ def test_get_ip_address(self) -> None:
551
+ """
552
+ Test the behaviour when the server name contains an explicit IP (with no port)
553
+ """
554
+ self.agent = self._make_agent()
555
+
556
+ # there will be a getaddrinfo on the IP
557
+ self.reactor.lookups["1.2.3.4"] = "1.2.3.4"
558
+
559
+ test_d = self._make_get_request(b"matrix-federation://1.2.3.4/foo/bar")
560
+
561
+ # Nothing happened yet
562
+ self.assertNoResult(test_d)
563
+
564
+ # Make sure treq is trying to connect
565
+ clients = self.reactor.tcpClients
566
+ self.assertEqual(len(clients), 1)
567
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
568
+ self.assertEqual(host, "1.2.3.4")
569
+ self.assertEqual(port, 8448)
570
+
571
+ # make a test server, and wire up the client
572
+ http_server = self._make_connection(client_factory, expected_sni=None)
573
+
574
+ self.assertEqual(len(http_server.requests), 1)
575
+ request = http_server.requests[0]
576
+ self.assertEqual(request.method, b"GET")
577
+ self.assertEqual(request.path, b"/foo/bar")
578
+ self.assertEqual(request.requestHeaders.getRawHeaders(b"host"), [b"1.2.3.4"])
579
+
580
+ # finish the request
581
+ request.finish()
582
+ self.reactor.pump((0.1,))
583
+ self.successResultOf(test_d)
584
+
585
+ def test_get_ipv6_address(self) -> None:
586
+ """
587
+ Test the behaviour when the server name contains an explicit IPv6 address
588
+ (with no port)
589
+ """
590
+ self.agent = self._make_agent()
591
+
592
+ # there will be a getaddrinfo on the IP
593
+ self.reactor.lookups["::1"] = "::1"
594
+
595
+ test_d = self._make_get_request(b"matrix-federation://[::1]/foo/bar")
596
+
597
+ # Nothing happened yet
598
+ self.assertNoResult(test_d)
599
+
600
+ # Make sure treq is trying to connect
601
+ clients = self.reactor.tcpClients
602
+ self.assertEqual(len(clients), 1)
603
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
604
+ self.assertEqual(host, "::1")
605
+ self.assertEqual(port, 8448)
606
+
607
+ # make a test server, and wire up the client
608
+ http_server = self._make_connection(client_factory, expected_sni=None)
609
+
610
+ self.assertEqual(len(http_server.requests), 1)
611
+ request = http_server.requests[0]
612
+ self.assertEqual(request.method, b"GET")
613
+ self.assertEqual(request.path, b"/foo/bar")
614
+ self.assertEqual(request.requestHeaders.getRawHeaders(b"host"), [b"[::1]"])
615
+
616
+ # finish the request
617
+ request.finish()
618
+ self.reactor.pump((0.1,))
619
+ self.successResultOf(test_d)
620
+
621
+ def test_get_ipv6_address_with_port(self) -> None:
622
+ """
623
+ Test the behaviour when the server name contains an explicit IPv6 address
624
+ (with explicit port)
625
+ """
626
+ self.agent = self._make_agent()
627
+
628
+ # there will be a getaddrinfo on the IP
629
+ self.reactor.lookups["::1"] = "::1"
630
+
631
+ test_d = self._make_get_request(b"matrix-federation://[::1]:80/foo/bar")
632
+
633
+ # Nothing happened yet
634
+ self.assertNoResult(test_d)
635
+
636
+ # Make sure treq is trying to connect
637
+ clients = self.reactor.tcpClients
638
+ self.assertEqual(len(clients), 1)
639
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
640
+ self.assertEqual(host, "::1")
641
+ self.assertEqual(port, 80)
642
+
643
+ # make a test server, and wire up the client
644
+ http_server = self._make_connection(client_factory, expected_sni=None)
645
+
646
+ self.assertEqual(len(http_server.requests), 1)
647
+ request = http_server.requests[0]
648
+ self.assertEqual(request.method, b"GET")
649
+ self.assertEqual(request.path, b"/foo/bar")
650
+ self.assertEqual(request.requestHeaders.getRawHeaders(b"host"), [b"[::1]:80"])
651
+
652
+ # finish the request
653
+ request.finish()
654
+ self.reactor.pump((0.1,))
655
+ self.successResultOf(test_d)
656
+
657
+ def test_get_hostname_bad_cert(self) -> None:
658
+ """
659
+ Test the behaviour when the certificate on the server doesn't match the hostname
660
+ """
661
+ self.agent = self._make_agent()
662
+
663
+ self.mock_resolver.resolve_service.return_value = []
664
+ self.reactor.lookups["testserv1"] = "1.2.3.4"
665
+
666
+ test_d = self._make_get_request(b"matrix-federation://testserv1/foo/bar")
667
+
668
+ # Nothing happened yet
669
+ self.assertNoResult(test_d)
670
+
671
+ # No SRV record lookup yet
672
+ self.mock_resolver.resolve_service.assert_not_called()
673
+
674
+ # there should be an attempt to connect on port 443 for the .well-known
675
+ clients = self.reactor.tcpClients
676
+ self.assertEqual(len(clients), 1)
677
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
678
+ self.assertEqual(host, "1.2.3.4")
679
+ self.assertEqual(port, 443)
680
+
681
+ # fonx the connection
682
+ client_factory.clientConnectionFailed(None, Exception("nope"))
683
+
684
+ # attemptdelay on the hostnameendpoint is 0.3, so takes that long before the
685
+ # .well-known request fails.
686
+ self.reactor.pump((0.4,))
687
+
688
+ # now there should be two SRV lookups
689
+ self.mock_resolver.resolve_service.assert_has_calls(
690
+ [call(b"_matrix-fed._tcp.testserv1"), call(b"_matrix._tcp.testserv1")]
691
+ )
692
+
693
+ # we should fall back to a direct connection
694
+ self.assertEqual(len(clients), 2)
695
+ (host, port, client_factory, _timeout, _bindAddress) = clients[1]
696
+ self.assertEqual(host, "1.2.3.4")
697
+ self.assertEqual(port, 8448)
698
+
699
+ # make a test server, and wire up the client
700
+ http_server = self._make_connection(client_factory, expected_sni=b"testserv1")
701
+
702
+ # there should be no requests
703
+ self.assertEqual(len(http_server.requests), 0)
704
+
705
+ # ... and the request should have failed
706
+ e = self.failureResultOf(test_d, ResponseNeverReceived)
707
+ failure_reason = e.value.reasons[0]
708
+ self.assertIsInstance(failure_reason.value, VerificationError)
709
+
710
+ def test_get_ip_address_bad_cert(self) -> None:
711
+ """
712
+ Test the behaviour when the server name contains an explicit IP, but
713
+ the server cert doesn't cover it
714
+ """
715
+ self.agent = self._make_agent()
716
+
717
+ # there will be a getaddrinfo on the IP
718
+ self.reactor.lookups["1.2.3.5"] = "1.2.3.5"
719
+
720
+ test_d = self._make_get_request(b"matrix-federation://1.2.3.5/foo/bar")
721
+
722
+ # Nothing happened yet
723
+ self.assertNoResult(test_d)
724
+
725
+ # Make sure treq is trying to connect
726
+ clients = self.reactor.tcpClients
727
+ self.assertEqual(len(clients), 1)
728
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
729
+ self.assertEqual(host, "1.2.3.5")
730
+ self.assertEqual(port, 8448)
731
+
732
+ # make a test server, and wire up the client
733
+ http_server = self._make_connection(client_factory, expected_sni=None)
734
+
735
+ # there should be no requests
736
+ self.assertEqual(len(http_server.requests), 0)
737
+
738
+ # ... and the request should have failed
739
+ e = self.failureResultOf(test_d, ResponseNeverReceived)
740
+ failure_reason = e.value.reasons[0]
741
+ self.assertIsInstance(failure_reason.value, VerificationError)
742
+
743
+ def test_get_no_srv_no_well_known(self) -> None:
744
+ """
745
+ Test the behaviour when the server name has no port, no SRV, and no well-known
746
+ """
747
+ self.agent = self._make_agent()
748
+
749
+ self.mock_resolver.resolve_service.return_value = []
750
+ self.reactor.lookups["testserv"] = "1.2.3.4"
751
+
752
+ test_d = self._make_get_request(b"matrix-federation://testserv/foo/bar")
753
+
754
+ # Nothing happened yet
755
+ self.assertNoResult(test_d)
756
+
757
+ # No SRV record lookup yet
758
+ self.mock_resolver.resolve_service.assert_not_called()
759
+
760
+ # there should be an attempt to connect on port 443 for the .well-known
761
+ clients = self.reactor.tcpClients
762
+ self.assertEqual(len(clients), 1)
763
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
764
+ self.assertEqual(host, "1.2.3.4")
765
+ self.assertEqual(port, 443)
766
+
767
+ # fonx the connection
768
+ client_factory.clientConnectionFailed(None, Exception("nope"))
769
+
770
+ # attemptdelay on the hostnameendpoint is 0.3, so takes that long before the
771
+ # .well-known request fails.
772
+ self.reactor.pump((0.4,))
773
+
774
+ # now there should be two SRV lookups
775
+ self.mock_resolver.resolve_service.assert_has_calls(
776
+ [call(b"_matrix-fed._tcp.testserv"), call(b"_matrix._tcp.testserv")]
777
+ )
778
+
779
+ # we should fall back to a direct connection
780
+ self.assertEqual(len(clients), 2)
781
+ (host, port, client_factory, _timeout, _bindAddress) = clients[1]
782
+ self.assertEqual(host, "1.2.3.4")
783
+ self.assertEqual(port, 8448)
784
+
785
+ # make a test server, and wire up the client
786
+ http_server = self._make_connection(client_factory, expected_sni=b"testserv")
787
+
788
+ self.assertEqual(len(http_server.requests), 1)
789
+ request = http_server.requests[0]
790
+ self.assertEqual(request.method, b"GET")
791
+ self.assertEqual(request.path, b"/foo/bar")
792
+ self.assertEqual(request.requestHeaders.getRawHeaders(b"host"), [b"testserv"])
793
+
794
+ # finish the request
795
+ request.finish()
796
+ self.reactor.pump((0.1,))
797
+ self.successResultOf(test_d)
798
+
799
+ def test_get_well_known(self) -> None:
800
+ """Test the behaviour when the .well-known delegates elsewhere"""
801
+ self.agent = self._make_agent()
802
+
803
+ self.mock_resolver.resolve_service.return_value = []
804
+ self.reactor.lookups["testserv"] = "1.2.3.4"
805
+ self.reactor.lookups["target-server"] = "1::f"
806
+
807
+ test_d = self._make_get_request(b"matrix-federation://testserv/foo/bar")
808
+
809
+ # Nothing happened yet
810
+ self.assertNoResult(test_d)
811
+
812
+ # there should be an attempt to connect on port 443 for the .well-known
813
+ clients = self.reactor.tcpClients
814
+ self.assertEqual(len(clients), 1)
815
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
816
+ self.assertEqual(host, "1.2.3.4")
817
+ self.assertEqual(port, 443)
818
+
819
+ self._handle_well_known_connection(
820
+ client_factory,
821
+ expected_sni=b"testserv",
822
+ content=b'{ "m.server": "target-server" }',
823
+ )
824
+
825
+ # there should be two SRV lookups
826
+ self.mock_resolver.resolve_service.assert_has_calls(
827
+ [
828
+ call(b"_matrix-fed._tcp.target-server"),
829
+ call(b"_matrix._tcp.target-server"),
830
+ ]
831
+ )
832
+
833
+ # now we should get a connection to the target server
834
+ self.assertEqual(len(clients), 2)
835
+ (host, port, client_factory, _timeout, _bindAddress) = clients[1]
836
+ self.assertEqual(host, "1::f")
837
+ self.assertEqual(port, 8448)
838
+
839
+ # make a test server, and wire up the client
840
+ http_server = self._make_connection(
841
+ client_factory, expected_sni=b"target-server"
842
+ )
843
+
844
+ self.assertEqual(len(http_server.requests), 1)
845
+ request = http_server.requests[0]
846
+ self.assertEqual(request.method, b"GET")
847
+ self.assertEqual(request.path, b"/foo/bar")
848
+ self.assertEqual(
849
+ request.requestHeaders.getRawHeaders(b"host"), [b"target-server"]
850
+ )
851
+
852
+ # finish the request
853
+ request.finish()
854
+ self.reactor.pump((0.1,))
855
+ self.successResultOf(test_d)
856
+
857
+ self.assertEqual(self.well_known_cache[b"testserv"], b"target-server")
858
+
859
+ # check the cache expires
860
+ self.reactor.pump((48 * 3600,))
861
+ self.well_known_cache.expire()
862
+ self.assertNotIn(b"testserv", self.well_known_cache)
863
+
864
+ def test_get_well_known_redirect(self) -> None:
865
+ """Test the behaviour when the server name has no port and no SRV record, but
866
+ the .well-known has a 300 redirect
867
+ """
868
+ self.agent = self._make_agent()
869
+
870
+ self.mock_resolver.resolve_service.return_value = []
871
+ self.reactor.lookups["testserv"] = "1.2.3.4"
872
+ self.reactor.lookups["target-server"] = "1::f"
873
+
874
+ test_d = self._make_get_request(b"matrix-federation://testserv/foo/bar")
875
+
876
+ # Nothing happened yet
877
+ self.assertNoResult(test_d)
878
+
879
+ # there should be an attempt to connect on port 443 for the .well-known
880
+ clients = self.reactor.tcpClients
881
+ self.assertEqual(len(clients), 1)
882
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop()
883
+ self.assertEqual(host, "1.2.3.4")
884
+ self.assertEqual(port, 443)
885
+
886
+ redirect_server = self._make_connection(
887
+ client_factory, expected_sni=b"testserv"
888
+ )
889
+
890
+ # send a 302 redirect
891
+ self.assertEqual(len(redirect_server.requests), 1)
892
+ request = redirect_server.requests[0]
893
+ request.redirect(b"https://testserv/even_better_known")
894
+ request.finish()
895
+
896
+ self.reactor.pump((0.1,))
897
+
898
+ # now there should be another connection
899
+ clients = self.reactor.tcpClients
900
+ self.assertEqual(len(clients), 1)
901
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop()
902
+ self.assertEqual(host, "1.2.3.4")
903
+ self.assertEqual(port, 443)
904
+
905
+ well_known_server = self._make_connection(
906
+ client_factory, expected_sni=b"testserv"
907
+ )
908
+
909
+ self.assertEqual(len(well_known_server.requests), 1, "No request after 302")
910
+ request = well_known_server.requests[0]
911
+ self.assertEqual(request.method, b"GET")
912
+ self.assertEqual(request.path, b"/even_better_known")
913
+ request.write(b'{ "m.server": "target-server" }')
914
+ request.finish()
915
+
916
+ self.reactor.pump((0.1,))
917
+
918
+ # there should be two SRV lookups
919
+ self.mock_resolver.resolve_service.assert_has_calls(
920
+ [
921
+ call(b"_matrix-fed._tcp.target-server"),
922
+ call(b"_matrix._tcp.target-server"),
923
+ ]
924
+ )
925
+
926
+ # now we should get a connection to the target server
927
+ self.assertEqual(len(clients), 1)
928
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
929
+ self.assertEqual(host, "1::f")
930
+ self.assertEqual(port, 8448)
931
+
932
+ # make a test server, and wire up the client
933
+ http_server = self._make_connection(
934
+ client_factory, expected_sni=b"target-server"
935
+ )
936
+
937
+ self.assertEqual(len(http_server.requests), 1)
938
+ request = http_server.requests[0]
939
+ self.assertEqual(request.method, b"GET")
940
+ self.assertEqual(request.path, b"/foo/bar")
941
+ self.assertEqual(
942
+ request.requestHeaders.getRawHeaders(b"host"), [b"target-server"]
943
+ )
944
+
945
+ # finish the request
946
+ request.finish()
947
+ self.reactor.pump((0.1,))
948
+ self.successResultOf(test_d)
949
+
950
+ self.assertEqual(self.well_known_cache[b"testserv"], b"target-server")
951
+
952
+ # check the cache expires
953
+ self.reactor.pump((48 * 3600,))
954
+ self.well_known_cache.expire()
955
+ self.assertNotIn(b"testserv", self.well_known_cache)
956
+
957
+ def test_get_invalid_well_known(self) -> None:
958
+ """
959
+ Test the behaviour when the server name has an *invalid* well-known (and no SRV)
960
+ """
961
+ self.agent = self._make_agent()
962
+
963
+ self.mock_resolver.resolve_service.return_value = []
964
+ self.reactor.lookups["testserv"] = "1.2.3.4"
965
+
966
+ test_d = self._make_get_request(b"matrix-federation://testserv/foo/bar")
967
+
968
+ # Nothing happened yet
969
+ self.assertNoResult(test_d)
970
+
971
+ # No SRV record lookup yet
972
+ self.mock_resolver.resolve_service.assert_not_called()
973
+
974
+ # there should be an attempt to connect on port 443 for the .well-known
975
+ clients = self.reactor.tcpClients
976
+ self.assertEqual(len(clients), 1)
977
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop()
978
+ self.assertEqual(host, "1.2.3.4")
979
+ self.assertEqual(port, 443)
980
+
981
+ self._handle_well_known_connection(
982
+ client_factory, expected_sni=b"testserv", content=b"NOT JSON"
983
+ )
984
+
985
+ # now there should be two SRV lookups
986
+ self.mock_resolver.resolve_service.assert_has_calls(
987
+ [call(b"_matrix-fed._tcp.testserv"), call(b"_matrix._tcp.testserv")]
988
+ )
989
+
990
+ # we should fall back to a direct connection
991
+ self.assertEqual(len(clients), 1)
992
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop()
993
+ self.assertEqual(host, "1.2.3.4")
994
+ self.assertEqual(port, 8448)
995
+
996
+ # make a test server, and wire up the client
997
+ http_server = self._make_connection(client_factory, expected_sni=b"testserv")
998
+
999
+ self.assertEqual(len(http_server.requests), 1)
1000
+ request = http_server.requests[0]
1001
+ self.assertEqual(request.method, b"GET")
1002
+ self.assertEqual(request.path, b"/foo/bar")
1003
+ self.assertEqual(request.requestHeaders.getRawHeaders(b"host"), [b"testserv"])
1004
+
1005
+ # finish the request
1006
+ request.finish()
1007
+ self.reactor.pump((0.1,))
1008
+ self.successResultOf(test_d)
1009
+
1010
+ def test_get_well_known_unsigned_cert(self) -> None:
1011
+ """Test the behaviour when the .well-known server presents a cert
1012
+ not signed by a CA
1013
+ """
1014
+
1015
+ # we use the same test server as the other tests, but use an agent with
1016
+ # the config left to the default, which will not trust it (since the
1017
+ # presented cert is signed by a test CA)
1018
+
1019
+ self.mock_resolver.resolve_service.return_value = []
1020
+ self.reactor.lookups["testserv"] = "1.2.3.4"
1021
+
1022
+ config = default_config("test", parse=True)
1023
+
1024
+ # Build a new agent and WellKnownResolver with a different tls factory
1025
+ tls_factory = FederationPolicyForHTTPS(config)
1026
+ agent = MatrixFederationAgent(
1027
+ server_name="OUR_STUB_HOMESERVER_NAME",
1028
+ reactor=self.reactor,
1029
+ clock=self.clock,
1030
+ tls_client_options_factory=tls_factory,
1031
+ user_agent=b"test-agent", # This is unused since _well_known_resolver is passed below.
1032
+ ip_allowlist=IPSet(),
1033
+ ip_blocklist=IPSet(),
1034
+ proxy_config=None,
1035
+ _srv_resolver=self.mock_resolver,
1036
+ _well_known_resolver=WellKnownResolver(
1037
+ server_name="OUR_STUB_HOMESERVER_NAME",
1038
+ reactor=cast(ISynapseReactor, self.reactor),
1039
+ clock=self.clock,
1040
+ agent=Agent(self.reactor, contextFactory=tls_factory),
1041
+ user_agent=b"test-agent",
1042
+ well_known_cache=self.well_known_cache,
1043
+ had_well_known_cache=self.had_well_known_cache,
1044
+ ),
1045
+ )
1046
+
1047
+ test_d = agent.request(b"GET", b"matrix-federation://testserv/foo/bar")
1048
+
1049
+ # Nothing happened yet
1050
+ self.assertNoResult(test_d)
1051
+
1052
+ # there should be an attempt to connect on port 443 for the .well-known
1053
+ clients = self.reactor.tcpClients
1054
+ self.assertEqual(len(clients), 1)
1055
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
1056
+ self.assertEqual(host, "1.2.3.4")
1057
+ self.assertEqual(port, 443)
1058
+
1059
+ http_proto = self._make_connection(client_factory, expected_sni=b"testserv")
1060
+
1061
+ # there should be no requests
1062
+ self.assertEqual(len(http_proto.requests), 0)
1063
+
1064
+ # and there should be two SRV lookups instead
1065
+ self.mock_resolver.resolve_service.assert_has_calls(
1066
+ [call(b"_matrix-fed._tcp.testserv"), call(b"_matrix._tcp.testserv")]
1067
+ )
1068
+
1069
+ def test_get_hostname_srv(self) -> None:
1070
+ """
1071
+ Test the behaviour when there is a single SRV record for _matrix-fed.
1072
+ """
1073
+ self.agent = self._make_agent()
1074
+
1075
+ self.mock_resolver.resolve_service.return_value = [
1076
+ Server(host=b"srvtarget", port=8443)
1077
+ ]
1078
+ self.reactor.lookups["srvtarget"] = "1.2.3.4"
1079
+
1080
+ test_d = self._make_get_request(b"matrix-federation://testserv/foo/bar")
1081
+
1082
+ # Nothing happened yet
1083
+ self.assertNoResult(test_d)
1084
+
1085
+ # the request for a .well-known will have failed with a DNS lookup error.
1086
+ self.mock_resolver.resolve_service.assert_called_once_with(
1087
+ b"_matrix-fed._tcp.testserv"
1088
+ )
1089
+
1090
+ # Make sure treq is trying to connect
1091
+ clients = self.reactor.tcpClients
1092
+ self.assertEqual(len(clients), 1)
1093
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
1094
+ self.assertEqual(host, "1.2.3.4")
1095
+ self.assertEqual(port, 8443)
1096
+
1097
+ # make a test server, and wire up the client
1098
+ http_server = self._make_connection(client_factory, expected_sni=b"testserv")
1099
+
1100
+ self.assertEqual(len(http_server.requests), 1)
1101
+ request = http_server.requests[0]
1102
+ self.assertEqual(request.method, b"GET")
1103
+ self.assertEqual(request.path, b"/foo/bar")
1104
+ self.assertEqual(request.requestHeaders.getRawHeaders(b"host"), [b"testserv"])
1105
+
1106
+ # finish the request
1107
+ request.finish()
1108
+ self.reactor.pump((0.1,))
1109
+ self.successResultOf(test_d)
1110
+
1111
+ def test_get_hostname_srv_legacy(self) -> None:
1112
+ """
1113
+ Test the behaviour when there is a single SRV record for _matrix.
1114
+ """
1115
+ self.agent = self._make_agent()
1116
+
1117
+ # Return no entries for the _matrix-fed lookup, and a response for _matrix.
1118
+ self.mock_resolver.resolve_service.side_effect = [
1119
+ [],
1120
+ [Server(host=b"srvtarget", port=8443)],
1121
+ ]
1122
+ self.reactor.lookups["srvtarget"] = "1.2.3.4"
1123
+
1124
+ test_d = self._make_get_request(b"matrix-federation://testserv/foo/bar")
1125
+
1126
+ # Nothing happened yet
1127
+ self.assertNoResult(test_d)
1128
+
1129
+ # the request for a .well-known will have failed with a DNS lookup error.
1130
+ self.mock_resolver.resolve_service.assert_has_calls(
1131
+ [call(b"_matrix-fed._tcp.testserv"), call(b"_matrix._tcp.testserv")]
1132
+ )
1133
+
1134
+ # Make sure treq is trying to connect
1135
+ clients = self.reactor.tcpClients
1136
+ self.assertEqual(len(clients), 1)
1137
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
1138
+ self.assertEqual(host, "1.2.3.4")
1139
+ self.assertEqual(port, 8443)
1140
+
1141
+ # make a test server, and wire up the client
1142
+ http_server = self._make_connection(client_factory, expected_sni=b"testserv")
1143
+
1144
+ self.assertEqual(len(http_server.requests), 1)
1145
+ request = http_server.requests[0]
1146
+ self.assertEqual(request.method, b"GET")
1147
+ self.assertEqual(request.path, b"/foo/bar")
1148
+ self.assertEqual(request.requestHeaders.getRawHeaders(b"host"), [b"testserv"])
1149
+
1150
+ # finish the request
1151
+ request.finish()
1152
+ self.reactor.pump((0.1,))
1153
+ self.successResultOf(test_d)
1154
+
1155
+ def test_get_well_known_srv(self) -> None:
1156
+ """Test the behaviour when the .well-known redirects to a place where there
1157
+ is a _matrix-fed SRV record.
1158
+ """
1159
+ self.agent = self._make_agent()
1160
+
1161
+ self.reactor.lookups["testserv"] = "1.2.3.4"
1162
+ self.reactor.lookups["srvtarget"] = "5.6.7.8"
1163
+
1164
+ test_d = self._make_get_request(b"matrix-federation://testserv/foo/bar")
1165
+
1166
+ # Nothing happened yet
1167
+ self.assertNoResult(test_d)
1168
+
1169
+ # there should be an attempt to connect on port 443 for the .well-known
1170
+ clients = self.reactor.tcpClients
1171
+ self.assertEqual(len(clients), 1)
1172
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
1173
+ self.assertEqual(host, "1.2.3.4")
1174
+ self.assertEqual(port, 443)
1175
+
1176
+ self.mock_resolver.resolve_service.return_value = [
1177
+ Server(host=b"srvtarget", port=8443)
1178
+ ]
1179
+
1180
+ self._handle_well_known_connection(
1181
+ client_factory,
1182
+ expected_sni=b"testserv",
1183
+ content=b'{ "m.server": "target-server" }',
1184
+ )
1185
+
1186
+ # there should be a SRV lookup
1187
+ self.mock_resolver.resolve_service.assert_called_once_with(
1188
+ b"_matrix-fed._tcp.target-server"
1189
+ )
1190
+
1191
+ # now we should get a connection to the target of the SRV record
1192
+ self.assertEqual(len(clients), 2)
1193
+ (host, port, client_factory, _timeout, _bindAddress) = clients[1]
1194
+ self.assertEqual(host, "5.6.7.8")
1195
+ self.assertEqual(port, 8443)
1196
+
1197
+ # make a test server, and wire up the client
1198
+ http_server = self._make_connection(
1199
+ client_factory, expected_sni=b"target-server"
1200
+ )
1201
+
1202
+ self.assertEqual(len(http_server.requests), 1)
1203
+ request = http_server.requests[0]
1204
+ self.assertEqual(request.method, b"GET")
1205
+ self.assertEqual(request.path, b"/foo/bar")
1206
+ self.assertEqual(
1207
+ request.requestHeaders.getRawHeaders(b"host"), [b"target-server"]
1208
+ )
1209
+
1210
+ # finish the request
1211
+ request.finish()
1212
+ self.reactor.pump((0.1,))
1213
+ self.successResultOf(test_d)
1214
+
1215
+ def test_get_well_known_srv_legacy(self) -> None:
1216
+ """Test the behaviour when the .well-known redirects to a place where there
1217
+ is a _matrix SRV record.
1218
+ """
1219
+ self.agent = self._make_agent()
1220
+
1221
+ self.reactor.lookups["testserv"] = "1.2.3.4"
1222
+ self.reactor.lookups["srvtarget"] = "5.6.7.8"
1223
+
1224
+ test_d = self._make_get_request(b"matrix-federation://testserv/foo/bar")
1225
+
1226
+ # Nothing happened yet
1227
+ self.assertNoResult(test_d)
1228
+
1229
+ # there should be an attempt to connect on port 443 for the .well-known
1230
+ clients = self.reactor.tcpClients
1231
+ self.assertEqual(len(clients), 1)
1232
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
1233
+ self.assertEqual(host, "1.2.3.4")
1234
+ self.assertEqual(port, 443)
1235
+
1236
+ # Return no entries for the _matrix-fed lookup, and a response for _matrix.
1237
+ self.mock_resolver.resolve_service.side_effect = [
1238
+ [],
1239
+ [Server(host=b"srvtarget", port=8443)],
1240
+ ]
1241
+
1242
+ self._handle_well_known_connection(
1243
+ client_factory,
1244
+ expected_sni=b"testserv",
1245
+ content=b'{ "m.server": "target-server" }',
1246
+ )
1247
+
1248
+ # there should be two SRV lookups
1249
+ self.mock_resolver.resolve_service.assert_has_calls(
1250
+ [
1251
+ call(b"_matrix-fed._tcp.target-server"),
1252
+ call(b"_matrix._tcp.target-server"),
1253
+ ]
1254
+ )
1255
+
1256
+ # now we should get a connection to the target of the SRV record
1257
+ self.assertEqual(len(clients), 2)
1258
+ (host, port, client_factory, _timeout, _bindAddress) = clients[1]
1259
+ self.assertEqual(host, "5.6.7.8")
1260
+ self.assertEqual(port, 8443)
1261
+
1262
+ # make a test server, and wire up the client
1263
+ http_server = self._make_connection(
1264
+ client_factory, expected_sni=b"target-server"
1265
+ )
1266
+
1267
+ self.assertEqual(len(http_server.requests), 1)
1268
+ request = http_server.requests[0]
1269
+ self.assertEqual(request.method, b"GET")
1270
+ self.assertEqual(request.path, b"/foo/bar")
1271
+ self.assertEqual(
1272
+ request.requestHeaders.getRawHeaders(b"host"), [b"target-server"]
1273
+ )
1274
+
1275
+ # finish the request
1276
+ request.finish()
1277
+ self.reactor.pump((0.1,))
1278
+ self.successResultOf(test_d)
1279
+
1280
+ def test_idna_servername(self) -> None:
1281
+ """test the behaviour when the server name has idna chars in"""
1282
+ self.agent = self._make_agent()
1283
+
1284
+ self.mock_resolver.resolve_service.return_value = []
1285
+
1286
+ # the resolver is always called with the IDNA hostname as a native string.
1287
+ self.reactor.lookups["xn--bcher-kva.com"] = "1.2.3.4"
1288
+
1289
+ # this is idna for bücher.com
1290
+ test_d = self._make_get_request(
1291
+ b"matrix-federation://xn--bcher-kva.com/foo/bar"
1292
+ )
1293
+
1294
+ # Nothing happened yet
1295
+ self.assertNoResult(test_d)
1296
+
1297
+ # No SRV record lookup yet
1298
+ self.mock_resolver.resolve_service.assert_not_called()
1299
+
1300
+ # there should be an attempt to connect on port 443 for the .well-known
1301
+ clients = self.reactor.tcpClients
1302
+ self.assertEqual(len(clients), 1)
1303
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
1304
+ self.assertEqual(host, "1.2.3.4")
1305
+ self.assertEqual(port, 443)
1306
+
1307
+ # fonx the connection
1308
+ client_factory.clientConnectionFailed(None, Exception("nope"))
1309
+
1310
+ # attemptdelay on the hostnameendpoint is 0.3, so takes that long before the
1311
+ # .well-known request fails.
1312
+ self.reactor.pump((0.4,))
1313
+
1314
+ # now there should have been a SRV lookup
1315
+ self.mock_resolver.resolve_service.assert_has_calls(
1316
+ [
1317
+ call(b"_matrix-fed._tcp.xn--bcher-kva.com"),
1318
+ call(b"_matrix._tcp.xn--bcher-kva.com"),
1319
+ ]
1320
+ )
1321
+
1322
+ # We should fall back to port 8448
1323
+ clients = self.reactor.tcpClients
1324
+ self.assertEqual(len(clients), 2)
1325
+ (host, port, client_factory, _timeout, _bindAddress) = clients[1]
1326
+ self.assertEqual(host, "1.2.3.4")
1327
+ self.assertEqual(port, 8448)
1328
+
1329
+ # make a test server, and wire up the client
1330
+ http_server = self._make_connection(
1331
+ client_factory, expected_sni=b"xn--bcher-kva.com"
1332
+ )
1333
+
1334
+ self.assertEqual(len(http_server.requests), 1)
1335
+ request = http_server.requests[0]
1336
+ self.assertEqual(request.method, b"GET")
1337
+ self.assertEqual(request.path, b"/foo/bar")
1338
+ self.assertEqual(
1339
+ request.requestHeaders.getRawHeaders(b"host"), [b"xn--bcher-kva.com"]
1340
+ )
1341
+
1342
+ # finish the request
1343
+ request.finish()
1344
+ self.reactor.pump((0.1,))
1345
+ self.successResultOf(test_d)
1346
+
1347
+ def test_idna_srv_target(self) -> None:
1348
+ """test the behaviour when the target of a _matrix-fed SRV record has idna chars"""
1349
+ self.agent = self._make_agent()
1350
+
1351
+ self.mock_resolver.resolve_service.return_value = [
1352
+ Server(host=b"xn--trget-3qa.com", port=8443)
1353
+ ] # târget.com
1354
+ self.reactor.lookups["xn--trget-3qa.com"] = "1.2.3.4"
1355
+
1356
+ test_d = self._make_get_request(
1357
+ b"matrix-federation://xn--bcher-kva.com/foo/bar"
1358
+ )
1359
+
1360
+ # Nothing happened yet
1361
+ self.assertNoResult(test_d)
1362
+
1363
+ self.mock_resolver.resolve_service.assert_called_once_with(
1364
+ b"_matrix-fed._tcp.xn--bcher-kva.com"
1365
+ )
1366
+
1367
+ # Make sure treq is trying to connect
1368
+ clients = self.reactor.tcpClients
1369
+ self.assertEqual(len(clients), 1)
1370
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
1371
+ self.assertEqual(host, "1.2.3.4")
1372
+ self.assertEqual(port, 8443)
1373
+
1374
+ # make a test server, and wire up the client
1375
+ http_server = self._make_connection(
1376
+ client_factory, expected_sni=b"xn--bcher-kva.com"
1377
+ )
1378
+
1379
+ self.assertEqual(len(http_server.requests), 1)
1380
+ request = http_server.requests[0]
1381
+ self.assertEqual(request.method, b"GET")
1382
+ self.assertEqual(request.path, b"/foo/bar")
1383
+ self.assertEqual(
1384
+ request.requestHeaders.getRawHeaders(b"host"), [b"xn--bcher-kva.com"]
1385
+ )
1386
+
1387
+ # finish the request
1388
+ request.finish()
1389
+ self.reactor.pump((0.1,))
1390
+ self.successResultOf(test_d)
1391
+
1392
+ def test_idna_srv_target_legacy(self) -> None:
1393
+ """test the behaviour when the target of a _matrix SRV record has idna chars"""
1394
+ self.agent = self._make_agent()
1395
+
1396
+ # Return no entries for the _matrix-fed lookup, and a response for _matrix.
1397
+ self.mock_resolver.resolve_service.side_effect = [
1398
+ [],
1399
+ [Server(host=b"xn--trget-3qa.com", port=8443)],
1400
+ ] # târget.com
1401
+ self.reactor.lookups["xn--trget-3qa.com"] = "1.2.3.4"
1402
+
1403
+ test_d = self._make_get_request(
1404
+ b"matrix-federation://xn--bcher-kva.com/foo/bar"
1405
+ )
1406
+
1407
+ # Nothing happened yet
1408
+ self.assertNoResult(test_d)
1409
+
1410
+ self.mock_resolver.resolve_service.assert_has_calls(
1411
+ [
1412
+ call(b"_matrix-fed._tcp.xn--bcher-kva.com"),
1413
+ call(b"_matrix._tcp.xn--bcher-kva.com"),
1414
+ ]
1415
+ )
1416
+
1417
+ # Make sure treq is trying to connect
1418
+ clients = self.reactor.tcpClients
1419
+ self.assertEqual(len(clients), 1)
1420
+ (host, port, client_factory, _timeout, _bindAddress) = clients[0]
1421
+ self.assertEqual(host, "1.2.3.4")
1422
+ self.assertEqual(port, 8443)
1423
+
1424
+ # make a test server, and wire up the client
1425
+ http_server = self._make_connection(
1426
+ client_factory, expected_sni=b"xn--bcher-kva.com"
1427
+ )
1428
+
1429
+ self.assertEqual(len(http_server.requests), 1)
1430
+ request = http_server.requests[0]
1431
+ self.assertEqual(request.method, b"GET")
1432
+ self.assertEqual(request.path, b"/foo/bar")
1433
+ self.assertEqual(
1434
+ request.requestHeaders.getRawHeaders(b"host"), [b"xn--bcher-kva.com"]
1435
+ )
1436
+
1437
+ # finish the request
1438
+ request.finish()
1439
+ self.reactor.pump((0.1,))
1440
+ self.successResultOf(test_d)
1441
+
1442
+ def test_well_known_cache(self) -> None:
1443
+ self.reactor.lookups["testserv"] = "1.2.3.4"
1444
+
1445
+ fetch_d = defer.ensureDeferred(
1446
+ self.well_known_resolver.get_well_known(b"testserv")
1447
+ )
1448
+
1449
+ # there should be an attempt to connect on port 443 for the .well-known
1450
+ clients = self.reactor.tcpClients
1451
+ self.assertEqual(len(clients), 1)
1452
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop(0)
1453
+ self.assertEqual(host, "1.2.3.4")
1454
+ self.assertEqual(port, 443)
1455
+
1456
+ well_known_server = self._handle_well_known_connection(
1457
+ client_factory,
1458
+ expected_sni=b"testserv",
1459
+ response_headers={b"Cache-Control": b"max-age=1000"},
1460
+ content=b'{ "m.server": "target-server" }',
1461
+ )
1462
+
1463
+ r = self.successResultOf(fetch_d)
1464
+ self.assertEqual(r.delegated_server, b"target-server")
1465
+
1466
+ # close the tcp connection
1467
+ well_known_server.loseConnection()
1468
+
1469
+ # repeat the request: it should hit the cache
1470
+ fetch_d = defer.ensureDeferred(
1471
+ self.well_known_resolver.get_well_known(b"testserv")
1472
+ )
1473
+ r = self.successResultOf(fetch_d)
1474
+ self.assertEqual(r.delegated_server, b"target-server")
1475
+
1476
+ # expire the cache
1477
+ self.reactor.pump((1000.0,))
1478
+
1479
+ # now it should connect again
1480
+ fetch_d = defer.ensureDeferred(
1481
+ self.well_known_resolver.get_well_known(b"testserv")
1482
+ )
1483
+
1484
+ self.assertEqual(len(clients), 1)
1485
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop(0)
1486
+ self.assertEqual(host, "1.2.3.4")
1487
+ self.assertEqual(port, 443)
1488
+
1489
+ self._handle_well_known_connection(
1490
+ client_factory,
1491
+ expected_sni=b"testserv",
1492
+ content=b'{ "m.server": "other-server" }',
1493
+ )
1494
+
1495
+ r = self.successResultOf(fetch_d)
1496
+ self.assertEqual(r.delegated_server, b"other-server")
1497
+
1498
+ def test_well_known_cache_with_temp_failure(self) -> None:
1499
+ """Test that we refetch well-known before the cache expires, and that
1500
+ it ignores transient errors.
1501
+ """
1502
+
1503
+ self.reactor.lookups["testserv"] = "1.2.3.4"
1504
+
1505
+ fetch_d = defer.ensureDeferred(
1506
+ self.well_known_resolver.get_well_known(b"testserv")
1507
+ )
1508
+
1509
+ # there should be an attempt to connect on port 443 for the .well-known
1510
+ clients = self.reactor.tcpClients
1511
+ self.assertEqual(len(clients), 1)
1512
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop(0)
1513
+ self.assertEqual(host, "1.2.3.4")
1514
+ self.assertEqual(port, 443)
1515
+
1516
+ well_known_server = self._handle_well_known_connection(
1517
+ client_factory,
1518
+ expected_sni=b"testserv",
1519
+ response_headers={b"Cache-Control": b"max-age=1000"},
1520
+ content=b'{ "m.server": "target-server" }',
1521
+ )
1522
+
1523
+ r = self.successResultOf(fetch_d)
1524
+ self.assertEqual(r.delegated_server, b"target-server")
1525
+
1526
+ # close the tcp connection
1527
+ well_known_server.loseConnection()
1528
+
1529
+ # Get close to the cache expiry, this will cause the resolver to do
1530
+ # another lookup.
1531
+ self.reactor.pump((900.0,))
1532
+
1533
+ fetch_d = defer.ensureDeferred(
1534
+ self.well_known_resolver.get_well_known(b"testserv")
1535
+ )
1536
+
1537
+ # The resolver may retry a few times, so fonx all requests that come along
1538
+ attempts = 0
1539
+ while self.reactor.tcpClients:
1540
+ clients = self.reactor.tcpClients
1541
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop(0)
1542
+
1543
+ attempts += 1
1544
+
1545
+ # fonx the connection attempt, this will be treated as a temporary
1546
+ # failure.
1547
+ client_factory.clientConnectionFailed(None, Exception("nope"))
1548
+
1549
+ # There's a few sleeps involved, so we have to pump the reactor a
1550
+ # bit.
1551
+ self.reactor.pump((1.0, 1.0))
1552
+
1553
+ # We expect to see more than one attempt as there was previously a valid
1554
+ # well known.
1555
+ self.assertGreater(attempts, 1)
1556
+
1557
+ # Resolver should return cached value, despite the lookup failing.
1558
+ r = self.successResultOf(fetch_d)
1559
+ self.assertEqual(r.delegated_server, b"target-server")
1560
+
1561
+ # Expire both caches and repeat the request
1562
+ self.reactor.pump((10000.0,))
1563
+
1564
+ # Repeat the request, this time it should fail if the lookup fails.
1565
+ fetch_d = defer.ensureDeferred(
1566
+ self.well_known_resolver.get_well_known(b"testserv")
1567
+ )
1568
+
1569
+ clients = self.reactor.tcpClients
1570
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop(0)
1571
+ client_factory.clientConnectionFailed(None, Exception("nope"))
1572
+ self.reactor.pump((0.4,))
1573
+
1574
+ r = self.successResultOf(fetch_d)
1575
+ self.assertEqual(r.delegated_server, None)
1576
+
1577
+ def test_well_known_too_large(self) -> None:
1578
+ """A well-known query that returns a result which is too large should be rejected."""
1579
+ self.reactor.lookups["testserv"] = "1.2.3.4"
1580
+
1581
+ fetch_d = defer.ensureDeferred(
1582
+ self.well_known_resolver.get_well_known(b"testserv")
1583
+ )
1584
+
1585
+ # there should be an attempt to connect on port 443 for the .well-known
1586
+ clients = self.reactor.tcpClients
1587
+ self.assertEqual(len(clients), 1)
1588
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop(0)
1589
+ self.assertEqual(host, "1.2.3.4")
1590
+ self.assertEqual(port, 443)
1591
+
1592
+ self._handle_well_known_connection(
1593
+ client_factory,
1594
+ expected_sni=b"testserv",
1595
+ response_headers={b"Cache-Control": b"max-age=1000"},
1596
+ content=b'{ "m.server": "' + (b"a" * WELL_KNOWN_MAX_SIZE) + b'" }',
1597
+ )
1598
+
1599
+ # The result is successful, but disabled delegation.
1600
+ r = self.successResultOf(fetch_d)
1601
+ self.assertIsNone(r.delegated_server)
1602
+
1603
+ def test_srv_fallbacks(self) -> None:
1604
+ """Test that other SRV results are tried if the first one fails for _matrix-fed SRV."""
1605
+ self.agent = self._make_agent()
1606
+
1607
+ self.mock_resolver.resolve_service.return_value = [
1608
+ Server(host=b"target.com", port=8443),
1609
+ Server(host=b"target.com", port=8444),
1610
+ ]
1611
+ self.reactor.lookups["target.com"] = "1.2.3.4"
1612
+
1613
+ test_d = self._make_get_request(b"matrix-federation://testserv/foo/bar")
1614
+
1615
+ # Nothing happened yet
1616
+ self.assertNoResult(test_d)
1617
+
1618
+ self.mock_resolver.resolve_service.assert_called_once_with(
1619
+ b"_matrix-fed._tcp.testserv"
1620
+ )
1621
+
1622
+ # We should see an attempt to connect to the first server
1623
+ clients = self.reactor.tcpClients
1624
+ self.assertEqual(len(clients), 1)
1625
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop(0)
1626
+ self.assertEqual(host, "1.2.3.4")
1627
+ self.assertEqual(port, 8443)
1628
+
1629
+ # Fonx the connection
1630
+ client_factory.clientConnectionFailed(None, Exception("nope"))
1631
+
1632
+ # There's a 300ms delay in HostnameEndpoint
1633
+ self.reactor.pump((0.4,))
1634
+
1635
+ # Hasn't failed yet
1636
+ self.assertNoResult(test_d)
1637
+
1638
+ # We shouldnow see an attempt to connect to the second server
1639
+ clients = self.reactor.tcpClients
1640
+ self.assertEqual(len(clients), 1)
1641
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop(0)
1642
+ self.assertEqual(host, "1.2.3.4")
1643
+ self.assertEqual(port, 8444)
1644
+
1645
+ # make a test server, and wire up the client
1646
+ http_server = self._make_connection(client_factory, expected_sni=b"testserv")
1647
+
1648
+ self.assertEqual(len(http_server.requests), 1)
1649
+ request = http_server.requests[0]
1650
+ self.assertEqual(request.method, b"GET")
1651
+ self.assertEqual(request.path, b"/foo/bar")
1652
+ self.assertEqual(request.requestHeaders.getRawHeaders(b"host"), [b"testserv"])
1653
+
1654
+ # finish the request
1655
+ request.finish()
1656
+ self.reactor.pump((0.1,))
1657
+ self.successResultOf(test_d)
1658
+
1659
+ def test_srv_fallbacks_legacy(self) -> None:
1660
+ """Test that other SRV results are tried if the first one fails for _matrix SRV."""
1661
+ self.agent = self._make_agent()
1662
+
1663
+ # Return no entries for the _matrix-fed lookup, and a response for _matrix.
1664
+ self.mock_resolver.resolve_service.side_effect = [
1665
+ [],
1666
+ [
1667
+ Server(host=b"target.com", port=8443),
1668
+ Server(host=b"target.com", port=8444),
1669
+ ],
1670
+ ]
1671
+ self.reactor.lookups["target.com"] = "1.2.3.4"
1672
+
1673
+ test_d = self._make_get_request(b"matrix-federation://testserv/foo/bar")
1674
+
1675
+ # Nothing happened yet
1676
+ self.assertNoResult(test_d)
1677
+
1678
+ self.mock_resolver.resolve_service.assert_has_calls(
1679
+ [call(b"_matrix-fed._tcp.testserv"), call(b"_matrix._tcp.testserv")]
1680
+ )
1681
+
1682
+ # We should see an attempt to connect to the first server
1683
+ clients = self.reactor.tcpClients
1684
+ self.assertEqual(len(clients), 1)
1685
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop(0)
1686
+ self.assertEqual(host, "1.2.3.4")
1687
+ self.assertEqual(port, 8443)
1688
+
1689
+ # Fonx the connection
1690
+ client_factory.clientConnectionFailed(None, Exception("nope"))
1691
+
1692
+ # There's a 300ms delay in HostnameEndpoint
1693
+ self.reactor.pump((0.4,))
1694
+
1695
+ # Hasn't failed yet
1696
+ self.assertNoResult(test_d)
1697
+
1698
+ # We shouldnow see an attempt to connect to the second server
1699
+ clients = self.reactor.tcpClients
1700
+ self.assertEqual(len(clients), 1)
1701
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop(0)
1702
+ self.assertEqual(host, "1.2.3.4")
1703
+ self.assertEqual(port, 8444)
1704
+
1705
+ # make a test server, and wire up the client
1706
+ http_server = self._make_connection(client_factory, expected_sni=b"testserv")
1707
+
1708
+ self.assertEqual(len(http_server.requests), 1)
1709
+ request = http_server.requests[0]
1710
+ self.assertEqual(request.method, b"GET")
1711
+ self.assertEqual(request.path, b"/foo/bar")
1712
+ self.assertEqual(request.requestHeaders.getRawHeaders(b"host"), [b"testserv"])
1713
+
1714
+ # finish the request
1715
+ request.finish()
1716
+ self.reactor.pump((0.1,))
1717
+ self.successResultOf(test_d)
1718
+
1719
+ def test_srv_no_fallback_to_legacy(self) -> None:
1720
+ """Test that _matrix SRV results are not tried if the _matrix-fed one fails."""
1721
+ self.agent = self._make_agent()
1722
+
1723
+ # Return a failing entry for _matrix-fed.
1724
+ self.mock_resolver.resolve_service.side_effect = [
1725
+ [Server(host=b"target.com", port=8443)],
1726
+ [],
1727
+ ]
1728
+ self.reactor.lookups["target.com"] = "1.2.3.4"
1729
+
1730
+ test_d = self._make_get_request(b"matrix-federation://testserv/foo/bar")
1731
+
1732
+ # Nothing happened yet
1733
+ self.assertNoResult(test_d)
1734
+
1735
+ # Only the _matrix-fed is checked, _matrix is ignored.
1736
+ self.mock_resolver.resolve_service.assert_called_once_with(
1737
+ b"_matrix-fed._tcp.testserv"
1738
+ )
1739
+
1740
+ # We should see an attempt to connect to the first server
1741
+ clients = self.reactor.tcpClients
1742
+ self.assertEqual(len(clients), 1)
1743
+ (host, port, client_factory, _timeout, _bindAddress) = clients.pop(0)
1744
+ self.assertEqual(host, "1.2.3.4")
1745
+ self.assertEqual(port, 8443)
1746
+
1747
+ # Fonx the connection
1748
+ client_factory.clientConnectionFailed(None, Exception("nope"))
1749
+
1750
+ # There's a 300ms delay in HostnameEndpoint
1751
+ self.reactor.pump((0.4,))
1752
+
1753
+ # Failed to resolve a server.
1754
+ self.assertFailure(test_d, Exception)
1755
+
1756
+
1757
+ class TestCachePeriodFromHeaders(unittest.TestCase):
1758
+ def test_cache_control(self) -> None:
1759
+ # uppercase
1760
+ self.assertEqual(
1761
+ _cache_period_from_headers(
1762
+ Headers({b"Cache-Control": [b"foo, Max-Age = 100, bar"]})
1763
+ ),
1764
+ 100,
1765
+ )
1766
+
1767
+ # missing value
1768
+ self.assertIsNone(
1769
+ _cache_period_from_headers(Headers({b"Cache-Control": [b"max-age=, bar"]}))
1770
+ )
1771
+
1772
+ # hackernews: bogus due to semicolon
1773
+ self.assertIsNone(
1774
+ _cache_period_from_headers(
1775
+ Headers({b"Cache-Control": [b"private; max-age=0"]})
1776
+ )
1777
+ )
1778
+
1779
+ # github
1780
+ self.assertEqual(
1781
+ _cache_period_from_headers(
1782
+ Headers({b"Cache-Control": [b"max-age=0, private, must-revalidate"]})
1783
+ ),
1784
+ 0,
1785
+ )
1786
+
1787
+ # google
1788
+ self.assertEqual(
1789
+ _cache_period_from_headers(
1790
+ Headers({b"cache-control": [b"private, max-age=0"]})
1791
+ ),
1792
+ 0,
1793
+ )
1794
+
1795
+ def test_expires(self) -> None:
1796
+ self.assertEqual(
1797
+ _cache_period_from_headers(
1798
+ Headers({b"Expires": [b"Wed, 30 Jan 2019 07:35:33 GMT"]}),
1799
+ time_now=lambda: 1548833700,
1800
+ ),
1801
+ 33,
1802
+ )
1803
+
1804
+ # cache-control overrides expires
1805
+ self.assertEqual(
1806
+ _cache_period_from_headers(
1807
+ Headers(
1808
+ {
1809
+ b"cache-control": [b"max-age=10"],
1810
+ b"Expires": [b"Wed, 30 Jan 2019 07:35:33 GMT"],
1811
+ }
1812
+ ),
1813
+ time_now=lambda: 1548833700,
1814
+ ),
1815
+ 10,
1816
+ )
1817
+
1818
+ # invalid expires means immediate expiry
1819
+ self.assertEqual(_cache_period_from_headers(Headers({b"Expires": [b"0"]})), 0)
1820
+
1821
+
1822
+ def _check_logcontext(context: LoggingContextOrSentinel) -> None:
1823
+ current = current_context()
1824
+ if current is not context:
1825
+ raise AssertionError("Expected logcontext %s but was %s" % (context, current))
1826
+
1827
+
1828
+ def _get_test_protocol_factory() -> IProtocolFactory:
1829
+ """Get a protocol Factory which will build an HTTPChannel
1830
+ Returns:
1831
+ interfaces.IProtocolFactory
1832
+ """
1833
+ server_factory = Factory.forProtocol(HTTPChannel)
1834
+
1835
+ # Request.finish expects the factory to have a 'log' method.
1836
+ server_factory.log = _log_request
1837
+
1838
+ return server_factory
1839
+
1840
+
1841
+ def _log_request(request: str) -> None:
1842
+ """Implements Factory.log, which is expected by Request.finish"""
1843
+ logger.info("Completed request %s", request)
1844
+
1845
+
1846
+ @implementer(IPolicyForHTTPS)
1847
+ class TrustingTLSPolicyForHTTPS:
1848
+ """An IPolicyForHTTPS which checks that the certificate belongs to the
1849
+ right server, but doesn't check the certificate chain."""
1850
+
1851
+ def creatorForNetloc(
1852
+ self, hostname: bytes, port: int
1853
+ ) -> IOpenSSLClientConnectionCreator:
1854
+ certificateOptions = OpenSSLCertificateOptions()
1855
+ return ClientTLSOptions(hostname, certificateOptions.getContext())