Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 847e239

Browse files
authored
Prepatory work for adding power level event to batched events (#14214)
1 parent 2b940d2 commit 847e239

File tree

6 files changed

+47
-17
lines changed

6 files changed

+47
-17
lines changed

changelog.d/14214.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
When authenticating batched events, check for auth events in batch as well as DB.

synapse/event_auth.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,18 @@
1515

1616
import logging
1717
import typing
18-
from typing import Any, Collection, Dict, Iterable, List, Optional, Set, Tuple, Union
18+
from typing import (
19+
Any,
20+
Collection,
21+
Dict,
22+
Iterable,
23+
List,
24+
Mapping,
25+
Optional,
26+
Set,
27+
Tuple,
28+
Union,
29+
)
1930

2031
from canonicaljson import encode_canonical_json
2132
from signedjson.key import decode_verify_key_bytes
@@ -134,6 +145,7 @@ def validate_event_for_room_version(event: "EventBase") -> None:
134145
async def check_state_independent_auth_rules(
135146
store: _EventSourceStore,
136147
event: "EventBase",
148+
batched_auth_events: Optional[Mapping[str, "EventBase"]] = None,
137149
) -> None:
138150
"""Check that an event complies with auth rules that are independent of room state
139151
@@ -143,6 +155,8 @@ async def check_state_independent_auth_rules(
143155
Args:
144156
store: the datastore; used to fetch the auth events for validation
145157
event: the event being checked.
158+
batched_auth_events: if the event being authed is part of a batch, any events
159+
from the same batch that may be necessary to auth the current event
146160
147161
Raises:
148162
AuthError if the checks fail
@@ -162,6 +176,9 @@ async def check_state_independent_auth_rules(
162176
redact_behaviour=EventRedactBehaviour.as_is,
163177
allow_rejected=True,
164178
)
179+
if batched_auth_events:
180+
auth_events.update(batched_auth_events)
181+
165182
room_id = event.room_id
166183
auth_dict: MutableStateMap[str] = {}
167184
expected_auth_types = auth_types_for_event(event.room_version, event)

synapse/handlers/event_auth.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
import logging
15-
from typing import TYPE_CHECKING, Collection, List, Optional, Union
15+
from typing import TYPE_CHECKING, Collection, List, Mapping, Optional, Union
1616

1717
from synapse import event_auth
1818
from synapse.api.constants import (
@@ -29,7 +29,6 @@
2929
)
3030
from synapse.events import EventBase
3131
from synapse.events.builder import EventBuilder
32-
from synapse.events.snapshot import EventContext
3332
from synapse.types import StateMap, get_domain_from_id
3433

3534
if TYPE_CHECKING:
@@ -51,12 +50,21 @@ def __init__(self, hs: "HomeServer"):
5150
async def check_auth_rules_from_context(
5251
self,
5352
event: EventBase,
54-
context: EventContext,
53+
batched_auth_events: Optional[Mapping[str, EventBase]] = None,
5554
) -> None:
56-
"""Check an event passes the auth rules at its own auth events"""
57-
await check_state_independent_auth_rules(self._store, event)
55+
"""Check an event passes the auth rules at its own auth events
56+
Args:
57+
event: event to be authed
58+
batched_auth_events: if the event being authed is part of a batch, any events
59+
from the same batch that may be necessary to auth the current event
60+
"""
61+
await check_state_independent_auth_rules(
62+
self._store, event, batched_auth_events
63+
)
5864
auth_event_ids = event.auth_event_ids()
5965
auth_events_by_id = await self._store.get_events(auth_event_ids)
66+
if batched_auth_events:
67+
auth_events_by_id.update(batched_auth_events)
6068
check_state_dependent_auth_rules(event, auth_events_by_id.values())
6169

6270
def compute_auth_events(

synapse/handlers/federation.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -942,7 +942,7 @@ async def on_make_join_request(
942942

943943
# The remote hasn't signed it yet, obviously. We'll do the full checks
944944
# when we get the event back in `on_send_join_request`
945-
await self._event_auth_handler.check_auth_rules_from_context(event, context)
945+
await self._event_auth_handler.check_auth_rules_from_context(event)
946946
return event
947947

948948
async def on_invite_request(
@@ -1123,7 +1123,7 @@ async def on_make_leave_request(
11231123
try:
11241124
# The remote hasn't signed it yet, obviously. We'll do the full checks
11251125
# when we get the event back in `on_send_leave_request`
1126-
await self._event_auth_handler.check_auth_rules_from_context(event, context)
1126+
await self._event_auth_handler.check_auth_rules_from_context(event)
11271127
except AuthError as e:
11281128
logger.warning("Failed to create new leave %r because %s", event, e)
11291129
raise e
@@ -1182,7 +1182,7 @@ async def on_make_knock_request(
11821182
try:
11831183
# The remote hasn't signed it yet, obviously. We'll do the full checks
11841184
# when we get the event back in `on_send_knock_request`
1185-
await self._event_auth_handler.check_auth_rules_from_context(event, context)
1185+
await self._event_auth_handler.check_auth_rules_from_context(event)
11861186
except AuthError as e:
11871187
logger.warning("Failed to create new knock %r because %s", event, e)
11881188
raise e
@@ -1348,9 +1348,7 @@ async def exchange_third_party_invite(
13481348

13491349
try:
13501350
validate_event_for_room_version(event)
1351-
await self._event_auth_handler.check_auth_rules_from_context(
1352-
event, context
1353-
)
1351+
await self._event_auth_handler.check_auth_rules_from_context(event)
13541352
except AuthError as e:
13551353
logger.warning("Denying new third party invite %r because %s", event, e)
13561354
raise e
@@ -1400,7 +1398,7 @@ async def on_exchange_third_party_invite_request(
14001398

14011399
try:
14021400
validate_event_for_room_version(event)
1403-
await self._event_auth_handler.check_auth_rules_from_context(event, context)
1401+
await self._event_auth_handler.check_auth_rules_from_context(event)
14041402
except AuthError as e:
14051403
logger.warning("Denying third party invite %r because %s", event, e)
14061404
raise e

synapse/handlers/message.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1360,8 +1360,16 @@ async def handle_new_client_event(
13601360
else:
13611361
try:
13621362
validate_event_for_room_version(event)
1363+
# If we are persisting a batch of events the event(s) needed to auth the
1364+
# current event may be part of the batch and will not be in the DB yet
1365+
event_id_to_event = {e.event_id: e for e, _ in events_and_context}
1366+
batched_auth_events = {}
1367+
for event_id in event.auth_event_ids():
1368+
auth_event = event_id_to_event.get(event_id)
1369+
if auth_event:
1370+
batched_auth_events[event_id] = auth_event
13631371
await self._event_auth_handler.check_auth_rules_from_context(
1364-
event, context
1372+
event, batched_auth_events
13651373
)
13661374
except AuthError as err:
13671375
logger.warning("Denying new event %r because %s", event, err)

synapse/handlers/room.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,7 @@ async def upgrade_room(
229229
},
230230
)
231231
validate_event_for_room_version(tombstone_event)
232-
await self._event_auth_handler.check_auth_rules_from_context(
233-
tombstone_event, tombstone_context
234-
)
232+
await self._event_auth_handler.check_auth_rules_from_context(tombstone_event)
235233

236234
# Upgrade the room
237235
#

0 commit comments

Comments
 (0)