@@ -34,9 +34,11 @@ def check(event, auth_events, do_sig_check=True, do_size_check=True):
34
34
event: the event being checked.
35
35
auth_events (dict: event-key -> event): the existing room state.
36
36
37
+ Raises:
38
+ AuthError if the checks fail
37
39
38
40
Returns:
39
- True if the auth checks pass.
41
+ if the auth checks pass.
40
42
"""
41
43
if do_size_check :
42
44
_check_size_limits (event )
@@ -71,7 +73,7 @@ def check(event, auth_events, do_sig_check=True, do_size_check=True):
71
73
# Oh, we don't know what the state of the room was, so we
72
74
# are trusting that this is allowed (at least for now)
73
75
logger .warn ("Trusting event: %s" , event .event_id )
74
- return True
76
+ return
75
77
76
78
if event .type == EventTypes .Create :
77
79
room_id_domain = get_domain_from_id (event .room_id )
@@ -81,7 +83,8 @@ def check(event, auth_events, do_sig_check=True, do_size_check=True):
81
83
"Creation event's room_id domain does not match sender's"
82
84
)
83
85
# FIXME
84
- return True
86
+ logger .debug ("Allowing! %s" , event )
87
+ return
85
88
86
89
creation_event = auth_events .get ((EventTypes .Create , "" ), None )
87
90
@@ -118,7 +121,8 @@ def check(event, auth_events, do_sig_check=True, do_size_check=True):
118
121
403 ,
119
122
"Alias event's state_key does not match sender's domain"
120
123
)
121
- return True
124
+ logger .debug ("Allowing! %s" , event )
125
+ return
122
126
123
127
if logger .isEnabledFor (logging .DEBUG ):
124
128
logger .debug (
@@ -127,14 +131,9 @@ def check(event, auth_events, do_sig_check=True, do_size_check=True):
127
131
)
128
132
129
133
if event .type == EventTypes .Member :
130
- allowed = _is_membership_change_allowed (
131
- event , auth_events
132
- )
133
- if allowed :
134
- logger .debug ("Allowing! %s" , event )
135
- else :
136
- logger .debug ("Denying! %s" , event )
137
- return allowed
134
+ _is_membership_change_allowed (event , auth_events )
135
+ logger .debug ("Allowing! %s" , event )
136
+ return
138
137
139
138
_check_event_sender_in_room (event , auth_events )
140
139
@@ -153,7 +152,8 @@ def check(event, auth_events, do_sig_check=True, do_size_check=True):
153
152
)
154
153
)
155
154
else :
156
- return True
155
+ logger .debug ("Allowing! %s" , event )
156
+ return
157
157
158
158
_can_send_event (event , auth_events )
159
159
@@ -200,7 +200,7 @@ def _is_membership_change_allowed(event, auth_events):
200
200
create = auth_events .get (key )
201
201
if create and event .prev_events [0 ][0 ] == create .event_id :
202
202
if create .content ["creator" ] == event .state_key :
203
- return True
203
+ return
204
204
205
205
target_user_id = event .state_key
206
206
@@ -265,13 +265,13 @@ def _is_membership_change_allowed(event, auth_events):
265
265
raise AuthError (
266
266
403 , "%s is banned from the room" % (target_user_id ,)
267
267
)
268
- return True
268
+ return
269
269
270
270
if Membership .JOIN != membership :
271
271
if (caller_invited
272
272
and Membership .LEAVE == membership
273
273
and target_user_id == event .user_id ):
274
- return True
274
+ return
275
275
276
276
if not caller_in_room : # caller isn't joined
277
277
raise AuthError (
@@ -334,8 +334,6 @@ def _is_membership_change_allowed(event, auth_events):
334
334
else :
335
335
raise AuthError (500 , "Unknown membership %s" % membership )
336
336
337
- return True
338
-
339
337
340
338
def _check_event_sender_in_room (event , auth_events ):
341
339
key = (EventTypes .Member , event .user_id , )
@@ -355,35 +353,46 @@ def _check_joined_room(member, user_id, room_id):
355
353
))
356
354
357
355
358
- def get_send_level (etype , state_key , auth_events ):
359
- key = (EventTypes .PowerLevels , "" , )
360
- send_level_event = auth_events .get (key )
361
- send_level = None
362
- if send_level_event :
363
- send_level = send_level_event .content .get ("events" , {}).get (
364
- etype
365
- )
366
- if send_level is None :
367
- if state_key is not None :
368
- send_level = send_level_event .content .get (
369
- "state_default" , 50
370
- )
371
- else :
372
- send_level = send_level_event .content .get (
373
- "events_default" , 0
374
- )
356
+ def get_send_level (etype , state_key , power_levels_event ):
357
+ """Get the power level required to send an event of a given type
358
+
359
+ The federation spec [1] refers to this as "Required Power Level".
360
+
361
+ https://matrix.org/docs/spec/server_server/unstable.html#definitions
375
362
376
- if send_level :
377
- send_level = int (send_level )
363
+ Args:
364
+ etype (str): type of event
365
+ state_key (str|None): state_key of state event, or None if it is not
366
+ a state event.
367
+ power_levels_event (synapse.events.EventBase|None): power levels event
368
+ in force at this point in the room
369
+ Returns:
370
+ int: power level required to send this event.
371
+ """
372
+
373
+ if power_levels_event :
374
+ power_levels_content = power_levels_event .content
378
375
else :
379
- send_level = 0
376
+ power_levels_content = {}
377
+
378
+ # see if we have a custom level for this event type
379
+ send_level = power_levels_content .get ("events" , {}).get (etype )
380
+
381
+ # otherwise, fall back to the state_default/events_default.
382
+ if send_level is None :
383
+ if state_key is not None :
384
+ send_level = power_levels_content .get ("state_default" , 50 )
385
+ else :
386
+ send_level = power_levels_content .get ("events_default" , 0 )
380
387
381
- return send_level
388
+ return int ( send_level )
382
389
383
390
384
391
def _can_send_event (event , auth_events ):
392
+ power_levels_event = _get_power_level_event (auth_events )
393
+
385
394
send_level = get_send_level (
386
- event .type , event .get ("state_key" , None ), auth_events
395
+ event .type , event .get ("state_key" ), power_levels_event ,
387
396
)
388
397
user_level = get_user_power_level (event .user_id , auth_events )
389
398
@@ -524,13 +533,22 @@ def _check_power_levels(event, auth_events):
524
533
525
534
526
535
def _get_power_level_event (auth_events ):
527
- key = (EventTypes .PowerLevels , "" , )
528
- return auth_events .get (key )
536
+ return auth_events .get ((EventTypes .PowerLevels , "" ))
529
537
530
538
531
539
def get_user_power_level (user_id , auth_events ):
532
- power_level_event = _get_power_level_event (auth_events )
540
+ """Get a user's power level
541
+
542
+ Args:
543
+ user_id (str): user's id to look up in power_levels
544
+ auth_events (dict[(str, str), synapse.events.EventBase]):
545
+ state in force at this point in the room (or rather, a subset of
546
+ it including at least the create event and power levels event.
533
547
548
+ Returns:
549
+ int: the user's power level in this room.
550
+ """
551
+ power_level_event = _get_power_level_event (auth_events )
534
552
if power_level_event :
535
553
level = power_level_event .content .get ("users" , {}).get (user_id )
536
554
if not level :
@@ -541,6 +559,11 @@ def get_user_power_level(user_id, auth_events):
541
559
else :
542
560
return int (level )
543
561
else :
562
+ # if there is no power levels event, the creator gets 100 and everyone
563
+ # else gets 0.
564
+
565
+ # some things which call this don't pass the create event: hack around
566
+ # that.
544
567
key = (EventTypes .Create , "" , )
545
568
create_event = auth_events .get (key )
546
569
if (create_event is not None and
0 commit comments