Validate power levels event changes. Change error messages to be more helpful. Fix bug where we checked the wrong power levels
							parent
							
								
									9dd4570b68
								
							
						
					
					
						commit
						480438eee6
					
				|  | @ -18,7 +18,7 @@ | |||
| from twisted.internet import defer | ||||
| 
 | ||||
| from synapse.api.constants import Membership, JoinRules | ||||
| from synapse.api.errors import AuthError, StoreError, Codes | ||||
| from synapse.api.errors import AuthError, StoreError, Codes, SynapseError | ||||
| from synapse.api.events.room import RoomMemberEvent, RoomPowerLevelsEvent | ||||
| from synapse.util.logutils import log_function | ||||
| 
 | ||||
|  | @ -308,7 +308,9 @@ class Auth(object): | |||
|         else: | ||||
|             user_level = 0 | ||||
| 
 | ||||
|         logger.debug("Checking power level for %s, %s", event.user_id, user_level) | ||||
|         logger.debug( | ||||
|             "Checking power level for %s, %s", event.user_id, user_level | ||||
|         ) | ||||
|         if current_state and hasattr(current_state, "required_power_level"): | ||||
|             req = current_state.required_power_level | ||||
| 
 | ||||
|  | @ -321,6 +323,24 @@ class Auth(object): | |||
| 
 | ||||
|     @defer.inlineCallbacks | ||||
|     def _check_power_levels(self, event): | ||||
|         for k, v in event.content.items(): | ||||
|             if k == "default": | ||||
|                 continue | ||||
| 
 | ||||
|             # FIXME (erikj): We don't want hsob_Ts in content. | ||||
|             if k == "hsob_ts": | ||||
|                 continue | ||||
| 
 | ||||
|             try: | ||||
|                 self.hs.parse_userid(k) | ||||
|             except: | ||||
|                 raise SynapseError(400, "Not a valid user_id: %s" % (k,)) | ||||
| 
 | ||||
|             try: | ||||
|                 int(v) | ||||
|             except: | ||||
|                 raise SynapseError(400, "Not a valid power level: %s" % (v,)) | ||||
| 
 | ||||
|         current_state = yield self.store.get_current_state( | ||||
|             event.room_id, | ||||
|             event.type, | ||||
|  | @ -346,7 +366,10 @@ class Auth(object): | |||
| 
 | ||||
|         # FIXME (erikj) | ||||
|         old_people = {k: v for k, v in old_list.items() if k.startswith("@")} | ||||
|         new_people = {k: v for k, v in event.content.items() if k.startswith("@")} | ||||
|         new_people = { | ||||
|             k: v for k, v in event.content.items() | ||||
|             if k.startswith("@") | ||||
|         } | ||||
| 
 | ||||
|         removed = set(old_people.keys()) - set(new_people.keys()) | ||||
|         added = set(old_people.keys()) - set(new_people.keys()) | ||||
|  | @ -356,22 +379,24 @@ class Auth(object): | |||
|             if int(old_list.content[r]) > user_level: | ||||
|                 raise AuthError( | ||||
|                     403, | ||||
|                     "You don't have permission to change that state" | ||||
|                     "You don't have permission to remove user: %s" % (r, ) | ||||
|                 ) | ||||
| 
 | ||||
|         for n in new_people: | ||||
|         for n in added: | ||||
|             if int(event.content[n]) > user_level: | ||||
|                 raise AuthError( | ||||
|                     403, | ||||
|                     "You don't have permission to change that state" | ||||
|                     "You don't have permission to add ops level greater " | ||||
|                     "than your own" | ||||
|                 ) | ||||
| 
 | ||||
|         for s in same: | ||||
|             if int(event.content[s]) != int(old_list[s]): | ||||
|                 if int(old_list[s]) > user_level: | ||||
|                 if int(event.content[s]) > user_level: | ||||
|                     raise AuthError( | ||||
|                         403, | ||||
|                         "You don't have permission to change that state" | ||||
|                         "You don't have permission to add ops level greater " | ||||
|                         "than your own" | ||||
|                     ) | ||||
| 
 | ||||
|         if "default" in old_list: | ||||
|  | @ -380,7 +405,8 @@ class Auth(object): | |||
|             if old_default > user_level: | ||||
|                 raise AuthError( | ||||
|                     403, | ||||
|                     "You don't have permission to change that state" | ||||
|                     "You don't have permission to add ops level greater than " | ||||
|                     "your own" | ||||
|                 ) | ||||
| 
 | ||||
|             if "default" in event.content: | ||||
|  | @ -389,5 +415,6 @@ class Auth(object): | |||
|                 if new_default > user_level: | ||||
|                     raise AuthError( | ||||
|                         403, | ||||
|                         "You don't have permission to change that state" | ||||
|                         "You don't have permission to add ops level greater " | ||||
|                         "than your own" | ||||
|                     ) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Erik Johnston
						Erik Johnston