mirror of
https://mau.dev/maunium/synapse.git
synced 2024-12-13 14:43:30 +01:00
Kill off synapse.api.events.*
This commit is contained in:
parent
6a1da99fab
commit
3c77d13aa5
26 changed files with 74 additions and 925 deletions
|
@ -68,6 +68,7 @@ class EventTypes(object):
|
||||||
PowerLevels = "m.room.power_levels"
|
PowerLevels = "m.room.power_levels"
|
||||||
Aliases = "m.room.aliases"
|
Aliases = "m.room.aliases"
|
||||||
Redaction = "m.room.redaction"
|
Redaction = "m.room.redaction"
|
||||||
|
Feedback = "m.room.message.feedback"
|
||||||
|
|
||||||
# These are used for validation
|
# These are used for validation
|
||||||
Message = "m.room.message"
|
Message = "m.room.message"
|
||||||
|
|
|
@ -1,148 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2014 OpenMarket Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
from synapse.util.jsonobject import JsonEncodedObject
|
|
||||||
|
|
||||||
|
|
||||||
def serialize_event(hs, e):
|
|
||||||
# FIXME(erikj): To handle the case of presence events and the like
|
|
||||||
if not isinstance(e, SynapseEvent):
|
|
||||||
return e
|
|
||||||
|
|
||||||
# Should this strip out None's?
|
|
||||||
d = {k: v for k, v in e.get_dict().items()}
|
|
||||||
if "age_ts" in d:
|
|
||||||
d["age"] = int(hs.get_clock().time_msec()) - d["age_ts"]
|
|
||||||
del d["age_ts"]
|
|
||||||
|
|
||||||
return d
|
|
||||||
|
|
||||||
|
|
||||||
class SynapseEvent(JsonEncodedObject):
|
|
||||||
|
|
||||||
"""Base class for Synapse events. These are JSON objects which must abide
|
|
||||||
by a certain well-defined structure.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Attributes that are currently assumed by the federation side:
|
|
||||||
# Mandatory:
|
|
||||||
# - event_id
|
|
||||||
# - room_id
|
|
||||||
# - type
|
|
||||||
# - is_state
|
|
||||||
#
|
|
||||||
# Optional:
|
|
||||||
# - state_key (mandatory when is_state is True)
|
|
||||||
# - prev_events (these can be filled out by the federation layer itself.)
|
|
||||||
# - prev_state
|
|
||||||
|
|
||||||
valid_keys = [
|
|
||||||
"event_id",
|
|
||||||
"type",
|
|
||||||
"room_id",
|
|
||||||
"user_id", # sender/initiator
|
|
||||||
"content", # HTTP body, JSON
|
|
||||||
"state_key",
|
|
||||||
"age_ts",
|
|
||||||
"prev_content",
|
|
||||||
"replaces_state",
|
|
||||||
"redacted_because",
|
|
||||||
"origin_server_ts",
|
|
||||||
]
|
|
||||||
|
|
||||||
internal_keys = [
|
|
||||||
"is_state",
|
|
||||||
"depth",
|
|
||||||
"destinations",
|
|
||||||
"origin",
|
|
||||||
"outlier",
|
|
||||||
"redacted",
|
|
||||||
"prev_events",
|
|
||||||
"hashes",
|
|
||||||
"signatures",
|
|
||||||
"prev_state",
|
|
||||||
"auth_events",
|
|
||||||
"state_hash",
|
|
||||||
]
|
|
||||||
|
|
||||||
required_keys = [
|
|
||||||
"event_id",
|
|
||||||
"room_id",
|
|
||||||
"content",
|
|
||||||
]
|
|
||||||
|
|
||||||
outlier = False
|
|
||||||
|
|
||||||
def __init__(self, raises=True, **kwargs):
|
|
||||||
super(SynapseEvent, self).__init__(**kwargs)
|
|
||||||
# if "content" in kwargs:
|
|
||||||
# self.check_json(self.content, raises=raises)
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
""" Retrieve the JSON template for this event as a dict.
|
|
||||||
|
|
||||||
The template must be a dict representing the JSON to match. Only
|
|
||||||
required keys should be present. The values of the keys in the template
|
|
||||||
are checked via type() to the values of the same keys in the actual
|
|
||||||
event JSON.
|
|
||||||
|
|
||||||
NB: If loading content via json.loads, you MUST define strings as
|
|
||||||
unicode.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
Content:
|
|
||||||
{
|
|
||||||
"name": u"bob",
|
|
||||||
"age": 18,
|
|
||||||
"friends": [u"mike", u"jill"]
|
|
||||||
}
|
|
||||||
Template:
|
|
||||||
{
|
|
||||||
"name": u"string",
|
|
||||||
"age": 0,
|
|
||||||
"friends": [u"string"]
|
|
||||||
}
|
|
||||||
The values "string" and 0 could be anything, so long as the types
|
|
||||||
are the same as the content.
|
|
||||||
"""
|
|
||||||
raise NotImplementedError("get_content_template not implemented.")
|
|
||||||
|
|
||||||
def get_pdu_json(self, time_now=None):
|
|
||||||
pdu_json = self.get_full_dict()
|
|
||||||
pdu_json.pop("destinations", None)
|
|
||||||
pdu_json.pop("outlier", None)
|
|
||||||
pdu_json.pop("replaces_state", None)
|
|
||||||
pdu_json.pop("redacted", None)
|
|
||||||
pdu_json.pop("prev_content", None)
|
|
||||||
state_hash = pdu_json.pop("state_hash", None)
|
|
||||||
if state_hash is not None:
|
|
||||||
pdu_json.setdefault("unsigned", {})["state_hash"] = state_hash
|
|
||||||
content = pdu_json.get("content", {})
|
|
||||||
content.pop("prev", None)
|
|
||||||
if time_now is not None and "age_ts" in pdu_json:
|
|
||||||
age = time_now - pdu_json["age_ts"]
|
|
||||||
pdu_json.setdefault("unsigned", {})["age"] = int(age)
|
|
||||||
del pdu_json["age_ts"]
|
|
||||||
user_id = pdu_json.pop("user_id")
|
|
||||||
pdu_json["sender"] = user_id
|
|
||||||
return pdu_json
|
|
||||||
|
|
||||||
|
|
||||||
class SynapseStateEvent(SynapseEvent):
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
|
||||||
if "state_key" not in kwargs:
|
|
||||||
kwargs["state_key"] = ""
|
|
||||||
super(SynapseStateEvent, self).__init__(**kwargs)
|
|
|
@ -1,90 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2014 OpenMarket Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
from synapse.api.events.room import (
|
|
||||||
RoomTopicEvent, MessageEvent, RoomMemberEvent, FeedbackEvent,
|
|
||||||
InviteJoinEvent, RoomConfigEvent, RoomNameEvent, GenericEvent,
|
|
||||||
RoomPowerLevelsEvent, RoomJoinRulesEvent,
|
|
||||||
RoomCreateEvent,
|
|
||||||
RoomRedactionEvent,
|
|
||||||
)
|
|
||||||
|
|
||||||
from synapse.types import EventID
|
|
||||||
|
|
||||||
from synapse.util.stringutils import random_string
|
|
||||||
|
|
||||||
|
|
||||||
class EventFactory(object):
|
|
||||||
|
|
||||||
_event_classes = [
|
|
||||||
RoomTopicEvent,
|
|
||||||
RoomNameEvent,
|
|
||||||
MessageEvent,
|
|
||||||
RoomMemberEvent,
|
|
||||||
FeedbackEvent,
|
|
||||||
InviteJoinEvent,
|
|
||||||
RoomConfigEvent,
|
|
||||||
RoomPowerLevelsEvent,
|
|
||||||
RoomJoinRulesEvent,
|
|
||||||
RoomCreateEvent,
|
|
||||||
RoomRedactionEvent,
|
|
||||||
]
|
|
||||||
|
|
||||||
def __init__(self, hs):
|
|
||||||
self._event_list = {} # dict of TYPE to event class
|
|
||||||
for event_class in EventFactory._event_classes:
|
|
||||||
self._event_list[event_class.TYPE] = event_class
|
|
||||||
|
|
||||||
self.clock = hs.get_clock()
|
|
||||||
self.hs = hs
|
|
||||||
|
|
||||||
self.event_id_count = 0
|
|
||||||
|
|
||||||
def create_event_id(self):
|
|
||||||
i = str(self.event_id_count)
|
|
||||||
self.event_id_count += 1
|
|
||||||
|
|
||||||
local_part = str(int(self.clock.time())) + i + random_string(5)
|
|
||||||
|
|
||||||
e_id = EventID.create(local_part, self.hs.hostname)
|
|
||||||
|
|
||||||
return e_id.to_string()
|
|
||||||
|
|
||||||
def create_event(self, etype=None, **kwargs):
|
|
||||||
kwargs["type"] = etype
|
|
||||||
if "event_id" not in kwargs:
|
|
||||||
kwargs["event_id"] = self.create_event_id()
|
|
||||||
kwargs["origin"] = self.hs.hostname
|
|
||||||
else:
|
|
||||||
ev_id = self.hs.parse_eventid(kwargs["event_id"])
|
|
||||||
kwargs["origin"] = ev_id.domain
|
|
||||||
|
|
||||||
if "origin_server_ts" not in kwargs:
|
|
||||||
kwargs["origin_server_ts"] = int(self.clock.time_msec())
|
|
||||||
|
|
||||||
# The "age" key is a delta timestamp that should be converted into an
|
|
||||||
# absolute timestamp the minute we see it.
|
|
||||||
if "age" in kwargs:
|
|
||||||
kwargs["age_ts"] = int(self.clock.time_msec()) - int(kwargs["age"])
|
|
||||||
del kwargs["age"]
|
|
||||||
elif "age_ts" not in kwargs:
|
|
||||||
kwargs["age_ts"] = int(self.clock.time_msec())
|
|
||||||
|
|
||||||
if etype in self._event_list:
|
|
||||||
handler = self._event_list[etype]
|
|
||||||
else:
|
|
||||||
handler = GenericEvent
|
|
||||||
|
|
||||||
return handler(**kwargs)
|
|
|
@ -1,170 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2014 OpenMarket Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
from synapse.api.constants import Feedback, Membership
|
|
||||||
from synapse.api.errors import SynapseError
|
|
||||||
from . import SynapseEvent, SynapseStateEvent
|
|
||||||
|
|
||||||
|
|
||||||
class GenericEvent(SynapseEvent):
|
|
||||||
def get_content_template(self):
|
|
||||||
return {}
|
|
||||||
|
|
||||||
|
|
||||||
class RoomTopicEvent(SynapseEvent):
|
|
||||||
TYPE = "m.room.topic"
|
|
||||||
|
|
||||||
internal_keys = SynapseEvent.internal_keys + [
|
|
||||||
"topic",
|
|
||||||
]
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
|
||||||
kwargs["state_key"] = ""
|
|
||||||
if "topic" in kwargs["content"]:
|
|
||||||
kwargs["topic"] = kwargs["content"]["topic"]
|
|
||||||
super(RoomTopicEvent, self).__init__(**kwargs)
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
return {"topic": u"string"}
|
|
||||||
|
|
||||||
|
|
||||||
class RoomNameEvent(SynapseEvent):
|
|
||||||
TYPE = "m.room.name"
|
|
||||||
|
|
||||||
internal_keys = SynapseEvent.internal_keys + [
|
|
||||||
"name",
|
|
||||||
]
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
|
||||||
kwargs["state_key"] = ""
|
|
||||||
if "name" in kwargs["content"]:
|
|
||||||
kwargs["name"] = kwargs["content"]["name"]
|
|
||||||
super(RoomNameEvent, self).__init__(**kwargs)
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
return {"name": u"string"}
|
|
||||||
|
|
||||||
|
|
||||||
class RoomMemberEvent(SynapseEvent):
|
|
||||||
TYPE = "m.room.member"
|
|
||||||
|
|
||||||
valid_keys = SynapseEvent.valid_keys + [
|
|
||||||
# target is the state_key
|
|
||||||
"membership", # action
|
|
||||||
]
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
|
||||||
if "membership" not in kwargs:
|
|
||||||
kwargs["membership"] = kwargs.get("content", {}).get("membership")
|
|
||||||
if not kwargs["membership"] in Membership.LIST:
|
|
||||||
raise SynapseError(400, "Bad membership value.")
|
|
||||||
super(RoomMemberEvent, self).__init__(**kwargs)
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
return {"membership": u"string"}
|
|
||||||
|
|
||||||
|
|
||||||
class MessageEvent(SynapseEvent):
|
|
||||||
TYPE = "m.room.message"
|
|
||||||
|
|
||||||
valid_keys = SynapseEvent.valid_keys + [
|
|
||||||
"msg_id", # unique per room + user combo
|
|
||||||
]
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
|
||||||
super(MessageEvent, self).__init__(**kwargs)
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
return {"msgtype": u"string"}
|
|
||||||
|
|
||||||
|
|
||||||
class FeedbackEvent(SynapseEvent):
|
|
||||||
TYPE = "m.room.message.feedback"
|
|
||||||
|
|
||||||
valid_keys = SynapseEvent.valid_keys
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
|
||||||
super(FeedbackEvent, self).__init__(**kwargs)
|
|
||||||
if not kwargs["content"]["type"] in Feedback.LIST:
|
|
||||||
raise SynapseError(400, "Bad feedback value.")
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
return {
|
|
||||||
"type": u"string",
|
|
||||||
"target_event_id": u"string"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class InviteJoinEvent(SynapseEvent):
|
|
||||||
TYPE = "m.room.invite_join"
|
|
||||||
|
|
||||||
valid_keys = SynapseEvent.valid_keys + [
|
|
||||||
# target_user_id is the state_key
|
|
||||||
"target_host",
|
|
||||||
]
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
|
||||||
super(InviteJoinEvent, self).__init__(**kwargs)
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
return {}
|
|
||||||
|
|
||||||
|
|
||||||
class RoomConfigEvent(SynapseEvent):
|
|
||||||
TYPE = "m.room.config"
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
|
||||||
kwargs["state_key"] = ""
|
|
||||||
super(RoomConfigEvent, self).__init__(**kwargs)
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
return {}
|
|
||||||
|
|
||||||
|
|
||||||
class RoomCreateEvent(SynapseStateEvent):
|
|
||||||
TYPE = "m.room.create"
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
return {}
|
|
||||||
|
|
||||||
|
|
||||||
class RoomJoinRulesEvent(SynapseStateEvent):
|
|
||||||
TYPE = "m.room.join_rules"
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
return {}
|
|
||||||
|
|
||||||
|
|
||||||
class RoomPowerLevelsEvent(SynapseStateEvent):
|
|
||||||
TYPE = "m.room.power_levels"
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
return {}
|
|
||||||
|
|
||||||
|
|
||||||
class RoomAliasesEvent(SynapseStateEvent):
|
|
||||||
TYPE = "m.room.aliases"
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
return {}
|
|
||||||
|
|
||||||
|
|
||||||
class RoomRedactionEvent(SynapseEvent):
|
|
||||||
TYPE = "m.room.redaction"
|
|
||||||
|
|
||||||
valid_keys = SynapseEvent.valid_keys + ["redacts"]
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
return {}
|
|
|
@ -1,85 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2014 OpenMarket Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
from .room import (
|
|
||||||
RoomMemberEvent, RoomJoinRulesEvent, RoomPowerLevelsEvent,
|
|
||||||
RoomAliasesEvent, RoomCreateEvent,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def prune_event(event):
|
|
||||||
""" Returns a pruned version of the given event, which removes all keys we
|
|
||||||
don't know about or think could potentially be dodgy.
|
|
||||||
|
|
||||||
This is used when we "redact" an event. We want to remove all fields that
|
|
||||||
the user has specified, but we do want to keep necessary information like
|
|
||||||
type, state_key etc.
|
|
||||||
"""
|
|
||||||
event_type = event.type
|
|
||||||
|
|
||||||
allowed_keys = [
|
|
||||||
"event_id",
|
|
||||||
"user_id",
|
|
||||||
"room_id",
|
|
||||||
"hashes",
|
|
||||||
"signatures",
|
|
||||||
"content",
|
|
||||||
"type",
|
|
||||||
"state_key",
|
|
||||||
"depth",
|
|
||||||
"prev_events",
|
|
||||||
"prev_state",
|
|
||||||
"auth_events",
|
|
||||||
"origin",
|
|
||||||
"origin_server_ts",
|
|
||||||
]
|
|
||||||
|
|
||||||
new_content = {}
|
|
||||||
|
|
||||||
def add_fields(*fields):
|
|
||||||
for field in fields:
|
|
||||||
if field in event.content:
|
|
||||||
new_content[field] = event.content[field]
|
|
||||||
|
|
||||||
if event_type == RoomMemberEvent.TYPE:
|
|
||||||
add_fields("membership")
|
|
||||||
elif event_type == RoomCreateEvent.TYPE:
|
|
||||||
add_fields("creator")
|
|
||||||
elif event_type == RoomJoinRulesEvent.TYPE:
|
|
||||||
add_fields("join_rule")
|
|
||||||
elif event_type == RoomPowerLevelsEvent.TYPE:
|
|
||||||
add_fields(
|
|
||||||
"users",
|
|
||||||
"users_default",
|
|
||||||
"events",
|
|
||||||
"events_default",
|
|
||||||
"events_default",
|
|
||||||
"state_default",
|
|
||||||
"ban",
|
|
||||||
"kick",
|
|
||||||
"redact",
|
|
||||||
)
|
|
||||||
elif event_type == RoomAliasesEvent.TYPE:
|
|
||||||
add_fields("aliases")
|
|
||||||
|
|
||||||
allowed_fields = {
|
|
||||||
k: v
|
|
||||||
for k, v in event.get_full_dict().items()
|
|
||||||
if k in allowed_keys
|
|
||||||
}
|
|
||||||
|
|
||||||
allowed_fields["content"] = new_content
|
|
||||||
|
|
||||||
return type(event)(**allowed_fields)
|
|
|
@ -1,87 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2014 OpenMarket Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
from synapse.api.errors import SynapseError, Codes
|
|
||||||
|
|
||||||
|
|
||||||
class EventValidator(object):
|
|
||||||
def __init__(self, hs):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def validate(self, event):
|
|
||||||
"""Checks the given JSON content abides by the rules of the template.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
content : A JSON object to check.
|
|
||||||
raises: True to raise a SynapseError if the check fails.
|
|
||||||
Returns:
|
|
||||||
True if the content passes the template. Returns False if the check
|
|
||||||
fails and raises=False.
|
|
||||||
Raises:
|
|
||||||
SynapseError if the check fails and raises=True.
|
|
||||||
"""
|
|
||||||
# recursively call to inspect each layer
|
|
||||||
err_msg = self._check_json_template(
|
|
||||||
event.content,
|
|
||||||
event.get_content_template()
|
|
||||||
)
|
|
||||||
if err_msg:
|
|
||||||
raise SynapseError(400, err_msg, Codes.BAD_JSON)
|
|
||||||
else:
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _check_json_template(self, content, template):
|
|
||||||
"""Check content and template matches.
|
|
||||||
|
|
||||||
If the template is a dict, each key in the dict will be validated with
|
|
||||||
the content, else it will just compare the types of content and
|
|
||||||
template. This basic type check is required because this function will
|
|
||||||
be recursively called and could be called with just strs or ints.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
content: The content to validate.
|
|
||||||
template: The validation template.
|
|
||||||
Returns:
|
|
||||||
str: An error message if the validation fails, else None.
|
|
||||||
"""
|
|
||||||
if type(content) != type(template):
|
|
||||||
return "Mismatched types: %s" % template
|
|
||||||
|
|
||||||
if type(template) == dict:
|
|
||||||
for key in template:
|
|
||||||
if key not in content:
|
|
||||||
return "Missing %s key" % key
|
|
||||||
|
|
||||||
if type(content[key]) != type(template[key]):
|
|
||||||
return "Key %s is of the wrong type (got %s, want %s)" % (
|
|
||||||
key, type(content[key]), type(template[key]))
|
|
||||||
|
|
||||||
if type(content[key]) == dict:
|
|
||||||
# we must go deeper
|
|
||||||
msg = self._check_json_template(
|
|
||||||
content[key],
|
|
||||||
template[key]
|
|
||||||
)
|
|
||||||
if msg:
|
|
||||||
return msg
|
|
||||||
elif type(content[key]) == list:
|
|
||||||
# make sure each item type in content matches the template
|
|
||||||
for entry in content[key]:
|
|
||||||
msg = self._check_json_template(
|
|
||||||
entry,
|
|
||||||
template[key][0]
|
|
||||||
)
|
|
||||||
if msg:
|
|
||||||
return msg
|
|
|
@ -74,7 +74,6 @@ class ReplicationLayer(object):
|
||||||
|
|
||||||
self._clock = hs.get_clock()
|
self._clock = hs.get_clock()
|
||||||
|
|
||||||
self.event_factory = hs.get_event_factory()
|
|
||||||
self.event_builder_factory = hs.get_event_builder_factory()
|
self.event_builder_factory = hs.get_event_builder_factory()
|
||||||
|
|
||||||
def set_handler(self, handler):
|
def set_handler(self, handler):
|
||||||
|
|
|
@ -18,7 +18,7 @@ from twisted.internet import defer
|
||||||
from ._base import BaseHandler
|
from ._base import BaseHandler
|
||||||
|
|
||||||
from synapse.api.errors import SynapseError, Codes, CodeMessageException
|
from synapse.api.errors import SynapseError, Codes, CodeMessageException
|
||||||
from synapse.api.events.room import RoomAliasesEvent
|
from synapse.api.constants import EventTypes
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ class DirectoryHandler(BaseHandler):
|
||||||
|
|
||||||
msg_handler = self.hs.get_handlers().message_handler
|
msg_handler = self.hs.get_handlers().message_handler
|
||||||
yield msg_handler.create_and_send_event({
|
yield msg_handler.create_and_send_event({
|
||||||
"type": RoomAliasesEvent.TYPE,
|
"type": EventTypes.Aliases,
|
||||||
"state_key": self.hs.hostname,
|
"state_key": self.hs.hostname,
|
||||||
"room_id": room_id,
|
"room_id": room_id,
|
||||||
"sender": user_id,
|
"sender": user_id,
|
||||||
|
|
|
@ -22,8 +22,7 @@ from synapse.events.utils import prune_event
|
||||||
from synapse.api.errors import (
|
from synapse.api.errors import (
|
||||||
AuthError, FederationError, SynapseError, StoreError,
|
AuthError, FederationError, SynapseError, StoreError,
|
||||||
)
|
)
|
||||||
from synapse.api.events.room import RoomMemberEvent, RoomCreateEvent
|
from synapse.api.constants import EventTypes, Membership
|
||||||
from synapse.api.constants import Membership
|
|
||||||
from synapse.util.logutils import log_function
|
from synapse.util.logutils import log_function
|
||||||
from synapse.util.async import run_on_reactor
|
from synapse.util.async import run_on_reactor
|
||||||
from synapse.crypto.event_signing import (
|
from synapse.crypto.event_signing import (
|
||||||
|
@ -225,7 +224,7 @@ class FederationHandler(BaseHandler):
|
||||||
|
|
||||||
if not backfilled:
|
if not backfilled:
|
||||||
extra_users = []
|
extra_users = []
|
||||||
if event.type == RoomMemberEvent.TYPE:
|
if event.type == EventTypes.Member:
|
||||||
target_user_id = event.state_key
|
target_user_id = event.state_key
|
||||||
target_user = self.hs.parse_userid(target_user_id)
|
target_user = self.hs.parse_userid(target_user_id)
|
||||||
extra_users.append(target_user)
|
extra_users.append(target_user)
|
||||||
|
@ -234,7 +233,7 @@ class FederationHandler(BaseHandler):
|
||||||
event, extra_users=extra_users
|
event, extra_users=extra_users
|
||||||
)
|
)
|
||||||
|
|
||||||
if event.type == RoomMemberEvent.TYPE:
|
if event.type == EventTypes.Member:
|
||||||
if event.membership == Membership.JOIN:
|
if event.membership == Membership.JOIN:
|
||||||
user = self.hs.parse_userid(event.state_key)
|
user = self.hs.parse_userid(event.state_key)
|
||||||
yield self.distributor.fire(
|
yield self.distributor.fire(
|
||||||
|
@ -333,7 +332,8 @@ class FederationHandler(BaseHandler):
|
||||||
event = pdu
|
event = pdu
|
||||||
|
|
||||||
# We should assert some things.
|
# We should assert some things.
|
||||||
assert(event.type == RoomMemberEvent.TYPE)
|
# FIXME: Do this in a nicer way
|
||||||
|
assert(event.type == EventTypes.Member)
|
||||||
assert(event.user_id == joinee)
|
assert(event.user_id == joinee)
|
||||||
assert(event.state_key == joinee)
|
assert(event.state_key == joinee)
|
||||||
assert(event.room_id == room_id)
|
assert(event.room_id == room_id)
|
||||||
|
@ -450,7 +450,7 @@ class FederationHandler(BaseHandler):
|
||||||
process it until the other server has signed it and sent it back.
|
process it until the other server has signed it and sent it back.
|
||||||
"""
|
"""
|
||||||
builder = self.event_builder_factory.new({
|
builder = self.event_builder_factory.new({
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"content": {"membership": Membership.JOIN},
|
"content": {"membership": Membership.JOIN},
|
||||||
"room_id": room_id,
|
"room_id": room_id,
|
||||||
"sender": user_id,
|
"sender": user_id,
|
||||||
|
@ -492,7 +492,7 @@ class FederationHandler(BaseHandler):
|
||||||
)
|
)
|
||||||
|
|
||||||
extra_users = []
|
extra_users = []
|
||||||
if event.type == RoomMemberEvent.TYPE:
|
if event.type == EventTypes.Member:
|
||||||
target_user_id = event.state_key
|
target_user_id = event.state_key
|
||||||
target_user = self.hs.parse_userid(target_user_id)
|
target_user = self.hs.parse_userid(target_user_id)
|
||||||
extra_users.append(target_user)
|
extra_users.append(target_user)
|
||||||
|
@ -501,7 +501,7 @@ class FederationHandler(BaseHandler):
|
||||||
event, extra_users=extra_users
|
event, extra_users=extra_users
|
||||||
)
|
)
|
||||||
|
|
||||||
if event.type == RoomMemberEvent.TYPE:
|
if event.type == EventTypes.Member:
|
||||||
if event.content["membership"] == Membership.JOIN:
|
if event.content["membership"] == Membership.JOIN:
|
||||||
user = self.hs.parse_userid(event.state_key)
|
user = self.hs.parse_userid(event.state_key)
|
||||||
yield self.distributor.fire(
|
yield self.distributor.fire(
|
||||||
|
@ -514,7 +514,7 @@ class FederationHandler(BaseHandler):
|
||||||
|
|
||||||
for k, s in context.current_state.items():
|
for k, s in context.current_state.items():
|
||||||
try:
|
try:
|
||||||
if k[0] == RoomMemberEvent.TYPE:
|
if k[0] == EventTypes.Member:
|
||||||
if s.content["membership"] == Membership.JOIN:
|
if s.content["membership"] == Membership.JOIN:
|
||||||
destinations.add(
|
destinations.add(
|
||||||
self.hs.parse_userid(s.state_key).domain
|
self.hs.parse_userid(s.state_key).domain
|
||||||
|
@ -731,10 +731,10 @@ class FederationHandler(BaseHandler):
|
||||||
event.event_id, event.signatures,
|
event.event_id, event.signatures,
|
||||||
)
|
)
|
||||||
|
|
||||||
if event.type == RoomMemberEvent.TYPE and not event.auth_events:
|
if event.type == EventTypes.Member and not event.auth_events:
|
||||||
if len(event.prev_events) == 1:
|
if len(event.prev_events) == 1:
|
||||||
c = yield self.store.get_event(event.prev_events[0][0])
|
c = yield self.store.get_event(event.prev_events[0][0])
|
||||||
if c.type == RoomCreateEvent.TYPE:
|
if c.type == EventTypes.Create:
|
||||||
context.auth_events[(c.type, c.state_key)] = c
|
context.auth_events[(c.type, c.state_key)] = c
|
||||||
|
|
||||||
logger.debug(
|
logger.debug(
|
||||||
|
|
|
@ -35,7 +35,6 @@ class MessageHandler(BaseHandler):
|
||||||
super(MessageHandler, self).__init__(hs)
|
super(MessageHandler, self).__init__(hs)
|
||||||
self.hs = hs
|
self.hs = hs
|
||||||
self.clock = hs.get_clock()
|
self.clock = hs.get_clock()
|
||||||
self.event_factory = hs.get_event_factory()
|
|
||||||
self.validator = EventValidator()
|
self.validator = EventValidator()
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
|
|
|
@ -17,12 +17,8 @@
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
from synapse.types import UserID, RoomAlias, RoomID
|
from synapse.types import UserID, RoomAlias, RoomID
|
||||||
from synapse.api.constants import Membership, JoinRules
|
from synapse.api.constants import EventTypes, Membership, JoinRules
|
||||||
from synapse.api.errors import StoreError, SynapseError
|
from synapse.api.errors import StoreError, SynapseError
|
||||||
from synapse.api.events.room import (
|
|
||||||
RoomMemberEvent, RoomCreateEvent, RoomPowerLevelsEvent,
|
|
||||||
RoomTopicEvent, RoomNameEvent, RoomJoinRulesEvent,
|
|
||||||
)
|
|
||||||
from synapse.util import stringutils
|
from synapse.util import stringutils
|
||||||
from synapse.util.async import run_on_reactor
|
from synapse.util.async import run_on_reactor
|
||||||
from ._base import BaseHandler
|
from ._base import BaseHandler
|
||||||
|
@ -131,7 +127,7 @@ class RoomCreationHandler(BaseHandler):
|
||||||
if "name" in config:
|
if "name" in config:
|
||||||
name = config["name"]
|
name = config["name"]
|
||||||
yield msg_handler.create_and_send_event({
|
yield msg_handler.create_and_send_event({
|
||||||
"type": RoomNameEvent.TYPE,
|
"type": EventTypes.Name,
|
||||||
"room_id": room_id,
|
"room_id": room_id,
|
||||||
"sender": user_id,
|
"sender": user_id,
|
||||||
"content": {"name": name},
|
"content": {"name": name},
|
||||||
|
@ -140,7 +136,7 @@ class RoomCreationHandler(BaseHandler):
|
||||||
if "topic" in config:
|
if "topic" in config:
|
||||||
topic = config["topic"]
|
topic = config["topic"]
|
||||||
yield msg_handler.create_and_send_event({
|
yield msg_handler.create_and_send_event({
|
||||||
"type": RoomTopicEvent.TYPE,
|
"type": EventTypes.Topic,
|
||||||
"room_id": room_id,
|
"room_id": room_id,
|
||||||
"sender": user_id,
|
"sender": user_id,
|
||||||
"content": {"topic": topic},
|
"content": {"topic": topic},
|
||||||
|
@ -148,7 +144,7 @@ class RoomCreationHandler(BaseHandler):
|
||||||
|
|
||||||
for invitee in invite_list:
|
for invitee in invite_list:
|
||||||
yield msg_handler.create_and_send_event({
|
yield msg_handler.create_and_send_event({
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"state_key": invitee,
|
"state_key": invitee,
|
||||||
"room_id": room_id,
|
"room_id": room_id,
|
||||||
"user_id": user_id,
|
"user_id": user_id,
|
||||||
|
@ -186,12 +182,12 @@ class RoomCreationHandler(BaseHandler):
|
||||||
return e
|
return e
|
||||||
|
|
||||||
creation_event = create(
|
creation_event = create(
|
||||||
etype=RoomCreateEvent.TYPE,
|
etype=EventTypes.Create,
|
||||||
content={"creator": creator.to_string()},
|
content={"creator": creator.to_string()},
|
||||||
)
|
)
|
||||||
|
|
||||||
join_event = create(
|
join_event = create(
|
||||||
etype=RoomMemberEvent.TYPE,
|
etype=EventTypes.Member,
|
||||||
state_key=creator_id,
|
state_key=creator_id,
|
||||||
content={
|
content={
|
||||||
"membership": Membership.JOIN,
|
"membership": Membership.JOIN,
|
||||||
|
@ -199,15 +195,15 @@ class RoomCreationHandler(BaseHandler):
|
||||||
)
|
)
|
||||||
|
|
||||||
power_levels_event = create(
|
power_levels_event = create(
|
||||||
etype=RoomPowerLevelsEvent.TYPE,
|
etype=EventTypes.PowerLevels,
|
||||||
content={
|
content={
|
||||||
"users": {
|
"users": {
|
||||||
creator.to_string(): 100,
|
creator.to_string(): 100,
|
||||||
},
|
},
|
||||||
"users_default": 0,
|
"users_default": 0,
|
||||||
"events": {
|
"events": {
|
||||||
RoomNameEvent.TYPE: 100,
|
EventTypes.Name: 100,
|
||||||
RoomPowerLevelsEvent.TYPE: 100,
|
EventTypes.PowerLevels: 100,
|
||||||
},
|
},
|
||||||
"events_default": 0,
|
"events_default": 0,
|
||||||
"state_default": 50,
|
"state_default": 50,
|
||||||
|
@ -219,7 +215,7 @@ class RoomCreationHandler(BaseHandler):
|
||||||
|
|
||||||
join_rule = JoinRules.PUBLIC if is_public else JoinRules.INVITE
|
join_rule = JoinRules.PUBLIC if is_public else JoinRules.INVITE
|
||||||
join_rules_event = create(
|
join_rules_event = create(
|
||||||
etype=RoomJoinRulesEvent.TYPE,
|
etype=EventTypes.JoinRules,
|
||||||
content={"join_rule": join_rule},
|
content={"join_rule": join_rule},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -344,7 +340,7 @@ class RoomMemberHandler(BaseHandler):
|
||||||
target_user_id = event.state_key
|
target_user_id = event.state_key
|
||||||
|
|
||||||
prev_state = context.current_state.get(
|
prev_state = context.current_state.get(
|
||||||
(RoomMemberEvent.TYPE, target_user_id),
|
(EventTypes.Member, target_user_id),
|
||||||
None
|
None
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -396,7 +392,7 @@ class RoomMemberHandler(BaseHandler):
|
||||||
|
|
||||||
content.update({"membership": Membership.JOIN})
|
content.update({"membership": Membership.JOIN})
|
||||||
builder = self.event_builder_factory.new({
|
builder = self.event_builder_factory.new({
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"state_key": joinee.to_string(),
|
"state_key": joinee.to_string(),
|
||||||
"room_id": room_id,
|
"room_id": room_id,
|
||||||
"sender": joinee.to_string(),
|
"sender": joinee.to_string(),
|
||||||
|
|
|
@ -28,7 +28,7 @@ class RestServletFactory(object):
|
||||||
speaking, they serve as wrappers around events and the handlers that
|
speaking, they serve as wrappers around events and the handlers that
|
||||||
process them.
|
process them.
|
||||||
|
|
||||||
See synapse.api.events for information on synapse events.
|
See synapse.events for information on synapse events.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, hs):
|
def __init__(self, hs):
|
||||||
|
|
|
@ -67,8 +67,6 @@ class RestServlet(object):
|
||||||
self.auth = hs.get_auth()
|
self.auth = hs.get_auth()
|
||||||
self.txns = HttpTransactionStore()
|
self.txns = HttpTransactionStore()
|
||||||
|
|
||||||
self.validator = hs.get_event_validator()
|
|
||||||
|
|
||||||
def register(self, http_server):
|
def register(self, http_server):
|
||||||
""" Register this servlet with the given HTTP server. """
|
""" Register this servlet with the given HTTP server. """
|
||||||
if hasattr(self, "PATTERN"):
|
if hasattr(self, "PATTERN"):
|
||||||
|
|
|
@ -19,8 +19,7 @@ from twisted.internet import defer
|
||||||
from base import RestServlet, client_path_pattern
|
from base import RestServlet, client_path_pattern
|
||||||
from synapse.api.errors import SynapseError, Codes
|
from synapse.api.errors import SynapseError, Codes
|
||||||
from synapse.streams.config import PaginationConfig
|
from synapse.streams.config import PaginationConfig
|
||||||
from synapse.api.events.room import RoomMemberEvent, RoomRedactionEvent
|
from synapse.api.constants import EventTypes, Membership
|
||||||
from synapse.api.constants import Membership
|
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
@ -239,7 +238,7 @@ class JoinRoomAliasServlet(RestServlet):
|
||||||
msg_handler = self.handlers.message_handler
|
msg_handler = self.handlers.message_handler
|
||||||
yield msg_handler.create_and_send_event(
|
yield msg_handler.create_and_send_event(
|
||||||
{
|
{
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"content": {"membership": Membership.JOIN},
|
"content": {"membership": Membership.JOIN},
|
||||||
"room_id": identifier.to_string(),
|
"room_id": identifier.to_string(),
|
||||||
"sender": user.to_string(),
|
"sender": user.to_string(),
|
||||||
|
@ -403,7 +402,7 @@ class RoomMembershipRestServlet(RestServlet):
|
||||||
msg_handler = self.handlers.message_handler
|
msg_handler = self.handlers.message_handler
|
||||||
yield msg_handler.create_and_send_event(
|
yield msg_handler.create_and_send_event(
|
||||||
{
|
{
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"content": {"membership": unicode(membership_action)},
|
"content": {"membership": unicode(membership_action)},
|
||||||
"room_id": room_id,
|
"room_id": room_id,
|
||||||
"sender": user.to_string(),
|
"sender": user.to_string(),
|
||||||
|
@ -441,7 +440,7 @@ class RoomRedactEventRestServlet(RestServlet):
|
||||||
msg_handler = self.handlers.message_handler
|
msg_handler = self.handlers.message_handler
|
||||||
event = yield msg_handler.create_and_send_event(
|
event = yield msg_handler.create_and_send_event(
|
||||||
{
|
{
|
||||||
"type": RoomRedactionEvent.TYPE,
|
"type": EventTypes.Redaction,
|
||||||
"content": content,
|
"content": content,
|
||||||
"room_id": room_id,
|
"room_id": room_id,
|
||||||
"sender": user.to_string(),
|
"sender": user.to_string(),
|
||||||
|
|
|
@ -21,8 +21,6 @@
|
||||||
# Imports required for the default HomeServer() implementation
|
# Imports required for the default HomeServer() implementation
|
||||||
from synapse.federation import initialize_http_replication
|
from synapse.federation import initialize_http_replication
|
||||||
from synapse.events.utils import serialize_event
|
from synapse.events.utils import serialize_event
|
||||||
from synapse.api.events.factory import EventFactory
|
|
||||||
from synapse.api.events.validator import EventValidator
|
|
||||||
from synapse.notifier import Notifier
|
from synapse.notifier import Notifier
|
||||||
from synapse.api.auth import Auth
|
from synapse.api.auth import Auth
|
||||||
from synapse.handlers import Handlers
|
from synapse.handlers import Handlers
|
||||||
|
@ -66,7 +64,6 @@ class BaseHomeServer(object):
|
||||||
'persistence_service',
|
'persistence_service',
|
||||||
'replication_layer',
|
'replication_layer',
|
||||||
'datastore',
|
'datastore',
|
||||||
'event_factory',
|
|
||||||
'handlers',
|
'handlers',
|
||||||
'auth',
|
'auth',
|
||||||
'rest_servlet_factory',
|
'rest_servlet_factory',
|
||||||
|
@ -83,7 +80,6 @@ class BaseHomeServer(object):
|
||||||
'event_sources',
|
'event_sources',
|
||||||
'ratelimiter',
|
'ratelimiter',
|
||||||
'keyring',
|
'keyring',
|
||||||
'event_validator',
|
|
||||||
'event_builder_factory',
|
'event_builder_factory',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -198,9 +194,6 @@ class HomeServer(BaseHomeServer):
|
||||||
def build_datastore(self):
|
def build_datastore(self):
|
||||||
return DataStore(self)
|
return DataStore(self)
|
||||||
|
|
||||||
def build_event_factory(self):
|
|
||||||
return EventFactory(self)
|
|
||||||
|
|
||||||
def build_handlers(self):
|
def build_handlers(self):
|
||||||
return Handlers(self)
|
return Handlers(self)
|
||||||
|
|
||||||
|
@ -231,9 +224,6 @@ class HomeServer(BaseHomeServer):
|
||||||
def build_keyring(self):
|
def build_keyring(self):
|
||||||
return Keyring(self)
|
return Keyring(self)
|
||||||
|
|
||||||
def build_event_validator(self):
|
|
||||||
return EventValidator(self)
|
|
||||||
|
|
||||||
def build_event_builder_factory(self):
|
def build_event_builder_factory(self):
|
||||||
return EventBuilderFactory(
|
return EventBuilderFactory(
|
||||||
clock=self.get_clock(),
|
clock=self.get_clock(),
|
||||||
|
|
|
@ -18,7 +18,7 @@ from twisted.internet import defer
|
||||||
|
|
||||||
from synapse.util.logutils import log_function
|
from synapse.util.logutils import log_function
|
||||||
from synapse.util.async import run_on_reactor
|
from synapse.util.async import run_on_reactor
|
||||||
from synapse.api.events.room import RoomPowerLevelsEvent
|
from synapse.api.constants import EventTypes
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
|
@ -271,7 +271,7 @@ class StateHandler(object):
|
||||||
|
|
||||||
def _get_power_level_from_event_state(self, event, user_id):
|
def _get_power_level_from_event_state(self, event, user_id):
|
||||||
if hasattr(event, "old_state_events") and event.old_state_events:
|
if hasattr(event, "old_state_events") and event.old_state_events:
|
||||||
key = (RoomPowerLevelsEvent.TYPE, "", )
|
key = (EventTypes.PowerLevels, "", )
|
||||||
power_level_event = event.old_state_events.get(key)
|
power_level_event = event.old_state_events.get(key)
|
||||||
level = None
|
level = None
|
||||||
if power_level_event:
|
if power_level_event:
|
||||||
|
|
|
@ -15,12 +15,8 @@
|
||||||
|
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
from synapse.api.events.room import (
|
|
||||||
RoomMemberEvent, RoomTopicEvent, FeedbackEvent, RoomNameEvent,
|
|
||||||
RoomRedactionEvent,
|
|
||||||
)
|
|
||||||
|
|
||||||
from synapse.util.logutils import log_function
|
from synapse.util.logutils import log_function
|
||||||
|
from synapse.api.constants import EventTypes
|
||||||
|
|
||||||
from .directory import DirectoryStore
|
from .directory import DirectoryStore
|
||||||
from .feedback import FeedbackStore
|
from .feedback import FeedbackStore
|
||||||
|
@ -136,15 +132,15 @@ class DataStore(RoomMemberStore, RoomStore,
|
||||||
def _persist_event_txn(self, txn, event, context, backfilled,
|
def _persist_event_txn(self, txn, event, context, backfilled,
|
||||||
stream_ordering=None, is_new_state=True,
|
stream_ordering=None, is_new_state=True,
|
||||||
current_state=None):
|
current_state=None):
|
||||||
if event.type == RoomMemberEvent.TYPE:
|
if event.type == EventTypes.Member:
|
||||||
self._store_room_member_txn(txn, event)
|
self._store_room_member_txn(txn, event)
|
||||||
elif event.type == FeedbackEvent.TYPE:
|
elif event.type == EventTypes.Feedback:
|
||||||
self._store_feedback_txn(txn, event)
|
self._store_feedback_txn(txn, event)
|
||||||
elif event.type == RoomNameEvent.TYPE:
|
elif event.type == EventTypes.Name:
|
||||||
self._store_room_name_txn(txn, event)
|
self._store_room_name_txn(txn, event)
|
||||||
elif event.type == RoomTopicEvent.TYPE:
|
elif event.type == EventTypes.Topic:
|
||||||
self._store_room_topic_txn(txn, event)
|
self._store_room_topic_txn(txn, event)
|
||||||
elif event.type == RoomRedactionEvent.TYPE:
|
elif event.type == EventTypes.Redaction:
|
||||||
self._store_redaction(txn, event)
|
self._store_redaction(txn, event)
|
||||||
|
|
||||||
outlier = False
|
outlier = False
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2014 OpenMarket Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
|
@ -1,217 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2014 OpenMarket Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
from synapse.api.events import SynapseEvent
|
|
||||||
from synapse.api.events.validator import EventValidator
|
|
||||||
from synapse.api.errors import SynapseError
|
|
||||||
|
|
||||||
from tests import unittest
|
|
||||||
|
|
||||||
|
|
||||||
class SynapseTemplateCheckTestCase(unittest.TestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
self.validator = EventValidator(None)
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def test_top_level_keys(self):
|
|
||||||
template = {
|
|
||||||
"person": {},
|
|
||||||
"friends": ["string"]
|
|
||||||
}
|
|
||||||
|
|
||||||
content = {
|
|
||||||
"person": {"name": "bob"},
|
|
||||||
"friends": ["jill", "mike"]
|
|
||||||
}
|
|
||||||
|
|
||||||
event = MockSynapseEvent(template)
|
|
||||||
event.content = content
|
|
||||||
self.assertTrue(self.validator.validate(event))
|
|
||||||
|
|
||||||
content = {
|
|
||||||
"person": {"name": "bob"},
|
|
||||||
"friends": ["jill"],
|
|
||||||
"enemies": ["mike"]
|
|
||||||
}
|
|
||||||
event.content = content
|
|
||||||
self.assertTrue(self.validator.validate(event))
|
|
||||||
|
|
||||||
content = {
|
|
||||||
"person": {"name": "bob"},
|
|
||||||
# missing friends
|
|
||||||
"enemies": ["mike", "jill"]
|
|
||||||
}
|
|
||||||
event.content = content
|
|
||||||
self.assertRaises(
|
|
||||||
SynapseError,
|
|
||||||
self.validator.validate,
|
|
||||||
event
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_lists(self):
|
|
||||||
template = {
|
|
||||||
"person": {},
|
|
||||||
"friends": [{"name":"string"}]
|
|
||||||
}
|
|
||||||
|
|
||||||
content = {
|
|
||||||
"person": {"name": "bob"},
|
|
||||||
"friends": ["jill", "mike"] # should be in objects
|
|
||||||
}
|
|
||||||
|
|
||||||
event = MockSynapseEvent(template)
|
|
||||||
event.content = content
|
|
||||||
self.assertRaises(
|
|
||||||
SynapseError,
|
|
||||||
self.validator.validate,
|
|
||||||
event
|
|
||||||
)
|
|
||||||
|
|
||||||
content = {
|
|
||||||
"person": {"name": "bob"},
|
|
||||||
"friends": [{"name": "jill"}, {"name": "mike"}]
|
|
||||||
}
|
|
||||||
event.content = content
|
|
||||||
self.assertTrue(self.validator.validate(event))
|
|
||||||
|
|
||||||
def test_nested_lists(self):
|
|
||||||
template = {
|
|
||||||
"results": {
|
|
||||||
"families": [
|
|
||||||
{
|
|
||||||
"name": "string",
|
|
||||||
"members": [
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
content = {
|
|
||||||
"results": {
|
|
||||||
"families": [
|
|
||||||
{
|
|
||||||
"name": "Smith",
|
|
||||||
"members": [
|
|
||||||
"Alice", "Bob" # wrong types
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
event = MockSynapseEvent(template)
|
|
||||||
event.content = content
|
|
||||||
self.assertRaises(
|
|
||||||
SynapseError,
|
|
||||||
self.validator.validate,
|
|
||||||
event
|
|
||||||
)
|
|
||||||
|
|
||||||
content = {
|
|
||||||
"results": {
|
|
||||||
"families": [
|
|
||||||
{
|
|
||||||
"name": "Smith",
|
|
||||||
"members": [
|
|
||||||
{"name": "Alice"}, {"name": "Bob"}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
event.content = content
|
|
||||||
self.assertTrue(self.validator.validate(event))
|
|
||||||
|
|
||||||
def test_nested_keys(self):
|
|
||||||
template = {
|
|
||||||
"person": {
|
|
||||||
"attributes": {
|
|
||||||
"hair": "string",
|
|
||||||
"eye": "string"
|
|
||||||
},
|
|
||||||
"age": 0,
|
|
||||||
"fav_books": ["string"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
event = MockSynapseEvent(template)
|
|
||||||
|
|
||||||
content = {
|
|
||||||
"person": {
|
|
||||||
"attributes": {
|
|
||||||
"hair": "brown",
|
|
||||||
"eye": "green",
|
|
||||||
"skin": "purple"
|
|
||||||
},
|
|
||||||
"age": 33,
|
|
||||||
"fav_books": ["lotr", "hobbit"],
|
|
||||||
"fav_music": ["abba", "beatles"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
event.content = content
|
|
||||||
self.assertTrue(self.validator.validate(event))
|
|
||||||
|
|
||||||
content = {
|
|
||||||
"person": {
|
|
||||||
"attributes": {
|
|
||||||
"hair": "brown"
|
|
||||||
# missing eye
|
|
||||||
},
|
|
||||||
"age": 33,
|
|
||||||
"fav_books": ["lotr", "hobbit"],
|
|
||||||
"fav_music": ["abba", "beatles"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
event.content = content
|
|
||||||
self.assertRaises(
|
|
||||||
SynapseError,
|
|
||||||
self.validator.validate,
|
|
||||||
event
|
|
||||||
)
|
|
||||||
|
|
||||||
content = {
|
|
||||||
"person": {
|
|
||||||
"attributes": {
|
|
||||||
"hair": "brown",
|
|
||||||
"eye": "green",
|
|
||||||
"skin": "purple"
|
|
||||||
},
|
|
||||||
"age": 33,
|
|
||||||
"fav_books": "nothing", # should be a list
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
event.content = content
|
|
||||||
self.assertRaises(
|
|
||||||
SynapseError,
|
|
||||||
self.validator.validate,
|
|
||||||
event
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class MockSynapseEvent(SynapseEvent):
|
|
||||||
|
|
||||||
def __init__(self, template):
|
|
||||||
self.template = template
|
|
||||||
|
|
||||||
def get_content_template(self):
|
|
||||||
return self.template
|
|
||||||
|
|
|
@ -16,10 +16,7 @@
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
from tests import unittest
|
from tests import unittest
|
||||||
|
|
||||||
from synapse.api.events.room import (
|
from synapse.api.constants import EventTypes
|
||||||
MessageEvent,
|
|
||||||
)
|
|
||||||
|
|
||||||
from synapse.events import FrozenEvent
|
from synapse.events import FrozenEvent
|
||||||
from synapse.handlers.federation import FederationHandler
|
from synapse.handlers.federation import FederationHandler
|
||||||
from synapse.server import HomeServer
|
from synapse.server import HomeServer
|
||||||
|
@ -79,7 +76,7 @@ class FederationTestCase(unittest.TestCase):
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def test_msg(self):
|
def test_msg(self):
|
||||||
pdu = FrozenEvent({
|
pdu = FrozenEvent({
|
||||||
"type": MessageEvent.TYPE,
|
"type": EventTypes.Message,
|
||||||
"room_id": "foo",
|
"room_id": "foo",
|
||||||
"content": {"msgtype": u"fooo"},
|
"content": {"msgtype": u"fooo"},
|
||||||
"origin_server_ts": 0,
|
"origin_server_ts": 0,
|
||||||
|
|
|
@ -17,9 +17,6 @@
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
from tests import unittest
|
from tests import unittest
|
||||||
|
|
||||||
from synapse.api.events.room import (
|
|
||||||
RoomMemberEvent,
|
|
||||||
)
|
|
||||||
from synapse.api.constants import EventTypes, Membership
|
from synapse.api.constants import EventTypes, Membership
|
||||||
from synapse.handlers.room import RoomMemberHandler, RoomCreationHandler
|
from synapse.handlers.room import RoomMemberHandler, RoomCreationHandler
|
||||||
from synapse.handlers.profile import ProfileHandler
|
from synapse.handlers.profile import ProfileHandler
|
||||||
|
@ -102,7 +99,7 @@ class RoomMemberHandlerTestCase(unittest.TestCase):
|
||||||
content = {"membership": Membership.INVITE}
|
content = {"membership": Membership.INVITE}
|
||||||
|
|
||||||
builder = self.hs.get_event_builder_factory().new({
|
builder = self.hs.get_event_builder_factory().new({
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"sender": user_id,
|
"sender": user_id,
|
||||||
"state_key": target_user_id,
|
"state_key": target_user_id,
|
||||||
"room_id": room_id,
|
"room_id": room_id,
|
||||||
|
@ -115,11 +112,11 @@ class RoomMemberHandlerTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def annotate(_, ctx):
|
def annotate(_, ctx):
|
||||||
ctx.current_state = {
|
ctx.current_state = {
|
||||||
(RoomMemberEvent.TYPE, "@alice:green"): self._create_member(
|
(EventTypes.Member, "@alice:green"): self._create_member(
|
||||||
user_id="@alice:green",
|
user_id="@alice:green",
|
||||||
room_id=room_id,
|
room_id=room_id,
|
||||||
),
|
),
|
||||||
(RoomMemberEvent.TYPE, "@bob:red"): self._create_member(
|
(EventTypes.Member, "@bob:red"): self._create_member(
|
||||||
user_id="@bob:red",
|
user_id="@bob:red",
|
||||||
room_id=room_id,
|
room_id=room_id,
|
||||||
),
|
),
|
||||||
|
@ -131,7 +128,7 @@ class RoomMemberHandlerTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def add_auth(_, ctx):
|
def add_auth(_, ctx):
|
||||||
ctx.auth_events = ctx.current_state[
|
ctx.auth_events = ctx.current_state[
|
||||||
(RoomMemberEvent.TYPE, "@bob:red")
|
(EventTypes.Member, "@bob:red")
|
||||||
]
|
]
|
||||||
|
|
||||||
return defer.succeed(True)
|
return defer.succeed(True)
|
||||||
|
@ -181,7 +178,7 @@ class RoomMemberHandlerTestCase(unittest.TestCase):
|
||||||
self.distributor.observe("user_joined_room", join_signal_observer)
|
self.distributor.observe("user_joined_room", join_signal_observer)
|
||||||
|
|
||||||
builder = self.hs.get_event_builder_factory().new({
|
builder = self.hs.get_event_builder_factory().new({
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"sender": user_id,
|
"sender": user_id,
|
||||||
"state_key": user_id,
|
"state_key": user_id,
|
||||||
"room_id": room_id,
|
"room_id": room_id,
|
||||||
|
@ -194,7 +191,7 @@ class RoomMemberHandlerTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def annotate(_, ctx):
|
def annotate(_, ctx):
|
||||||
ctx.current_state = {
|
ctx.current_state = {
|
||||||
(RoomMemberEvent.TYPE, "@bob:red"): self._create_member(
|
(EventTypes.Member, "@bob:red"): self._create_member(
|
||||||
user_id="@bob:red",
|
user_id="@bob:red",
|
||||||
room_id=room_id,
|
room_id=room_id,
|
||||||
membership=Membership.INVITE
|
membership=Membership.INVITE
|
||||||
|
@ -207,7 +204,7 @@ class RoomMemberHandlerTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def add_auth(_, ctx):
|
def add_auth(_, ctx):
|
||||||
ctx.auth_events = ctx.current_state[
|
ctx.auth_events = ctx.current_state[
|
||||||
(RoomMemberEvent.TYPE, "@bob:red")
|
(EventTypes.Member, "@bob:red")
|
||||||
]
|
]
|
||||||
|
|
||||||
return defer.succeed(True)
|
return defer.succeed(True)
|
||||||
|
@ -238,7 +235,7 @@ class RoomMemberHandlerTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def _create_member(self, user_id, room_id, membership=Membership.JOIN):
|
def _create_member(self, user_id, room_id, membership=Membership.JOIN):
|
||||||
builder = self.hs.get_event_builder_factory().new({
|
builder = self.hs.get_event_builder_factory().new({
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"sender": user_id,
|
"sender": user_id,
|
||||||
"state_key": user_id,
|
"state_key": user_id,
|
||||||
"room_id": room_id,
|
"room_id": room_id,
|
||||||
|
@ -254,7 +251,7 @@ class RoomMemberHandlerTestCase(unittest.TestCase):
|
||||||
user = self.hs.parse_userid(user_id)
|
user = self.hs.parse_userid(user_id)
|
||||||
|
|
||||||
builder = self.hs.get_event_builder_factory().new({
|
builder = self.hs.get_event_builder_factory().new({
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"sender": user_id,
|
"sender": user_id,
|
||||||
"state_key": user_id,
|
"state_key": user_id,
|
||||||
"room_id": room_id,
|
"room_id": room_id,
|
||||||
|
@ -267,7 +264,7 @@ class RoomMemberHandlerTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def annotate(_, ctx):
|
def annotate(_, ctx):
|
||||||
ctx.current_state = {
|
ctx.current_state = {
|
||||||
(RoomMemberEvent.TYPE, "@bob:red"): self._create_member(
|
(EventTypes.Member, "@bob:red"): self._create_member(
|
||||||
user_id="@bob:red",
|
user_id="@bob:red",
|
||||||
room_id=room_id,
|
room_id=room_id,
|
||||||
membership=Membership.JOIN
|
membership=Membership.JOIN
|
||||||
|
@ -280,7 +277,7 @@ class RoomMemberHandlerTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def add_auth(_, ctx):
|
def add_auth(_, ctx):
|
||||||
ctx.auth_events = ctx.current_state[
|
ctx.auth_events = ctx.current_state[
|
||||||
(RoomMemberEvent.TYPE, "@bob:red")
|
(EventTypes.Member, "@bob:red")
|
||||||
]
|
]
|
||||||
|
|
||||||
return defer.succeed(True)
|
return defer.succeed(True)
|
||||||
|
|
|
@ -18,10 +18,7 @@ from tests import unittest
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
from synapse.server import HomeServer
|
from synapse.server import HomeServer
|
||||||
from synapse.api.constants import Membership
|
from synapse.api.constants import EventTypes, Membership
|
||||||
from synapse.api.events.room import (
|
|
||||||
RoomMemberEvent, MessageEvent, RoomRedactionEvent,
|
|
||||||
)
|
|
||||||
|
|
||||||
from tests.utils import SQLiteMemoryDbPool, MockKey
|
from tests.utils import SQLiteMemoryDbPool, MockKey
|
||||||
|
|
||||||
|
@ -64,7 +61,7 @@ class RedactionTestCase(unittest.TestCase):
|
||||||
content = {"membership": membership}
|
content = {"membership": membership}
|
||||||
content.update(extra_content)
|
content.update(extra_content)
|
||||||
builder = self.event_builder_factory.new({
|
builder = self.event_builder_factory.new({
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"sender": user.to_string(),
|
"sender": user.to_string(),
|
||||||
"state_key": user.to_string(),
|
"state_key": user.to_string(),
|
||||||
"room_id": room.to_string(),
|
"room_id": room.to_string(),
|
||||||
|
@ -84,7 +81,7 @@ class RedactionTestCase(unittest.TestCase):
|
||||||
self.depth += 1
|
self.depth += 1
|
||||||
|
|
||||||
builder = self.event_builder_factory.new({
|
builder = self.event_builder_factory.new({
|
||||||
"type": MessageEvent.TYPE,
|
"type": EventTypes.Message,
|
||||||
"sender": user.to_string(),
|
"sender": user.to_string(),
|
||||||
"state_key": user.to_string(),
|
"state_key": user.to_string(),
|
||||||
"room_id": room.to_string(),
|
"room_id": room.to_string(),
|
||||||
|
@ -102,7 +99,7 @@ class RedactionTestCase(unittest.TestCase):
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def inject_redaction(self, room, event_id, user, reason):
|
def inject_redaction(self, room, event_id, user, reason):
|
||||||
builder = self.event_builder_factory.new({
|
builder = self.event_builder_factory.new({
|
||||||
"type": RoomRedactionEvent.TYPE,
|
"type": EventTypes.Redaction,
|
||||||
"sender": user.to_string(),
|
"sender": user.to_string(),
|
||||||
"state_key": user.to_string(),
|
"state_key": user.to_string(),
|
||||||
"room_id": room.to_string(),
|
"room_id": room.to_string(),
|
||||||
|
@ -142,7 +139,7 @@ class RedactionTestCase(unittest.TestCase):
|
||||||
|
|
||||||
self.assertObjectHasAttributes(
|
self.assertObjectHasAttributes(
|
||||||
{
|
{
|
||||||
"type": MessageEvent.TYPE,
|
"type": EventTypes.Message,
|
||||||
"user_id": self.u_alice.to_string(),
|
"user_id": self.u_alice.to_string(),
|
||||||
"content": {"body": "t", "msgtype": "message"},
|
"content": {"body": "t", "msgtype": "message"},
|
||||||
},
|
},
|
||||||
|
@ -176,7 +173,7 @@ class RedactionTestCase(unittest.TestCase):
|
||||||
|
|
||||||
self.assertObjectHasAttributes(
|
self.assertObjectHasAttributes(
|
||||||
{
|
{
|
||||||
"type": MessageEvent.TYPE,
|
"type": EventTypes.Message,
|
||||||
"user_id": self.u_alice.to_string(),
|
"user_id": self.u_alice.to_string(),
|
||||||
"content": {},
|
"content": {},
|
||||||
},
|
},
|
||||||
|
@ -185,7 +182,7 @@ class RedactionTestCase(unittest.TestCase):
|
||||||
|
|
||||||
self.assertObjectHasAttributes(
|
self.assertObjectHasAttributes(
|
||||||
{
|
{
|
||||||
"type": RoomRedactionEvent.TYPE,
|
"type": EventTypes.Redaction,
|
||||||
"user_id": self.u_alice.to_string(),
|
"user_id": self.u_alice.to_string(),
|
||||||
"content": {"reason": reason},
|
"content": {"reason": reason},
|
||||||
},
|
},
|
||||||
|
@ -221,7 +218,7 @@ class RedactionTestCase(unittest.TestCase):
|
||||||
|
|
||||||
self.assertObjectHasAttributes(
|
self.assertObjectHasAttributes(
|
||||||
{
|
{
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"user_id": self.u_bob.to_string(),
|
"user_id": self.u_bob.to_string(),
|
||||||
"content": {"membership": Membership.JOIN, "blue": "red"},
|
"content": {"membership": Membership.JOIN, "blue": "red"},
|
||||||
},
|
},
|
||||||
|
@ -253,7 +250,7 @@ class RedactionTestCase(unittest.TestCase):
|
||||||
|
|
||||||
self.assertObjectHasAttributes(
|
self.assertObjectHasAttributes(
|
||||||
{
|
{
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"user_id": self.u_bob.to_string(),
|
"user_id": self.u_bob.to_string(),
|
||||||
"content": {"membership": Membership.JOIN},
|
"content": {"membership": Membership.JOIN},
|
||||||
},
|
},
|
||||||
|
@ -262,7 +259,7 @@ class RedactionTestCase(unittest.TestCase):
|
||||||
|
|
||||||
self.assertObjectHasAttributes(
|
self.assertObjectHasAttributes(
|
||||||
{
|
{
|
||||||
"type": RoomRedactionEvent.TYPE,
|
"type": EventTypes.Redaction,
|
||||||
"user_id": self.u_alice.to_string(),
|
"user_id": self.u_alice.to_string(),
|
||||||
"content": {"reason": reason},
|
"content": {"reason": reason},
|
||||||
},
|
},
|
||||||
|
|
|
@ -18,9 +18,7 @@ from tests import unittest
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
from synapse.server import HomeServer
|
from synapse.server import HomeServer
|
||||||
from synapse.api.events.room import (
|
from synapse.api.constants import EventTypes
|
||||||
RoomNameEvent, RoomTopicEvent
|
|
||||||
)
|
|
||||||
|
|
||||||
from tests.utils import SQLiteMemoryDbPool
|
from tests.utils import SQLiteMemoryDbPool
|
||||||
|
|
||||||
|
@ -131,7 +129,7 @@ class RoomEventsStoreTestCase(unittest.TestCase):
|
||||||
name = u"A-Room-Name"
|
name = u"A-Room-Name"
|
||||||
|
|
||||||
yield self.inject_room_event(
|
yield self.inject_room_event(
|
||||||
etype=RoomNameEvent.TYPE,
|
etype=EventTypes.Name,
|
||||||
name=name,
|
name=name,
|
||||||
content={"name": name},
|
content={"name": name},
|
||||||
depth=1,
|
depth=1,
|
||||||
|
@ -154,7 +152,7 @@ class RoomEventsStoreTestCase(unittest.TestCase):
|
||||||
topic = u"A place for things"
|
topic = u"A place for things"
|
||||||
|
|
||||||
yield self.inject_room_event(
|
yield self.inject_room_event(
|
||||||
etype=RoomTopicEvent.TYPE,
|
etype=EventTypes.Topic,
|
||||||
topic=topic,
|
topic=topic,
|
||||||
content={"topic": topic},
|
content={"topic": topic},
|
||||||
depth=1,
|
depth=1,
|
||||||
|
|
|
@ -18,8 +18,7 @@ from tests import unittest
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
from synapse.server import HomeServer
|
from synapse.server import HomeServer
|
||||||
from synapse.api.constants import Membership
|
from synapse.api.constants import EventTypes, Membership
|
||||||
from synapse.api.events.room import RoomMemberEvent
|
|
||||||
|
|
||||||
from tests.utils import SQLiteMemoryDbPool, MockKey
|
from tests.utils import SQLiteMemoryDbPool, MockKey
|
||||||
|
|
||||||
|
@ -61,7 +60,7 @@ class RoomMemberStoreTestCase(unittest.TestCase):
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def inject_room_member(self, room, user, membership, replaces_state=None):
|
def inject_room_member(self, room, user, membership, replaces_state=None):
|
||||||
builder = self.event_builder_factory.new({
|
builder = self.event_builder_factory.new({
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"sender": user.to_string(),
|
"sender": user.to_string(),
|
||||||
"state_key": user.to_string(),
|
"state_key": user.to_string(),
|
||||||
"room_id": room.to_string(),
|
"room_id": room.to_string(),
|
||||||
|
|
|
@ -18,8 +18,7 @@ from tests import unittest
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
from synapse.server import HomeServer
|
from synapse.server import HomeServer
|
||||||
from synapse.api.constants import Membership
|
from synapse.api.constants import EventTypes, Membership
|
||||||
from synapse.api.events.room import RoomMemberEvent, MessageEvent
|
|
||||||
|
|
||||||
from tests.utils import SQLiteMemoryDbPool, MockKey
|
from tests.utils import SQLiteMemoryDbPool, MockKey
|
||||||
|
|
||||||
|
@ -62,7 +61,7 @@ class StreamStoreTestCase(unittest.TestCase):
|
||||||
self.depth += 1
|
self.depth += 1
|
||||||
|
|
||||||
builder = self.event_builder_factory.new({
|
builder = self.event_builder_factory.new({
|
||||||
"type": RoomMemberEvent.TYPE,
|
"type": EventTypes.Member,
|
||||||
"sender": user.to_string(),
|
"sender": user.to_string(),
|
||||||
"state_key": user.to_string(),
|
"state_key": user.to_string(),
|
||||||
"room_id": room.to_string(),
|
"room_id": room.to_string(),
|
||||||
|
@ -82,7 +81,7 @@ class StreamStoreTestCase(unittest.TestCase):
|
||||||
self.depth += 1
|
self.depth += 1
|
||||||
|
|
||||||
builder = self.event_builder_factory.new({
|
builder = self.event_builder_factory.new({
|
||||||
"type": MessageEvent.TYPE,
|
"type": EventTypes.Message,
|
||||||
"sender": user.to_string(),
|
"sender": user.to_string(),
|
||||||
"state_key": user.to_string(),
|
"state_key": user.to_string(),
|
||||||
"room_id": room.to_string(),
|
"room_id": room.to_string(),
|
||||||
|
@ -125,7 +124,7 @@ class StreamStoreTestCase(unittest.TestCase):
|
||||||
|
|
||||||
self.assertObjectHasAttributes(
|
self.assertObjectHasAttributes(
|
||||||
{
|
{
|
||||||
"type": MessageEvent.TYPE,
|
"type": EventTypes.Message,
|
||||||
"user_id": self.u_alice.to_string(),
|
"user_id": self.u_alice.to_string(),
|
||||||
"content": {"body": "test", "msgtype": "message"},
|
"content": {"body": "test", "msgtype": "message"},
|
||||||
},
|
},
|
||||||
|
@ -162,7 +161,7 @@ class StreamStoreTestCase(unittest.TestCase):
|
||||||
|
|
||||||
self.assertObjectHasAttributes(
|
self.assertObjectHasAttributes(
|
||||||
{
|
{
|
||||||
"type": MessageEvent.TYPE,
|
"type": EventTypes.Message,
|
||||||
"user_id": self.u_alice.to_string(),
|
"user_id": self.u_alice.to_string(),
|
||||||
"content": {"body": "test", "msgtype": "message"},
|
"content": {"body": "test", "msgtype": "message"},
|
||||||
},
|
},
|
||||||
|
|
|
@ -15,15 +15,11 @@
|
||||||
|
|
||||||
from synapse.http.server import HttpServer
|
from synapse.http.server import HttpServer
|
||||||
from synapse.api.errors import cs_error, CodeMessageException, StoreError
|
from synapse.api.errors import cs_error, CodeMessageException, StoreError
|
||||||
from synapse.api.constants import Membership
|
from synapse.api.constants import EventTypes
|
||||||
from synapse.storage import prepare_database
|
from synapse.storage import prepare_database
|
||||||
|
|
||||||
from synapse.util.logcontext import LoggingContext
|
from synapse.util.logcontext import LoggingContext
|
||||||
|
|
||||||
from synapse.api.events.room import (
|
|
||||||
RoomMemberEvent, MessageEvent
|
|
||||||
)
|
|
||||||
|
|
||||||
from twisted.internet import defer, reactor
|
from twisted.internet import defer, reactor
|
||||||
from twisted.enterprise.adbapi import ConnectionPool
|
from twisted.enterprise.adbapi import ConnectionPool
|
||||||
|
|
||||||
|
@ -276,7 +272,7 @@ class MemoryDataStore(object):
|
||||||
return defer.succeed([])
|
return defer.succeed([])
|
||||||
|
|
||||||
def persist_event(self, event):
|
def persist_event(self, event):
|
||||||
if event.type == RoomMemberEvent.TYPE:
|
if event.type == EventTypes.Member:
|
||||||
room_id = event.room_id
|
room_id = event.room_id
|
||||||
user = event.state_key
|
user = event.state_key
|
||||||
membership = event.membership
|
membership = event.membership
|
||||||
|
|
Loading…
Reference in a new issue