2828logger = logging .getLogger (__name__ )
2929
3030
31+ AuthEventTypes = (
32+ EventTypes .Create , EventTypes .Member , EventTypes .PowerLevels ,
33+ EventTypes .JoinRules ,
34+ )
35+
36+
3137class Auth (object ):
3238
3339 def __init__ (self , hs ):
@@ -166,6 +172,7 @@ def is_membership_change_allowed(self, event, auth_events):
166172 target = auth_events .get (key )
167173
168174 target_in_room = target and target .membership == Membership .JOIN
175+ target_banned = target and target .membership == Membership .BAN
169176
170177 key = (EventTypes .JoinRules , "" , )
171178 join_rule_event = auth_events .get (key )
@@ -194,6 +201,7 @@ def is_membership_change_allowed(self, event, auth_events):
194201 {
195202 "caller_in_room" : caller_in_room ,
196203 "caller_invited" : caller_invited ,
204+ "target_banned" : target_banned ,
197205 "target_in_room" : target_in_room ,
198206 "membership" : membership ,
199207 "join_rule" : join_rule ,
@@ -202,6 +210,11 @@ def is_membership_change_allowed(self, event, auth_events):
202210 }
203211 )
204212
213+ if ban_level :
214+ ban_level = int (ban_level )
215+ else :
216+ ban_level = 50 # FIXME (erikj): What should we do here?
217+
205218 if Membership .INVITE == membership :
206219 # TODO (erikj): We should probably handle this more intelligently
207220 # PRIVATE join rules.
@@ -212,6 +225,10 @@ def is_membership_change_allowed(self, event, auth_events):
212225 403 ,
213226 "%s not in room %s." % (event .user_id , event .room_id ,)
214227 )
228+ elif target_banned :
229+ raise AuthError (
230+ 403 , "%s is banned from the room" % (target_user_id ,)
231+ )
215232 elif target_in_room : # the target is already in the room.
216233 raise AuthError (403 , "%s is already in the room." %
217234 target_user_id )
@@ -221,6 +238,8 @@ def is_membership_change_allowed(self, event, auth_events):
221238 # joined: It's a NOOP
222239 if event .user_id != target_user_id :
223240 raise AuthError (403 , "Cannot force another user to join." )
241+ elif target_banned :
242+ raise AuthError (403 , "You are banned from this room" )
224243 elif join_rule == JoinRules .PUBLIC :
225244 pass
226245 elif join_rule == JoinRules .INVITE :
@@ -238,6 +257,10 @@ def is_membership_change_allowed(self, event, auth_events):
238257 403 ,
239258 "%s not in room %s." % (target_user_id , event .room_id ,)
240259 )
260+ elif target_banned and user_level < ban_level :
261+ raise AuthError (
262+ 403 , "You cannot unban user &s." % (target_user_id ,)
263+ )
241264 elif target_user_id != event .user_id :
242265 if kick_level :
243266 kick_level = int (kick_level )
@@ -249,11 +272,6 @@ def is_membership_change_allowed(self, event, auth_events):
249272 403 , "You cannot kick user %s." % target_user_id
250273 )
251274 elif Membership .BAN == membership :
252- if ban_level :
253- ban_level = int (ban_level )
254- else :
255- ban_level = 50 # FIXME (erikj): What should we do here?
256-
257275 if user_level < ban_level :
258276 raise AuthError (403 , "You don't have permission to ban" )
259277 else :
@@ -370,7 +388,7 @@ def get_user_by_token(self, token):
370388 AuthError if no user by that token exists or the token is invalid.
371389 """
372390 try :
373- ret = yield self .store .get_user_by_token (token = token )
391+ ret = yield self .store .get_user_by_token (token )
374392 if not ret :
375393 raise StoreError (400 , "Unknown token" )
376394 user_info = {
@@ -412,12 +430,6 @@ def add_auth_events(self, builder, context):
412430
413431 builder .auth_events = auth_events_entries
414432
415- context .auth_events = {
416- k : v
417- for k , v in context .current_state .items ()
418- if v .event_id in auth_ids
419- }
420-
421433 def compute_auth_events (self , event , current_state ):
422434 if event .type == EventTypes .Create :
423435 return []
0 commit comments