Fix public room joining by making sure replaces_state never points to itself.

pull/25/head
Erik Johnston 2014-12-11 15:56:01 +00:00
parent 9191292b0f
commit 0b04369238
3 changed files with 13 additions and 10 deletions

View File

@ -349,7 +349,7 @@ class FederationHandler(BaseHandler):
handled_events = set()
try:
builder.event_id = self.event_factory.create_event_id()
builder.event_id = self.event_builder_factory.create_event_id()
builder.origin = self.hs.hostname
builder.content = content
@ -593,13 +593,13 @@ class FederationHandler(BaseHandler):
}
event = yield self.store.get_event(event_id)
if hasattr(event, "state_key"):
if event and event.is_state():
# Get previous state
if hasattr(event, "replaces_state") and event.replaces_state:
prev_event = yield self.store.get_event(
event.replaces_state
)
results[(event.type, event.state_key)] = prev_event
if "replaces_state" in event.unsigned:
prev_id = event.unsigned["replaces_state"]
if prev_id != event.event_id:
prev_event = yield self.store.get_event(prev_id)
results[(event.type, event.state_key)] = prev_event
else:
del results[(event.type, event.state_key)]

View File

@ -159,7 +159,8 @@ class StateHandler(object):
key = (event.type, event.state_key)
if key in context.current_state:
replaces = context.current_state[key]
event.unsigned["replaces_state"] = replaces.event_id
if replaces.event_id != event.event_id: # Paranoia check
event.unsigned["replaces_state"] = replaces.event_id
defer.returnValue([])

View File

@ -451,7 +451,8 @@ class SQLBaseStore(object):
return events
def _get_event_txn(self, txn, event_id, check_redacted=True):
def _get_event_txn(self, txn, event_id, check_redacted=True,
get_prev_content=True):
sql = (
"SELECT json, r.event_id FROM event_json as e "
"LEFT JOIN redactions as r ON e.event_id = r.redacts "
@ -487,10 +488,11 @@ class SQLBaseStore(object):
if because:
ev.unsigned["redacted_because"] = because
if "replaces_state" in ev.unsigned:
if get_prev_content and "replaces_state" in ev.unsigned:
ev.unsigned["prev_content"] = self._get_event_txn(
txn,
ev.unsigned["replaces_state"],
get_prev_content=False,
).get_dict()["content"]
return ev