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: 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) ) ) -