Merge pull request #8 from PeerD/patch-1
Add option to replace 3PIDs in synapse if removed/changed in the backend
This commit is contained in:
@@ -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:
|
||||
|
@@ -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)
|
||||
)
|
||||
)
|
||||
|
||||
|
Reference in New Issue
Block a user