From 25ebf58b7f98b6af14eadf30d6b2ee0b9449dd32 Mon Sep 17 00:00:00 2001 From: PeerD Date: Thu, 21 Feb 2019 16:58:09 +0100 Subject: [PATCH 1/2] replace 3pid option Adds the option to replace 3pid from the external datasource in synapse. In this case, all 3pids that are not listed in the external store are deleted from synapse on login. --- rest_auth_provider.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/rest_auth_provider.py b/rest_auth_provider.py index 1d582d9..e3587cf 100644 --- a/rest_auth_provider.py +++ b/rest_auth_provider.py @@ -90,9 +90,12 @@ class RestAuthProvider(object): if (self.config.updateThreepid): if "three_pids" in profile: logger.info("Handling 3PIDs") + + external_3pids = [] for threepid in profile["three_pids"]: medium = threepid["medium"].lower() address = threepid["address"].lower() + external_3pids.append({"medium": medium, "address": address}) logger.info("Looking for 3PID %s:%s in user profile", medium, address) validated_at = self.account_handler.hs.get_clock().time_msec() @@ -107,6 +110,20 @@ class RestAuthProvider(object): ) else: logger.info("3PID is present, skipping") + + if (self.config.replaceThreepid): + for threepid in (yield store.user_get_threepids(user_id)): + medium = threepid["medium"].lower() + address = threepid["address"].lower() + if {"medium": medium, "address": address} not in external_3pids: + logger.info("3PID is not present in external datastore, deleting") + yield store.user_delete_threepid( + user_id, + medium, + address + ) + + else: logger.info("3PIDs were not updated due to policy") else: @@ -125,6 +142,7 @@ class RestAuthProvider(object): setNameOnRegister = True setNameOnLogin = False updateThreepid = True + replaceThreepid = False rest_config = _RestConfig() rest_config.endpoint = config["endpoint"] @@ -165,6 +183,15 @@ class RestAuthProvider(object): # we don't care pass + try: + rest_config.replaceThreepid = config['policy']['all']['threepid']['replace'] + except TypeError: + # we don't care + pass + except KeyError: + # we don't care + pass + return rest_config def _require_keys(config, required): @@ -175,4 +202,3 @@ def _require_keys(config, required): ", ".join(missing) ) ) - From d21a5534d61f56890e57ad7a339357e6d7166b6c Mon Sep 17 00:00:00 2001 From: PeerD Date: Thu, 21 Feb 2019 17:02:07 +0100 Subject: [PATCH 2/2] Updated Readme.md for 3PID replacement option --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ed00c81..1efb4de 100644 --- a/README.md +++ b/README.md @@ -87,14 +87,16 @@ If you would like to change the behaviour, you can use the following configurati ``` 3PIDs received from the backend are merged with the ones already linked to the account. -If you would like to change this behaviour, you can use the following configuration item: +If you would like to change this behaviour, you can use the following configuration items: ```yaml config: policy: all: threepid: update: false + replace: false ``` +If update is set to `false`, the 3PIDs will not be changed at all. If replace is set to `true`, all 3PIDs not available in the backend anymore will be deleted from synapse. ## Integrate To use this module with your back-end, you will need to implement a single REST endpoint: