before fulfilling a group invite,check if user is already joined/invited (#3436)

Fixes vector-im/riot-web#5645
This commit is contained in:
Michael Telatynski 2019-10-10 13:03:44 +01:00 committed by Richard van der Hoff
parent 2efd050c9d
commit 9a84d74417
2 changed files with 17 additions and 4 deletions

1
changelog.d/3436.bugfix Normal file
View file

@ -0,0 +1 @@
Fix a problem where users could be invited twice to the same group.

View file

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright 2017 Vector Creations Ltd # Copyright 2017 Vector Creations Ltd
# Copyright 2018 New Vector Ltd # Copyright 2018 New Vector Ltd
# Copyright 2019 Michael Telatynski <7t3chguy@gmail.com>
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -20,16 +21,16 @@ from six import string_types
from twisted.internet import defer from twisted.internet import defer
from synapse.api.errors import SynapseError from synapse.api.errors import Codes, SynapseError
from synapse.types import GroupID, RoomID, UserID, get_domain_from_id from synapse.types import GroupID, RoomID, UserID, get_domain_from_id
from synapse.util.async_helpers import concurrently_execute from synapse.util.async_helpers import concurrently_execute
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# TODO: Allow users to "knock" or simpkly join depending on rules # TODO: Allow users to "knock" or simply join depending on rules
# TODO: Federation admin APIs # TODO: Federation admin APIs
# TODO: is_priveged flag to users and is_public to users and rooms # TODO: is_privileged flag to users and is_public to users and rooms
# TODO: Audit log for admins (profile updates, membership changes, users who tried # TODO: Audit log for admins (profile updates, membership changes, users who tried
# to join but were rejected, etc) # to join but were rejected, etc)
# TODO: Flairs # TODO: Flairs
@ -590,7 +591,18 @@ class GroupsServerHandler(object):
) )
# TODO: Check if user knocked # TODO: Check if user knocked
# TODO: Check if user is already invited
invited_users = yield self.store.get_invited_users_in_group(group_id)
if user_id in invited_users:
raise SynapseError(
400, "User already invited to group", errcode=Codes.BAD_STATE
)
user_results = yield self.store.get_users_in_group(
group_id, include_private=True
)
if user_id in [user_result["user_id"] for user_result in user_results]:
raise SynapseError(400, "User already in group")
content = { content = {
"profile": {"name": group["name"], "avatar_url": group["avatar_url"]}, "profile": {"name": group["name"], "avatar_url": group["avatar_url"]},