Merge pull request #3271 from matrix-org/rav/consent_uri_in_messages
Support for putting %(consent_uri)s in messages
This commit is contained in:
commit
2f7008d4eb
3 changed files with 50 additions and 7 deletions
|
@ -43,10 +43,13 @@ DEFAULT_CONFIG = """\
|
||||||
# version: 1.0
|
# version: 1.0
|
||||||
# server_notice_content:
|
# server_notice_content:
|
||||||
# msgtype: m.text
|
# msgtype: m.text
|
||||||
# body: |
|
# body: >-
|
||||||
# Pls do consent kthx
|
# To continue using this homeserver you must review and agree to the
|
||||||
# block_events_error: |
|
# terms and conditions at %(consent_uri)s
|
||||||
# You can't send any messages until you consent to the privacy policy.
|
# block_events_error: >-
|
||||||
|
# To continue using this homeserver you must review and agree to the
|
||||||
|
# terms and conditions at %(consent_uri)s
|
||||||
|
#
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -575,8 +575,11 @@ class EventCreationHandler(object):
|
||||||
return
|
return
|
||||||
|
|
||||||
consent_uri = self._consent_uri_builder.build_user_consent_uri(user_id)
|
consent_uri = self._consent_uri_builder.build_user_consent_uri(user_id)
|
||||||
|
msg = self.config.block_events_without_consent_error % {
|
||||||
|
'consent_uri': consent_uri,
|
||||||
|
}
|
||||||
raise ConsentNotGivenError(
|
raise ConsentNotGivenError(
|
||||||
msg=self.config.block_events_without_consent_error,
|
msg=msg,
|
||||||
consent_uri=consent_uri,
|
consent_uri=consent_uri,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -14,10 +14,13 @@
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from six import (iteritems, string_types)
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
from synapse.api.errors import SynapseError
|
from synapse.api.errors import SynapseError
|
||||||
|
from synapse.api.urls import ConsentURIBuilder
|
||||||
from synapse.config import ConfigError
|
from synapse.config import ConfigError
|
||||||
|
from synapse.types import get_localpart_from_id
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -52,6 +55,8 @@ class ConsentServerNotices(object):
|
||||||
"key.",
|
"key.",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self._consent_uri_builder = ConsentURIBuilder(hs.config)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def maybe_send_server_notice_to_user(self, user_id):
|
def maybe_send_server_notice_to_user(self, user_id):
|
||||||
"""Check if we need to send a notice to this user, and does so if so
|
"""Check if we need to send a notice to this user, and does so if so
|
||||||
|
@ -81,10 +86,18 @@ class ConsentServerNotices(object):
|
||||||
# we've already sent a notice to the user
|
# we've already sent a notice to the user
|
||||||
return
|
return
|
||||||
|
|
||||||
# need to send a message
|
# need to send a message.
|
||||||
try:
|
try:
|
||||||
|
consent_uri = self._consent_uri_builder.build_user_consent_uri(
|
||||||
|
get_localpart_from_id(user_id),
|
||||||
|
)
|
||||||
|
content = copy_with_str_subst(
|
||||||
|
self._server_notice_content, {
|
||||||
|
'consent_uri': consent_uri,
|
||||||
|
},
|
||||||
|
)
|
||||||
yield self._server_notices_manager.send_notice(
|
yield self._server_notices_manager.send_notice(
|
||||||
user_id, self._server_notice_content,
|
user_id, content,
|
||||||
)
|
)
|
||||||
yield self._store.user_set_consent_server_notice_sent(
|
yield self._store.user_set_consent_server_notice_sent(
|
||||||
user_id, self._current_consent_version,
|
user_id, self._current_consent_version,
|
||||||
|
@ -93,3 +106,27 @@ class ConsentServerNotices(object):
|
||||||
logger.error("Error sending server notice about user consent: %s", e)
|
logger.error("Error sending server notice about user consent: %s", e)
|
||||||
finally:
|
finally:
|
||||||
self._users_in_progress.remove(user_id)
|
self._users_in_progress.remove(user_id)
|
||||||
|
|
||||||
|
|
||||||
|
def copy_with_str_subst(x, substitutions):
|
||||||
|
"""Deep-copy a structure, carrying out string substitions on any strings
|
||||||
|
|
||||||
|
Args:
|
||||||
|
x (object): structure to be copied
|
||||||
|
substitutions (object): substitutions to be made - passed into the
|
||||||
|
string '%' operator
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
copy of x
|
||||||
|
"""
|
||||||
|
if isinstance(x, string_types):
|
||||||
|
return x % substitutions
|
||||||
|
if isinstance(x, dict):
|
||||||
|
return {
|
||||||
|
k: copy_with_str_subst(v, substitutions) for (k, v) in iteritems(x)
|
||||||
|
}
|
||||||
|
if isinstance(x, (list, tuple)):
|
||||||
|
return [copy_with_str_subst(y) for y in x]
|
||||||
|
|
||||||
|
# assume it's uninterested and can be shallow-copied.
|
||||||
|
return x
|
||||||
|
|
Loading…
Reference in a new issue