summary refs log tree commit diff
path: root/synapse
diff options
context:
space:
mode:
Diffstat (limited to 'synapse')
-rw-r--r--synapse/handlers/register.py14
-rw-r--r--synapse/replication/http/register.py2
-rw-r--r--synapse/rest/client/v2_alpha/register.py5
3 files changed, 18 insertions, 3 deletions
diff --git a/synapse/handlers/register.py b/synapse/handlers/register.py
index 4631fab94e..5c92960d25 100644
--- a/synapse/handlers/register.py
+++ b/synapse/handlers/register.py
@@ -150,6 +150,7 @@ class RegistrationHandler(BaseHandler):
         threepid=None,
         user_type=None,
         default_display_name=None,
+        require_consent=True,
         address=None,
         bind_emails=[],
     ):
@@ -167,6 +168,7 @@ class RegistrationHandler(BaseHandler):
               will be set to this. Defaults to 'localpart'.
             address (str|None): the IP address used to perform the registration.
             bind_emails (List[str]): list of emails to bind to this account.
+            require_consent (bool): Should the user be required to give consent.
         Returns:
             Deferred[str]: user_id
         Raises:
@@ -211,6 +213,7 @@ class RegistrationHandler(BaseHandler):
                 admin=admin,
                 user_type=user_type,
                 address=address,
+                require_consent=require_consent,
             )
 
             if self.hs.config.user_directory_search_all_users:
@@ -244,7 +247,7 @@ class RegistrationHandler(BaseHandler):
                     user_id = None
                     attempts += 1
 
-        if not self.hs.config.user_consent_at_registration:
+        if not self.hs.config.user_consent_at_registration and require_consent:
             yield self._auto_join_rooms(user_id)
         else:
             logger.info(
@@ -525,6 +528,7 @@ class RegistrationHandler(BaseHandler):
             ratelimit=False,
         )
 
+    @defer.inlineCallbacks
     def register_with_store(
         self,
         user_id,
@@ -536,6 +540,7 @@ class RegistrationHandler(BaseHandler):
         admin=False,
         user_type=None,
         address=None,
+        require_consent=True,
     ):
         """Register user in the datastore.
 
@@ -553,7 +558,7 @@ class RegistrationHandler(BaseHandler):
             user_type (str|None): type of user. One of the values from
                 api.constants.UserTypes, or None for a normal user.
             address (str|None): the IP address used to perform the registration.
-
+            require_consent (bool): Should the user be required to give consent.
         Returns:
             Deferred
         """
@@ -584,8 +589,12 @@ class RegistrationHandler(BaseHandler):
                 admin=admin,
                 user_type=user_type,
                 address=address,
+                require_consent=require_consent,
             )
         else:
+            if require_consent is False:
+                yield self.store.user_set_consent_version(user_id, "no-consent-required")
+
             return self.store.register_user(
                 user_id=user_id,
                 password_hash=password_hash,
@@ -597,6 +606,7 @@ class RegistrationHandler(BaseHandler):
                 user_type=user_type,
             )
 
+
     @defer.inlineCallbacks
     def register_device(self, user_id, device_id, initial_display_name, is_guest=False):
         """Register a device for a user and generate an access token.
diff --git a/synapse/replication/http/register.py b/synapse/replication/http/register.py
index 3341320a87..65702de082 100644
--- a/synapse/replication/http/register.py
+++ b/synapse/replication/http/register.py
@@ -72,6 +72,7 @@ class ReplicationRegisterServlet(ReplicationEndpoint):
             "admin": admin,
             "user_type": user_type,
             "address": address,
+            "require_consent": require_consent,
         }
 
     @defer.inlineCallbacks
@@ -88,6 +89,7 @@ class ReplicationRegisterServlet(ReplicationEndpoint):
             admin=content["admin"],
             user_type=content["user_type"],
             address=content["address"],
+            require_consent=content["require_consent"],
         )
 
         return (200, {})
diff --git a/synapse/rest/client/v2_alpha/register.py b/synapse/rest/client/v2_alpha/register.py
index 05ea1459e3..724231f364 100644
--- a/synapse/rest/client/v2_alpha/register.py
+++ b/synapse/rest/client/v2_alpha/register.py
@@ -525,6 +525,9 @@ class RegisterRestServlet(RestServlet):
         # downcased one in `username` for the mac calculation
         user = body["username"].encode("utf-8")
 
+        # do not require consent for this user (for example, bots)
+        require_consent = body.get("require_consent", True)
+
         # str() because otherwise hmac complains that 'unicode' does not
         # have the buffer interface
         got_mac = str(body["mac"])
@@ -542,7 +545,7 @@ class RegisterRestServlet(RestServlet):
             raise SynapseError(403, "HMAC incorrect")
 
         user_id = yield self.registration_handler.register_user(
-            localpart=username, password=password
+            localpart=username, password=password, require_consent=require_consent,
         )
 
         result = yield self._create_registration_details(user_id, body)