matrix-synapse 1.142.0rc3__cp314-abi3-musllinux_1_2_aarch64.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 (1057) hide show
  1. matrix_synapse-1.142.0rc3.dist-info/AUTHORS.rst +51 -0
  2. matrix_synapse-1.142.0rc3.dist-info/LICENSE-AGPL-3.0 +661 -0
  3. matrix_synapse-1.142.0rc3.dist-info/LICENSE-COMMERCIAL +6 -0
  4. matrix_synapse-1.142.0rc3.dist-info/METADATA +375 -0
  5. matrix_synapse-1.142.0rc3.dist-info/RECORD +1057 -0
  6. matrix_synapse-1.142.0rc3.dist-info/WHEEL +4 -0
  7. matrix_synapse-1.142.0rc3.dist-info/entry_points.txt +14 -0
  8. matrix_synapse.libs/libgcc_s-2d945d6c.so.1 +0 -0
  9. synapse/__init__.py +97 -0
  10. synapse/_scripts/__init__.py +0 -0
  11. synapse/_scripts/export_signing_key.py +109 -0
  12. synapse/_scripts/generate_config.py +83 -0
  13. synapse/_scripts/generate_log_config.py +56 -0
  14. synapse/_scripts/generate_signing_key.py +55 -0
  15. synapse/_scripts/generate_workers_map.py +318 -0
  16. synapse/_scripts/hash_password.py +95 -0
  17. synapse/_scripts/move_remote_media_to_new_store.py +128 -0
  18. synapse/_scripts/register_new_matrix_user.py +374 -0
  19. synapse/_scripts/review_recent_signups.py +212 -0
  20. synapse/_scripts/synapse_port_db.py +1603 -0
  21. synapse/_scripts/synctl.py +365 -0
  22. synapse/_scripts/update_synapse_database.py +130 -0
  23. synapse/api/__init__.py +20 -0
  24. synapse/api/auth/__init__.py +207 -0
  25. synapse/api/auth/base.py +406 -0
  26. synapse/api/auth/internal.py +299 -0
  27. synapse/api/auth/mas.py +457 -0
  28. synapse/api/auth/msc3861_delegated.py +617 -0
  29. synapse/api/auth_blocking.py +144 -0
  30. synapse/api/constants.py +362 -0
  31. synapse/api/errors.py +907 -0
  32. synapse/api/filtering.py +539 -0
  33. synapse/api/presence.py +104 -0
  34. synapse/api/ratelimiting.py +482 -0
  35. synapse/api/room_versions.py +535 -0
  36. synapse/api/urls.py +119 -0
  37. synapse/app/__init__.py +60 -0
  38. synapse/app/_base.py +866 -0
  39. synapse/app/admin_cmd.py +388 -0
  40. synapse/app/appservice.py +30 -0
  41. synapse/app/client_reader.py +30 -0
  42. synapse/app/complement_fork_starter.py +206 -0
  43. synapse/app/event_creator.py +29 -0
  44. synapse/app/federation_reader.py +30 -0
  45. synapse/app/federation_sender.py +30 -0
  46. synapse/app/frontend_proxy.py +30 -0
  47. synapse/app/generic_worker.py +475 -0
  48. synapse/app/homeserver.py +504 -0
  49. synapse/app/media_repository.py +30 -0
  50. synapse/app/phone_stats_home.py +296 -0
  51. synapse/app/pusher.py +30 -0
  52. synapse/app/synchrotron.py +30 -0
  53. synapse/app/user_dir.py +31 -0
  54. synapse/appservice/__init__.py +461 -0
  55. synapse/appservice/api.py +569 -0
  56. synapse/appservice/scheduler.py +567 -0
  57. synapse/config/__init__.py +27 -0
  58. synapse/config/__main__.py +62 -0
  59. synapse/config/_base.py +1108 -0
  60. synapse/config/_base.pyi +217 -0
  61. synapse/config/_util.py +99 -0
  62. synapse/config/account_validity.py +116 -0
  63. synapse/config/api.py +141 -0
  64. synapse/config/appservice.py +210 -0
  65. synapse/config/auth.py +80 -0
  66. synapse/config/auto_accept_invites.py +43 -0
  67. synapse/config/background_updates.py +44 -0
  68. synapse/config/cache.py +231 -0
  69. synapse/config/captcha.py +90 -0
  70. synapse/config/cas.py +116 -0
  71. synapse/config/consent.py +73 -0
  72. synapse/config/database.py +184 -0
  73. synapse/config/emailconfig.py +367 -0
  74. synapse/config/experimental.py +595 -0
  75. synapse/config/federation.py +114 -0
  76. synapse/config/homeserver.py +141 -0
  77. synapse/config/jwt.py +55 -0
  78. synapse/config/key.py +447 -0
  79. synapse/config/logger.py +390 -0
  80. synapse/config/mas.py +191 -0
  81. synapse/config/matrixrtc.py +66 -0
  82. synapse/config/metrics.py +84 -0
  83. synapse/config/modules.py +40 -0
  84. synapse/config/oembed.py +185 -0
  85. synapse/config/oidc.py +509 -0
  86. synapse/config/password_auth_providers.py +82 -0
  87. synapse/config/push.py +64 -0
  88. synapse/config/ratelimiting.py +254 -0
  89. synapse/config/redis.py +74 -0
  90. synapse/config/registration.py +296 -0
  91. synapse/config/repository.py +311 -0
  92. synapse/config/retention.py +162 -0
  93. synapse/config/room.py +88 -0
  94. synapse/config/room_directory.py +165 -0
  95. synapse/config/saml2.py +251 -0
  96. synapse/config/server.py +1170 -0
  97. synapse/config/server_notices.py +84 -0
  98. synapse/config/spam_checker.py +66 -0
  99. synapse/config/sso.py +121 -0
  100. synapse/config/stats.py +54 -0
  101. synapse/config/third_party_event_rules.py +40 -0
  102. synapse/config/tls.py +192 -0
  103. synapse/config/tracer.py +71 -0
  104. synapse/config/user_directory.py +47 -0
  105. synapse/config/user_types.py +44 -0
  106. synapse/config/voip.py +59 -0
  107. synapse/config/workers.py +642 -0
  108. synapse/crypto/__init__.py +20 -0
  109. synapse/crypto/context_factory.py +278 -0
  110. synapse/crypto/event_signing.py +194 -0
  111. synapse/crypto/keyring.py +931 -0
  112. synapse/event_auth.py +1266 -0
  113. synapse/events/__init__.py +668 -0
  114. synapse/events/auto_accept_invites.py +216 -0
  115. synapse/events/builder.py +387 -0
  116. synapse/events/presence_router.py +245 -0
  117. synapse/events/snapshot.py +559 -0
  118. synapse/events/utils.py +928 -0
  119. synapse/events/validator.py +305 -0
  120. synapse/federation/__init__.py +22 -0
  121. synapse/federation/federation_base.py +383 -0
  122. synapse/federation/federation_client.py +2134 -0
  123. synapse/federation/federation_server.py +1544 -0
  124. synapse/federation/persistence.py +71 -0
  125. synapse/federation/send_queue.py +532 -0
  126. synapse/federation/sender/__init__.py +1165 -0
  127. synapse/federation/sender/per_destination_queue.py +884 -0
  128. synapse/federation/sender/transaction_manager.py +210 -0
  129. synapse/federation/transport/__init__.py +28 -0
  130. synapse/federation/transport/client.py +1201 -0
  131. synapse/federation/transport/server/__init__.py +334 -0
  132. synapse/federation/transport/server/_base.py +429 -0
  133. synapse/federation/transport/server/federation.py +912 -0
  134. synapse/federation/units.py +133 -0
  135. synapse/handlers/__init__.py +20 -0
  136. synapse/handlers/account.py +162 -0
  137. synapse/handlers/account_data.py +362 -0
  138. synapse/handlers/account_validity.py +361 -0
  139. synapse/handlers/admin.py +618 -0
  140. synapse/handlers/appservice.py +991 -0
  141. synapse/handlers/auth.py +2494 -0
  142. synapse/handlers/cas.py +413 -0
  143. synapse/handlers/deactivate_account.py +363 -0
  144. synapse/handlers/delayed_events.py +635 -0
  145. synapse/handlers/device.py +1873 -0
  146. synapse/handlers/devicemessage.py +399 -0
  147. synapse/handlers/directory.py +554 -0
  148. synapse/handlers/e2e_keys.py +1834 -0
  149. synapse/handlers/e2e_room_keys.py +455 -0
  150. synapse/handlers/event_auth.py +390 -0
  151. synapse/handlers/events.py +201 -0
  152. synapse/handlers/federation.py +2043 -0
  153. synapse/handlers/federation_event.py +2420 -0
  154. synapse/handlers/identity.py +812 -0
  155. synapse/handlers/initial_sync.py +528 -0
  156. synapse/handlers/jwt.py +120 -0
  157. synapse/handlers/message.py +2347 -0
  158. synapse/handlers/oidc.py +1803 -0
  159. synapse/handlers/pagination.py +768 -0
  160. synapse/handlers/password_policy.py +102 -0
  161. synapse/handlers/presence.py +2638 -0
  162. synapse/handlers/profile.py +655 -0
  163. synapse/handlers/push_rules.py +164 -0
  164. synapse/handlers/read_marker.py +79 -0
  165. synapse/handlers/receipts.py +351 -0
  166. synapse/handlers/register.py +1060 -0
  167. synapse/handlers/relations.py +624 -0
  168. synapse/handlers/reports.py +98 -0
  169. synapse/handlers/room.py +2447 -0
  170. synapse/handlers/room_list.py +632 -0
  171. synapse/handlers/room_member.py +2365 -0
  172. synapse/handlers/room_member_worker.py +146 -0
  173. synapse/handlers/room_policy.py +186 -0
  174. synapse/handlers/room_summary.py +1057 -0
  175. synapse/handlers/saml.py +524 -0
  176. synapse/handlers/search.py +723 -0
  177. synapse/handlers/send_email.py +209 -0
  178. synapse/handlers/set_password.py +71 -0
  179. synapse/handlers/sliding_sync/__init__.py +1701 -0
  180. synapse/handlers/sliding_sync/extensions.py +970 -0
  181. synapse/handlers/sliding_sync/room_lists.py +2266 -0
  182. synapse/handlers/sliding_sync/store.py +128 -0
  183. synapse/handlers/sso.py +1292 -0
  184. synapse/handlers/state_deltas.py +82 -0
  185. synapse/handlers/stats.py +322 -0
  186. synapse/handlers/sync.py +3109 -0
  187. synapse/handlers/thread_subscriptions.py +190 -0
  188. synapse/handlers/typing.py +606 -0
  189. synapse/handlers/ui_auth/__init__.py +48 -0
  190. synapse/handlers/ui_auth/checkers.py +332 -0
  191. synapse/handlers/user_directory.py +783 -0
  192. synapse/handlers/worker_lock.py +365 -0
  193. synapse/http/__init__.py +106 -0
  194. synapse/http/additional_resource.py +62 -0
  195. synapse/http/client.py +1360 -0
  196. synapse/http/connectproxyclient.py +309 -0
  197. synapse/http/federation/__init__.py +19 -0
  198. synapse/http/federation/matrix_federation_agent.py +490 -0
  199. synapse/http/federation/srv_resolver.py +196 -0
  200. synapse/http/federation/well_known_resolver.py +367 -0
  201. synapse/http/matrixfederationclient.py +1875 -0
  202. synapse/http/proxy.py +290 -0
  203. synapse/http/proxyagent.py +497 -0
  204. synapse/http/replicationagent.py +203 -0
  205. synapse/http/request_metrics.py +309 -0
  206. synapse/http/server.py +1114 -0
  207. synapse/http/servlet.py +1019 -0
  208. synapse/http/site.py +825 -0
  209. synapse/http/types.py +27 -0
  210. synapse/logging/__init__.py +31 -0
  211. synapse/logging/_remote.py +261 -0
  212. synapse/logging/_terse_json.py +95 -0
  213. synapse/logging/context.py +1211 -0
  214. synapse/logging/formatter.py +63 -0
  215. synapse/logging/handlers.py +99 -0
  216. synapse/logging/loggers.py +25 -0
  217. synapse/logging/opentracing.py +1132 -0
  218. synapse/logging/scopecontextmanager.py +161 -0
  219. synapse/media/_base.py +827 -0
  220. synapse/media/filepath.py +417 -0
  221. synapse/media/media_repository.py +1580 -0
  222. synapse/media/media_storage.py +704 -0
  223. synapse/media/oembed.py +277 -0
  224. synapse/media/preview_html.py +559 -0
  225. synapse/media/storage_provider.py +195 -0
  226. synapse/media/thumbnailer.py +833 -0
  227. synapse/media/url_previewer.py +875 -0
  228. synapse/metrics/__init__.py +754 -0
  229. synapse/metrics/_gc.py +219 -0
  230. synapse/metrics/_reactor_metrics.py +171 -0
  231. synapse/metrics/_types.py +38 -0
  232. synapse/metrics/background_process_metrics.py +556 -0
  233. synapse/metrics/common_usage_metrics.py +94 -0
  234. synapse/metrics/jemalloc.py +248 -0
  235. synapse/module_api/__init__.py +2154 -0
  236. synapse/module_api/callbacks/__init__.py +50 -0
  237. synapse/module_api/callbacks/account_validity_callbacks.py +106 -0
  238. synapse/module_api/callbacks/media_repository_callbacks.py +160 -0
  239. synapse/module_api/callbacks/ratelimit_callbacks.py +79 -0
  240. synapse/module_api/callbacks/spamchecker_callbacks.py +1113 -0
  241. synapse/module_api/callbacks/third_party_event_rules_callbacks.py +599 -0
  242. synapse/module_api/errors.py +42 -0
  243. synapse/notifier.py +972 -0
  244. synapse/push/__init__.py +212 -0
  245. synapse/push/bulk_push_rule_evaluator.py +637 -0
  246. synapse/push/clientformat.py +126 -0
  247. synapse/push/emailpusher.py +333 -0
  248. synapse/push/httppusher.py +564 -0
  249. synapse/push/mailer.py +1012 -0
  250. synapse/push/presentable_names.py +216 -0
  251. synapse/push/push_tools.py +114 -0
  252. synapse/push/push_types.py +141 -0
  253. synapse/push/pusher.py +87 -0
  254. synapse/push/pusherpool.py +501 -0
  255. synapse/push/rulekinds.py +33 -0
  256. synapse/py.typed +0 -0
  257. synapse/replication/__init__.py +20 -0
  258. synapse/replication/http/__init__.py +68 -0
  259. synapse/replication/http/_base.py +468 -0
  260. synapse/replication/http/account_data.py +297 -0
  261. synapse/replication/http/deactivate_account.py +81 -0
  262. synapse/replication/http/delayed_events.py +62 -0
  263. synapse/replication/http/devices.py +254 -0
  264. synapse/replication/http/federation.py +334 -0
  265. synapse/replication/http/login.py +106 -0
  266. synapse/replication/http/membership.py +364 -0
  267. synapse/replication/http/presence.py +133 -0
  268. synapse/replication/http/push.py +156 -0
  269. synapse/replication/http/register.py +172 -0
  270. synapse/replication/http/send_events.py +182 -0
  271. synapse/replication/http/state.py +82 -0
  272. synapse/replication/http/streams.py +101 -0
  273. synapse/replication/tcp/__init__.py +56 -0
  274. synapse/replication/tcp/client.py +552 -0
  275. synapse/replication/tcp/commands.py +569 -0
  276. synapse/replication/tcp/context.py +41 -0
  277. synapse/replication/tcp/external_cache.py +156 -0
  278. synapse/replication/tcp/handler.py +942 -0
  279. synapse/replication/tcp/protocol.py +608 -0
  280. synapse/replication/tcp/redis.py +509 -0
  281. synapse/replication/tcp/resource.py +348 -0
  282. synapse/replication/tcp/streams/__init__.py +96 -0
  283. synapse/replication/tcp/streams/_base.py +766 -0
  284. synapse/replication/tcp/streams/events.py +287 -0
  285. synapse/replication/tcp/streams/federation.py +92 -0
  286. synapse/replication/tcp/streams/partial_state.py +80 -0
  287. synapse/res/providers.json +29 -0
  288. synapse/res/templates/_base.html +29 -0
  289. synapse/res/templates/account_previously_renewed.html +6 -0
  290. synapse/res/templates/account_renewed.html +6 -0
  291. synapse/res/templates/add_threepid.html +8 -0
  292. synapse/res/templates/add_threepid.txt +6 -0
  293. synapse/res/templates/add_threepid_failure.html +7 -0
  294. synapse/res/templates/add_threepid_success.html +6 -0
  295. synapse/res/templates/already_in_use.html +12 -0
  296. synapse/res/templates/already_in_use.txt +10 -0
  297. synapse/res/templates/auth_success.html +21 -0
  298. synapse/res/templates/invalid_token.html +6 -0
  299. synapse/res/templates/mail-Element.css +7 -0
  300. synapse/res/templates/mail-Vector.css +7 -0
  301. synapse/res/templates/mail-expiry.css +4 -0
  302. synapse/res/templates/mail.css +156 -0
  303. synapse/res/templates/notice_expiry.html +46 -0
  304. synapse/res/templates/notice_expiry.txt +7 -0
  305. synapse/res/templates/notif.html +51 -0
  306. synapse/res/templates/notif.txt +22 -0
  307. synapse/res/templates/notif_mail.html +59 -0
  308. synapse/res/templates/notif_mail.txt +10 -0
  309. synapse/res/templates/password_reset.html +10 -0
  310. synapse/res/templates/password_reset.txt +7 -0
  311. synapse/res/templates/password_reset_confirmation.html +15 -0
  312. synapse/res/templates/password_reset_failure.html +7 -0
  313. synapse/res/templates/password_reset_success.html +6 -0
  314. synapse/res/templates/recaptcha.html +42 -0
  315. synapse/res/templates/registration.html +12 -0
  316. synapse/res/templates/registration.txt +10 -0
  317. synapse/res/templates/registration_failure.html +6 -0
  318. synapse/res/templates/registration_success.html +6 -0
  319. synapse/res/templates/registration_token.html +18 -0
  320. synapse/res/templates/room.html +33 -0
  321. synapse/res/templates/room.txt +9 -0
  322. synapse/res/templates/sso.css +129 -0
  323. synapse/res/templates/sso_account_deactivated.html +25 -0
  324. synapse/res/templates/sso_auth_account_details.html +186 -0
  325. synapse/res/templates/sso_auth_account_details.js +116 -0
  326. synapse/res/templates/sso_auth_bad_user.html +26 -0
  327. synapse/res/templates/sso_auth_confirm.html +27 -0
  328. synapse/res/templates/sso_auth_success.html +26 -0
  329. synapse/res/templates/sso_error.html +71 -0
  330. synapse/res/templates/sso_footer.html +19 -0
  331. synapse/res/templates/sso_login_idp_picker.html +60 -0
  332. synapse/res/templates/sso_new_user_consent.html +30 -0
  333. synapse/res/templates/sso_partial_profile.html +19 -0
  334. synapse/res/templates/sso_redirect_confirm.html +39 -0
  335. synapse/res/templates/style.css +33 -0
  336. synapse/res/templates/terms.html +27 -0
  337. synapse/rest/__init__.py +197 -0
  338. synapse/rest/admin/__init__.py +390 -0
  339. synapse/rest/admin/_base.py +72 -0
  340. synapse/rest/admin/background_updates.py +171 -0
  341. synapse/rest/admin/devices.py +221 -0
  342. synapse/rest/admin/event_reports.py +173 -0
  343. synapse/rest/admin/events.py +69 -0
  344. synapse/rest/admin/experimental_features.py +137 -0
  345. synapse/rest/admin/federation.py +243 -0
  346. synapse/rest/admin/media.py +540 -0
  347. synapse/rest/admin/registration_tokens.py +358 -0
  348. synapse/rest/admin/rooms.py +1061 -0
  349. synapse/rest/admin/scheduled_tasks.py +70 -0
  350. synapse/rest/admin/server_notice_servlet.py +132 -0
  351. synapse/rest/admin/statistics.py +132 -0
  352. synapse/rest/admin/username_available.py +58 -0
  353. synapse/rest/admin/users.py +1608 -0
  354. synapse/rest/client/__init__.py +20 -0
  355. synapse/rest/client/_base.py +113 -0
  356. synapse/rest/client/account.py +930 -0
  357. synapse/rest/client/account_data.py +319 -0
  358. synapse/rest/client/account_validity.py +103 -0
  359. synapse/rest/client/appservice_ping.py +125 -0
  360. synapse/rest/client/auth.py +218 -0
  361. synapse/rest/client/auth_metadata.py +122 -0
  362. synapse/rest/client/capabilities.py +121 -0
  363. synapse/rest/client/delayed_events.py +111 -0
  364. synapse/rest/client/devices.py +587 -0
  365. synapse/rest/client/directory.py +211 -0
  366. synapse/rest/client/events.py +116 -0
  367. synapse/rest/client/filter.py +112 -0
  368. synapse/rest/client/initial_sync.py +65 -0
  369. synapse/rest/client/keys.py +678 -0
  370. synapse/rest/client/knock.py +104 -0
  371. synapse/rest/client/login.py +754 -0
  372. synapse/rest/client/login_token_request.py +127 -0
  373. synapse/rest/client/logout.py +93 -0
  374. synapse/rest/client/matrixrtc.py +52 -0
  375. synapse/rest/client/media.py +286 -0
  376. synapse/rest/client/mutual_rooms.py +93 -0
  377. synapse/rest/client/notifications.py +137 -0
  378. synapse/rest/client/openid.py +109 -0
  379. synapse/rest/client/password_policy.py +69 -0
  380. synapse/rest/client/presence.py +131 -0
  381. synapse/rest/client/profile.py +291 -0
  382. synapse/rest/client/push_rule.py +331 -0
  383. synapse/rest/client/pusher.py +181 -0
  384. synapse/rest/client/read_marker.py +104 -0
  385. synapse/rest/client/receipts.py +165 -0
  386. synapse/rest/client/register.py +1067 -0
  387. synapse/rest/client/relations.py +138 -0
  388. synapse/rest/client/rendezvous.py +76 -0
  389. synapse/rest/client/reporting.py +207 -0
  390. synapse/rest/client/room.py +1669 -0
  391. synapse/rest/client/room_keys.py +426 -0
  392. synapse/rest/client/room_upgrade_rest_servlet.py +112 -0
  393. synapse/rest/client/sendtodevice.py +85 -0
  394. synapse/rest/client/sync.py +1131 -0
  395. synapse/rest/client/tags.py +129 -0
  396. synapse/rest/client/thirdparty.py +130 -0
  397. synapse/rest/client/thread_subscriptions.py +247 -0
  398. synapse/rest/client/tokenrefresh.py +52 -0
  399. synapse/rest/client/transactions.py +149 -0
  400. synapse/rest/client/user_directory.py +90 -0
  401. synapse/rest/client/versions.py +191 -0
  402. synapse/rest/client/voip.py +88 -0
  403. synapse/rest/consent/__init__.py +0 -0
  404. synapse/rest/consent/consent_resource.py +210 -0
  405. synapse/rest/health.py +38 -0
  406. synapse/rest/key/__init__.py +20 -0
  407. synapse/rest/key/v2/__init__.py +40 -0
  408. synapse/rest/key/v2/local_key_resource.py +125 -0
  409. synapse/rest/key/v2/remote_key_resource.py +302 -0
  410. synapse/rest/media/__init__.py +0 -0
  411. synapse/rest/media/config_resource.py +53 -0
  412. synapse/rest/media/create_resource.py +90 -0
  413. synapse/rest/media/download_resource.py +110 -0
  414. synapse/rest/media/media_repository_resource.py +113 -0
  415. synapse/rest/media/preview_url_resource.py +77 -0
  416. synapse/rest/media/thumbnail_resource.py +142 -0
  417. synapse/rest/media/upload_resource.py +187 -0
  418. synapse/rest/media/v1/__init__.py +39 -0
  419. synapse/rest/media/v1/_base.py +23 -0
  420. synapse/rest/media/v1/media_storage.py +23 -0
  421. synapse/rest/media/v1/storage_provider.py +23 -0
  422. synapse/rest/synapse/__init__.py +20 -0
  423. synapse/rest/synapse/client/__init__.py +93 -0
  424. synapse/rest/synapse/client/federation_whitelist.py +66 -0
  425. synapse/rest/synapse/client/jwks.py +77 -0
  426. synapse/rest/synapse/client/new_user_consent.py +115 -0
  427. synapse/rest/synapse/client/oidc/__init__.py +45 -0
  428. synapse/rest/synapse/client/oidc/backchannel_logout_resource.py +42 -0
  429. synapse/rest/synapse/client/oidc/callback_resource.py +48 -0
  430. synapse/rest/synapse/client/password_reset.py +129 -0
  431. synapse/rest/synapse/client/pick_idp.py +107 -0
  432. synapse/rest/synapse/client/pick_username.py +153 -0
  433. synapse/rest/synapse/client/rendezvous.py +58 -0
  434. synapse/rest/synapse/client/saml2/__init__.py +42 -0
  435. synapse/rest/synapse/client/saml2/metadata_resource.py +46 -0
  436. synapse/rest/synapse/client/saml2/response_resource.py +52 -0
  437. synapse/rest/synapse/client/sso_register.py +56 -0
  438. synapse/rest/synapse/client/unsubscribe.py +88 -0
  439. synapse/rest/synapse/mas/__init__.py +71 -0
  440. synapse/rest/synapse/mas/_base.py +55 -0
  441. synapse/rest/synapse/mas/devices.py +239 -0
  442. synapse/rest/synapse/mas/users.py +469 -0
  443. synapse/rest/well_known.py +148 -0
  444. synapse/server.py +1258 -0
  445. synapse/server_notices/__init__.py +0 -0
  446. synapse/server_notices/consent_server_notices.py +136 -0
  447. synapse/server_notices/resource_limits_server_notices.py +215 -0
  448. synapse/server_notices/server_notices_manager.py +388 -0
  449. synapse/server_notices/server_notices_sender.py +67 -0
  450. synapse/server_notices/worker_server_notices_sender.py +46 -0
  451. synapse/spam_checker_api/__init__.py +31 -0
  452. synapse/state/__init__.py +1022 -0
  453. synapse/state/v1.py +370 -0
  454. synapse/state/v2.py +985 -0
  455. synapse/static/client/login/index.html +47 -0
  456. synapse/static/client/login/js/jquery-3.4.1.min.js +2 -0
  457. synapse/static/client/login/js/login.js +291 -0
  458. synapse/static/client/login/spinner.gif +0 -0
  459. synapse/static/client/login/style.css +79 -0
  460. synapse/static/index.html +63 -0
  461. synapse/storage/__init__.py +43 -0
  462. synapse/storage/_base.py +245 -0
  463. synapse/storage/admin_client_config.py +26 -0
  464. synapse/storage/background_updates.py +1189 -0
  465. synapse/storage/controllers/__init__.py +57 -0
  466. synapse/storage/controllers/persist_events.py +1239 -0
  467. synapse/storage/controllers/purge_events.py +456 -0
  468. synapse/storage/controllers/state.py +954 -0
  469. synapse/storage/controllers/stats.py +119 -0
  470. synapse/storage/database.py +2720 -0
  471. synapse/storage/databases/__init__.py +175 -0
  472. synapse/storage/databases/main/__init__.py +424 -0
  473. synapse/storage/databases/main/account_data.py +1060 -0
  474. synapse/storage/databases/main/appservice.py +473 -0
  475. synapse/storage/databases/main/cache.py +911 -0
  476. synapse/storage/databases/main/censor_events.py +225 -0
  477. synapse/storage/databases/main/client_ips.py +817 -0
  478. synapse/storage/databases/main/delayed_events.py +560 -0
  479. synapse/storage/databases/main/deviceinbox.py +1272 -0
  480. synapse/storage/databases/main/devices.py +2581 -0
  481. synapse/storage/databases/main/directory.py +212 -0
  482. synapse/storage/databases/main/e2e_room_keys.py +690 -0
  483. synapse/storage/databases/main/end_to_end_keys.py +1896 -0
  484. synapse/storage/databases/main/event_federation.py +2509 -0
  485. synapse/storage/databases/main/event_push_actions.py +1937 -0
  486. synapse/storage/databases/main/events.py +3746 -0
  487. synapse/storage/databases/main/events_bg_updates.py +2910 -0
  488. synapse/storage/databases/main/events_forward_extremities.py +126 -0
  489. synapse/storage/databases/main/events_worker.py +2784 -0
  490. synapse/storage/databases/main/experimental_features.py +130 -0
  491. synapse/storage/databases/main/filtering.py +231 -0
  492. synapse/storage/databases/main/keys.py +291 -0
  493. synapse/storage/databases/main/lock.py +553 -0
  494. synapse/storage/databases/main/media_repository.py +1070 -0
  495. synapse/storage/databases/main/metrics.py +460 -0
  496. synapse/storage/databases/main/monthly_active_users.py +443 -0
  497. synapse/storage/databases/main/openid.py +61 -0
  498. synapse/storage/databases/main/presence.py +511 -0
  499. synapse/storage/databases/main/profile.py +541 -0
  500. synapse/storage/databases/main/purge_events.py +511 -0
  501. synapse/storage/databases/main/push_rule.py +972 -0
  502. synapse/storage/databases/main/pusher.py +794 -0
  503. synapse/storage/databases/main/receipts.py +1342 -0
  504. synapse/storage/databases/main/registration.py +3076 -0
  505. synapse/storage/databases/main/rejections.py +38 -0
  506. synapse/storage/databases/main/relations.py +1118 -0
  507. synapse/storage/databases/main/room.py +2781 -0
  508. synapse/storage/databases/main/roommember.py +2112 -0
  509. synapse/storage/databases/main/search.py +941 -0
  510. synapse/storage/databases/main/session.py +151 -0
  511. synapse/storage/databases/main/signatures.py +94 -0
  512. synapse/storage/databases/main/sliding_sync.py +603 -0
  513. synapse/storage/databases/main/state.py +1006 -0
  514. synapse/storage/databases/main/state_deltas.py +329 -0
  515. synapse/storage/databases/main/stats.py +791 -0
  516. synapse/storage/databases/main/stream.py +2580 -0
  517. synapse/storage/databases/main/tags.py +360 -0
  518. synapse/storage/databases/main/task_scheduler.py +225 -0
  519. synapse/storage/databases/main/thread_subscriptions.py +591 -0
  520. synapse/storage/databases/main/transactions.py +681 -0
  521. synapse/storage/databases/main/ui_auth.py +420 -0
  522. synapse/storage/databases/main/user_directory.py +1331 -0
  523. synapse/storage/databases/main/user_erasure_store.py +117 -0
  524. synapse/storage/databases/state/__init__.py +22 -0
  525. synapse/storage/databases/state/bg_updates.py +499 -0
  526. synapse/storage/databases/state/deletion.py +558 -0
  527. synapse/storage/databases/state/store.py +949 -0
  528. synapse/storage/engines/__init__.py +70 -0
  529. synapse/storage/engines/_base.py +154 -0
  530. synapse/storage/engines/postgres.py +261 -0
  531. synapse/storage/engines/sqlite.py +199 -0
  532. synapse/storage/invite_rule.py +112 -0
  533. synapse/storage/keys.py +40 -0
  534. synapse/storage/prepare_database.py +731 -0
  535. synapse/storage/push_rule.py +28 -0
  536. synapse/storage/roommember.py +89 -0
  537. synapse/storage/schema/README.md +4 -0
  538. synapse/storage/schema/__init__.py +182 -0
  539. synapse/storage/schema/common/delta/25/00background_updates.sql +40 -0
  540. synapse/storage/schema/common/delta/35/00background_updates_add_col.sql +36 -0
  541. synapse/storage/schema/common/delta/58/00background_update_ordering.sql +38 -0
  542. synapse/storage/schema/common/full_schemas/72/full.sql.postgres +8 -0
  543. synapse/storage/schema/common/full_schemas/72/full.sql.sqlite +6 -0
  544. synapse/storage/schema/common/schema_version.sql +60 -0
  545. synapse/storage/schema/main/delta/12/v12.sql +82 -0
  546. synapse/storage/schema/main/delta/13/v13.sql +38 -0
  547. synapse/storage/schema/main/delta/14/v14.sql +42 -0
  548. synapse/storage/schema/main/delta/15/appservice_txns.sql +50 -0
  549. synapse/storage/schema/main/delta/15/presence_indices.sql +2 -0
  550. synapse/storage/schema/main/delta/15/v15.sql +24 -0
  551. synapse/storage/schema/main/delta/16/events_order_index.sql +4 -0
  552. synapse/storage/schema/main/delta/16/remote_media_cache_index.sql +2 -0
  553. synapse/storage/schema/main/delta/16/remove_duplicates.sql +9 -0
  554. synapse/storage/schema/main/delta/16/room_alias_index.sql +3 -0
  555. synapse/storage/schema/main/delta/16/unique_constraints.sql +72 -0
  556. synapse/storage/schema/main/delta/16/users.sql +56 -0
  557. synapse/storage/schema/main/delta/17/drop_indexes.sql +37 -0
  558. synapse/storage/schema/main/delta/17/server_keys.sql +43 -0
  559. synapse/storage/schema/main/delta/17/user_threepids.sql +9 -0
  560. synapse/storage/schema/main/delta/18/server_keys_bigger_ints.sql +51 -0
  561. synapse/storage/schema/main/delta/19/event_index.sql +38 -0
  562. synapse/storage/schema/main/delta/20/dummy.sql +1 -0
  563. synapse/storage/schema/main/delta/20/pushers.py +93 -0
  564. synapse/storage/schema/main/delta/21/end_to_end_keys.sql +53 -0
  565. synapse/storage/schema/main/delta/21/receipts.sql +57 -0
  566. synapse/storage/schema/main/delta/22/receipts_index.sql +41 -0
  567. synapse/storage/schema/main/delta/22/user_threepids_unique.sql +19 -0
  568. synapse/storage/schema/main/delta/24/stats_reporting.sql +37 -0
  569. synapse/storage/schema/main/delta/25/fts.py +81 -0
  570. synapse/storage/schema/main/delta/25/guest_access.sql +44 -0
  571. synapse/storage/schema/main/delta/25/history_visibility.sql +44 -0
  572. synapse/storage/schema/main/delta/25/tags.sql +57 -0
  573. synapse/storage/schema/main/delta/26/account_data.sql +36 -0
  574. synapse/storage/schema/main/delta/27/account_data.sql +55 -0
  575. synapse/storage/schema/main/delta/27/forgotten_memberships.sql +45 -0
  576. synapse/storage/schema/main/delta/27/ts.py +61 -0
  577. synapse/storage/schema/main/delta/28/event_push_actions.sql +46 -0
  578. synapse/storage/schema/main/delta/28/events_room_stream.sql +39 -0
  579. synapse/storage/schema/main/delta/28/public_roms_index.sql +39 -0
  580. synapse/storage/schema/main/delta/28/receipts_user_id_index.sql +41 -0
  581. synapse/storage/schema/main/delta/28/upgrade_times.sql +40 -0
  582. synapse/storage/schema/main/delta/28/users_is_guest.sql +41 -0
  583. synapse/storage/schema/main/delta/29/push_actions.sql +54 -0
  584. synapse/storage/schema/main/delta/30/alias_creator.sql +35 -0
  585. synapse/storage/schema/main/delta/30/as_users.py +82 -0
  586. synapse/storage/schema/main/delta/30/deleted_pushers.sql +44 -0
  587. synapse/storage/schema/main/delta/30/presence_stream.sql +49 -0
  588. synapse/storage/schema/main/delta/30/public_rooms.sql +42 -0
  589. synapse/storage/schema/main/delta/30/push_rule_stream.sql +57 -0
  590. synapse/storage/schema/main/delta/30/threepid_guest_access_tokens.sql +43 -0
  591. synapse/storage/schema/main/delta/31/invites.sql +61 -0
  592. synapse/storage/schema/main/delta/31/local_media_repository_url_cache.sql +46 -0
  593. synapse/storage/schema/main/delta/31/pushers_0.py +92 -0
  594. synapse/storage/schema/main/delta/31/pushers_index.sql +41 -0
  595. synapse/storage/schema/main/delta/31/search_update.py +65 -0
  596. synapse/storage/schema/main/delta/32/events.sql +35 -0
  597. synapse/storage/schema/main/delta/32/openid.sql +9 -0
  598. synapse/storage/schema/main/delta/32/pusher_throttle.sql +42 -0
  599. synapse/storage/schema/main/delta/32/remove_indices.sql +52 -0
  600. synapse/storage/schema/main/delta/32/reports.sql +44 -0
  601. synapse/storage/schema/main/delta/33/access_tokens_device_index.sql +36 -0
  602. synapse/storage/schema/main/delta/33/devices.sql +40 -0
  603. synapse/storage/schema/main/delta/33/devices_for_e2e_keys.sql +38 -0
  604. synapse/storage/schema/main/delta/33/devices_for_e2e_keys_clear_unknown_device.sql +39 -0
  605. synapse/storage/schema/main/delta/33/event_fields.py +61 -0
  606. synapse/storage/schema/main/delta/33/remote_media_ts.py +43 -0
  607. synapse/storage/schema/main/delta/33/user_ips_index.sql +36 -0
  608. synapse/storage/schema/main/delta/34/appservice_stream.sql +42 -0
  609. synapse/storage/schema/main/delta/34/cache_stream.py +50 -0
  610. synapse/storage/schema/main/delta/34/device_inbox.sql +43 -0
  611. synapse/storage/schema/main/delta/34/push_display_name_rename.sql +39 -0
  612. synapse/storage/schema/main/delta/34/received_txn_purge.py +36 -0
  613. synapse/storage/schema/main/delta/35/contains_url.sql +36 -0
  614. synapse/storage/schema/main/delta/35/device_outbox.sql +58 -0
  615. synapse/storage/schema/main/delta/35/device_stream_id.sql +40 -0
  616. synapse/storage/schema/main/delta/35/event_push_actions_index.sql +36 -0
  617. synapse/storage/schema/main/delta/35/public_room_list_change_stream.sql +52 -0
  618. synapse/storage/schema/main/delta/35/stream_order_to_extrem.sql +56 -0
  619. synapse/storage/schema/main/delta/36/readd_public_rooms.sql +45 -0
  620. synapse/storage/schema/main/delta/37/remove_auth_idx.py +89 -0
  621. synapse/storage/schema/main/delta/37/user_threepids.sql +71 -0
  622. synapse/storage/schema/main/delta/38/postgres_fts_gist.sql +38 -0
  623. synapse/storage/schema/main/delta/39/appservice_room_list.sql +48 -0
  624. synapse/storage/schema/main/delta/39/device_federation_stream_idx.sql +35 -0
  625. synapse/storage/schema/main/delta/39/event_push_index.sql +36 -0
  626. synapse/storage/schema/main/delta/39/federation_out_position.sql +41 -0
  627. synapse/storage/schema/main/delta/39/membership_profile.sql +39 -0
  628. synapse/storage/schema/main/delta/40/current_state_idx.sql +36 -0
  629. synapse/storage/schema/main/delta/40/device_inbox.sql +40 -0
  630. synapse/storage/schema/main/delta/40/device_list_streams.sql +79 -0
  631. synapse/storage/schema/main/delta/40/event_push_summary.sql +57 -0
  632. synapse/storage/schema/main/delta/40/pushers.sql +58 -0
  633. synapse/storage/schema/main/delta/41/device_list_stream_idx.sql +36 -0
  634. synapse/storage/schema/main/delta/41/device_outbound_index.sql +35 -0
  635. synapse/storage/schema/main/delta/41/event_search_event_id_idx.sql +36 -0
  636. synapse/storage/schema/main/delta/41/ratelimit.sql +41 -0
  637. synapse/storage/schema/main/delta/42/current_state_delta.sql +48 -0
  638. synapse/storage/schema/main/delta/42/device_list_last_id.sql +52 -0
  639. synapse/storage/schema/main/delta/42/event_auth_state_only.sql +36 -0
  640. synapse/storage/schema/main/delta/42/user_dir.py +88 -0
  641. synapse/storage/schema/main/delta/43/blocked_rooms.sql +40 -0
  642. synapse/storage/schema/main/delta/43/quarantine_media.sql +36 -0
  643. synapse/storage/schema/main/delta/43/url_cache.sql +35 -0
  644. synapse/storage/schema/main/delta/43/user_share.sql +52 -0
  645. synapse/storage/schema/main/delta/44/expire_url_cache.sql +60 -0
  646. synapse/storage/schema/main/delta/45/group_server.sql +186 -0
  647. synapse/storage/schema/main/delta/45/profile_cache.sql +47 -0
  648. synapse/storage/schema/main/delta/46/drop_refresh_tokens.sql +36 -0
  649. synapse/storage/schema/main/delta/46/drop_unique_deleted_pushers.sql +54 -0
  650. synapse/storage/schema/main/delta/46/group_server.sql +51 -0
  651. synapse/storage/schema/main/delta/46/local_media_repository_url_idx.sql +43 -0
  652. synapse/storage/schema/main/delta/46/user_dir_null_room_ids.sql +54 -0
  653. synapse/storage/schema/main/delta/46/user_dir_typos.sql +43 -0
  654. synapse/storage/schema/main/delta/47/last_access_media.sql +35 -0
  655. synapse/storage/schema/main/delta/47/postgres_fts_gin.sql +36 -0
  656. synapse/storage/schema/main/delta/47/push_actions_staging.sql +47 -0
  657. synapse/storage/schema/main/delta/48/add_user_consent.sql +37 -0
  658. synapse/storage/schema/main/delta/48/add_user_ips_last_seen_index.sql +36 -0
  659. synapse/storage/schema/main/delta/48/deactivated_users.sql +44 -0
  660. synapse/storage/schema/main/delta/48/group_unique_indexes.py +67 -0
  661. synapse/storage/schema/main/delta/48/groups_joinable.sql +41 -0
  662. synapse/storage/schema/main/delta/49/add_user_consent_server_notice_sent.sql +39 -0
  663. synapse/storage/schema/main/delta/49/add_user_daily_visits.sql +40 -0
  664. synapse/storage/schema/main/delta/49/add_user_ips_last_seen_only_index.sql +36 -0
  665. synapse/storage/schema/main/delta/50/add_creation_ts_users_index.sql +38 -0
  666. synapse/storage/schema/main/delta/50/erasure_store.sql +40 -0
  667. synapse/storage/schema/main/delta/50/make_event_content_nullable.py +102 -0
  668. synapse/storage/schema/main/delta/51/e2e_room_keys.sql +58 -0
  669. synapse/storage/schema/main/delta/51/monthly_active_users.sql +46 -0
  670. synapse/storage/schema/main/delta/52/add_event_to_state_group_index.sql +38 -0
  671. synapse/storage/schema/main/delta/52/device_list_streams_unique_idx.sql +55 -0
  672. synapse/storage/schema/main/delta/52/e2e_room_keys.sql +72 -0
  673. synapse/storage/schema/main/delta/53/add_user_type_to_users.sql +38 -0
  674. synapse/storage/schema/main/delta/53/drop_sent_transactions.sql +35 -0
  675. synapse/storage/schema/main/delta/53/event_format_version.sql +35 -0
  676. synapse/storage/schema/main/delta/53/user_dir_populate.sql +49 -0
  677. synapse/storage/schema/main/delta/53/user_ips_index.sql +49 -0
  678. synapse/storage/schema/main/delta/53/user_share.sql +63 -0
  679. synapse/storage/schema/main/delta/53/user_threepid_id.sql +48 -0
  680. synapse/storage/schema/main/delta/53/users_in_public_rooms.sql +47 -0
  681. synapse/storage/schema/main/delta/54/account_validity_with_renewal.sql +49 -0
  682. synapse/storage/schema/main/delta/54/add_validity_to_server_keys.sql +42 -0
  683. synapse/storage/schema/main/delta/54/delete_forward_extremities.sql +42 -0
  684. synapse/storage/schema/main/delta/54/drop_legacy_tables.sql +49 -0
  685. synapse/storage/schema/main/delta/54/drop_presence_list.sql +35 -0
  686. synapse/storage/schema/main/delta/54/relations.sql +46 -0
  687. synapse/storage/schema/main/delta/54/stats.sql +99 -0
  688. synapse/storage/schema/main/delta/54/stats2.sql +47 -0
  689. synapse/storage/schema/main/delta/55/access_token_expiry.sql +37 -0
  690. synapse/storage/schema/main/delta/55/track_threepid_validations.sql +50 -0
  691. synapse/storage/schema/main/delta/55/users_alter_deactivated.sql +38 -0
  692. synapse/storage/schema/main/delta/56/add_spans_to_device_lists.sql +39 -0
  693. synapse/storage/schema/main/delta/56/current_state_events_membership.sql +41 -0
  694. synapse/storage/schema/main/delta/56/current_state_events_membership_mk2.sql +43 -0
  695. synapse/storage/schema/main/delta/56/delete_keys_from_deleted_backups.sql +44 -0
  696. synapse/storage/schema/main/delta/56/destinations_failure_ts.sql +44 -0
  697. synapse/storage/schema/main/delta/56/destinations_retry_interval_type.sql.postgres +18 -0
  698. synapse/storage/schema/main/delta/56/device_stream_id_insert.sql +39 -0
  699. synapse/storage/schema/main/delta/56/devices_last_seen.sql +43 -0
  700. synapse/storage/schema/main/delta/56/drop_unused_event_tables.sql +39 -0
  701. synapse/storage/schema/main/delta/56/event_expiry.sql +40 -0
  702. synapse/storage/schema/main/delta/56/event_labels.sql +49 -0
  703. synapse/storage/schema/main/delta/56/event_labels_background_update.sql +36 -0
  704. synapse/storage/schema/main/delta/56/fix_room_keys_index.sql +37 -0
  705. synapse/storage/schema/main/delta/56/hidden_devices.sql +37 -0
  706. synapse/storage/schema/main/delta/56/hidden_devices_fix.sql.sqlite +42 -0
  707. synapse/storage/schema/main/delta/56/nuke_empty_communities_from_db.sql +48 -0
  708. synapse/storage/schema/main/delta/56/public_room_list_idx.sql +35 -0
  709. synapse/storage/schema/main/delta/56/redaction_censor.sql +35 -0
  710. synapse/storage/schema/main/delta/56/redaction_censor2.sql +41 -0
  711. synapse/storage/schema/main/delta/56/redaction_censor3_fix_update.sql.postgres +25 -0
  712. synapse/storage/schema/main/delta/56/redaction_censor4.sql +35 -0
  713. synapse/storage/schema/main/delta/56/remove_tombstoned_rooms_from_directory.sql +38 -0
  714. synapse/storage/schema/main/delta/56/room_key_etag.sql +36 -0
  715. synapse/storage/schema/main/delta/56/room_membership_idx.sql +37 -0
  716. synapse/storage/schema/main/delta/56/room_retention.sql +52 -0
  717. synapse/storage/schema/main/delta/56/signing_keys.sql +75 -0
  718. synapse/storage/schema/main/delta/56/signing_keys_nonunique_signatures.sql +41 -0
  719. synapse/storage/schema/main/delta/56/stats_separated.sql +175 -0
  720. synapse/storage/schema/main/delta/56/unique_user_filter_index.py +46 -0
  721. synapse/storage/schema/main/delta/56/user_external_ids.sql +43 -0
  722. synapse/storage/schema/main/delta/56/users_in_public_rooms_idx.sql +36 -0
  723. synapse/storage/schema/main/delta/57/delete_old_current_state_events.sql +41 -0
  724. synapse/storage/schema/main/delta/57/device_list_remote_cache_stale.sql +44 -0
  725. synapse/storage/schema/main/delta/57/local_current_membership.py +111 -0
  726. synapse/storage/schema/main/delta/57/remove_sent_outbound_pokes.sql +40 -0
  727. synapse/storage/schema/main/delta/57/rooms_version_column.sql +43 -0
  728. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.postgres +35 -0
  729. synapse/storage/schema/main/delta/57/rooms_version_column_2.sql.sqlite +22 -0
  730. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.postgres +39 -0
  731. synapse/storage/schema/main/delta/57/rooms_version_column_3.sql.sqlite +23 -0
  732. synapse/storage/schema/main/delta/58/02remove_dup_outbound_pokes.sql +41 -0
  733. synapse/storage/schema/main/delta/58/03persist_ui_auth.sql +55 -0
  734. synapse/storage/schema/main/delta/58/05cache_instance.sql.postgres +30 -0
  735. synapse/storage/schema/main/delta/58/06dlols_unique_idx.py +83 -0
  736. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.postgres +33 -0
  737. synapse/storage/schema/main/delta/58/07add_method_to_thumbnail_constraint.sql.sqlite +44 -0
  738. synapse/storage/schema/main/delta/58/07persist_ui_auth_ips.sql +44 -0
  739. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.postgres +18 -0
  740. synapse/storage/schema/main/delta/58/08_media_safe_from_quarantine.sql.sqlite +18 -0
  741. synapse/storage/schema/main/delta/58/09shadow_ban.sql +37 -0
  742. synapse/storage/schema/main/delta/58/10_pushrules_enabled_delete_obsolete.sql +47 -0
  743. synapse/storage/schema/main/delta/58/10drop_local_rejections_stream.sql +41 -0
  744. synapse/storage/schema/main/delta/58/10federation_pos_instance_name.sql +41 -0
  745. synapse/storage/schema/main/delta/58/11dehydration.sql +39 -0
  746. synapse/storage/schema/main/delta/58/11fallback.sql +43 -0
  747. synapse/storage/schema/main/delta/58/11user_id_seq.py +38 -0
  748. synapse/storage/schema/main/delta/58/12room_stats.sql +51 -0
  749. synapse/storage/schema/main/delta/58/13remove_presence_allow_inbound.sql +36 -0
  750. synapse/storage/schema/main/delta/58/14events_instance_name.sql +35 -0
  751. synapse/storage/schema/main/delta/58/14events_instance_name.sql.postgres +28 -0
  752. synapse/storage/schema/main/delta/58/15_catchup_destination_rooms.sql +61 -0
  753. synapse/storage/schema/main/delta/58/15unread_count.sql +45 -0
  754. synapse/storage/schema/main/delta/58/16populate_stats_process_rooms_fix.sql +41 -0
  755. synapse/storage/schema/main/delta/58/17_catchup_last_successful.sql +40 -0
  756. synapse/storage/schema/main/delta/58/18stream_positions.sql +41 -0
  757. synapse/storage/schema/main/delta/58/19instance_map.sql.postgres +25 -0
  758. synapse/storage/schema/main/delta/58/19txn_id.sql +59 -0
  759. synapse/storage/schema/main/delta/58/20instance_name_event_tables.sql +36 -0
  760. synapse/storage/schema/main/delta/58/20user_daily_visits.sql +37 -0
  761. synapse/storage/schema/main/delta/58/21as_device_stream.sql +36 -0
  762. synapse/storage/schema/main/delta/58/21drop_device_max_stream_id.sql +1 -0
  763. synapse/storage/schema/main/delta/58/22puppet_token.sql +36 -0
  764. synapse/storage/schema/main/delta/58/22users_have_local_media.sql +2 -0
  765. synapse/storage/schema/main/delta/58/23e2e_cross_signing_keys_idx.sql +36 -0
  766. synapse/storage/schema/main/delta/58/24drop_event_json_index.sql +38 -0
  767. synapse/storage/schema/main/delta/58/25user_external_ids_user_id_idx.sql +36 -0
  768. synapse/storage/schema/main/delta/58/26access_token_last_validated.sql +37 -0
  769. synapse/storage/schema/main/delta/58/27local_invites.sql +37 -0
  770. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.postgres +16 -0
  771. synapse/storage/schema/main/delta/58/28drop_last_used_column.sql.sqlite +62 -0
  772. synapse/storage/schema/main/delta/59/01ignored_user.py +85 -0
  773. synapse/storage/schema/main/delta/59/02shard_send_to_device.sql +37 -0
  774. synapse/storage/schema/main/delta/59/03shard_send_to_device_sequence.sql.postgres +25 -0
  775. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql +71 -0
  776. synapse/storage/schema/main/delta/59/04_event_auth_chains.sql.postgres +16 -0
  777. synapse/storage/schema/main/delta/59/04drop_account_data.sql +36 -0
  778. synapse/storage/schema/main/delta/59/05cache_invalidation.sql +36 -0
  779. synapse/storage/schema/main/delta/59/06chain_cover_index.sql +36 -0
  780. synapse/storage/schema/main/delta/59/06shard_account_data.sql +39 -0
  781. synapse/storage/schema/main/delta/59/06shard_account_data.sql.postgres +32 -0
  782. synapse/storage/schema/main/delta/59/07shard_account_data_fix.sql +37 -0
  783. synapse/storage/schema/main/delta/59/08delete_pushers_for_deactivated_accounts.sql +39 -0
  784. synapse/storage/schema/main/delta/59/08delete_stale_pushers.sql +39 -0
  785. synapse/storage/schema/main/delta/59/09rejected_events_metadata.sql +45 -0
  786. synapse/storage/schema/main/delta/59/10delete_purged_chain_cover.sql +36 -0
  787. synapse/storage/schema/main/delta/59/11add_knock_members_to_stats.sql +39 -0
  788. synapse/storage/schema/main/delta/59/11drop_thumbnail_constraint.sql.postgres +22 -0
  789. synapse/storage/schema/main/delta/59/12account_validity_token_used_ts_ms.sql +37 -0
  790. synapse/storage/schema/main/delta/59/12presence_stream_instance.sql +37 -0
  791. synapse/storage/schema/main/delta/59/12presence_stream_instance_seq.sql.postgres +20 -0
  792. synapse/storage/schema/main/delta/59/13users_to_send_full_presence_to.sql +53 -0
  793. synapse/storage/schema/main/delta/59/14refresh_tokens.sql +53 -0
  794. synapse/storage/schema/main/delta/59/15locks.sql +56 -0
  795. synapse/storage/schema/main/delta/59/16federation_inbound_staging.sql +51 -0
  796. synapse/storage/schema/main/delta/60/01recreate_stream_ordering.sql.postgres +45 -0
  797. synapse/storage/schema/main/delta/60/02change_stream_ordering_columns.sql.postgres +30 -0
  798. synapse/storage/schema/main/delta/61/01change_appservices_txns.sql.postgres +23 -0
  799. synapse/storage/schema/main/delta/61/01insertion_event_lookups.sql +68 -0
  800. synapse/storage/schema/main/delta/61/02drop_redundant_room_depth_index.sql +37 -0
  801. synapse/storage/schema/main/delta/61/03recreate_min_depth.py +74 -0
  802. synapse/storage/schema/main/delta/62/01insertion_event_extremities.sql +43 -0
  803. synapse/storage/schema/main/delta/63/01create_registration_tokens.sql +42 -0
  804. synapse/storage/schema/main/delta/63/02delete_unlinked_email_pushers.sql +39 -0
  805. synapse/storage/schema/main/delta/63/02populate-rooms-creator.sql +36 -0
  806. synapse/storage/schema/main/delta/63/03session_store.sql +42 -0
  807. synapse/storage/schema/main/delta/63/04add_presence_stream_not_offline_index.sql +37 -0
  808. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.postgres +23 -0
  809. synapse/storage/schema/main/delta/64/01msc2716_chunk_to_batch_rename.sql.sqlite +37 -0
  810. synapse/storage/schema/main/delta/65/01msc2716_insertion_event_edges.sql +38 -0
  811. synapse/storage/schema/main/delta/65/03remove_hidden_devices_from_device_inbox.sql +41 -0
  812. synapse/storage/schema/main/delta/65/04_local_group_updates.sql +37 -0
  813. synapse/storage/schema/main/delta/65/05_remove_room_stats_historical_and_user_stats_historical.sql +38 -0
  814. synapse/storage/schema/main/delta/65/06remove_deleted_devices_from_device_inbox.sql +53 -0
  815. synapse/storage/schema/main/delta/65/07_arbitrary_relations.sql +37 -0
  816. synapse/storage/schema/main/delta/65/08_device_inbox_background_updates.sql +37 -0
  817. synapse/storage/schema/main/delta/65/10_expirable_refresh_tokens.sql +47 -0
  818. synapse/storage/schema/main/delta/65/11_devices_auth_provider_session.sql +46 -0
  819. synapse/storage/schema/main/delta/67/01drop_public_room_list_stream.sql +37 -0
  820. synapse/storage/schema/main/delta/68/01event_columns.sql +45 -0
  821. synapse/storage/schema/main/delta/68/02_msc2409_add_device_id_appservice_stream_type.sql +40 -0
  822. synapse/storage/schema/main/delta/68/03_delete_account_data_for_deactivated_accounts.sql +39 -0
  823. synapse/storage/schema/main/delta/68/04_refresh_tokens_index_next_token_id.sql +47 -0
  824. synapse/storage/schema/main/delta/68/04partial_state_rooms.sql +60 -0
  825. synapse/storage/schema/main/delta/68/05_delete_non_strings_from_event_search.sql.sqlite +22 -0
  826. synapse/storage/schema/main/delta/68/05partial_state_rooms_triggers.py +80 -0
  827. synapse/storage/schema/main/delta/68/06_msc3202_add_device_list_appservice_stream_type.sql +42 -0
  828. synapse/storage/schema/main/delta/69/01as_txn_seq.py +54 -0
  829. synapse/storage/schema/main/delta/69/01device_list_oubound_by_room.sql +57 -0
  830. synapse/storage/schema/main/delta/69/02cache_invalidation_index.sql +37 -0
  831. synapse/storage/schema/main/delta/70/01clean_table_purged_rooms.sql +39 -0
  832. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.postgres +43 -0
  833. synapse/storage/schema/main/delta/71/01rebuild_event_edges.sql.sqlite +47 -0
  834. synapse/storage/schema/main/delta/71/01remove_noop_background_updates.sql +80 -0
  835. synapse/storage/schema/main/delta/71/02event_push_summary_unique.sql +37 -0
  836. synapse/storage/schema/main/delta/72/01add_room_type_to_state_stats.sql +38 -0
  837. synapse/storage/schema/main/delta/72/01event_push_summary_receipt.sql +54 -0
  838. synapse/storage/schema/main/delta/72/02event_push_actions_index.sql +38 -0
  839. synapse/storage/schema/main/delta/72/03bg_populate_events_columns.py +57 -0
  840. synapse/storage/schema/main/delta/72/03drop_event_reference_hashes.sql +36 -0
  841. synapse/storage/schema/main/delta/72/03remove_groups.sql +50 -0
  842. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.postgres +17 -0
  843. synapse/storage/schema/main/delta/72/04drop_column_application_services_state_last_txn.sql.sqlite +40 -0
  844. synapse/storage/schema/main/delta/72/05receipts_event_stream_ordering.sql +38 -0
  845. synapse/storage/schema/main/delta/72/05remove_unstable_private_read_receipts.sql +38 -0
  846. synapse/storage/schema/main/delta/72/06add_consent_ts_to_users.sql +35 -0
  847. synapse/storage/schema/main/delta/72/06thread_notifications.sql +49 -0
  848. synapse/storage/schema/main/delta/72/07force_update_current_state_events_membership.py +67 -0
  849. synapse/storage/schema/main/delta/72/07thread_receipts.sql.postgres +30 -0
  850. synapse/storage/schema/main/delta/72/07thread_receipts.sql.sqlite +70 -0
  851. synapse/storage/schema/main/delta/72/08begin_cache_invalidation_seq_at_2.sql.postgres +23 -0
  852. synapse/storage/schema/main/delta/72/08thread_receipts.sql +39 -0
  853. synapse/storage/schema/main/delta/72/09partial_indices.sql.sqlite +56 -0
  854. synapse/storage/schema/main/delta/73/01event_failed_pull_attempts.sql +48 -0
  855. synapse/storage/schema/main/delta/73/02add_pusher_enabled.sql +35 -0
  856. synapse/storage/schema/main/delta/73/02room_id_indexes_for_purging.sql +41 -0
  857. synapse/storage/schema/main/delta/73/03pusher_device_id.sql +39 -0
  858. synapse/storage/schema/main/delta/73/03users_approved_column.sql +39 -0
  859. synapse/storage/schema/main/delta/73/04partial_join_details.sql +42 -0
  860. synapse/storage/schema/main/delta/73/04pending_device_list_updates.sql +47 -0
  861. synapse/storage/schema/main/delta/73/05old_push_actions.sql.postgres +22 -0
  862. synapse/storage/schema/main/delta/73/05old_push_actions.sql.sqlite +24 -0
  863. synapse/storage/schema/main/delta/73/06thread_notifications_thread_id_idx.sql +42 -0
  864. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.postgres +23 -0
  865. synapse/storage/schema/main/delta/73/08thread_receipts_non_null.sql.sqlite +76 -0
  866. synapse/storage/schema/main/delta/73/09partial_joined_via_destination.sql +37 -0
  867. synapse/storage/schema/main/delta/73/09threads_table.sql +49 -0
  868. synapse/storage/schema/main/delta/73/10_update_sqlite_fts4_tokenizer.py +71 -0
  869. synapse/storage/schema/main/delta/73/10login_tokens.sql +54 -0
  870. synapse/storage/schema/main/delta/73/11event_search_room_id_n_distinct.sql.postgres +33 -0
  871. synapse/storage/schema/main/delta/73/12refactor_device_list_outbound_pokes.sql +72 -0
  872. synapse/storage/schema/main/delta/73/13add_device_lists_index.sql +39 -0
  873. synapse/storage/schema/main/delta/73/20_un_partial_stated_room_stream.sql +51 -0
  874. synapse/storage/schema/main/delta/73/21_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  875. synapse/storage/schema/main/delta/73/22_rebuild_user_dir_stats.sql +48 -0
  876. synapse/storage/schema/main/delta/73/22_un_partial_stated_event_stream.sql +53 -0
  877. synapse/storage/schema/main/delta/73/23_fix_thread_index.sql +52 -0
  878. synapse/storage/schema/main/delta/73/23_un_partial_stated_room_stream_seq.sql.postgres +20 -0
  879. synapse/storage/schema/main/delta/73/24_events_jump_to_date_index.sql +36 -0
  880. synapse/storage/schema/main/delta/73/25drop_presence.sql +36 -0
  881. synapse/storage/schema/main/delta/74/01_user_directory_stale_remote_users.sql +58 -0
  882. synapse/storage/schema/main/delta/74/02_set_device_id_for_pushers_bg_update.sql +38 -0
  883. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.postgres +29 -0
  884. synapse/storage/schema/main/delta/74/03_membership_tables_event_stream_ordering.sql.sqlite +23 -0
  885. synapse/storage/schema/main/delta/74/03_room_membership_index.sql +38 -0
  886. synapse/storage/schema/main/delta/74/04_delete_e2e_backup_keys_for_deactivated_users.sql +36 -0
  887. synapse/storage/schema/main/delta/74/04_membership_tables_event_stream_ordering_triggers.py +87 -0
  888. synapse/storage/schema/main/delta/74/05_events_txn_id_device_id.sql +72 -0
  889. synapse/storage/schema/main/delta/74/90COMMENTS_destinations.sql.postgres +52 -0
  890. synapse/storage/schema/main/delta/76/01_add_profiles_full_user_id_column.sql +39 -0
  891. synapse/storage/schema/main/delta/76/02_add_user_filters_full_user_id_column.sql +39 -0
  892. synapse/storage/schema/main/delta/76/03_per_user_experimental_features.sql +46 -0
  893. synapse/storage/schema/main/delta/76/04_add_room_forgetter.sql +43 -0
  894. synapse/storage/schema/main/delta/77/01_add_profiles_not_valid_check.sql.postgres +16 -0
  895. synapse/storage/schema/main/delta/77/02_add_user_filters_not_valid_check.sql.postgres +16 -0
  896. synapse/storage/schema/main/delta/77/03bg_populate_full_user_id_profiles.sql +35 -0
  897. synapse/storage/schema/main/delta/77/04bg_populate_full_user_id_user_filters.sql +35 -0
  898. synapse/storage/schema/main/delta/77/05thread_notifications_backfill.sql +67 -0
  899. synapse/storage/schema/main/delta/77/06thread_notifications_not_null.sql.sqlite +102 -0
  900. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions.sql.postgres +27 -0
  901. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_actions_staging.sql.postgres +27 -0
  902. synapse/storage/schema/main/delta/77/06thread_notifications_not_null_event_push_summary.sql.postgres +29 -0
  903. synapse/storage/schema/main/delta/77/14bg_indices_event_stream_ordering.sql +39 -0
  904. synapse/storage/schema/main/delta/78/01_validate_and_update_profiles.py +99 -0
  905. synapse/storage/schema/main/delta/78/02_validate_and_update_user_filters.py +100 -0
  906. synapse/storage/schema/main/delta/78/03_remove_unused_indexes_user_filters.py +72 -0
  907. synapse/storage/schema/main/delta/78/03event_extremities_constraints.py +65 -0
  908. synapse/storage/schema/main/delta/78/04_add_full_user_id_index_user_filters.py +32 -0
  909. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.postgres +102 -0
  910. synapse/storage/schema/main/delta/79/03_read_write_locks_triggers.sql.sqlite +72 -0
  911. synapse/storage/schema/main/delta/79/04_mitigate_stream_ordering_update_race.py +70 -0
  912. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.postgres +69 -0
  913. synapse/storage/schema/main/delta/79/05_read_write_locks_triggers.sql.sqlite +65 -0
  914. synapse/storage/schema/main/delta/80/01_users_alter_locked.sql +35 -0
  915. synapse/storage/schema/main/delta/80/02_read_write_locks_unlogged.sql.postgres +30 -0
  916. synapse/storage/schema/main/delta/80/02_scheduled_tasks.sql +47 -0
  917. synapse/storage/schema/main/delta/80/03_read_write_locks_triggers.sql.postgres +37 -0
  918. synapse/storage/schema/main/delta/80/04_read_write_locks_deadlock.sql.postgres +71 -0
  919. synapse/storage/schema/main/delta/82/02_scheduled_tasks_index.sql +35 -0
  920. synapse/storage/schema/main/delta/82/04_add_indices_for_purging_rooms.sql +39 -0
  921. synapse/storage/schema/main/delta/82/05gaps.sql +44 -0
  922. synapse/storage/schema/main/delta/83/01_drop_old_tables.sql +43 -0
  923. synapse/storage/schema/main/delta/83/03_instance_name_receipts.sql.sqlite +17 -0
  924. synapse/storage/schema/main/delta/83/05_cross_signing_key_update_grant.sql +34 -0
  925. synapse/storage/schema/main/delta/83/06_event_push_summary_room.sql +36 -0
  926. synapse/storage/schema/main/delta/84/01_auth_links_stats.sql.postgres +20 -0
  927. synapse/storage/schema/main/delta/84/02_auth_links_index.sql +16 -0
  928. synapse/storage/schema/main/delta/84/03_auth_links_analyze.sql.postgres +16 -0
  929. synapse/storage/schema/main/delta/84/04_access_token_index.sql +15 -0
  930. synapse/storage/schema/main/delta/85/01_add_suspended.sql +14 -0
  931. synapse/storage/schema/main/delta/85/02_add_instance_names.sql +27 -0
  932. synapse/storage/schema/main/delta/85/03_new_sequences.sql.postgres +54 -0
  933. synapse/storage/schema/main/delta/85/04_cleanup_device_federation_outbox.sql +15 -0
  934. synapse/storage/schema/main/delta/85/05_add_instance_names_converted_pos.sql +16 -0
  935. synapse/storage/schema/main/delta/85/06_add_room_reports.sql +20 -0
  936. synapse/storage/schema/main/delta/86/01_authenticate_media.sql +15 -0
  937. synapse/storage/schema/main/delta/86/02_receipts_event_id_index.sql +15 -0
  938. synapse/storage/schema/main/delta/87/01_sliding_sync_memberships.sql +169 -0
  939. synapse/storage/schema/main/delta/87/02_per_connection_state.sql +81 -0
  940. synapse/storage/schema/main/delta/87/03_current_state_index.sql +19 -0
  941. synapse/storage/schema/main/delta/88/01_add_delayed_events.sql +43 -0
  942. synapse/storage/schema/main/delta/88/01_custom_profile_fields.sql +15 -0
  943. synapse/storage/schema/main/delta/88/02_fix_sliding_sync_membership_snapshots_forgotten_column.sql +21 -0
  944. synapse/storage/schema/main/delta/88/03_add_otk_ts_added_index.sql +18 -0
  945. synapse/storage/schema/main/delta/88/04_current_state_delta_index.sql +18 -0
  946. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.postgres +19 -0
  947. synapse/storage/schema/main/delta/88/05_drop_old_otks.sql.sqlite +19 -0
  948. synapse/storage/schema/main/delta/88/05_sliding_sync_room_config_index.sql +20 -0
  949. synapse/storage/schema/main/delta/88/06_events_received_ts_index.sql +17 -0
  950. synapse/storage/schema/main/delta/89/01_sliding_sync_membership_snapshot_index.sql +15 -0
  951. synapse/storage/schema/main/delta/90/01_add_column_participant_room_memberships_table.sql +16 -0
  952. synapse/storage/schema/main/delta/91/01_media_hash.sql +28 -0
  953. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.postgres +16 -0
  954. synapse/storage/schema/main/delta/92/01_remove_trigger.sql.sqlite +16 -0
  955. synapse/storage/schema/main/delta/92/02_remove_populate_participant_bg_update.sql +17 -0
  956. synapse/storage/schema/main/delta/92/04_ss_membership_snapshot_idx.sql +16 -0
  957. synapse/storage/schema/main/delta/92/04_thread_subscriptions.sql +59 -0
  958. synapse/storage/schema/main/delta/92/04_thread_subscriptions_seq.sql.postgres +19 -0
  959. synapse/storage/schema/main/delta/92/05_fixup_max_depth_cap.sql +17 -0
  960. synapse/storage/schema/main/delta/92/05_thread_subscriptions_comments.sql.postgres +18 -0
  961. synapse/storage/schema/main/delta/92/06_device_federation_inbox_index.sql +16 -0
  962. synapse/storage/schema/main/delta/92/06_threads_last_sent_stream_ordering_comments.sql.postgres +24 -0
  963. synapse/storage/schema/main/delta/92/07_add_user_reports.sql +22 -0
  964. synapse/storage/schema/main/delta/92/07_event_txn_id_device_id_txn_id2.sql +15 -0
  965. synapse/storage/schema/main/delta/92/08_room_ban_redactions.sql +21 -0
  966. synapse/storage/schema/main/delta/92/08_thread_subscriptions_seq_fixup.sql.postgres +19 -0
  967. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql +20 -0
  968. synapse/storage/schema/main/delta/92/09_thread_subscriptions_update.sql.postgres +18 -0
  969. synapse/storage/schema/main/full_schemas/72/full.sql.postgres +1344 -0
  970. synapse/storage/schema/main/full_schemas/72/full.sql.sqlite +646 -0
  971. synapse/storage/schema/state/delta/23/drop_state_index.sql +35 -0
  972. synapse/storage/schema/state/delta/32/remove_state_indices.sql +38 -0
  973. synapse/storage/schema/state/delta/35/add_state_index.sql +36 -0
  974. synapse/storage/schema/state/delta/35/state.sql +41 -0
  975. synapse/storage/schema/state/delta/35/state_dedupe.sql +36 -0
  976. synapse/storage/schema/state/delta/47/state_group_seq.py +38 -0
  977. synapse/storage/schema/state/delta/56/state_group_room_idx.sql +36 -0
  978. synapse/storage/schema/state/delta/61/02state_groups_state_n_distinct.sql.postgres +34 -0
  979. synapse/storage/schema/state/delta/70/08_state_group_edges_unique.sql +36 -0
  980. synapse/storage/schema/state/delta/89/01_state_groups_deletion.sql +39 -0
  981. synapse/storage/schema/state/delta/90/02_delete_unreferenced_state_groups.sql +16 -0
  982. synapse/storage/schema/state/delta/90/03_remove_old_deletion_bg_update.sql +15 -0
  983. synapse/storage/schema/state/full_schemas/72/full.sql.postgres +30 -0
  984. synapse/storage/schema/state/full_schemas/72/full.sql.sqlite +20 -0
  985. synapse/storage/types.py +185 -0
  986. synapse/storage/util/__init__.py +20 -0
  987. synapse/storage/util/id_generators.py +909 -0
  988. synapse/storage/util/partial_state_events_tracker.py +194 -0
  989. synapse/storage/util/sequence.py +315 -0
  990. synapse/streams/__init__.py +43 -0
  991. synapse/streams/config.py +92 -0
  992. synapse/streams/events.py +203 -0
  993. synapse/synapse_rust/__init__.pyi +3 -0
  994. synapse/synapse_rust/acl.pyi +20 -0
  995. synapse/synapse_rust/events.pyi +136 -0
  996. synapse/synapse_rust/http_client.pyi +32 -0
  997. synapse/synapse_rust/push.pyi +86 -0
  998. synapse/synapse_rust/rendezvous.pyi +30 -0
  999. synapse/synapse_rust/segmenter.pyi +1 -0
  1000. synapse/synapse_rust.abi3.so +0 -0
  1001. synapse/types/__init__.py +1600 -0
  1002. synapse/types/handlers/__init__.py +93 -0
  1003. synapse/types/handlers/policy_server.py +16 -0
  1004. synapse/types/handlers/sliding_sync.py +909 -0
  1005. synapse/types/rest/__init__.py +25 -0
  1006. synapse/types/rest/client/__init__.py +415 -0
  1007. synapse/types/state.py +635 -0
  1008. synapse/types/storage/__init__.py +66 -0
  1009. synapse/util/__init__.py +170 -0
  1010. synapse/util/async_helpers.py +1067 -0
  1011. synapse/util/batching_queue.py +202 -0
  1012. synapse/util/caches/__init__.py +300 -0
  1013. synapse/util/caches/cached_call.py +143 -0
  1014. synapse/util/caches/deferred_cache.py +530 -0
  1015. synapse/util/caches/descriptors.py +694 -0
  1016. synapse/util/caches/dictionary_cache.py +350 -0
  1017. synapse/util/caches/expiringcache.py +251 -0
  1018. synapse/util/caches/lrucache.py +977 -0
  1019. synapse/util/caches/response_cache.py +323 -0
  1020. synapse/util/caches/stream_change_cache.py +370 -0
  1021. synapse/util/caches/treecache.py +189 -0
  1022. synapse/util/caches/ttlcache.py +197 -0
  1023. synapse/util/cancellation.py +63 -0
  1024. synapse/util/check_dependencies.py +335 -0
  1025. synapse/util/clock.py +500 -0
  1026. synapse/util/constants.py +22 -0
  1027. synapse/util/daemonize.py +165 -0
  1028. synapse/util/distributor.py +159 -0
  1029. synapse/util/events.py +134 -0
  1030. synapse/util/file_consumer.py +164 -0
  1031. synapse/util/frozenutils.py +57 -0
  1032. synapse/util/gai_resolver.py +180 -0
  1033. synapse/util/hash.py +38 -0
  1034. synapse/util/httpresourcetree.py +108 -0
  1035. synapse/util/iterutils.py +189 -0
  1036. synapse/util/json.py +56 -0
  1037. synapse/util/linked_list.py +156 -0
  1038. synapse/util/logcontext.py +46 -0
  1039. synapse/util/logformatter.py +28 -0
  1040. synapse/util/macaroons.py +325 -0
  1041. synapse/util/manhole.py +191 -0
  1042. synapse/util/metrics.py +340 -0
  1043. synapse/util/module_loader.py +116 -0
  1044. synapse/util/msisdn.py +51 -0
  1045. synapse/util/patch_inline_callbacks.py +250 -0
  1046. synapse/util/pydantic_models.py +56 -0
  1047. synapse/util/ratelimitutils.py +420 -0
  1048. synapse/util/retryutils.py +339 -0
  1049. synapse/util/rlimit.py +42 -0
  1050. synapse/util/rust.py +134 -0
  1051. synapse/util/sentinel.py +21 -0
  1052. synapse/util/stringutils.py +293 -0
  1053. synapse/util/task_scheduler.py +493 -0
  1054. synapse/util/templates.py +126 -0
  1055. synapse/util/threepids.py +123 -0
  1056. synapse/util/wheel_timer.py +112 -0
  1057. synapse/visibility.py +836 -0
@@ -0,0 +1,1669 @@
1
+ #
2
+ # This file is licensed under the Affero General Public License (AGPL) version 3.
3
+ #
4
+ # Copyright 2014-2016 OpenMarket Ltd
5
+ # Copyright (C) 2023-2024 New Vector, Ltd
6
+ #
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Affero General Public License as
9
+ # published by the Free Software Foundation, either version 3 of the
10
+ # License, or (at your option) any later version.
11
+ #
12
+ # See the GNU Affero General Public License for more details:
13
+ # <https://www.gnu.org/licenses/agpl-3.0.html>.
14
+ #
15
+ # Originally licensed under the Apache License, Version 2.0:
16
+ # <http://www.apache.org/licenses/LICENSE-2.0>.
17
+ #
18
+ # [This file includes modifications made by New Vector Limited]
19
+ #
20
+ #
21
+
22
+ """This module contains REST servlets to do with rooms: /rooms/<paths>"""
23
+
24
+ import logging
25
+ import re
26
+ from enum import Enum
27
+ from http import HTTPStatus
28
+ from typing import TYPE_CHECKING, Awaitable, Optional
29
+ from urllib import parse as urlparse
30
+
31
+ from prometheus_client.core import Histogram
32
+
33
+ from twisted.web.server import Request
34
+
35
+ from synapse import event_auth
36
+ from synapse.api.constants import Direction, EventTypes, Membership
37
+ from synapse.api.errors import (
38
+ AuthError,
39
+ Codes,
40
+ InvalidClientCredentialsError,
41
+ MissingClientTokenError,
42
+ ShadowBanError,
43
+ SynapseError,
44
+ UnredactedContentDeletedError,
45
+ )
46
+ from synapse.api.filtering import Filter
47
+ from synapse.events.utils import (
48
+ SerializeEventConfig,
49
+ format_event_for_client_v2,
50
+ serialize_event,
51
+ )
52
+ from synapse.http.server import HttpServer
53
+ from synapse.http.servlet import (
54
+ ResolveRoomIdMixin,
55
+ RestServlet,
56
+ assert_params_in_dict,
57
+ parse_boolean,
58
+ parse_enum,
59
+ parse_integer,
60
+ parse_json,
61
+ parse_json_object_from_request,
62
+ parse_string,
63
+ parse_strings_from_args,
64
+ )
65
+ from synapse.http.site import SynapseRequest
66
+ from synapse.logging.context import make_deferred_yieldable, run_in_background
67
+ from synapse.logging.opentracing import set_tag
68
+ from synapse.metrics import SERVER_NAME_LABEL
69
+ from synapse.rest.client._base import client_patterns
70
+ from synapse.rest.client.transactions import HttpTransactionCache
71
+ from synapse.state import CREATE_KEY, POWER_KEY
72
+ from synapse.streams.config import PaginationConfig
73
+ from synapse.types import JsonDict, Requester, StreamToken, ThirdPartyInstanceID, UserID
74
+ from synapse.types.state import StateFilter
75
+ from synapse.util.cancellation import cancellable
76
+ from synapse.util.events import generate_fake_event_id
77
+ from synapse.util.stringutils import parse_and_validate_server_name
78
+
79
+ if TYPE_CHECKING:
80
+ from synapse.server import HomeServer
81
+
82
+ logger = logging.getLogger(__name__)
83
+
84
+
85
+ class _RoomSize(Enum):
86
+ """
87
+ Enum to differentiate sizes of rooms. This is a pretty good approximation
88
+ about how hard it will be to get events in the room. We could also look at
89
+ room "complexity".
90
+ """
91
+
92
+ # This doesn't necessarily mean the room is a DM, just that there is a DM
93
+ # amount of people there.
94
+ DM_SIZE = "direct_message_size"
95
+ SMALL = "small"
96
+ SUBSTANTIAL = "substantial"
97
+ LARGE = "large"
98
+
99
+ @staticmethod
100
+ def from_member_count(member_count: int) -> "_RoomSize":
101
+ if member_count <= 2:
102
+ return _RoomSize.DM_SIZE
103
+ elif member_count < 100:
104
+ return _RoomSize.SMALL
105
+ elif member_count < 1000:
106
+ return _RoomSize.SUBSTANTIAL
107
+ else:
108
+ return _RoomSize.LARGE
109
+
110
+
111
+ # This is an extra metric on top of `synapse_http_server_response_time_seconds`
112
+ # which times the same sort of thing but this one allows us to see values
113
+ # greater than 10s. We use a separate dedicated histogram with its own buckets
114
+ # so that we don't increase the cardinality of the general one because it's
115
+ # multiplied across hundreds of servlets.
116
+ messsages_response_timer = Histogram(
117
+ "synapse_room_message_list_rest_servlet_response_time_seconds",
118
+ "sec",
119
+ # We have a label for room size so we can try to see a more realistic
120
+ # picture of /messages response time for bigger rooms. We don't want the
121
+ # tiny rooms that can always respond fast skewing our results when we're trying
122
+ # to optimize the bigger cases.
123
+ labelnames=["room_size", SERVER_NAME_LABEL],
124
+ buckets=(
125
+ 0.005,
126
+ 0.01,
127
+ 0.025,
128
+ 0.05,
129
+ 0.1,
130
+ 0.25,
131
+ 0.5,
132
+ 1.0,
133
+ 2.5,
134
+ 5.0,
135
+ 10.0,
136
+ 20.0,
137
+ 30.0,
138
+ 60.0,
139
+ 80.0,
140
+ 100.0,
141
+ 120.0,
142
+ 150.0,
143
+ 180.0,
144
+ "+Inf",
145
+ ),
146
+ )
147
+
148
+
149
+ class TransactionRestServlet(RestServlet):
150
+ def __init__(self, hs: "HomeServer"):
151
+ super().__init__()
152
+ self.txns = HttpTransactionCache(hs)
153
+
154
+
155
+ class RoomCreateRestServlet(TransactionRestServlet):
156
+ CATEGORY = "Client API requests"
157
+
158
+ def __init__(self, hs: "HomeServer"):
159
+ super().__init__(hs)
160
+ self._room_creation_handler = hs.get_room_creation_handler()
161
+ self.auth = hs.get_auth()
162
+
163
+ def register(self, http_server: HttpServer) -> None:
164
+ PATTERNS = "/createRoom"
165
+ register_txn_path(self, PATTERNS, http_server)
166
+
167
+ async def on_PUT(
168
+ self, request: SynapseRequest, txn_id: str
169
+ ) -> tuple[int, JsonDict]:
170
+ requester = await self.auth.get_user_by_req(request)
171
+ set_tag("txn_id", txn_id)
172
+ return await self.txns.fetch_or_execute_request(
173
+ request, requester, self._do, request, requester
174
+ )
175
+
176
+ async def on_POST(self, request: SynapseRequest) -> tuple[int, JsonDict]:
177
+ requester = await self.auth.get_user_by_req(request)
178
+ return await self._do(request, requester)
179
+
180
+ async def _do(
181
+ self, request: SynapseRequest, requester: Requester
182
+ ) -> tuple[int, JsonDict]:
183
+ room_id, _, _ = await self._room_creation_handler.create_room(
184
+ requester, self.get_room_config(request)
185
+ )
186
+
187
+ return 200, {"room_id": room_id}
188
+
189
+ def get_room_config(self, request: Request) -> JsonDict:
190
+ user_supplied_config = parse_json_object_from_request(request)
191
+ return user_supplied_config
192
+
193
+
194
+ # TODO: Needs unit testing for generic events
195
+ class RoomStateEventRestServlet(RestServlet):
196
+ CATEGORY = "Event sending requests"
197
+
198
+ def __init__(self, hs: "HomeServer"):
199
+ super().__init__()
200
+ self.event_creation_handler = hs.get_event_creation_handler()
201
+ self.room_member_handler = hs.get_room_member_handler()
202
+ self.message_handler = hs.get_message_handler()
203
+ self.delayed_events_handler = hs.get_delayed_events_handler()
204
+ self.auth = hs.get_auth()
205
+ self.clock = hs.get_clock()
206
+ self._max_event_delay_ms = hs.config.server.max_event_delay_ms
207
+ self._spam_checker_module_callbacks = hs.get_module_api_callbacks().spam_checker
208
+
209
+ def register(self, http_server: HttpServer) -> None:
210
+ # /rooms/$roomid/state/$eventtype
211
+ no_state_key = "/rooms/(?P<room_id>[^/]*)/state/(?P<event_type>[^/]*)$"
212
+
213
+ # /rooms/$roomid/state/$eventtype/$statekey
214
+ state_key = (
215
+ "/rooms/(?P<room_id>[^/]*)/state/"
216
+ "(?P<event_type>[^/]*)/(?P<state_key>[^/]*)$"
217
+ )
218
+
219
+ http_server.register_paths(
220
+ "GET",
221
+ client_patterns(state_key, v1=True),
222
+ self.on_GET,
223
+ self.__class__.__name__,
224
+ )
225
+ http_server.register_paths(
226
+ "PUT",
227
+ client_patterns(state_key, v1=True),
228
+ self.on_PUT,
229
+ self.__class__.__name__,
230
+ )
231
+ http_server.register_paths(
232
+ "GET",
233
+ client_patterns(no_state_key, v1=True),
234
+ self.on_GET_no_state_key,
235
+ self.__class__.__name__,
236
+ )
237
+ http_server.register_paths(
238
+ "PUT",
239
+ client_patterns(no_state_key, v1=True),
240
+ self.on_PUT_no_state_key,
241
+ self.__class__.__name__,
242
+ )
243
+
244
+ @cancellable
245
+ def on_GET_no_state_key(
246
+ self, request: SynapseRequest, room_id: str, event_type: str
247
+ ) -> Awaitable[tuple[int, JsonDict]]:
248
+ return self.on_GET(request, room_id, event_type, "")
249
+
250
+ def on_PUT_no_state_key(
251
+ self, request: SynapseRequest, room_id: str, event_type: str
252
+ ) -> Awaitable[tuple[int, JsonDict]]:
253
+ return self.on_PUT(request, room_id, event_type, "")
254
+
255
+ @cancellable
256
+ async def on_GET(
257
+ self, request: SynapseRequest, room_id: str, event_type: str, state_key: str
258
+ ) -> tuple[int, JsonDict]:
259
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
260
+ format = parse_string(
261
+ request, "format", default="content", allowed_values=["content", "event"]
262
+ )
263
+
264
+ msg_handler = self.message_handler
265
+ data = await msg_handler.get_room_data(
266
+ requester=requester,
267
+ room_id=room_id,
268
+ event_type=event_type,
269
+ state_key=state_key,
270
+ )
271
+
272
+ if not data:
273
+ raise SynapseError(404, "Event not found.", errcode=Codes.NOT_FOUND)
274
+
275
+ if format == "event":
276
+ event = serialize_event(
277
+ data,
278
+ self.clock.time_msec(),
279
+ config=SerializeEventConfig(
280
+ event_format=format_event_for_client_v2,
281
+ requester=requester,
282
+ ),
283
+ )
284
+ return 200, event
285
+ elif format == "content":
286
+ return 200, data.get_dict()["content"]
287
+
288
+ # Format must be event or content, per the parse_string call above.
289
+ raise RuntimeError(f"Unknown format: {format:r}.")
290
+
291
+ async def on_PUT(
292
+ self,
293
+ request: SynapseRequest,
294
+ room_id: str,
295
+ event_type: str,
296
+ state_key: str,
297
+ txn_id: Optional[str] = None,
298
+ ) -> tuple[int, JsonDict]:
299
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
300
+
301
+ if txn_id:
302
+ set_tag("txn_id", txn_id)
303
+
304
+ content = parse_json_object_from_request(request)
305
+
306
+ is_requester_admin = await self.auth.is_server_admin(requester)
307
+ if not is_requester_admin:
308
+ spam_check = (
309
+ await self._spam_checker_module_callbacks.user_may_send_state_event(
310
+ user_id=requester.user.to_string(),
311
+ room_id=room_id,
312
+ event_type=event_type,
313
+ state_key=state_key,
314
+ content=content,
315
+ )
316
+ )
317
+ if spam_check != self._spam_checker_module_callbacks.NOT_SPAM:
318
+ raise SynapseError(
319
+ 403,
320
+ "You are not permitted to send the state event",
321
+ errcode=spam_check[0],
322
+ additional_fields=spam_check[1],
323
+ )
324
+
325
+ origin_server_ts = None
326
+ if requester.app_service:
327
+ origin_server_ts = parse_integer(request, "ts")
328
+
329
+ delay = _parse_request_delay(request, self._max_event_delay_ms)
330
+ if delay is not None:
331
+ delay_id = await self.delayed_events_handler.add(
332
+ requester,
333
+ room_id=room_id,
334
+ event_type=event_type,
335
+ state_key=state_key,
336
+ origin_server_ts=origin_server_ts,
337
+ content=content,
338
+ delay=delay,
339
+ )
340
+
341
+ set_tag("delay_id", delay_id)
342
+ ret = {"delay_id": delay_id}
343
+ return 200, ret
344
+
345
+ try:
346
+ if event_type == EventTypes.Member:
347
+ membership = content.get("membership", None)
348
+ if not isinstance(membership, str):
349
+ raise SynapseError(400, "Invalid membership (must be a string)")
350
+
351
+ event_id, _ = await self.room_member_handler.update_membership(
352
+ requester,
353
+ target=UserID.from_string(state_key),
354
+ room_id=room_id,
355
+ action=membership,
356
+ content=content,
357
+ origin_server_ts=origin_server_ts,
358
+ )
359
+ else:
360
+ event_dict: JsonDict = {
361
+ "type": event_type,
362
+ "content": content,
363
+ "room_id": room_id,
364
+ "sender": requester.user.to_string(),
365
+ }
366
+
367
+ if state_key is not None:
368
+ event_dict["state_key"] = state_key
369
+
370
+ if origin_server_ts is not None:
371
+ event_dict["origin_server_ts"] = origin_server_ts
372
+
373
+ (
374
+ event,
375
+ _,
376
+ ) = await self.event_creation_handler.create_and_send_nonmember_event(
377
+ requester, event_dict, txn_id=txn_id
378
+ )
379
+ event_id = event.event_id
380
+ except ShadowBanError:
381
+ event_id = generate_fake_event_id()
382
+
383
+ set_tag("event_id", event_id)
384
+ ret = {"event_id": event_id}
385
+ return 200, ret
386
+
387
+
388
+ # TODO: Needs unit testing for generic events + feedback
389
+ class RoomSendEventRestServlet(TransactionRestServlet):
390
+ CATEGORY = "Event sending requests"
391
+
392
+ def __init__(self, hs: "HomeServer"):
393
+ super().__init__(hs)
394
+ self.event_creation_handler = hs.get_event_creation_handler()
395
+ self.delayed_events_handler = hs.get_delayed_events_handler()
396
+ self.auth = hs.get_auth()
397
+ self._max_event_delay_ms = hs.config.server.max_event_delay_ms
398
+
399
+ def register(self, http_server: HttpServer) -> None:
400
+ # /rooms/$roomid/send/$event_type[/$txn_id]
401
+ PATTERNS = "/rooms/(?P<room_id>[^/]*)/send/(?P<event_type>[^/]*)"
402
+ register_txn_path(self, PATTERNS, http_server)
403
+
404
+ async def _do(
405
+ self,
406
+ request: SynapseRequest,
407
+ requester: Requester,
408
+ room_id: str,
409
+ event_type: str,
410
+ txn_id: Optional[str],
411
+ ) -> tuple[int, JsonDict]:
412
+ content = parse_json_object_from_request(request)
413
+
414
+ origin_server_ts = None
415
+ if requester.app_service:
416
+ origin_server_ts = parse_integer(request, "ts")
417
+
418
+ delay = _parse_request_delay(request, self._max_event_delay_ms)
419
+ if delay is not None:
420
+ delay_id = await self.delayed_events_handler.add(
421
+ requester,
422
+ room_id=room_id,
423
+ event_type=event_type,
424
+ state_key=None,
425
+ origin_server_ts=origin_server_ts,
426
+ content=content,
427
+ delay=delay,
428
+ )
429
+
430
+ set_tag("delay_id", delay_id)
431
+ ret = {"delay_id": delay_id}
432
+ return 200, ret
433
+
434
+ event_dict: JsonDict = {
435
+ "type": event_type,
436
+ "content": content,
437
+ "room_id": room_id,
438
+ "sender": requester.user.to_string(),
439
+ }
440
+
441
+ if origin_server_ts is not None:
442
+ event_dict["origin_server_ts"] = origin_server_ts
443
+
444
+ try:
445
+ (
446
+ event,
447
+ _,
448
+ ) = await self.event_creation_handler.create_and_send_nonmember_event(
449
+ requester, event_dict, txn_id=txn_id
450
+ )
451
+ event_id = event.event_id
452
+ except ShadowBanError:
453
+ event_id = generate_fake_event_id()
454
+
455
+ set_tag("event_id", event_id)
456
+ return 200, {"event_id": event_id}
457
+
458
+ async def on_POST(
459
+ self,
460
+ request: SynapseRequest,
461
+ room_id: str,
462
+ event_type: str,
463
+ ) -> tuple[int, JsonDict]:
464
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
465
+ return await self._do(request, requester, room_id, event_type, None)
466
+
467
+ async def on_PUT(
468
+ self, request: SynapseRequest, room_id: str, event_type: str, txn_id: str
469
+ ) -> tuple[int, JsonDict]:
470
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
471
+ set_tag("txn_id", txn_id)
472
+
473
+ return await self.txns.fetch_or_execute_request(
474
+ request,
475
+ requester,
476
+ self._do,
477
+ request,
478
+ requester,
479
+ room_id,
480
+ event_type,
481
+ txn_id,
482
+ )
483
+
484
+
485
+ def _parse_request_delay(
486
+ request: SynapseRequest,
487
+ max_delay: Optional[int],
488
+ ) -> Optional[int]:
489
+ """Parses from the request string the delay parameter for
490
+ delayed event requests, and checks it for correctness.
491
+
492
+ Args:
493
+ request: the twisted HTTP request.
494
+ max_delay: the maximum allowed value of the delay parameter,
495
+ or None if no delay parameter is allowed.
496
+ Returns:
497
+ The value of the requested delay, or None if it was absent.
498
+
499
+ Raises:
500
+ SynapseError: if the delay parameter is present and forbidden,
501
+ or if it exceeds the maximum allowed value.
502
+ """
503
+ delay = parse_integer(request, "org.matrix.msc4140.delay")
504
+ if delay is None:
505
+ return None
506
+ if max_delay is None:
507
+ raise SynapseError(
508
+ HTTPStatus.BAD_REQUEST,
509
+ "Delayed events are not supported on this server",
510
+ Codes.UNKNOWN,
511
+ {
512
+ "org.matrix.msc4140.errcode": "M_MAX_DELAY_UNSUPPORTED",
513
+ },
514
+ )
515
+ if delay > max_delay:
516
+ raise SynapseError(
517
+ HTTPStatus.BAD_REQUEST,
518
+ "The requested delay exceeds the allowed maximum.",
519
+ Codes.UNKNOWN,
520
+ {
521
+ "org.matrix.msc4140.errcode": "M_MAX_DELAY_EXCEEDED",
522
+ "org.matrix.msc4140.max_delay": max_delay,
523
+ },
524
+ )
525
+ return delay
526
+
527
+
528
+ # TODO: Needs unit testing for room ID + alias joins
529
+ class JoinRoomAliasServlet(ResolveRoomIdMixin, TransactionRestServlet):
530
+ CATEGORY = "Event sending requests"
531
+
532
+ def __init__(self, hs: "HomeServer"):
533
+ super().__init__(hs)
534
+ super(ResolveRoomIdMixin, self).__init__(hs) # ensure the Mixin is set up
535
+ self.auth = hs.get_auth()
536
+
537
+ def register(self, http_server: HttpServer) -> None:
538
+ # /join/$room_identifier[/$txn_id]
539
+ PATTERNS = "/join/(?P<room_identifier>[^/]*)"
540
+ register_txn_path(self, PATTERNS, http_server)
541
+
542
+ async def _do(
543
+ self,
544
+ request: SynapseRequest,
545
+ requester: Requester,
546
+ room_identifier: str,
547
+ txn_id: Optional[str],
548
+ ) -> tuple[int, JsonDict]:
549
+ content = parse_json_object_from_request(request, allow_empty_body=True)
550
+
551
+ # twisted.web.server.Request.args is incorrectly defined as Optional[Any]
552
+ args: dict[bytes, list[bytes]] = request.args # type: ignore
553
+ # Prefer via over server_name (deprecated with MSC4156)
554
+ remote_room_hosts = parse_strings_from_args(args, "via", required=False)
555
+ if remote_room_hosts is None:
556
+ remote_room_hosts = parse_strings_from_args(
557
+ args, "server_name", required=False
558
+ )
559
+ room_id, remote_room_hosts = await self.resolve_room_id(
560
+ room_identifier,
561
+ remote_room_hosts,
562
+ )
563
+
564
+ await self.room_member_handler.update_membership(
565
+ requester=requester,
566
+ target=requester.user,
567
+ room_id=room_id,
568
+ action="join",
569
+ txn_id=txn_id,
570
+ remote_room_hosts=remote_room_hosts,
571
+ content=content,
572
+ third_party_signed=content.get("third_party_signed", None),
573
+ )
574
+
575
+ return 200, {"room_id": room_id}
576
+
577
+ async def on_POST(
578
+ self,
579
+ request: SynapseRequest,
580
+ room_identifier: str,
581
+ ) -> tuple[int, JsonDict]:
582
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
583
+ return await self._do(request, requester, room_identifier, None)
584
+
585
+ async def on_PUT(
586
+ self, request: SynapseRequest, room_identifier: str, txn_id: str
587
+ ) -> tuple[int, JsonDict]:
588
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
589
+ set_tag("txn_id", txn_id)
590
+
591
+ return await self.txns.fetch_or_execute_request(
592
+ request, requester, self._do, request, requester, room_identifier, txn_id
593
+ )
594
+
595
+
596
+ # TODO: Needs unit testing
597
+ class PublicRoomListRestServlet(RestServlet):
598
+ PATTERNS = client_patterns("/publicRooms$", v1=True)
599
+ CATEGORY = "Client API requests"
600
+
601
+ def __init__(self, hs: "HomeServer"):
602
+ super().__init__()
603
+ self.hs = hs
604
+ self.auth = hs.get_auth()
605
+
606
+ async def on_GET(self, request: SynapseRequest) -> tuple[int, JsonDict]:
607
+ server = parse_string(request, "server")
608
+
609
+ try:
610
+ await self.auth.get_user_by_req(request, allow_guest=True)
611
+ except InvalidClientCredentialsError as e:
612
+ # Option to allow servers to require auth when accessing
613
+ # /publicRooms via CS API. This is especially helpful in private
614
+ # federations.
615
+ if not self.hs.config.server.allow_public_rooms_without_auth:
616
+ raise
617
+
618
+ # We allow people to not be authed if they're just looking at our
619
+ # room list, but require auth when we proxy the request.
620
+ # In both cases we call the auth function, as that has the side
621
+ # effect of logging who issued this request if an access token was
622
+ # provided.
623
+ if server:
624
+ raise e
625
+
626
+ limit: Optional[int] = parse_integer(request, "limit", 0)
627
+ since_token = parse_string(request, "since")
628
+
629
+ if limit == 0:
630
+ # zero is a special value which corresponds to no limit.
631
+ limit = None
632
+
633
+ handler = self.hs.get_room_list_handler()
634
+ if server and not self.hs.is_mine_server_name(server):
635
+ # Ensure the server is valid.
636
+ try:
637
+ parse_and_validate_server_name(server)
638
+ except ValueError:
639
+ raise SynapseError(
640
+ 400,
641
+ "Invalid server name: %s" % (server,),
642
+ Codes.INVALID_PARAM,
643
+ )
644
+
645
+ data = await handler.get_remote_public_room_list(
646
+ server, limit=limit, since_token=since_token
647
+ )
648
+ else:
649
+ data = await handler.get_local_public_room_list(
650
+ limit=limit, since_token=since_token
651
+ )
652
+
653
+ return 200, data
654
+
655
+ async def on_POST(self, request: SynapseRequest) -> tuple[int, JsonDict]:
656
+ await self.auth.get_user_by_req(request, allow_guest=True)
657
+
658
+ server = parse_string(request, "server")
659
+ content = parse_json_object_from_request(request)
660
+
661
+ limit: Optional[int] = int(content.get("limit", 100))
662
+ since_token = content.get("since", None)
663
+ search_filter = content.get("filter", None)
664
+
665
+ include_all_networks = content.get("include_all_networks", False)
666
+ third_party_instance_id = content.get("third_party_instance_id", None)
667
+
668
+ if include_all_networks:
669
+ network_tuple = None
670
+ if third_party_instance_id is not None:
671
+ raise SynapseError(
672
+ 400, "Can't use include_all_networks with an explicit network"
673
+ )
674
+ elif third_party_instance_id is None:
675
+ network_tuple = ThirdPartyInstanceID(None, None)
676
+ else:
677
+ network_tuple = ThirdPartyInstanceID.from_string(third_party_instance_id)
678
+
679
+ if limit == 0:
680
+ # zero is a special value which corresponds to no limit.
681
+ limit = None
682
+
683
+ handler = self.hs.get_room_list_handler()
684
+ if server and not self.hs.is_mine_server_name(server):
685
+ # Ensure the server is valid.
686
+ try:
687
+ parse_and_validate_server_name(server)
688
+ except ValueError:
689
+ raise SynapseError(
690
+ 400,
691
+ "Invalid server name: %s" % (server,),
692
+ Codes.INVALID_PARAM,
693
+ )
694
+
695
+ data = await handler.get_remote_public_room_list(
696
+ server,
697
+ limit=limit,
698
+ since_token=since_token,
699
+ search_filter=search_filter,
700
+ include_all_networks=include_all_networks,
701
+ third_party_instance_id=third_party_instance_id,
702
+ )
703
+
704
+ else:
705
+ data = await handler.get_local_public_room_list(
706
+ limit=limit,
707
+ since_token=since_token,
708
+ search_filter=search_filter,
709
+ network_tuple=network_tuple,
710
+ )
711
+
712
+ return 200, data
713
+
714
+
715
+ # TODO: Needs unit testing
716
+ class RoomMemberListRestServlet(RestServlet):
717
+ PATTERNS = client_patterns("/rooms/(?P<room_id>[^/]*)/members$", v1=True)
718
+ CATEGORY = "Client API requests"
719
+
720
+ def __init__(self, hs: "HomeServer"):
721
+ super().__init__()
722
+ self.message_handler = hs.get_message_handler()
723
+ self.auth = hs.get_auth()
724
+ self.store = hs.get_datastores().main
725
+
726
+ @cancellable
727
+ async def on_GET(
728
+ self, request: SynapseRequest, room_id: str
729
+ ) -> tuple[int, JsonDict]:
730
+ # TODO support Pagination stream API (limit/tokens)
731
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
732
+ handler = self.message_handler
733
+
734
+ # request the state as of a given event, as identified by a stream token,
735
+ # for consistency with /messages etc.
736
+ # useful for getting the membership in retrospect as of a given /sync
737
+ # response.
738
+ at_token_string = parse_string(request, "at")
739
+ if at_token_string is None:
740
+ at_token = None
741
+ else:
742
+ at_token = await StreamToken.from_string(self.store, at_token_string)
743
+
744
+ # let you filter down on particular memberships.
745
+ # XXX: this may not be the best shape for this API - we could pass in a filter
746
+ # instead, except filters aren't currently aware of memberships.
747
+ # See https://github.com/matrix-org/matrix-doc/issues/1337 for more details.
748
+ membership = parse_string(request, "membership")
749
+ not_membership = parse_string(request, "not_membership")
750
+
751
+ events = await handler.get_state_events(
752
+ room_id=room_id,
753
+ requester=requester,
754
+ at_token=at_token,
755
+ state_filter=StateFilter.from_types([(EventTypes.Member, None)]),
756
+ )
757
+
758
+ chunk = []
759
+
760
+ for event in events:
761
+ if (membership and event["content"].get("membership") != membership) or (
762
+ not_membership and event["content"].get("membership") == not_membership
763
+ ):
764
+ continue
765
+ chunk.append(event)
766
+
767
+ return 200, {"chunk": chunk}
768
+
769
+
770
+ # deprecated in favour of /members?membership=join?
771
+ # except it does custom AS logic and has a simpler return format
772
+ class JoinedRoomMemberListRestServlet(RestServlet):
773
+ PATTERNS = client_patterns("/rooms/(?P<room_id>[^/]*)/joined_members$", v1=True)
774
+ CATEGORY = "Client API requests"
775
+
776
+ def __init__(self, hs: "HomeServer"):
777
+ super().__init__()
778
+ self.message_handler = hs.get_message_handler()
779
+ self.auth = hs.get_auth()
780
+
781
+ async def on_GET(
782
+ self, request: SynapseRequest, room_id: str
783
+ ) -> tuple[int, JsonDict]:
784
+ requester = await self.auth.get_user_by_req(request)
785
+
786
+ users_with_profile = await self.message_handler.get_joined_members(
787
+ requester, room_id
788
+ )
789
+
790
+ return 200, {"joined": users_with_profile}
791
+
792
+
793
+ # TODO: Needs better unit testing
794
+ class RoomMessageListRestServlet(RestServlet):
795
+ PATTERNS = client_patterns("/rooms/(?P<room_id>[^/]*)/messages$", v1=True)
796
+ # TODO The routing information should be exposed programatically.
797
+ # I want to do this but for now I felt bad about leaving this without
798
+ # at least a visible warning on it.
799
+ CATEGORY = "Client API requests (ALL FOR SAME ROOM MUST GO TO SAME WORKER)"
800
+
801
+ def __init__(self, hs: "HomeServer"):
802
+ super().__init__()
803
+ self._hs = hs
804
+ self.server_name = hs.hostname
805
+ self.clock = hs.get_clock()
806
+ self.pagination_handler = hs.get_pagination_handler()
807
+ self.auth = hs.get_auth()
808
+ self.store = hs.get_datastores().main
809
+
810
+ async def on_GET(
811
+ self, request: SynapseRequest, room_id: str
812
+ ) -> tuple[int, JsonDict]:
813
+ processing_start_time = self.clock.time_msec()
814
+ # Fire off and hope that we get a result by the end.
815
+ #
816
+ # We're using the mypy type ignore comment because the `@cached`
817
+ # decorator on `get_number_joined_users_in_room` doesn't play well with
818
+ # the type system. Maybe in the future, it can use some ParamSpec
819
+ # wizardry to fix it up.
820
+ room_member_count_deferred = run_in_background( # type: ignore[call-overload]
821
+ self.store.get_number_joined_users_in_room,
822
+ room_id,
823
+ )
824
+
825
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
826
+ pagination_config = await PaginationConfig.from_request(
827
+ self.store, request, default_limit=10
828
+ )
829
+ # Twisted will have processed the args by now.
830
+ assert request.args is not None
831
+
832
+ filter_json = parse_json(request, "filter", encoding="utf-8")
833
+ event_filter = Filter(self._hs, filter_json) if filter_json else None
834
+
835
+ as_client_event = b"raw" not in request.args
836
+ if (
837
+ event_filter
838
+ and event_filter.filter_json.get("event_format", "client") == "federation"
839
+ ):
840
+ as_client_event = False
841
+
842
+ msgs = await self.pagination_handler.get_messages(
843
+ room_id=room_id,
844
+ requester=requester,
845
+ pagin_config=pagination_config,
846
+ as_client_event=as_client_event,
847
+ event_filter=event_filter,
848
+ )
849
+
850
+ processing_end_time = self.clock.time_msec()
851
+ room_member_count = await make_deferred_yieldable(room_member_count_deferred)
852
+ messsages_response_timer.labels(
853
+ room_size=_RoomSize.from_member_count(room_member_count),
854
+ **{SERVER_NAME_LABEL: self.server_name},
855
+ ).observe((processing_end_time - processing_start_time) / 1000)
856
+
857
+ return 200, msgs
858
+
859
+
860
+ # TODO: Needs unit testing
861
+ class RoomStateRestServlet(RestServlet):
862
+ PATTERNS = client_patterns("/rooms/(?P<room_id>[^/]*)/state$", v1=True)
863
+ CATEGORY = "Client API requests"
864
+
865
+ def __init__(self, hs: "HomeServer"):
866
+ super().__init__()
867
+ self.message_handler = hs.get_message_handler()
868
+ self.auth = hs.get_auth()
869
+
870
+ @cancellable
871
+ async def on_GET(
872
+ self, request: SynapseRequest, room_id: str
873
+ ) -> tuple[int, list[JsonDict]]:
874
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
875
+ # Get all the current state for this room
876
+ events = await self.message_handler.get_state_events(
877
+ room_id=room_id,
878
+ requester=requester,
879
+ )
880
+ return 200, events
881
+
882
+
883
+ # TODO: Needs unit testing
884
+ class RoomInitialSyncRestServlet(RestServlet):
885
+ PATTERNS = client_patterns("/rooms/(?P<room_id>[^/]*)/initialSync$", v1=True)
886
+ CATEGORY = "Sync requests"
887
+
888
+ def __init__(self, hs: "HomeServer"):
889
+ super().__init__()
890
+ self.initial_sync_handler = hs.get_initial_sync_handler()
891
+ self.auth = hs.get_auth()
892
+ self.store = hs.get_datastores().main
893
+
894
+ async def on_GET(
895
+ self, request: SynapseRequest, room_id: str
896
+ ) -> tuple[int, JsonDict]:
897
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
898
+ pagination_config = await PaginationConfig.from_request(
899
+ self.store, request, default_limit=10
900
+ )
901
+ content = await self.initial_sync_handler.room_initial_sync(
902
+ room_id=room_id, requester=requester, pagin_config=pagination_config
903
+ )
904
+ return 200, content
905
+
906
+
907
+ class RoomEventServlet(RestServlet):
908
+ PATTERNS = client_patterns(
909
+ "/rooms/(?P<room_id>[^/]*)/event/(?P<event_id>[^/]*)$", v1=True
910
+ )
911
+ CATEGORY = "Client API requests"
912
+
913
+ def __init__(self, hs: "HomeServer"):
914
+ super().__init__()
915
+ self.clock = hs.get_clock()
916
+ self._store = hs.get_datastores().main
917
+ self._state = hs.get_state_handler()
918
+ self._storage_controllers = hs.get_storage_controllers()
919
+ self.event_handler = hs.get_event_handler()
920
+ self._event_serializer = hs.get_event_client_serializer()
921
+ self._relations_handler = hs.get_relations_handler()
922
+ self.auth = hs.get_auth()
923
+ self.content_keep_ms = hs.config.server.redaction_retention_period
924
+ self.msc2815_enabled = hs.config.experimental.msc2815_enabled
925
+
926
+ async def on_GET(
927
+ self, request: SynapseRequest, room_id: str, event_id: str
928
+ ) -> tuple[int, JsonDict]:
929
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
930
+
931
+ include_unredacted_content = self.msc2815_enabled and (
932
+ parse_string(
933
+ request,
934
+ "fi.mau.msc2815.include_unredacted_content",
935
+ allowed_values=("true", "false"),
936
+ )
937
+ == "true"
938
+ )
939
+ if include_unredacted_content and not await self.auth.is_server_admin(
940
+ requester
941
+ ):
942
+ auth_events = await self._storage_controllers.state.get_current_state(
943
+ room_id,
944
+ StateFilter.from_types(
945
+ [
946
+ POWER_KEY,
947
+ CREATE_KEY,
948
+ ]
949
+ ),
950
+ )
951
+
952
+ redact_level = event_auth.get_named_level(auth_events, "redact", 50)
953
+ user_level = event_auth.get_user_power_level(
954
+ requester.user.to_string(), auth_events
955
+ )
956
+ if user_level < redact_level:
957
+ raise SynapseError(
958
+ 403,
959
+ "You don't have permission to view redacted events in this room.",
960
+ errcode=Codes.FORBIDDEN,
961
+ )
962
+
963
+ try:
964
+ event = await self.event_handler.get_event(
965
+ requester.user,
966
+ room_id,
967
+ event_id,
968
+ show_redacted=include_unredacted_content,
969
+ )
970
+ except AuthError:
971
+ # This endpoint is supposed to return a 404 when the requester does
972
+ # not have permission to access the event
973
+ # https://matrix.org/docs/spec/client_server/r0.5.0#get-matrix-client-r0-rooms-roomid-event-eventid
974
+ raise SynapseError(404, "Event not found.", errcode=Codes.NOT_FOUND)
975
+
976
+ if event:
977
+ if include_unredacted_content and await self._store.have_censored_event(
978
+ event_id
979
+ ):
980
+ raise UnredactedContentDeletedError(self.content_keep_ms)
981
+
982
+ # Ensure there are bundled aggregations available.
983
+ aggregations = await self._relations_handler.get_bundled_aggregations(
984
+ [event], requester.user.to_string()
985
+ )
986
+
987
+ # per MSC2676, /rooms/{roomId}/event/{eventId}, should return the
988
+ # *original* event, rather than the edited version
989
+ event_dict = await self._event_serializer.serialize_event(
990
+ event,
991
+ self.clock.time_msec(),
992
+ bundle_aggregations=aggregations,
993
+ config=SerializeEventConfig(requester=requester),
994
+ )
995
+ return 200, event_dict
996
+
997
+ raise SynapseError(404, "Event not found.", errcode=Codes.NOT_FOUND)
998
+
999
+
1000
+ class RoomEventContextServlet(RestServlet):
1001
+ PATTERNS = client_patterns(
1002
+ "/rooms/(?P<room_id>[^/]*)/context/(?P<event_id>[^/]*)$", v1=True
1003
+ )
1004
+ CATEGORY = "Client API requests"
1005
+
1006
+ def __init__(self, hs: "HomeServer"):
1007
+ super().__init__()
1008
+ self._hs = hs
1009
+ self.clock = hs.get_clock()
1010
+ self.room_context_handler = hs.get_room_context_handler()
1011
+ self._event_serializer = hs.get_event_client_serializer()
1012
+ self.auth = hs.get_auth()
1013
+
1014
+ async def on_GET(
1015
+ self, request: SynapseRequest, room_id: str, event_id: str
1016
+ ) -> tuple[int, JsonDict]:
1017
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
1018
+
1019
+ limit = parse_integer(request, "limit", default=10)
1020
+
1021
+ # picking the API shape for symmetry with /messages
1022
+ filter_json = parse_json(request, "filter", encoding="utf-8")
1023
+ event_filter = Filter(self._hs, filter_json) if filter_json else None
1024
+
1025
+ event_context = await self.room_context_handler.get_event_context(
1026
+ requester, room_id, event_id, limit, event_filter
1027
+ )
1028
+
1029
+ if not event_context:
1030
+ raise SynapseError(404, "Event not found.", errcode=Codes.NOT_FOUND)
1031
+
1032
+ time_now = self.clock.time_msec()
1033
+ serializer_options = SerializeEventConfig(requester=requester)
1034
+ results = {
1035
+ "events_before": await self._event_serializer.serialize_events(
1036
+ event_context.events_before,
1037
+ time_now,
1038
+ bundle_aggregations=event_context.aggregations,
1039
+ config=serializer_options,
1040
+ ),
1041
+ "event": await self._event_serializer.serialize_event(
1042
+ event_context.event,
1043
+ time_now,
1044
+ bundle_aggregations=event_context.aggregations,
1045
+ config=serializer_options,
1046
+ ),
1047
+ "events_after": await self._event_serializer.serialize_events(
1048
+ event_context.events_after,
1049
+ time_now,
1050
+ bundle_aggregations=event_context.aggregations,
1051
+ config=serializer_options,
1052
+ ),
1053
+ "state": await self._event_serializer.serialize_events(
1054
+ event_context.state,
1055
+ time_now,
1056
+ config=serializer_options,
1057
+ ),
1058
+ "start": event_context.start,
1059
+ "end": event_context.end,
1060
+ }
1061
+
1062
+ return 200, results
1063
+
1064
+
1065
+ class RoomForgetRestServlet(TransactionRestServlet):
1066
+ def __init__(self, hs: "HomeServer"):
1067
+ super().__init__(hs)
1068
+ self.room_member_handler = hs.get_room_member_handler()
1069
+ self.auth = hs.get_auth()
1070
+
1071
+ def register(self, http_server: HttpServer) -> None:
1072
+ PATTERNS = "/rooms/(?P<room_id>[^/]*)/forget"
1073
+ register_txn_path(self, PATTERNS, http_server)
1074
+
1075
+ async def _do(self, requester: Requester, room_id: str) -> tuple[int, JsonDict]:
1076
+ await self.room_member_handler.forget(user=requester.user, room_id=room_id)
1077
+
1078
+ return 200, {}
1079
+
1080
+ async def on_POST(
1081
+ self, request: SynapseRequest, room_id: str
1082
+ ) -> tuple[int, JsonDict]:
1083
+ requester = await self.auth.get_user_by_req(request, allow_guest=False)
1084
+ return await self._do(requester, room_id)
1085
+
1086
+ async def on_PUT(
1087
+ self, request: SynapseRequest, room_id: str, txn_id: str
1088
+ ) -> tuple[int, JsonDict]:
1089
+ requester = await self.auth.get_user_by_req(request, allow_guest=False)
1090
+ set_tag("txn_id", txn_id)
1091
+
1092
+ return await self.txns.fetch_or_execute_request(
1093
+ request, requester, self._do, requester, room_id
1094
+ )
1095
+
1096
+
1097
+ # TODO: Needs unit testing
1098
+ class RoomMembershipRestServlet(TransactionRestServlet):
1099
+ CATEGORY = "Event sending requests"
1100
+
1101
+ def __init__(self, hs: "HomeServer"):
1102
+ super().__init__(hs)
1103
+ self.room_member_handler = hs.get_room_member_handler()
1104
+ self.auth = hs.get_auth()
1105
+ self.config = hs.config
1106
+
1107
+ def register(self, http_server: HttpServer) -> None:
1108
+ # /rooms/$roomid/[join|invite|leave|ban|unban|kick]
1109
+ PATTERNS = (
1110
+ "/rooms/(?P<room_id>[^/]*)/"
1111
+ "(?P<membership_action>join|invite|leave|ban|unban|kick)"
1112
+ )
1113
+ register_txn_path(self, PATTERNS, http_server)
1114
+
1115
+ async def _do(
1116
+ self,
1117
+ request: SynapseRequest,
1118
+ requester: Requester,
1119
+ room_id: str,
1120
+ membership_action: str,
1121
+ txn_id: Optional[str],
1122
+ ) -> tuple[int, JsonDict]:
1123
+ if requester.is_guest and membership_action not in {
1124
+ Membership.JOIN,
1125
+ Membership.LEAVE,
1126
+ }:
1127
+ raise AuthError(403, "Guest access not allowed")
1128
+
1129
+ request_body = parse_json_object_from_request(request, allow_empty_body=True)
1130
+
1131
+ if membership_action == "invite" and all(
1132
+ key in request_body for key in ("medium", "address")
1133
+ ):
1134
+ if not all(key in request_body for key in ("id_server", "id_access_token")):
1135
+ raise SynapseError(
1136
+ HTTPStatus.BAD_REQUEST,
1137
+ "`id_server` and `id_access_token` are required when doing 3pid invite",
1138
+ Codes.MISSING_PARAM,
1139
+ )
1140
+
1141
+ try:
1142
+ await self.room_member_handler.do_3pid_invite(
1143
+ room_id,
1144
+ requester.user,
1145
+ request_body["medium"],
1146
+ request_body["address"],
1147
+ request_body["id_server"],
1148
+ requester,
1149
+ txn_id,
1150
+ request_body["id_access_token"],
1151
+ )
1152
+ except ShadowBanError:
1153
+ # Pretend the request succeeded.
1154
+ pass
1155
+ return 200, {}
1156
+
1157
+ target = requester.user
1158
+ if membership_action in ["invite", "ban", "unban", "kick"]:
1159
+ assert_params_in_dict(request_body, ["user_id"])
1160
+ target = UserID.from_string(request_body["user_id"])
1161
+
1162
+ event_content = None
1163
+ if "reason" in request_body:
1164
+ event_content = {"reason": request_body["reason"]}
1165
+ if self.config.experimental.msc4293_enabled:
1166
+ if "org.matrix.msc4293.redact_events" in request_body:
1167
+ if event_content is None:
1168
+ event_content = {}
1169
+ event_content["org.matrix.msc4293.redact_events"] = request_body[
1170
+ "org.matrix.msc4293.redact_events"
1171
+ ]
1172
+
1173
+ try:
1174
+ await self.room_member_handler.update_membership(
1175
+ requester=requester,
1176
+ target=target,
1177
+ room_id=room_id,
1178
+ action=membership_action,
1179
+ txn_id=txn_id,
1180
+ third_party_signed=request_body.get("third_party_signed", None),
1181
+ content=event_content,
1182
+ )
1183
+ except ShadowBanError:
1184
+ # Pretend the request succeeded.
1185
+ pass
1186
+
1187
+ return_value = {}
1188
+
1189
+ if membership_action == "join":
1190
+ return_value["room_id"] = room_id
1191
+
1192
+ return 200, return_value
1193
+
1194
+ async def on_POST(
1195
+ self,
1196
+ request: SynapseRequest,
1197
+ room_id: str,
1198
+ membership_action: str,
1199
+ ) -> tuple[int, JsonDict]:
1200
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
1201
+ return await self._do(request, requester, room_id, membership_action, None)
1202
+
1203
+ async def on_PUT(
1204
+ self, request: SynapseRequest, room_id: str, membership_action: str, txn_id: str
1205
+ ) -> tuple[int, JsonDict]:
1206
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
1207
+ set_tag("txn_id", txn_id)
1208
+
1209
+ return await self.txns.fetch_or_execute_request(
1210
+ request,
1211
+ requester,
1212
+ self._do,
1213
+ request,
1214
+ requester,
1215
+ room_id,
1216
+ membership_action,
1217
+ txn_id,
1218
+ )
1219
+
1220
+
1221
+ class RoomRedactEventRestServlet(TransactionRestServlet):
1222
+ CATEGORY = "Event sending requests"
1223
+
1224
+ def __init__(self, hs: "HomeServer"):
1225
+ super().__init__(hs)
1226
+ self.server_name = hs.hostname
1227
+ self.hs = hs
1228
+ self.event_creation_handler = hs.get_event_creation_handler()
1229
+ self.auth = hs.get_auth()
1230
+ self._store = hs.get_datastores().main
1231
+ self._relation_handler = hs.get_relations_handler()
1232
+ self._msc3912_enabled = hs.config.experimental.msc3912_enabled
1233
+
1234
+ def register(self, http_server: HttpServer) -> None:
1235
+ PATTERNS = "/rooms/(?P<room_id>[^/]*)/redact/(?P<event_id>[^/]*)"
1236
+ register_txn_path(self, PATTERNS, http_server)
1237
+
1238
+ async def _do(
1239
+ self,
1240
+ request: SynapseRequest,
1241
+ requester: Requester,
1242
+ room_id: str,
1243
+ event_id: str,
1244
+ txn_id: Optional[str],
1245
+ ) -> tuple[int, JsonDict]:
1246
+ content = parse_json_object_from_request(request)
1247
+
1248
+ requester_suspended = await self._store.get_user_suspended_status(
1249
+ requester.user.to_string()
1250
+ )
1251
+
1252
+ if requester_suspended:
1253
+ event = await self._store.get_event(event_id, allow_none=True)
1254
+ if event:
1255
+ if event.sender != requester.user.to_string():
1256
+ raise SynapseError(
1257
+ 403,
1258
+ "You can only redact your own events while account is suspended.",
1259
+ Codes.USER_ACCOUNT_SUSPENDED,
1260
+ )
1261
+
1262
+ # Ensure the redacts property in the content matches the one provided in
1263
+ # the URL.
1264
+ room_version = await self._store.get_room_version(room_id)
1265
+ if room_version.updated_redaction_rules:
1266
+ if "redacts" in content and content["redacts"] != event_id:
1267
+ raise SynapseError(
1268
+ 400,
1269
+ "Cannot provide a redacts value incoherent with the event_id of the URL parameter",
1270
+ Codes.INVALID_PARAM,
1271
+ )
1272
+ else:
1273
+ content["redacts"] = event_id
1274
+
1275
+ try:
1276
+ with_relations = None
1277
+ if self._msc3912_enabled and "org.matrix.msc3912.with_relations" in content:
1278
+ with_relations = content["org.matrix.msc3912.with_relations"]
1279
+ del content["org.matrix.msc3912.with_relations"]
1280
+
1281
+ # Check if there's an existing event for this transaction now (even though
1282
+ # create_and_send_nonmember_event also does it) because, if there's one,
1283
+ # then we want to skip the call to redact_events_related_to.
1284
+ event = None
1285
+ if txn_id:
1286
+ event = await self.event_creation_handler.get_event_from_transaction(
1287
+ requester, txn_id, room_id
1288
+ )
1289
+
1290
+ # Event is not yet redacted, create a new event to redact it.
1291
+ if event is None:
1292
+ event_dict = {
1293
+ "type": EventTypes.Redaction,
1294
+ "content": content,
1295
+ "room_id": room_id,
1296
+ "sender": requester.user.to_string(),
1297
+ }
1298
+ # Earlier room versions had a top-level redacts property.
1299
+ if not room_version.updated_redaction_rules:
1300
+ event_dict["redacts"] = event_id
1301
+
1302
+ (
1303
+ event,
1304
+ _,
1305
+ ) = await self.event_creation_handler.create_and_send_nonmember_event(
1306
+ requester, event_dict, txn_id=txn_id
1307
+ )
1308
+
1309
+ if with_relations:
1310
+ self.hs.run_as_background_process(
1311
+ "redact_related_events",
1312
+ self._relation_handler.redact_events_related_to,
1313
+ requester=requester,
1314
+ event_id=event_id,
1315
+ initial_redaction_event=event,
1316
+ relation_types=with_relations,
1317
+ )
1318
+
1319
+ event_id = event.event_id
1320
+ except ShadowBanError:
1321
+ event_id = generate_fake_event_id()
1322
+
1323
+ set_tag("event_id", event_id)
1324
+ return 200, {"event_id": event_id}
1325
+
1326
+ async def on_POST(
1327
+ self,
1328
+ request: SynapseRequest,
1329
+ room_id: str,
1330
+ event_id: str,
1331
+ ) -> tuple[int, JsonDict]:
1332
+ requester = await self.auth.get_user_by_req(request)
1333
+ return await self._do(request, requester, room_id, event_id, None)
1334
+
1335
+ async def on_PUT(
1336
+ self, request: SynapseRequest, room_id: str, event_id: str, txn_id: str
1337
+ ) -> tuple[int, JsonDict]:
1338
+ requester = await self.auth.get_user_by_req(request)
1339
+ set_tag("txn_id", txn_id)
1340
+
1341
+ return await self.txns.fetch_or_execute_request(
1342
+ request, requester, self._do, request, requester, room_id, event_id, txn_id
1343
+ )
1344
+
1345
+
1346
+ class RoomTypingRestServlet(RestServlet):
1347
+ PATTERNS = client_patterns(
1348
+ "/rooms/(?P<room_id>[^/]*)/typing/(?P<user_id>[^/]*)$", v1=True
1349
+ )
1350
+ CATEGORY = "The typing stream"
1351
+
1352
+ def __init__(self, hs: "HomeServer"):
1353
+ super().__init__()
1354
+ self.hs = hs
1355
+ self.presence_handler = hs.get_presence_handler()
1356
+ self.auth = hs.get_auth()
1357
+
1358
+ # If we're not on the typing writer instance we should scream if we get
1359
+ # requests.
1360
+ self._is_typing_writer = (
1361
+ hs.get_instance_name() in hs.config.worker.writers.typing
1362
+ )
1363
+
1364
+ async def on_PUT(
1365
+ self, request: SynapseRequest, room_id: str, user_id: str
1366
+ ) -> tuple[int, JsonDict]:
1367
+ requester = await self.auth.get_user_by_req(request)
1368
+
1369
+ if not self._is_typing_writer:
1370
+ raise Exception("Got /typing request on instance that is not typing writer")
1371
+
1372
+ room_id = urlparse.unquote(room_id)
1373
+ target_user = UserID.from_string(urlparse.unquote(user_id))
1374
+
1375
+ content = parse_json_object_from_request(request)
1376
+
1377
+ await self.presence_handler.bump_presence_active_time(
1378
+ requester.user, requester.device_id
1379
+ )
1380
+
1381
+ # Limit timeout to stop people from setting silly typing timeouts.
1382
+ timeout = min(content.get("timeout", 30000), 120000)
1383
+
1384
+ # Defer getting the typing handler since it will raise on WORKER_PATTERNS.
1385
+ typing_handler = self.hs.get_typing_writer_handler()
1386
+
1387
+ try:
1388
+ if content["typing"]:
1389
+ await typing_handler.started_typing(
1390
+ target_user=target_user,
1391
+ requester=requester,
1392
+ room_id=room_id,
1393
+ timeout=timeout,
1394
+ )
1395
+ else:
1396
+ await typing_handler.stopped_typing(
1397
+ target_user=target_user, requester=requester, room_id=room_id
1398
+ )
1399
+ except ShadowBanError:
1400
+ # Pretend this worked without error.
1401
+ pass
1402
+
1403
+ return 200, {}
1404
+
1405
+
1406
+ class RoomAliasListServlet(RestServlet):
1407
+ PATTERNS = [
1408
+ re.compile(
1409
+ r"^/_matrix/client/unstable/org\.matrix\.msc2432"
1410
+ r"/rooms/(?P<room_id>[^/]*)/aliases"
1411
+ ),
1412
+ ] + list(client_patterns("/rooms/(?P<room_id>[^/]*)/aliases$", unstable=False))
1413
+ CATEGORY = "Client API requests"
1414
+
1415
+ def __init__(self, hs: "HomeServer"):
1416
+ super().__init__()
1417
+ self.auth = hs.get_auth()
1418
+ self.directory_handler = hs.get_directory_handler()
1419
+
1420
+ async def on_GET(
1421
+ self, request: SynapseRequest, room_id: str
1422
+ ) -> tuple[int, JsonDict]:
1423
+ requester = await self.auth.get_user_by_req(request)
1424
+
1425
+ alias_list = await self.directory_handler.get_aliases_for_room(
1426
+ requester, room_id
1427
+ )
1428
+
1429
+ return 200, {"aliases": alias_list}
1430
+
1431
+
1432
+ class SearchRestServlet(RestServlet):
1433
+ PATTERNS = client_patterns("/search$", v1=True)
1434
+ CATEGORY = "Client API requests"
1435
+
1436
+ def __init__(self, hs: "HomeServer"):
1437
+ super().__init__()
1438
+ self.search_handler = hs.get_search_handler()
1439
+ self.auth = hs.get_auth()
1440
+
1441
+ async def on_POST(self, request: SynapseRequest) -> tuple[int, JsonDict]:
1442
+ requester = await self.auth.get_user_by_req(request)
1443
+
1444
+ content = parse_json_object_from_request(request)
1445
+
1446
+ batch = parse_string(request, "next_batch")
1447
+ results = await self.search_handler.search(requester, content, batch)
1448
+
1449
+ return 200, results
1450
+
1451
+
1452
+ class JoinedRoomsRestServlet(RestServlet):
1453
+ PATTERNS = client_patterns("/joined_rooms$", v1=True)
1454
+ CATEGORY = "Client API requests"
1455
+
1456
+ def __init__(self, hs: "HomeServer"):
1457
+ super().__init__()
1458
+ self.store = hs.get_datastores().main
1459
+ self.auth = hs.get_auth()
1460
+
1461
+ async def on_GET(self, request: SynapseRequest) -> tuple[int, JsonDict]:
1462
+ requester = await self.auth.get_user_by_req(request, allow_guest=True)
1463
+
1464
+ room_ids = await self.store.get_rooms_for_user(requester.user.to_string())
1465
+ return 200, {"joined_rooms": list(room_ids)}
1466
+
1467
+
1468
+ def register_txn_path(
1469
+ servlet: RestServlet,
1470
+ regex_string: str,
1471
+ http_server: HttpServer,
1472
+ ) -> None:
1473
+ """Registers a transaction-based path.
1474
+
1475
+ This registers two paths:
1476
+ PUT regex_string/$txnid
1477
+ POST regex_string
1478
+
1479
+ Args:
1480
+ regex_string: The regex string to register. Must NOT have a
1481
+ trailing $ as this string will be appended to.
1482
+ http_server: The http_server to register paths with.
1483
+ """
1484
+ on_POST = getattr(servlet, "on_POST", None)
1485
+ on_PUT = getattr(servlet, "on_PUT", None)
1486
+ if on_POST is None or on_PUT is None:
1487
+ raise RuntimeError("on_POST and on_PUT must exist when using register_txn_path")
1488
+ http_server.register_paths(
1489
+ "POST",
1490
+ client_patterns(regex_string + "$", v1=True),
1491
+ on_POST,
1492
+ servlet.__class__.__name__,
1493
+ )
1494
+ http_server.register_paths(
1495
+ "PUT",
1496
+ client_patterns(regex_string + "/(?P<txn_id>[^/]*)$", v1=True),
1497
+ on_PUT,
1498
+ servlet.__class__.__name__,
1499
+ )
1500
+
1501
+
1502
+ class TimestampLookupRestServlet(RestServlet):
1503
+ """
1504
+ API endpoint to fetch the `event_id` of the closest event to the given
1505
+ timestamp (`ts` query parameter) in the given direction (`dir` query
1506
+ parameter).
1507
+
1508
+ Useful for cases like jump to date so you can start paginating messages from
1509
+ a given date in the archive.
1510
+
1511
+ `ts` is a timestamp in milliseconds where we will find the closest event in
1512
+ the given direction.
1513
+
1514
+ `dir` can be `f` or `b` to indicate forwards and backwards in time from the
1515
+ given timestamp.
1516
+
1517
+ GET /_matrix/client/v1/rooms/<roomID>/timestamp_to_event?ts=<timestamp>&dir=<direction>
1518
+ {
1519
+ "event_id": ...
1520
+ }
1521
+ """
1522
+
1523
+ PATTERNS = (
1524
+ re.compile("^/_matrix/client/v1/rooms/(?P<room_id>[^/]*)/timestamp_to_event$"),
1525
+ )
1526
+ CATEGORY = "Client API requests"
1527
+
1528
+ def __init__(self, hs: "HomeServer"):
1529
+ super().__init__()
1530
+ self._auth = hs.get_auth()
1531
+ self._store = hs.get_datastores().main
1532
+ self.timestamp_lookup_handler = hs.get_timestamp_lookup_handler()
1533
+
1534
+ async def on_GET(
1535
+ self, request: SynapseRequest, room_id: str
1536
+ ) -> tuple[int, JsonDict]:
1537
+ requester = await self._auth.get_user_by_req(request)
1538
+ await self._auth.check_user_in_room_or_world_readable(room_id, requester)
1539
+
1540
+ timestamp = parse_integer(request, "ts", required=True)
1541
+ direction = parse_enum(request, "dir", Direction, default=Direction.FORWARDS)
1542
+
1543
+ (
1544
+ event_id,
1545
+ origin_server_ts,
1546
+ ) = await self.timestamp_lookup_handler.get_event_for_timestamp(
1547
+ requester, room_id, timestamp, direction
1548
+ )
1549
+
1550
+ return 200, {
1551
+ "event_id": event_id,
1552
+ "origin_server_ts": origin_server_ts,
1553
+ }
1554
+
1555
+
1556
+ class RoomHierarchyRestServlet(RestServlet):
1557
+ PATTERNS = (re.compile("^/_matrix/client/v1/rooms/(?P<room_id>[^/]*)/hierarchy$"),)
1558
+ WORKERS = PATTERNS
1559
+ CATEGORY = "Client API requests"
1560
+
1561
+ def __init__(self, hs: "HomeServer"):
1562
+ super().__init__()
1563
+ self._auth = hs.get_auth()
1564
+ self._room_summary_handler = hs.get_room_summary_handler()
1565
+ self.msc4235_enabled = hs.config.experimental.msc4235_enabled
1566
+
1567
+ async def on_GET(
1568
+ self, request: SynapseRequest, room_id: str
1569
+ ) -> tuple[int, JsonDict]:
1570
+ requester = await self._auth.get_user_by_req(request, allow_guest=True)
1571
+
1572
+ max_depth = parse_integer(request, "max_depth")
1573
+ limit = parse_integer(request, "limit")
1574
+
1575
+ # twisted.web.server.Request.args is incorrectly defined as Optional[Any]
1576
+ remote_room_hosts = None
1577
+ if self.msc4235_enabled:
1578
+ args: dict[bytes, list[bytes]] = request.args # type: ignore
1579
+ via_param = parse_strings_from_args(
1580
+ args, "org.matrix.msc4235.via", required=False
1581
+ )
1582
+ remote_room_hosts = tuple(via_param or [])
1583
+
1584
+ return 200, await self._room_summary_handler.get_room_hierarchy(
1585
+ requester,
1586
+ room_id,
1587
+ suggested_only=parse_boolean(request, "suggested_only", default=False),
1588
+ max_depth=max_depth,
1589
+ limit=limit,
1590
+ from_token=parse_string(request, "from"),
1591
+ remote_room_hosts=remote_room_hosts,
1592
+ )
1593
+
1594
+
1595
+ class RoomSummaryRestServlet(ResolveRoomIdMixin, RestServlet):
1596
+ PATTERNS = (
1597
+ # deprecated endpoint, to be removed
1598
+ re.compile(
1599
+ "^/_matrix/client/unstable/im.nheko.summary"
1600
+ "/rooms/(?P<room_identifier>[^/]*)/summary$"
1601
+ ),
1602
+ # recommended endpoint
1603
+ re.compile(
1604
+ "^/_matrix/client/unstable/im.nheko.summary"
1605
+ "/summary/(?P<room_identifier>[^/]*)$"
1606
+ ),
1607
+ )
1608
+ CATEGORY = "Client API requests"
1609
+
1610
+ def __init__(self, hs: "HomeServer"):
1611
+ super().__init__(hs)
1612
+ self._auth = hs.get_auth()
1613
+ self._room_summary_handler = hs.get_room_summary_handler()
1614
+
1615
+ async def on_GET(
1616
+ self, request: SynapseRequest, room_identifier: str
1617
+ ) -> tuple[int, JsonDict]:
1618
+ try:
1619
+ requester = await self._auth.get_user_by_req(request, allow_guest=True)
1620
+ requester_user_id: Optional[str] = requester.user.to_string()
1621
+ except MissingClientTokenError:
1622
+ # auth is optional
1623
+ requester_user_id = None
1624
+
1625
+ # twisted.web.server.Request.args is incorrectly defined as Optional[Any]
1626
+ args: dict[bytes, list[bytes]] = request.args # type: ignore
1627
+ remote_room_hosts = parse_strings_from_args(args, "via", required=False)
1628
+ room_id, remote_room_hosts = await self.resolve_room_id(
1629
+ room_identifier,
1630
+ remote_room_hosts,
1631
+ )
1632
+
1633
+ return 200, await self._room_summary_handler.get_room_summary(
1634
+ requester_user_id,
1635
+ room_id,
1636
+ remote_room_hosts,
1637
+ )
1638
+
1639
+
1640
+ def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None:
1641
+ RoomStateEventRestServlet(hs).register(http_server)
1642
+ RoomMemberListRestServlet(hs).register(http_server)
1643
+ JoinedRoomMemberListRestServlet(hs).register(http_server)
1644
+ RoomMessageListRestServlet(hs).register(http_server)
1645
+ JoinRoomAliasServlet(hs).register(http_server)
1646
+ RoomMembershipRestServlet(hs).register(http_server)
1647
+ RoomSendEventRestServlet(hs).register(http_server)
1648
+ PublicRoomListRestServlet(hs).register(http_server)
1649
+ RoomStateRestServlet(hs).register(http_server)
1650
+ RoomRedactEventRestServlet(hs).register(http_server)
1651
+ RoomTypingRestServlet(hs).register(http_server)
1652
+ RoomEventContextServlet(hs).register(http_server)
1653
+ RoomHierarchyRestServlet(hs).register(http_server)
1654
+ if hs.config.experimental.msc3266_enabled:
1655
+ RoomSummaryRestServlet(hs).register(http_server)
1656
+ RoomEventServlet(hs).register(http_server)
1657
+ JoinedRoomsRestServlet(hs).register(http_server)
1658
+ RoomAliasListServlet(hs).register(http_server)
1659
+ SearchRestServlet(hs).register(http_server)
1660
+ RoomCreateRestServlet(hs).register(http_server)
1661
+ TimestampLookupRestServlet(hs).register(http_server)
1662
+
1663
+ # Some servlets only get registered for the main process.
1664
+ if hs.config.worker.worker_app is None:
1665
+ RoomForgetRestServlet(hs).register(http_server)
1666
+
1667
+
1668
+ def register_deprecated_servlets(hs: "HomeServer", http_server: HttpServer) -> None:
1669
+ RoomInitialSyncRestServlet(hs).register(http_server)