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
synapse/http/client.py ADDED
@@ -0,0 +1,1360 @@
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 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
+ import logging
22
+ import urllib.parse
23
+ from http import HTTPStatus
24
+ from io import BytesIO
25
+ from typing import (
26
+ TYPE_CHECKING,
27
+ Any,
28
+ BinaryIO,
29
+ Callable,
30
+ Mapping,
31
+ Optional,
32
+ Protocol,
33
+ Union,
34
+ )
35
+
36
+ import attr
37
+ import treq
38
+ from canonicaljson import encode_canonical_json
39
+ from netaddr import AddrFormatError, IPAddress, IPSet
40
+ from prometheus_client import Counter
41
+ from zope.interface import implementer
42
+
43
+ from OpenSSL import SSL
44
+ from OpenSSL.SSL import VERIFY_NONE
45
+ from twisted.internet import defer, error as twisted_error, protocol, ssl
46
+ from twisted.internet.address import IPv4Address, IPv6Address
47
+ from twisted.internet.interfaces import (
48
+ IAddress,
49
+ IDelayedCall,
50
+ IHostResolution,
51
+ IOpenSSLContextFactory,
52
+ IReactorCore,
53
+ IReactorPluggableNameResolver,
54
+ IResolutionReceiver,
55
+ ITCPTransport,
56
+ )
57
+ from twisted.internet.protocol import connectionDone
58
+ from twisted.internet.task import Cooperator
59
+ from twisted.python.failure import Failure
60
+ from twisted.web._newclient import ResponseDone
61
+ from twisted.web.client import (
62
+ Agent,
63
+ HTTPConnectionPool,
64
+ ResponseNeverReceived,
65
+ readBody,
66
+ )
67
+ from twisted.web.http import PotentialDataLoss
68
+ from twisted.web.http_headers import Headers
69
+ from twisted.web.iweb import (
70
+ UNKNOWN_LENGTH,
71
+ IAgent,
72
+ IBodyProducer,
73
+ IPolicyForHTTPS,
74
+ IResponse,
75
+ )
76
+
77
+ from synapse.api.errors import Codes, HttpResponseException, SynapseError
78
+ from synapse.http import QuieterFileBodyProducer, RequestTimedOutError, redact_uri
79
+ from synapse.http.proxyagent import ProxyAgent
80
+ from synapse.http.replicationagent import ReplicationAgent
81
+ from synapse.http.types import QueryParams
82
+ from synapse.logging.context import make_deferred_yieldable, run_in_background
83
+ from synapse.logging.opentracing import set_tag, start_active_span, tags
84
+ from synapse.metrics import SERVER_NAME_LABEL
85
+ from synapse.types import ISynapseReactor, StrSequence
86
+ from synapse.util.async_helpers import timeout_deferred
87
+ from synapse.util.clock import Clock
88
+ from synapse.util.json import json_decoder
89
+
90
+ if TYPE_CHECKING:
91
+ from synapse.server import HomeServer
92
+
93
+ # Support both import names for the `python-multipart` (PyPI) library,
94
+ # which renamed its package name from `multipart` to `python_multipart`
95
+ # in 0.0.13 (though supports the old import name for compatibility).
96
+ # Note that the `multipart` package name conflicts with `multipart` (PyPI)
97
+ # so we should prefer importing from `python_multipart` when possible.
98
+ try:
99
+ from python_multipart import MultipartParser
100
+
101
+ if TYPE_CHECKING:
102
+ from python_multipart import multipart
103
+ except ImportError:
104
+ from multipart import MultipartParser # type: ignore[no-redef]
105
+
106
+
107
+ logger = logging.getLogger(__name__)
108
+
109
+ outgoing_requests_counter = Counter(
110
+ "synapse_http_client_requests", "", labelnames=["method", SERVER_NAME_LABEL]
111
+ )
112
+ incoming_responses_counter = Counter(
113
+ "synapse_http_client_responses",
114
+ "",
115
+ labelnames=["method", "code", SERVER_NAME_LABEL],
116
+ )
117
+
118
+ # the type of the headers map, to be passed to the t.w.h.Headers.
119
+ #
120
+ # The actual type accepted by Twisted is
121
+ # Mapping[Union[str, bytes], Sequence[Union[str, bytes]] ,
122
+ # allowing us to mix and match str and bytes freely. However: any str is also a
123
+ # Sequence[str]; passing a header string value which is a
124
+ # standalone str is interpreted as a sequence of 1-codepoint strings. This is a disastrous footgun.
125
+ # We use a narrower value type (RawHeaderValue) to avoid this footgun.
126
+ #
127
+ # We also simplify the keys to be either all str or all bytes. This helps because
128
+ # Dict[K, V] is invariant in K (and indeed V).
129
+ RawHeaders = Union[Mapping[str, "RawHeaderValue"], Mapping[bytes, "RawHeaderValue"]]
130
+
131
+ # the value actually has to be a List, but List is invariant so we can't specify that
132
+ # the entries can either be Lists or bytes.
133
+ RawHeaderValue = Union[
134
+ StrSequence,
135
+ list[bytes],
136
+ list[Union[str, bytes]],
137
+ tuple[bytes, ...],
138
+ tuple[Union[str, bytes], ...],
139
+ ]
140
+
141
+
142
+ def _is_ip_blocked(
143
+ ip_address: IPAddress, allowlist: Optional[IPSet], blocklist: IPSet
144
+ ) -> bool:
145
+ """
146
+ Compares an IP address to allowed and disallowed IP sets.
147
+
148
+ Args:
149
+ ip_address: The IP address to check
150
+ allowlist: Allowed IP addresses.
151
+ blocklist: Disallowed IP addresses.
152
+
153
+ Returns:
154
+ True if the IP address is in the blocklist and not in the allowlist.
155
+ """
156
+ if ip_address in blocklist:
157
+ if allowlist is None or ip_address not in allowlist:
158
+ return True
159
+ return False
160
+
161
+
162
+ _EPSILON = 0.00000001
163
+
164
+
165
+ def _make_scheduler(clock: Clock) -> Callable[[Callable[[], object]], IDelayedCall]:
166
+ """Makes a schedular suitable for a Cooperator using the given reactor.
167
+
168
+ (This is effectively just a copy from `twisted.internet.task`)
169
+ """
170
+
171
+ def _scheduler(x: Callable[[], object]) -> IDelayedCall:
172
+ return clock.call_later(
173
+ _EPSILON,
174
+ x,
175
+ )
176
+
177
+ return _scheduler
178
+
179
+
180
+ class _IPBlockingResolver:
181
+ """
182
+ A proxy for reactor.nameResolver which only produces non-blocklisted IP
183
+ addresses, preventing DNS rebinding attacks.
184
+ """
185
+
186
+ def __init__(
187
+ self,
188
+ reactor: IReactorPluggableNameResolver,
189
+ ip_allowlist: Optional[IPSet],
190
+ ip_blocklist: IPSet,
191
+ ):
192
+ """
193
+ Args:
194
+ reactor: The twisted reactor.
195
+ ip_allowlist: IP addresses to allow.
196
+ ip_blocklist: IP addresses to disallow.
197
+ """
198
+ self._reactor = reactor
199
+ self._ip_allowlist = ip_allowlist
200
+ self._ip_blocklist = ip_blocklist
201
+
202
+ def resolveHostName(
203
+ self, recv: IResolutionReceiver, hostname: str, portNumber: int = 0
204
+ ) -> IResolutionReceiver:
205
+ addresses: list[IAddress] = []
206
+
207
+ def _callback() -> None:
208
+ has_bad_ip = False
209
+ for address in addresses:
210
+ # We only expect IPv4 and IPv6 addresses since only A/AAAA lookups
211
+ # should go through this path.
212
+ if not isinstance(address, (IPv4Address, IPv6Address)):
213
+ continue
214
+
215
+ ip_address = IPAddress(address.host)
216
+
217
+ if _is_ip_blocked(ip_address, self._ip_allowlist, self._ip_blocklist):
218
+ logger.info(
219
+ "Blocked %s from DNS resolution to %s", ip_address, hostname
220
+ )
221
+ has_bad_ip = True
222
+
223
+ # if we have a blocked IP, we'd like to raise an error to block the
224
+ # request, but all we can really do from here is claim that there were no
225
+ # valid results.
226
+ if not has_bad_ip:
227
+ for address in addresses:
228
+ recv.addressResolved(address)
229
+ recv.resolutionComplete()
230
+
231
+ @implementer(IResolutionReceiver)
232
+ class EndpointReceiver:
233
+ @staticmethod
234
+ def resolutionBegan(resolutionInProgress: IHostResolution) -> None:
235
+ recv.resolutionBegan(resolutionInProgress)
236
+
237
+ @staticmethod
238
+ def addressResolved(address: IAddress) -> None:
239
+ addresses.append(address)
240
+
241
+ @staticmethod
242
+ def resolutionComplete() -> None:
243
+ _callback()
244
+
245
+ endpoint_receiver_wrapper = EndpointReceiver()
246
+ self._reactor.nameResolver.resolveHostName(
247
+ endpoint_receiver_wrapper, hostname, portNumber=portNumber
248
+ )
249
+
250
+ return recv
251
+
252
+
253
+ # ISynapseReactor implies IReactorCore, but explicitly marking it this as an implementer
254
+ # of IReactorCore seems to keep mypy-zope happier.
255
+ @implementer(IReactorCore, ISynapseReactor)
256
+ class BlocklistingReactorWrapper:
257
+ """
258
+ A Reactor wrapper which will prevent DNS resolution to blocked IP
259
+ addresses, to prevent DNS rebinding.
260
+ """
261
+
262
+ def __init__(
263
+ self,
264
+ reactor: IReactorPluggableNameResolver,
265
+ ip_allowlist: Optional[IPSet],
266
+ ip_blocklist: IPSet,
267
+ ):
268
+ self._reactor = reactor
269
+
270
+ # We need to use a DNS resolver which filters out blocked IP
271
+ # addresses, to prevent DNS rebinding.
272
+ self._nameResolver = _IPBlockingResolver(
273
+ self._reactor, ip_allowlist, ip_blocklist
274
+ )
275
+
276
+ def __getattr__(self, attr: str) -> Any:
277
+ # Passthrough to the real reactor except for the DNS resolver.
278
+ if attr == "nameResolver":
279
+ return self._nameResolver
280
+ else:
281
+ return getattr(self._reactor, attr)
282
+
283
+
284
+ class BlocklistingAgentWrapper(Agent):
285
+ """
286
+ An Agent wrapper which will prevent access to IP addresses being accessed
287
+ directly (without an IP address lookup).
288
+ """
289
+
290
+ def __init__(
291
+ self,
292
+ agent: IAgent,
293
+ ip_blocklist: IPSet,
294
+ ip_allowlist: Optional[IPSet] = None,
295
+ ):
296
+ """
297
+ Args:
298
+ agent: The Agent to wrap.
299
+ ip_allowlist: IP addresses to allow.
300
+ ip_blocklist: IP addresses to disallow.
301
+ """
302
+ self._agent = agent
303
+ self._ip_allowlist = ip_allowlist
304
+ self._ip_blocklist = ip_blocklist
305
+
306
+ def request(
307
+ self,
308
+ method: bytes,
309
+ uri: bytes,
310
+ headers: Optional[Headers] = None,
311
+ bodyProducer: Optional[IBodyProducer] = None,
312
+ ) -> defer.Deferred:
313
+ h = urllib.parse.urlparse(uri.decode("ascii"))
314
+
315
+ try:
316
+ # h.hostname is Optional[str], None raises an AddrFormatError, so
317
+ # this is safe even though IPAddress requires a str.
318
+ ip_address = IPAddress(h.hostname) # type: ignore[arg-type]
319
+ except AddrFormatError:
320
+ # Not an IP
321
+ pass
322
+ else:
323
+ if _is_ip_blocked(ip_address, self._ip_allowlist, self._ip_blocklist):
324
+ logger.info("Blocking access to %s", ip_address)
325
+ e = SynapseError(HTTPStatus.FORBIDDEN, "IP address blocked")
326
+ return defer.fail(Failure(e))
327
+
328
+ return self._agent.request(
329
+ method, uri, headers=headers, bodyProducer=bodyProducer
330
+ )
331
+
332
+
333
+ class BaseHttpClient:
334
+ """
335
+ A simple, no-frills HTTP client with methods that wrap up common ways of
336
+ using HTTP in Matrix. Does not come with a default Agent, subclasses will need to
337
+ define their own.
338
+
339
+ Args:
340
+ hs: The HomeServer instance to pass in
341
+ treq_args: Extra keyword arguments to be given to treq.request.
342
+ """
343
+
344
+ agent: IAgent
345
+
346
+ def __init__(
347
+ self,
348
+ hs: "HomeServer",
349
+ treq_args: Optional[dict[str, Any]] = None,
350
+ ):
351
+ self.hs = hs
352
+ self.server_name = hs.hostname
353
+ self.reactor = hs.get_reactor()
354
+
355
+ self._extra_treq_args = treq_args or {}
356
+ self.clock = hs.get_clock()
357
+
358
+ user_agent = hs.version_string
359
+ if hs.config.server.user_agent_suffix:
360
+ user_agent = "%s %s" % (
361
+ user_agent,
362
+ hs.config.server.user_agent_suffix,
363
+ )
364
+ self.user_agent = user_agent.encode("ascii")
365
+
366
+ # We use this for our body producers to ensure that they use the correct
367
+ # reactor.
368
+ self._cooperator = Cooperator(scheduler=_make_scheduler(hs.get_clock()))
369
+
370
+ async def request(
371
+ self,
372
+ method: str,
373
+ uri: str,
374
+ data: Optional[bytes] = None,
375
+ headers: Optional[Headers] = None,
376
+ ) -> IResponse:
377
+ """
378
+ Args:
379
+ method: HTTP method to use.
380
+ uri: URI to query.
381
+ data: Data to send in the request body, if applicable.
382
+ headers: Request headers.
383
+
384
+ Returns:
385
+ Response object, once the headers have been read.
386
+
387
+ Raises:
388
+ RequestTimedOutError if the request times out before the headers are read
389
+
390
+ """
391
+ outgoing_requests_counter.labels(
392
+ method=method, **{SERVER_NAME_LABEL: self.server_name}
393
+ ).inc()
394
+
395
+ # log request but strip `access_token` (AS requests for example include this)
396
+ logger.debug("Sending request %s %s", method, redact_uri(uri))
397
+
398
+ with start_active_span(
399
+ "outgoing-client-request",
400
+ tags={
401
+ tags.SPAN_KIND: tags.SPAN_KIND_RPC_CLIENT,
402
+ tags.HTTP_METHOD: method,
403
+ tags.HTTP_URL: uri,
404
+ },
405
+ finish_on_close=True,
406
+ ):
407
+ try:
408
+ body_producer = None
409
+ if data is not None:
410
+ body_producer = QuieterFileBodyProducer(
411
+ BytesIO(data),
412
+ cooperator=self._cooperator,
413
+ )
414
+
415
+ # Always make sure we add a user agent to the request
416
+ if headers is None:
417
+ headers = Headers()
418
+
419
+ if not headers.hasHeader("User-Agent"):
420
+ headers.addRawHeader("User-Agent", self.user_agent)
421
+
422
+ request_deferred: defer.Deferred = treq.request(
423
+ method,
424
+ uri,
425
+ agent=self.agent,
426
+ data=body_producer,
427
+ headers=headers,
428
+ # Avoid buffering the body in treq since we do not reuse
429
+ # response bodies.
430
+ unbuffered=True,
431
+ **self._extra_treq_args,
432
+ )
433
+
434
+ # we use our own timeout mechanism rather than treq's as a workaround
435
+ # for https://twistedmatrix.com/trac/ticket/9534.
436
+ request_deferred = timeout_deferred(
437
+ deferred=request_deferred,
438
+ timeout=60,
439
+ clock=self.hs.get_clock(),
440
+ )
441
+
442
+ # turn timeouts into RequestTimedOutErrors
443
+ request_deferred.addErrback(_timeout_to_request_timed_out_error)
444
+
445
+ response = await make_deferred_yieldable(request_deferred)
446
+
447
+ incoming_responses_counter.labels(
448
+ method=method,
449
+ code=response.code,
450
+ **{SERVER_NAME_LABEL: self.server_name},
451
+ ).inc()
452
+ logger.info(
453
+ "Received response to %s %s: %s",
454
+ method,
455
+ redact_uri(uri),
456
+ response.code,
457
+ )
458
+ return response
459
+ except Exception as e:
460
+ incoming_responses_counter.labels(
461
+ method=method,
462
+ code="ERR",
463
+ **{SERVER_NAME_LABEL: self.server_name},
464
+ ).inc()
465
+ logger.info(
466
+ "Error sending request to %s %s: %s %s",
467
+ method,
468
+ redact_uri(uri),
469
+ type(e).__name__,
470
+ e.args[0],
471
+ )
472
+ set_tag(tags.ERROR, True)
473
+ set_tag("error_reason", e.args[0])
474
+ raise
475
+
476
+ async def post_urlencoded_get_json(
477
+ self,
478
+ uri: str,
479
+ args: Optional[Mapping[str, Union[str, list[str]]]] = None,
480
+ headers: Optional[RawHeaders] = None,
481
+ ) -> Any:
482
+ """
483
+ Args:
484
+ uri: uri to query
485
+ args: parameters to be url-encoded in the body
486
+ headers: a map from header name to a list of values for that header
487
+
488
+ Returns:
489
+ parsed json
490
+
491
+ Raises:
492
+ RequestTimedOutError: if there is a timeout before the response headers
493
+ are received. Note there is currently no timeout on reading the response
494
+ body.
495
+
496
+ HttpResponseException: On a non-2xx HTTP response.
497
+
498
+ ValueError: if the response was not JSON
499
+ """
500
+
501
+ # TODO: Do we ever want to log message contents?
502
+ logger.debug("post_urlencoded_get_json args: %s", args)
503
+
504
+ query_bytes = encode_query_args(args)
505
+
506
+ actual_headers = {
507
+ b"Content-Type": [b"application/x-www-form-urlencoded"],
508
+ b"User-Agent": [self.user_agent],
509
+ b"Accept": [b"application/json"],
510
+ }
511
+ if headers:
512
+ actual_headers.update(headers) # type: ignore
513
+
514
+ response = await self.request(
515
+ "POST", uri, headers=Headers(actual_headers), data=query_bytes
516
+ )
517
+
518
+ body = await make_deferred_yieldable(readBody(response))
519
+
520
+ if 200 <= response.code < 300:
521
+ return json_decoder.decode(body.decode("utf-8"))
522
+ else:
523
+ raise HttpResponseException(
524
+ response.code, response.phrase.decode("ascii", errors="replace"), body
525
+ )
526
+
527
+ async def post_json_get_json(
528
+ self, uri: str, post_json: Any, headers: Optional[RawHeaders] = None
529
+ ) -> Any:
530
+ """
531
+
532
+ Args:
533
+ uri: URI to query.
534
+ post_json: request body, to be encoded as json
535
+ headers: a map from header name to a list of values for that header
536
+
537
+ Returns:
538
+ parsed json
539
+
540
+ Raises:
541
+ RequestTimedOutError: if there is a timeout before the response headers
542
+ are received. Note there is currently no timeout on reading the response
543
+ body.
544
+
545
+ HttpResponseException: On a non-2xx HTTP response.
546
+
547
+ ValueError: if the response was not JSON
548
+ """
549
+ json_str = encode_canonical_json(post_json)
550
+
551
+ logger.debug("HTTP POST %s -> %s", json_str, uri)
552
+
553
+ actual_headers = {
554
+ b"Content-Type": [b"application/json"],
555
+ b"User-Agent": [self.user_agent],
556
+ b"Accept": [b"application/json"],
557
+ }
558
+ if headers:
559
+ actual_headers.update(headers) # type: ignore
560
+
561
+ response = await self.request(
562
+ "POST", uri, headers=Headers(actual_headers), data=json_str
563
+ )
564
+
565
+ body = await make_deferred_yieldable(readBody(response))
566
+
567
+ if 200 <= response.code < 300:
568
+ return json_decoder.decode(body.decode("utf-8"))
569
+ else:
570
+ raise HttpResponseException(
571
+ response.code, response.phrase.decode("ascii", errors="replace"), body
572
+ )
573
+
574
+ async def get_json(
575
+ self,
576
+ uri: str,
577
+ args: Optional[QueryParams] = None,
578
+ headers: Optional[RawHeaders] = None,
579
+ ) -> Any:
580
+ """Gets some json from the given URI.
581
+
582
+ Args:
583
+ uri: The URI to request, not including query parameters
584
+ args: A dictionary used to create query string
585
+ headers: a map from header name to a list of values for that header
586
+ Returns:
587
+ Succeeds when we get a 2xx HTTP response, with the HTTP body as JSON.
588
+ Raises:
589
+ RequestTimedOutError: if there is a timeout before the response headers
590
+ are received. Note there is currently no timeout on reading the response
591
+ body.
592
+
593
+ HttpResponseException On a non-2xx HTTP response.
594
+
595
+ ValueError: if the response was not JSON
596
+ """
597
+ actual_headers = {b"Accept": [b"application/json"]}
598
+ if headers:
599
+ actual_headers.update(headers) # type: ignore
600
+
601
+ body = await self.get_raw(uri, args, headers=actual_headers)
602
+ return json_decoder.decode(body.decode("utf-8"))
603
+
604
+ async def put_json(
605
+ self,
606
+ uri: str,
607
+ json_body: Any,
608
+ args: Optional[QueryParams] = None,
609
+ headers: Optional[RawHeaders] = None,
610
+ ) -> Any:
611
+ """Puts some json to the given URI.
612
+
613
+ Args:
614
+ uri: The URI to request, not including query parameters
615
+ json_body: The JSON to put in the HTTP body,
616
+ args: A dictionary used to create query strings
617
+ headers: a map from header name to a list of values for that header
618
+ Returns:
619
+ Succeeds when we get a 2xx HTTP response, with the HTTP body as JSON.
620
+ Raises:
621
+ RequestTimedOutError: if there is a timeout before the response headers
622
+ are received. Note there is currently no timeout on reading the response
623
+ body.
624
+
625
+ HttpResponseException On a non-2xx HTTP response.
626
+
627
+ ValueError: if the response was not JSON
628
+ """
629
+ if args:
630
+ query_str = urllib.parse.urlencode(args, True)
631
+ uri = "%s?%s" % (uri, query_str)
632
+
633
+ json_str = encode_canonical_json(json_body)
634
+
635
+ actual_headers = {
636
+ b"Content-Type": [b"application/json"],
637
+ b"User-Agent": [self.user_agent],
638
+ b"Accept": [b"application/json"],
639
+ }
640
+ if headers:
641
+ actual_headers.update(headers) # type: ignore
642
+
643
+ response = await self.request(
644
+ "PUT", uri, headers=Headers(actual_headers), data=json_str
645
+ )
646
+
647
+ body = await make_deferred_yieldable(readBody(response))
648
+
649
+ if 200 <= response.code < 300:
650
+ return json_decoder.decode(body.decode("utf-8"))
651
+ else:
652
+ raise HttpResponseException(
653
+ response.code, response.phrase.decode("ascii", errors="replace"), body
654
+ )
655
+
656
+ async def get_raw(
657
+ self,
658
+ uri: str,
659
+ args: Optional[QueryParams] = None,
660
+ headers: Optional[RawHeaders] = None,
661
+ ) -> bytes:
662
+ """Gets raw text from the given URI.
663
+
664
+ Args:
665
+ uri: The URI to request, not including query parameters
666
+ args: A dictionary used to create query strings
667
+ headers: a map from header name to a list of values for that header
668
+ Returns:
669
+ Succeeds when we get a 2xx HTTP response, with the
670
+ HTTP body as bytes.
671
+ Raises:
672
+ RequestTimedOutError: if there is a timeout before the response headers
673
+ are received. Note there is currently no timeout on reading the response
674
+ body.
675
+
676
+ HttpResponseException on a non-2xx HTTP response.
677
+ """
678
+ if args:
679
+ query_str = urllib.parse.urlencode(args, True)
680
+ uri = "%s?%s" % (uri, query_str)
681
+
682
+ actual_headers = {b"User-Agent": [self.user_agent]}
683
+ if headers:
684
+ actual_headers.update(headers) # type: ignore
685
+
686
+ response = await self.request("GET", uri, headers=Headers(actual_headers))
687
+
688
+ body = await make_deferred_yieldable(readBody(response))
689
+
690
+ if 200 <= response.code < 300:
691
+ return body
692
+ else:
693
+ raise HttpResponseException(
694
+ response.code, response.phrase.decode("ascii", errors="replace"), body
695
+ )
696
+
697
+ # XXX: FIXME: This is horribly copy-pasted from matrixfederationclient.
698
+ # The two should be factored out.
699
+
700
+ async def get_file(
701
+ self,
702
+ url: str,
703
+ output_stream: BinaryIO,
704
+ max_size: Optional[int] = None,
705
+ headers: Optional[RawHeaders] = None,
706
+ is_allowed_content_type: Optional[Callable[[str], bool]] = None,
707
+ ) -> tuple[int, dict[bytes, list[bytes]], str, int]:
708
+ """GETs a file from a given URL
709
+ Args:
710
+ url: The URL to GET
711
+ output_stream: File to write the response body to.
712
+ headers: A map from header name to a list of values for that header
713
+ is_allowed_content_type: A predicate to determine whether the
714
+ content type of the file we're downloading is allowed. If set and
715
+ it evaluates to False when called with the content type, the
716
+ request will be terminated before completing the download by
717
+ raising SynapseError.
718
+ Returns:
719
+ A tuple of the file length, dict of the response
720
+ headers, absolute URI of the response and HTTP response code.
721
+
722
+ Raises:
723
+ RequestTimedOutError: if there is a timeout before the response headers
724
+ are received. Note there is currently no timeout on reading the response
725
+ body.
726
+
727
+ SynapseError: if the response is not a 2xx, the remote file is too large, or
728
+ another exception happens during the download.
729
+ """
730
+
731
+ actual_headers = {b"User-Agent": [self.user_agent]}
732
+ if headers:
733
+ actual_headers.update(headers) # type: ignore
734
+
735
+ response = await self.request("GET", url, headers=Headers(actual_headers))
736
+
737
+ resp_headers = dict(response.headers.getAllRawHeaders())
738
+
739
+ if response.code > 299:
740
+ logger.warning("Got %d when downloading %s", response.code, url)
741
+ raise SynapseError(
742
+ HTTPStatus.BAD_GATEWAY, "Got error %d" % (response.code,), Codes.UNKNOWN
743
+ )
744
+
745
+ if is_allowed_content_type and b"Content-Type" in resp_headers:
746
+ content_type = resp_headers[b"Content-Type"][0].decode("ascii")
747
+ if not is_allowed_content_type(content_type):
748
+ raise SynapseError(
749
+ HTTPStatus.BAD_GATEWAY,
750
+ (
751
+ "Requested file's content type not allowed for this operation: %s"
752
+ % content_type
753
+ ),
754
+ )
755
+
756
+ # TODO: if our Content-Type is HTML or something, just read the first
757
+ # N bytes into RAM rather than saving it all to disk only to read it
758
+ # straight back in again
759
+
760
+ try:
761
+ d = read_body_with_max_size(response, output_stream, max_size)
762
+
763
+ # Ensure that the body is not read forever.
764
+ d = timeout_deferred(
765
+ deferred=d,
766
+ timeout=30,
767
+ clock=self.hs.get_clock(),
768
+ )
769
+
770
+ length = await make_deferred_yieldable(d)
771
+ except BodyExceededMaxSize:
772
+ raise SynapseError(
773
+ HTTPStatus.BAD_GATEWAY,
774
+ "Requested file is too large > %r bytes" % (max_size,),
775
+ Codes.TOO_LARGE,
776
+ )
777
+ except defer.TimeoutError:
778
+ raise SynapseError(
779
+ HTTPStatus.BAD_GATEWAY,
780
+ "Requested file took too long to download",
781
+ Codes.TOO_LARGE,
782
+ )
783
+ except Exception as e:
784
+ raise SynapseError(
785
+ HTTPStatus.BAD_GATEWAY, ("Failed to download remote body: %s" % e)
786
+ ) from e
787
+
788
+ return (
789
+ length,
790
+ resp_headers,
791
+ response.request.absoluteURI.decode("ascii"),
792
+ response.code,
793
+ )
794
+
795
+
796
+ class SimpleHttpClient(BaseHttpClient):
797
+ """
798
+ An HTTP client capable of crossing a proxy and respecting a block/allow list.
799
+
800
+ This also configures a larger / longer lasting HTTP connection pool.
801
+
802
+ Args:
803
+ hs: The HomeServer instance to pass in
804
+ treq_args: Extra keyword arguments to be given to treq.request.
805
+ ip_blocklist: The IP addresses that we may not request.
806
+ ip_allowlist: The allowed IP addresses, that we can
807
+ request if it were otherwise caught in a blocklist.
808
+ use_proxy: Whether proxy settings should be discovered and used
809
+ from conventional environment variables.
810
+ """
811
+
812
+ def __init__(
813
+ self,
814
+ hs: "HomeServer",
815
+ treq_args: Optional[dict[str, Any]] = None,
816
+ ip_allowlist: Optional[IPSet] = None,
817
+ ip_blocklist: Optional[IPSet] = None,
818
+ use_proxy: bool = False,
819
+ ):
820
+ super().__init__(hs, treq_args=treq_args)
821
+ self._ip_allowlist = ip_allowlist
822
+ self._ip_blocklist = ip_blocklist
823
+
824
+ if self._ip_blocklist:
825
+ # If we have an IP blocklist, we need to use a DNS resolver which
826
+ # filters out blocked IP addresses, to prevent DNS rebinding.
827
+ self.reactor: ISynapseReactor = BlocklistingReactorWrapper(
828
+ self.reactor, self._ip_allowlist, self._ip_blocklist
829
+ )
830
+
831
+ # the pusher makes lots of concurrent SSL connections to Sygnal, and tends to
832
+ # do so in batches, so we need to allow the pool to keep lots of idle
833
+ # connections around.
834
+ pool = HTTPConnectionPool(self.reactor)
835
+ # XXX: The justification for using the cache factor here is that larger
836
+ # instances will need both more cache and more connections.
837
+ # Still, this should probably be a separate dial
838
+ pool.maxPersistentPerHost = max(int(100 * hs.config.caches.global_factor), 5)
839
+ pool.cachedConnectionTimeout = 2 * 60
840
+
841
+ self.agent: IAgent = ProxyAgent(
842
+ reactor=self.reactor,
843
+ proxy_reactor=hs.get_reactor(),
844
+ connectTimeout=15,
845
+ contextFactory=self.hs.get_http_client_context_factory(),
846
+ pool=pool,
847
+ proxy_config=hs.config.server.proxy_config,
848
+ )
849
+
850
+ if self._ip_blocklist:
851
+ # If we have an IP blocklist, we then install the Agent which prevents
852
+ # direct access to IP addresses, that are not caught by the DNS resolution.
853
+ self.agent = BlocklistingAgentWrapper(
854
+ self.agent,
855
+ ip_blocklist=self._ip_blocklist,
856
+ ip_allowlist=self._ip_allowlist,
857
+ )
858
+
859
+
860
+ class ReplicationClient(BaseHttpClient):
861
+ """Client for connecting to replication endpoints via HTTP and HTTPS.
862
+
863
+ Attributes:
864
+ agent: The custom Twisted Agent used for constructing the connection.
865
+ """
866
+
867
+ def __init__(
868
+ self,
869
+ hs: "HomeServer",
870
+ ):
871
+ """
872
+ Args:
873
+ hs: The HomeServer instance to pass in
874
+ """
875
+ super().__init__(hs)
876
+ self.server_name = hs.hostname
877
+
878
+ # Use a pool, but a very small one.
879
+ pool = HTTPConnectionPool(self.reactor)
880
+ pool.maxPersistentPerHost = 5
881
+ pool.cachedConnectionTimeout = 2 * 60
882
+
883
+ self.agent: IAgent = ReplicationAgent(
884
+ hs.get_reactor(),
885
+ hs.config.worker.instance_map,
886
+ contextFactory=hs.get_http_client_context_factory(),
887
+ pool=pool,
888
+ )
889
+
890
+ async def request(
891
+ self,
892
+ method: str,
893
+ uri: str,
894
+ data: Optional[bytes] = None,
895
+ headers: Optional[Headers] = None,
896
+ ) -> IResponse:
897
+ """
898
+ Make a request, differs from BaseHttpClient.request in that it does not use treq.
899
+
900
+ Args:
901
+ method: HTTP method to use.
902
+ uri: URI to query.
903
+ data: Data to send in the request body, if applicable.
904
+ headers: Request headers.
905
+
906
+ Returns:
907
+ Response object, once the headers have been read.
908
+
909
+ Raises:
910
+ RequestTimedOutError if the request times out before the headers are read
911
+
912
+ """
913
+ outgoing_requests_counter.labels(
914
+ method=method, **{SERVER_NAME_LABEL: self.server_name}
915
+ ).inc()
916
+
917
+ logger.debug("Sending request %s %s", method, uri)
918
+
919
+ with start_active_span(
920
+ "outgoing-replication-request",
921
+ tags={
922
+ tags.SPAN_KIND: tags.SPAN_KIND_RPC_CLIENT,
923
+ tags.HTTP_METHOD: method,
924
+ tags.HTTP_URL: uri,
925
+ },
926
+ finish_on_close=True,
927
+ ):
928
+ try:
929
+ body_producer = None
930
+ if data is not None:
931
+ body_producer = QuieterFileBodyProducer(
932
+ BytesIO(data),
933
+ cooperator=self._cooperator,
934
+ )
935
+
936
+ # Skip the fancy treq stuff, we don't need cookie handling, redirects,
937
+ # or buffered response bodies.
938
+ method_bytes = method.encode("ascii")
939
+ uri_bytes = uri.encode("ascii")
940
+
941
+ # To preserve the logging context, the timeout is treated
942
+ # in a similar way to `defer.gatherResults`:
943
+ # * Each logging context-preserving fork is wrapped in
944
+ # `run_in_background`. In this case there is only one,
945
+ # since the timeout fork is not logging-context aware.
946
+ # * The `Deferred` that joins the forks back together is
947
+ # wrapped in `make_deferred_yieldable` to restore the
948
+ # logging context regardless of the path taken.
949
+ # (The logic/comments for this came from MatrixFederationHttpClient)
950
+ request_deferred = run_in_background(
951
+ self.agent.request,
952
+ method_bytes,
953
+ uri_bytes,
954
+ headers,
955
+ bodyProducer=body_producer,
956
+ )
957
+
958
+ # we use our own timeout mechanism rather than twisted's as a workaround
959
+ # for https://twistedmatrix.com/trac/ticket/9534.
960
+ # (Updated url https://github.com/twisted/twisted/issues/9534)
961
+ request_deferred = timeout_deferred(
962
+ deferred=request_deferred,
963
+ timeout=60,
964
+ clock=self.hs.get_clock(),
965
+ )
966
+
967
+ # turn timeouts into RequestTimedOutErrors
968
+ request_deferred.addErrback(_timeout_to_request_timed_out_error)
969
+
970
+ response = await make_deferred_yieldable(request_deferred)
971
+
972
+ incoming_responses_counter.labels(
973
+ method=method,
974
+ code=response.code,
975
+ **{SERVER_NAME_LABEL: self.server_name},
976
+ ).inc()
977
+ logger.info(
978
+ "Received response to %s %s: %s",
979
+ method,
980
+ uri,
981
+ response.code,
982
+ )
983
+ return response
984
+ except Exception as e:
985
+ incoming_responses_counter.labels(
986
+ method=method,
987
+ code="ERR",
988
+ **{SERVER_NAME_LABEL: self.server_name},
989
+ ).inc()
990
+ logger.info(
991
+ "Error sending request to %s %s: %s %s",
992
+ method,
993
+ uri,
994
+ type(e).__name__,
995
+ e.args[0],
996
+ )
997
+ set_tag(tags.ERROR, True)
998
+ set_tag("error_reason", e.args[0])
999
+ raise
1000
+
1001
+
1002
+ def _timeout_to_request_timed_out_error(f: Failure) -> Failure:
1003
+ if f.check(twisted_error.TimeoutError, twisted_error.ConnectingCancelledError):
1004
+ # The TCP connection has its own timeout (set by the 'connectTimeout' param
1005
+ # on the Agent), which raises twisted_error.TimeoutError exception.
1006
+ raise RequestTimedOutError("Timeout connecting to remote server")
1007
+ elif f.check(defer.TimeoutError, ResponseNeverReceived):
1008
+ # this one means that we hit our overall timeout on the request
1009
+ raise RequestTimedOutError("Timeout waiting for response from remote server")
1010
+
1011
+ return f
1012
+
1013
+
1014
+ class ByteWriteable(Protocol):
1015
+ """The type of object which must be passed into read_body_with_max_size.
1016
+
1017
+ Typically this is a file object.
1018
+ """
1019
+
1020
+ def write(self, data: bytes) -> int:
1021
+ pass
1022
+
1023
+
1024
+ class BodyExceededMaxSize(Exception):
1025
+ """The maximum allowed size of the HTTP body was exceeded."""
1026
+
1027
+
1028
+ class _DiscardBodyWithMaxSizeProtocol(protocol.Protocol):
1029
+ """A protocol which immediately errors upon receiving data."""
1030
+
1031
+ transport: Optional[ITCPTransport] = None
1032
+
1033
+ def __init__(self, deferred: defer.Deferred):
1034
+ self.deferred = deferred
1035
+
1036
+ def _maybe_fail(self) -> None:
1037
+ """
1038
+ Report a max size exceed error and disconnect the first time this is called.
1039
+ """
1040
+ if not self.deferred.called:
1041
+ self.deferred.errback(BodyExceededMaxSize())
1042
+ # Close the connection (forcefully) since all the data will get
1043
+ # discarded anyway.
1044
+ assert self.transport is not None
1045
+ self.transport.abortConnection()
1046
+
1047
+ def dataReceived(self, data: bytes) -> None:
1048
+ self._maybe_fail()
1049
+
1050
+ def connectionLost(self, reason: Failure = connectionDone) -> None:
1051
+ self._maybe_fail()
1052
+
1053
+
1054
+ @attr.s(auto_attribs=True, slots=True)
1055
+ class MultipartResponse:
1056
+ """
1057
+ A small class to hold parsed values of a multipart response.
1058
+ """
1059
+
1060
+ json: bytes = b"{}"
1061
+ length: Optional[int] = None
1062
+ content_type: Optional[bytes] = None
1063
+ disposition: Optional[bytes] = None
1064
+ url: Optional[bytes] = None
1065
+
1066
+
1067
+ class _MultipartParserProtocol(protocol.Protocol):
1068
+ """
1069
+ Protocol to read and parse a MSC3916 multipart/mixed response
1070
+ """
1071
+
1072
+ transport: Optional[ITCPTransport] = None
1073
+
1074
+ def __init__(
1075
+ self,
1076
+ stream: ByteWriteable,
1077
+ deferred: defer.Deferred,
1078
+ boundary: str,
1079
+ max_length: Optional[int],
1080
+ ) -> None:
1081
+ self.stream = stream
1082
+ self.deferred = deferred
1083
+ self.boundary = boundary
1084
+ self.max_length = max_length
1085
+ self.parser: Optional[MultipartParser] = None
1086
+ self.multipart_response = MultipartResponse()
1087
+ self.has_redirect = False
1088
+ self.in_json = False
1089
+ self.json_done = False
1090
+ self.file_length = 0
1091
+ self.total_length = 0
1092
+ self.in_disposition = False
1093
+ self.in_content_type = False
1094
+
1095
+ def dataReceived(self, incoming_data: bytes) -> None:
1096
+ if self.deferred.called:
1097
+ return
1098
+
1099
+ # we don't have a parser yet, instantiate it
1100
+ if not self.parser:
1101
+
1102
+ def on_header_field(data: bytes, start: int, end: int) -> None:
1103
+ if data[start:end].lower() == b"location":
1104
+ self.has_redirect = True
1105
+ if data[start:end].lower() == b"content-disposition":
1106
+ self.in_disposition = True
1107
+ if data[start:end].lower() == b"content-type":
1108
+ self.in_content_type = True
1109
+
1110
+ def on_header_value(data: bytes, start: int, end: int) -> None:
1111
+ # the first header should be content-type for application/json
1112
+ if not self.in_json and not self.json_done:
1113
+ assert data[start:end] == b"application/json"
1114
+ self.in_json = True
1115
+ elif self.has_redirect:
1116
+ self.multipart_response.url = data[start:end]
1117
+ elif self.in_content_type:
1118
+ self.multipart_response.content_type = data[start:end]
1119
+ self.in_content_type = False
1120
+ elif self.in_disposition:
1121
+ self.multipart_response.disposition = data[start:end]
1122
+ self.in_disposition = False
1123
+
1124
+ def on_part_data(data: bytes, start: int, end: int) -> None:
1125
+ # we've seen json header but haven't written the json data
1126
+ if self.in_json and not self.json_done:
1127
+ self.multipart_response.json = data[start:end]
1128
+ self.json_done = True
1129
+ # we have a redirect header rather than a file, and have already captured it
1130
+ elif self.has_redirect:
1131
+ return
1132
+ # otherwise we are in the file part
1133
+ else:
1134
+ try:
1135
+ self.stream.write(data[start:end])
1136
+ except Exception as e:
1137
+ logger.warning(
1138
+ "Exception encountered writing file data to stream: %s", e
1139
+ )
1140
+ self.deferred.errback()
1141
+ self.file_length += end - start
1142
+
1143
+ callbacks: "multipart.MultipartCallbacks" = {
1144
+ "on_header_field": on_header_field,
1145
+ "on_header_value": on_header_value,
1146
+ "on_part_data": on_part_data,
1147
+ }
1148
+ self.parser = MultipartParser(self.boundary, callbacks)
1149
+
1150
+ self.total_length += len(incoming_data)
1151
+ if self.max_length is not None and self.total_length >= self.max_length:
1152
+ self.deferred.errback(BodyExceededMaxSize())
1153
+ # Close the connection (forcefully) since all the data will get
1154
+ # discarded anyway.
1155
+ assert self.transport is not None
1156
+ self.transport.abortConnection()
1157
+
1158
+ try:
1159
+ self.parser.write(incoming_data)
1160
+ except Exception as e:
1161
+ logger.warning("Exception writing to multipart parser: %s", e)
1162
+ self.deferred.errback()
1163
+ return
1164
+
1165
+ def connectionLost(self, reason: Failure = connectionDone) -> None:
1166
+ # If the maximum size was already exceeded, there's nothing to do.
1167
+ if self.deferred.called:
1168
+ return
1169
+
1170
+ if reason.check(ResponseDone):
1171
+ self.multipart_response.length = self.file_length
1172
+ self.deferred.callback(self.multipart_response)
1173
+ else:
1174
+ self.deferred.errback(reason)
1175
+
1176
+
1177
+ class _ReadBodyWithMaxSizeProtocol(protocol.Protocol):
1178
+ """A protocol which reads body to a stream, erroring if the body exceeds a maximum size."""
1179
+
1180
+ transport: Optional[ITCPTransport] = None
1181
+
1182
+ def __init__(
1183
+ self, stream: ByteWriteable, deferred: defer.Deferred, max_size: Optional[int]
1184
+ ):
1185
+ self.stream = stream
1186
+ self.deferred = deferred
1187
+ self.length = 0
1188
+ self.max_size = max_size
1189
+
1190
+ def dataReceived(self, data: bytes) -> None:
1191
+ # If the deferred was called, bail early.
1192
+ if self.deferred.called:
1193
+ return
1194
+
1195
+ try:
1196
+ self.stream.write(data)
1197
+ except Exception:
1198
+ self.deferred.errback()
1199
+ return
1200
+
1201
+ self.length += len(data)
1202
+ # The first time the maximum size is exceeded, error and cancel the
1203
+ # connection. dataReceived might be called again if data was received
1204
+ # in the meantime.
1205
+ if self.max_size is not None and self.length >= self.max_size:
1206
+ self.deferred.errback(BodyExceededMaxSize())
1207
+ # Close the connection (forcefully) since all the data will get
1208
+ # discarded anyway.
1209
+ assert self.transport is not None
1210
+ self.transport.abortConnection()
1211
+
1212
+ def connectionLost(self, reason: Failure = connectionDone) -> None:
1213
+ # If the maximum size was already exceeded, there's nothing to do.
1214
+ if self.deferred.called:
1215
+ return
1216
+
1217
+ if reason.check(ResponseDone):
1218
+ self.deferred.callback(self.length)
1219
+ elif reason.check(PotentialDataLoss):
1220
+ # This applies to requests which don't set `Content-Length` or a
1221
+ # `Transfer-Encoding` in the response because in this case the end of the
1222
+ # response is indicated by the connection being closed, an event which may
1223
+ # also be due to a transient network problem or other error. But since this
1224
+ # behavior is expected of some servers (like YouTube), let's ignore it.
1225
+ # Stolen from https://github.com/twisted/treq/pull/49/files
1226
+ # http://twistedmatrix.com/trac/ticket/4840
1227
+ self.deferred.callback(self.length)
1228
+ else:
1229
+ self.deferred.errback(reason)
1230
+
1231
+
1232
+ def read_body_with_max_size(
1233
+ response: IResponse, stream: ByteWriteable, max_size: Optional[int]
1234
+ ) -> "defer.Deferred[int]":
1235
+ """
1236
+ Read a HTTP response body to a file-object. Optionally enforcing a maximum file size.
1237
+
1238
+ If the maximum file size is reached, the returned Deferred will resolve to a
1239
+ Failure with a BodyExceededMaxSize exception.
1240
+
1241
+ Args:
1242
+ response: The HTTP response to read from.
1243
+ stream: The file-object to write to.
1244
+ max_size: The maximum file size to allow.
1245
+
1246
+ Returns:
1247
+ A Deferred which resolves to the length of the read body.
1248
+ """
1249
+ d: "defer.Deferred[int]" = defer.Deferred()
1250
+
1251
+ # If the Content-Length header gives a size larger than the maximum allowed
1252
+ # size, do not bother downloading the body.
1253
+ if max_size is not None and response.length != UNKNOWN_LENGTH:
1254
+ if response.length > max_size:
1255
+ response.deliverBody(_DiscardBodyWithMaxSizeProtocol(d))
1256
+ return d
1257
+
1258
+ response.deliverBody(_ReadBodyWithMaxSizeProtocol(stream, d, max_size))
1259
+ return d
1260
+
1261
+
1262
+ def read_multipart_response(
1263
+ response: IResponse, stream: ByteWriteable, boundary: str, max_length: Optional[int]
1264
+ ) -> "defer.Deferred[MultipartResponse]":
1265
+ """
1266
+ Reads a MSC3916 multipart/mixed response and parses it, reading the file part (if it contains one) into
1267
+ the stream passed in and returning a deferred resolving to a MultipartResponse
1268
+
1269
+ Args:
1270
+ response: The HTTP response to read from.
1271
+ stream: The file-object to write to.
1272
+ boundary: the multipart/mixed boundary string
1273
+ max_length: maximum allowable length of the response
1274
+ """
1275
+ d: defer.Deferred[MultipartResponse] = defer.Deferred()
1276
+
1277
+ # If the Content-Length header gives a size larger than the maximum allowed
1278
+ # size, do not bother downloading the body.
1279
+ if max_length is not None and response.length != UNKNOWN_LENGTH:
1280
+ if response.length > max_length:
1281
+ response.deliverBody(_DiscardBodyWithMaxSizeProtocol(d))
1282
+ return d
1283
+
1284
+ response.deliverBody(_MultipartParserProtocol(stream, d, boundary, max_length))
1285
+ return d
1286
+
1287
+
1288
+ def encode_query_args(args: Optional[QueryParams]) -> bytes:
1289
+ """
1290
+ Encodes a map of query arguments to bytes which can be appended to a URL.
1291
+
1292
+ Args:
1293
+ args: The query arguments, a mapping of string to string or list of strings.
1294
+
1295
+ Returns:
1296
+ The query arguments encoded as bytes.
1297
+ """
1298
+ if args is None:
1299
+ return b""
1300
+
1301
+ query_str = urllib.parse.urlencode(args, True)
1302
+
1303
+ return query_str.encode("utf8")
1304
+
1305
+
1306
+ @implementer(IPolicyForHTTPS)
1307
+ class InsecureInterceptableContextFactory(ssl.ContextFactory):
1308
+ """
1309
+ Factory for PyOpenSSL SSL contexts which accepts any certificate for any domain.
1310
+
1311
+ Do not use this since it allows an attacker to intercept your communications.
1312
+ """
1313
+
1314
+ def __init__(self) -> None:
1315
+ self._context = SSL.Context(SSL.SSLv23_METHOD)
1316
+ self._context.set_verify(VERIFY_NONE, lambda *_: False)
1317
+
1318
+ def getContext(self) -> SSL.Context:
1319
+ return self._context
1320
+
1321
+ def creatorForNetloc(self, hostname: bytes, port: int) -> IOpenSSLContextFactory:
1322
+ return self
1323
+
1324
+
1325
+ def is_unknown_endpoint(
1326
+ e: HttpResponseException, synapse_error: Optional[SynapseError] = None
1327
+ ) -> bool:
1328
+ """
1329
+ Returns true if the response was due to an endpoint being unimplemented.
1330
+
1331
+ Args:
1332
+ e: The error response received from the remote server.
1333
+ synapse_error: The above error converted to a SynapseError. This is
1334
+ automatically generated if not provided.
1335
+
1336
+ """
1337
+ if synapse_error is None:
1338
+ synapse_error = e.to_synapse_error()
1339
+
1340
+ # Matrix v1.6 specifies that servers should return a 404 or 405 with an errcode
1341
+ # of M_UNRECOGNIZED when they receive a request to an unknown endpoint or
1342
+ # to an unknown method, respectively.
1343
+ #
1344
+ # Older versions of servers don't return proper errors, so be graceful. But,
1345
+ # also handle that some endpoints truly do return 404 errors.
1346
+ return (
1347
+ # 404 is an unknown endpoint, 405 is a known endpoint, but unknown method.
1348
+ (e.code == 404 or e.code == 405)
1349
+ and (
1350
+ # Consider empty body or non-JSON bodies to be unrecognised (matches
1351
+ # older Dendrites & Conduits).
1352
+ not e.response
1353
+ or not e.response.startswith(b"{")
1354
+ # The proper response JSON with M_UNRECOGNIZED errcode.
1355
+ or synapse_error.errcode == Codes.UNRECOGNIZED
1356
+ )
1357
+ ) or (
1358
+ # Older Synapses returned a 400 error.
1359
+ e.code == 400 and synapse_error.errcode == Codes.UNRECOGNIZED
1360
+ )