Fix auth to correctly handle initial creation of rooms

This commit is contained in:
Erik Johnston 2014-11-18 15:36:36 +00:00
parent ae9c2ab165
commit 95614e5220
2 changed files with 58 additions and 27 deletions

View File

@ -21,7 +21,7 @@ from synapse.api.constants import Membership, JoinRules
from synapse.api.errors import AuthError, StoreError, Codes, SynapseError from synapse.api.errors import AuthError, StoreError, Codes, SynapseError
from synapse.api.events.room import ( from synapse.api.events.room import (
RoomMemberEvent, RoomPowerLevelsEvent, RoomRedactionEvent, RoomMemberEvent, RoomPowerLevelsEvent, RoomRedactionEvent,
RoomJoinRulesEvent, RoomCreateEvent, RoomJoinRulesEvent, RoomCreateEvent, RoomAliasesEvent,
) )
from synapse.util.logutils import log_function from synapse.util.logutils import log_function
from syutil.base64util import encode_base64 from syutil.base64util import encode_base64
@ -63,6 +63,10 @@ class Auth(object):
# FIXME # FIXME
return True return True
# FIXME: Temp hack
if event.type == RoomAliasesEvent.TYPE:
return True
if event.type == RoomMemberEvent.TYPE: if event.type == RoomMemberEvent.TYPE:
allowed = self.is_membership_change_allowed(event) allowed = self.is_membership_change_allowed(event)
if allowed: if allowed:
@ -144,6 +148,17 @@ class Auth(object):
@log_function @log_function
def is_membership_change_allowed(self, event): def is_membership_change_allowed(self, event):
membership = event.content["membership"]
# Check if this is the room creator joining:
if len(event.prev_events) == 1 and Membership.JOIN == membership:
# Get room creation event:
key = (RoomCreateEvent.TYPE, "", )
create = event.old_state_events.get(key)
if event.prev_events[0][0] == create.event_id:
if create.content["creator"] == event.state_key:
return True
target_user_id = event.state_key target_user_id = event.state_key
# get info about the caller # get info about the caller
@ -159,8 +174,6 @@ class Auth(object):
target_in_room = target and target.membership == Membership.JOIN target_in_room = target and target.membership == Membership.JOIN
membership = event.content["membership"]
key = (RoomJoinRulesEvent.TYPE, "", ) key = (RoomJoinRulesEvent.TYPE, "", )
join_rule_event = event.old_state_events.get(key) join_rule_event = event.old_state_events.get(key)
if join_rule_event: if join_rule_event:
@ -255,6 +268,11 @@ class Auth(object):
level = power_level_event.content.get("users", {}).get(user_id) level = power_level_event.content.get("users", {}).get(user_id)
if not level: if not level:
level = power_level_event.content.get("users_default", 0) level = power_level_event.content.get("users_default", 0)
else:
key = (RoomCreateEvent.TYPE, "", )
create_event = event.old_state_events.get(key)
if create_event.content["creator"] == user_id:
return 100
return level return level

View File

@ -184,15 +184,7 @@ class SynapseHomeServer(HomeServer):
logger.info("Synapse now listening on port %d", unsecure_port) logger.info("Synapse now listening on port %d", unsecure_port)
def setup(): def setup(config, run_http=True):
config = HomeServerConfig.load_config(
"Synapse Homeserver",
sys.argv[1:],
generate_section="Homeserver"
)
config.setup_logging()
logger.info("Server hostname: %s", config.server_name) logger.info("Server hostname: %s", config.server_name)
if re.search(":[0-9]+$", config.server_name): if re.search(":[0-9]+$", config.server_name):
@ -212,12 +204,13 @@ def setup():
content_addr=config.content_addr, content_addr=config.content_addr,
) )
hs.register_servlets() if run_http:
hs.register_servlets()
hs.create_resource_tree( hs.create_resource_tree(
web_client=config.webclient, web_client=config.webclient,
redirect_root_to_web_client=True, redirect_root_to_web_client=True,
) )
db_name = hs.get_db_name() db_name = hs.get_db_name()
@ -237,11 +230,18 @@ def setup():
f.namespace['hs'] = hs f.namespace['hs'] = hs
reactor.listenTCP(config.manhole, f, interface='127.0.0.1') reactor.listenTCP(config.manhole, f, interface='127.0.0.1')
bind_port = config.bind_port if run_http:
if config.no_tls: bind_port = config.bind_port
bind_port = None if config.no_tls:
hs.start_listening(bind_port, config.unsecure_port) bind_port = None
hs.start_listening(bind_port, config.unsecure_port)
hs.config = config
return hs
def run(config):
if config.daemonize: if config.daemonize:
print config.pid_file print config.pid_file
daemon = Daemonize( daemon = Daemonize(
@ -257,13 +257,26 @@ def setup():
else: else:
reactor.run() reactor.run()
def run():
with LoggingContext("run"):
reactor.run()
def main(): def main(args, run_http=True):
with LoggingContext("main"): with LoggingContext("main"):
setup() config = HomeServerConfig.load_config(
"Synapse Homeserver",
args,
generate_section="Homeserver"
)
config.setup_logging()
hs = setup(config, run_http=run_http)
def r():
run(config)
hs.run = r
return hs
if __name__ == '__main__': if __name__ == '__main__':
main() hs = main(sys.argv[1:])
hs.run()