Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit da3dd48

Browse files
committed
Merge branch 'develop' into release-v0.11.0
2 parents 63b28c7 + e4d622a commit da3dd48

File tree

18 files changed

+474
-142
lines changed

18 files changed

+474
-142
lines changed

synapse/config/_base.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
# limitations under the License.
1515

1616
import argparse
17+
import errno
1718
import os
1819
import yaml
1920
import sys
@@ -91,8 +92,11 @@ def check_file(cls, file_path, config_name):
9192
@classmethod
9293
def ensure_directory(cls, dir_path):
9394
dir_path = cls.abspath(dir_path)
94-
if not os.path.exists(dir_path):
95+
try:
9596
os.makedirs(dir_path)
97+
except OSError, e:
98+
if e.errno != errno.EEXIST:
99+
raise
96100
if not os.path.isdir(dir_path):
97101
raise ConfigError(
98102
"%s is not a directory" % (dir_path,)

synapse/federation/federation_client.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,8 @@ def get_event_auth(self, destination, room_id, event_id):
357357
defer.returnValue(signed_auth)
358358

359359
@defer.inlineCallbacks
360-
def make_membership_event(self, destinations, room_id, user_id, membership):
360+
def make_membership_event(self, destinations, room_id, user_id, membership,
361+
content={},):
361362
"""
362363
Creates an m.room.member event, with context, without participating in the room.
363364
@@ -398,6 +399,8 @@ def make_membership_event(self, destinations, room_id, user_id, membership):
398399

399400
logger.debug("Got response to make_%s: %s", membership, pdu_dict)
400401

402+
pdu_dict["content"].update(content)
403+
401404
defer.returnValue(
402405
(destination, self.event_from_pdu_json(pdu_dict))
403406
)

synapse/handlers/_base.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@
2929

3030

3131
class BaseHandler(object):
32+
"""
33+
Common base class for the event handlers.
34+
35+
:type store: synapse.storage.events.StateStore
36+
:type state_handler: synapse.state.StateHandler
37+
"""
3238

3339
def __init__(self, hs):
3440
self.store = hs.get_datastore()

synapse/handlers/federation.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,7 @@ def on_event_auth(self, event_id):
564564

565565
@log_function
566566
@defer.inlineCallbacks
567-
def do_invite_join(self, target_hosts, room_id, joinee):
567+
def do_invite_join(self, target_hosts, room_id, joinee, content):
568568
""" Attempts to join the `joinee` to the room `room_id` via the
569569
server `target_host`.
570570
@@ -584,7 +584,8 @@ def do_invite_join(self, target_hosts, room_id, joinee):
584584
target_hosts,
585585
room_id,
586586
joinee,
587-
"join"
587+
"join",
588+
content,
588589
)
589590

590591
self.room_queues[room_id] = []
@@ -840,12 +841,14 @@ def do_remotely_reject_invite(self, target_hosts, room_id, user_id):
840841
defer.returnValue(None)
841842

842843
@defer.inlineCallbacks
843-
def _make_and_verify_event(self, target_hosts, room_id, user_id, membership):
844+
def _make_and_verify_event(self, target_hosts, room_id, user_id, membership,
845+
content={},):
844846
origin, pdu = yield self.replication_layer.make_membership_event(
845847
target_hosts,
846848
room_id,
847849
user_id,
848-
membership
850+
membership,
851+
content,
849852
)
850853

851854
logger.debug("Got response to make_%s: %s", membership, pdu)

synapse/handlers/message.py

Lines changed: 51 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -258,20 +258,30 @@ def get_room_data(self, user_id=None, room_id=None,
258258

259259
@defer.inlineCallbacks
260260
def _check_in_room_or_world_readable(self, room_id, user_id, is_guest):
261-
if is_guest:
261+
try:
262+
# check_user_was_in_room will return the most recent membership
263+
# event for the user if:
264+
# * The user is a non-guest user, and was ever in the room
265+
# * The user is a guest user, and has joined the room
266+
# else it will throw.
267+
member_event = yield self.auth.check_user_was_in_room(room_id, user_id)
268+
defer.returnValue((member_event.membership, member_event.event_id))
269+
return
270+
except AuthError, auth_error:
262271
visibility = yield self.state_handler.get_current_state(
263272
room_id, EventTypes.RoomHistoryVisibility, ""
264273
)
265-
if visibility.content["history_visibility"] == "world_readable":
274+
if (
275+
visibility and
276+
visibility.content["history_visibility"] == "world_readable"
277+
):
266278
defer.returnValue((Membership.JOIN, None))
267279
return
268-
else:
269-
raise AuthError(
270-
403, "Guest access not allowed", errcode=Codes.GUEST_ACCESS_FORBIDDEN
271-
)
272-
else:
273-
member_event = yield self.auth.check_user_was_in_room(room_id, user_id)
274-
defer.returnValue((member_event.membership, member_event.event_id))
280+
if not is_guest:
281+
raise auth_error
282+
raise AuthError(
283+
403, "Guest access not allowed", errcode=Codes.GUEST_ACCESS_FORBIDDEN
284+
)
275285

276286
@defer.inlineCallbacks
277287
def get_state_events(self, user_id, room_id, is_guest=False):
@@ -456,7 +466,7 @@ def handle_room(event):
456466
defer.returnValue(ret)
457467

458468
@defer.inlineCallbacks
459-
def room_initial_sync(self, user_id, room_id, pagin_config=None):
469+
def room_initial_sync(self, user_id, room_id, pagin_config=None, is_guest=False):
460470
"""Capture the a snapshot of a room. If user is currently a member of
461471
the room this will be what is currently in the room. If the user left
462472
the room this will be what was in the room when they left.
@@ -473,15 +483,19 @@ def room_initial_sync(self, user_id, room_id, pagin_config=None):
473483
A JSON serialisable dict with the snapshot of the room.
474484
"""
475485

476-
member_event = yield self.auth.check_user_was_in_room(room_id, user_id)
486+
membership, member_event_id = yield self._check_in_room_or_world_readable(
487+
room_id,
488+
user_id,
489+
is_guest
490+
)
477491

478-
if member_event.membership == Membership.JOIN:
492+
if membership == Membership.JOIN:
479493
result = yield self._room_initial_sync_joined(
480-
user_id, room_id, pagin_config, member_event
494+
user_id, room_id, pagin_config, membership, is_guest
481495
)
482-
elif member_event.membership == Membership.LEAVE:
496+
elif membership == Membership.LEAVE:
483497
result = yield self._room_initial_sync_parted(
484-
user_id, room_id, pagin_config, member_event
498+
user_id, room_id, pagin_config, membership, member_event_id, is_guest
485499
)
486500

487501
private_user_data = []
@@ -497,19 +511,19 @@ def room_initial_sync(self, user_id, room_id, pagin_config=None):
497511

498512
@defer.inlineCallbacks
499513
def _room_initial_sync_parted(self, user_id, room_id, pagin_config,
500-
member_event):
514+
membership, member_event_id, is_guest):
501515
room_state = yield self.store.get_state_for_events(
502-
[member_event.event_id], None
516+
[member_event_id], None
503517
)
504518

505-
room_state = room_state[member_event.event_id]
519+
room_state = room_state[member_event_id]
506520

507521
limit = pagin_config.limit if pagin_config else None
508522
if limit is None:
509523
limit = 10
510524

511525
stream_token = yield self.store.get_stream_token_for_event(
512-
member_event.event_id
526+
member_event_id
513527
)
514528

515529
messages, token = yield self.store.get_recent_events_for_room(
@@ -519,7 +533,7 @@ def _room_initial_sync_parted(self, user_id, room_id, pagin_config,
519533
)
520534

521535
messages = yield self._filter_events_for_client(
522-
user_id, messages
536+
user_id, messages, is_guest=is_guest
523537
)
524538

525539
start_token = StreamToken(token[0], 0, 0, 0, 0)
@@ -528,7 +542,7 @@ def _room_initial_sync_parted(self, user_id, room_id, pagin_config,
528542
time_now = self.clock.time_msec()
529543

530544
defer.returnValue({
531-
"membership": member_event.membership,
545+
"membership": membership,
532546
"room_id": room_id,
533547
"messages": {
534548
"chunk": [serialize_event(m, time_now) for m in messages],
@@ -542,7 +556,7 @@ def _room_initial_sync_parted(self, user_id, room_id, pagin_config,
542556

543557
@defer.inlineCallbacks
544558
def _room_initial_sync_joined(self, user_id, room_id, pagin_config,
545-
member_event):
559+
membership, is_guest):
546560
current_state = yield self.state.get_current_state(
547561
room_id=room_id,
548562
)
@@ -574,12 +588,14 @@ def _room_initial_sync_joined(self, user_id, room_id, pagin_config,
574588

575589
@defer.inlineCallbacks
576590
def get_presence():
577-
states = yield presence_handler.get_states(
578-
target_users=[UserID.from_string(m.user_id) for m in room_members],
579-
auth_user=auth_user,
580-
as_event=True,
581-
check_auth=False,
582-
)
591+
states = {}
592+
if not is_guest:
593+
states = yield presence_handler.get_states(
594+
target_users=[UserID.from_string(m.user_id) for m in room_members],
595+
auth_user=auth_user,
596+
as_event=True,
597+
check_auth=False,
598+
)
583599

584600
defer.returnValue(states.values())
585601

@@ -599,16 +615,15 @@ def get_presence():
599615
).addErrback(unwrapFirstError)
600616

601617
messages = yield self._filter_events_for_client(
602-
user_id, messages
618+
user_id, messages, is_guest=is_guest, require_all_visible_for_guests=False
603619
)
604620

605621
start_token = now_token.copy_and_replace("room_key", token[0])
606622
end_token = now_token.copy_and_replace("room_key", token[1])
607623

608624
time_now = self.clock.time_msec()
609625

610-
defer.returnValue({
611-
"membership": member_event.membership,
626+
ret = {
612627
"room_id": room_id,
613628
"messages": {
614629
"chunk": [serialize_event(m, time_now) for m in messages],
@@ -618,4 +633,8 @@ def get_presence():
618633
"state": state,
619634
"presence": presence,
620635
"receipts": receipts,
621-
})
636+
}
637+
if not is_guest:
638+
ret["membership"] = membership
639+
640+
defer.returnValue(ret)

synapse/handlers/room.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,8 @@ def _do_join(self, event, context, room_hosts=None, do_auth=True):
504504
yield handler.do_invite_join(
505505
room_hosts,
506506
room_id,
507-
event.user_id
507+
event.user_id,
508+
event.content,
508509
)
509510
else:
510511
logger.debug("Doing normal join")

0 commit comments

Comments
 (0)