|
15 | 15 |
|
16 | 16 | """Contains handlers for federation events."""
|
17 | 17 |
|
18 |
| -import itertools |
19 | 18 | import logging
|
20 | 19 | from http import HTTPStatus
|
21 | 20 | from typing import TYPE_CHECKING, Dict, Iterable, List, Optional, Tuple, Union
|
|
27 | 26 | from twisted.internet import defer
|
28 | 27 |
|
29 | 28 | from synapse import event_auth
|
30 |
| -from synapse.api.constants import ( |
31 |
| - EventContentFields, |
32 |
| - EventTypes, |
33 |
| - Membership, |
34 |
| - RejectedReason, |
35 |
| -) |
| 29 | +from synapse.api.constants import EventContentFields, EventTypes, Membership |
36 | 30 | from synapse.api.errors import (
|
37 | 31 | AuthError,
|
38 | 32 | CodeMessageException,
|
|
43 | 37 | RequestSendFailed,
|
44 | 38 | SynapseError,
|
45 | 39 | )
|
46 |
| -from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, RoomVersion, RoomVersions |
| 40 | +from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, RoomVersion |
47 | 41 | from synapse.crypto.event_signing import compute_event_signature
|
48 |
| -from synapse.event_auth import ( |
49 |
| - check_auth_rules_for_event, |
50 |
| - validate_event_for_room_version, |
51 |
| -) |
| 42 | +from synapse.event_auth import validate_event_for_room_version |
52 | 43 | from synapse.events import EventBase
|
53 | 44 | from synapse.events.snapshot import EventContext
|
54 | 45 | from synapse.events.validator import EventValidator
|
@@ -519,7 +510,7 @@ async def do_invite_join(
|
519 | 510 | auth_events=auth_chain,
|
520 | 511 | )
|
521 | 512 |
|
522 |
| - max_stream_id = await self._persist_auth_tree( |
| 513 | + max_stream_id = await self._federation_event_handler.process_remote_join( |
523 | 514 | origin, room_id, auth_chain, state, event, room_version_obj
|
524 | 515 | )
|
525 | 516 |
|
@@ -1095,117 +1086,6 @@ async def get_persisted_pdu(
|
1095 | 1086 | else:
|
1096 | 1087 | return None
|
1097 | 1088 |
|
1098 |
| - async def _persist_auth_tree( |
1099 |
| - self, |
1100 |
| - origin: str, |
1101 |
| - room_id: str, |
1102 |
| - auth_events: List[EventBase], |
1103 |
| - state: List[EventBase], |
1104 |
| - event: EventBase, |
1105 |
| - room_version: RoomVersion, |
1106 |
| - ) -> int: |
1107 |
| - """Checks the auth chain is valid (and passes auth checks) for the |
1108 |
| - state and event. Then persists the auth chain and state atomically. |
1109 |
| - Persists the event separately. Notifies about the persisted events |
1110 |
| - where appropriate. |
1111 |
| -
|
1112 |
| - Will attempt to fetch missing auth events. |
1113 |
| -
|
1114 |
| - Args: |
1115 |
| - origin: Where the events came from |
1116 |
| - room_id, |
1117 |
| - auth_events |
1118 |
| - state |
1119 |
| - event |
1120 |
| - room_version: The room version we expect this room to have, and |
1121 |
| - will raise if it doesn't match the version in the create event. |
1122 |
| - """ |
1123 |
| - events_to_context = {} |
1124 |
| - for e in itertools.chain(auth_events, state): |
1125 |
| - e.internal_metadata.outlier = True |
1126 |
| - events_to_context[e.event_id] = EventContext.for_outlier() |
1127 |
| - |
1128 |
| - event_map = { |
1129 |
| - e.event_id: e for e in itertools.chain(auth_events, state, [event]) |
1130 |
| - } |
1131 |
| - |
1132 |
| - create_event = None |
1133 |
| - for e in auth_events: |
1134 |
| - if (e.type, e.state_key) == (EventTypes.Create, ""): |
1135 |
| - create_event = e |
1136 |
| - break |
1137 |
| - |
1138 |
| - if create_event is None: |
1139 |
| - # If the state doesn't have a create event then the room is |
1140 |
| - # invalid, and it would fail auth checks anyway. |
1141 |
| - raise SynapseError(400, "No create event in state") |
1142 |
| - |
1143 |
| - room_version_id = create_event.content.get( |
1144 |
| - "room_version", RoomVersions.V1.identifier |
1145 |
| - ) |
1146 |
| - |
1147 |
| - if room_version.identifier != room_version_id: |
1148 |
| - raise SynapseError(400, "Room version mismatch") |
1149 |
| - |
1150 |
| - missing_auth_events = set() |
1151 |
| - for e in itertools.chain(auth_events, state, [event]): |
1152 |
| - for e_id in e.auth_event_ids(): |
1153 |
| - if e_id not in event_map: |
1154 |
| - missing_auth_events.add(e_id) |
1155 |
| - |
1156 |
| - for e_id in missing_auth_events: |
1157 |
| - m_ev = await self.federation_client.get_pdu( |
1158 |
| - [origin], |
1159 |
| - e_id, |
1160 |
| - room_version=room_version, |
1161 |
| - outlier=True, |
1162 |
| - timeout=10000, |
1163 |
| - ) |
1164 |
| - if m_ev and m_ev.event_id == e_id: |
1165 |
| - event_map[e_id] = m_ev |
1166 |
| - else: |
1167 |
| - logger.info("Failed to find auth event %r", e_id) |
1168 |
| - |
1169 |
| - for e in itertools.chain(auth_events, state, [event]): |
1170 |
| - auth_for_e = [ |
1171 |
| - event_map[e_id] for e_id in e.auth_event_ids() if e_id in event_map |
1172 |
| - ] |
1173 |
| - if create_event: |
1174 |
| - auth_for_e.append(create_event) |
1175 |
| - |
1176 |
| - try: |
1177 |
| - validate_event_for_room_version(room_version, e) |
1178 |
| - check_auth_rules_for_event(room_version, e, auth_for_e) |
1179 |
| - except SynapseError as err: |
1180 |
| - # we may get SynapseErrors here as well as AuthErrors. For |
1181 |
| - # instance, there are a couple of (ancient) events in some |
1182 |
| - # rooms whose senders do not have the correct sigil; these |
1183 |
| - # cause SynapseErrors in auth.check. We don't want to give up |
1184 |
| - # the attempt to federate altogether in such cases. |
1185 |
| - |
1186 |
| - logger.warning("Rejecting %s because %s", e.event_id, err.msg) |
1187 |
| - |
1188 |
| - if e == event: |
1189 |
| - raise |
1190 |
| - events_to_context[e.event_id].rejected = RejectedReason.AUTH_ERROR |
1191 |
| - |
1192 |
| - if auth_events or state: |
1193 |
| - await self._federation_event_handler.persist_events_and_notify( |
1194 |
| - room_id, |
1195 |
| - [ |
1196 |
| - (e, events_to_context[e.event_id]) |
1197 |
| - for e in itertools.chain(auth_events, state) |
1198 |
| - ], |
1199 |
| - ) |
1200 |
| - |
1201 |
| - new_event_context = await self.state_handler.compute_event_context( |
1202 |
| - event, old_state=state |
1203 |
| - ) |
1204 |
| - |
1205 |
| - return await self._federation_event_handler.persist_events_and_notify( |
1206 |
| - room_id, [(event, new_event_context)] |
1207 |
| - ) |
1208 |
| - |
1209 | 1089 | async def on_get_missing_events(
|
1210 | 1090 | self,
|
1211 | 1091 | origin: str,
|
|
0 commit comments