diff options
author | Andrew Morgan <1342360+anoadragon453@users.noreply.github.com> | 2019-11-14 18:42:55 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-14 18:42:55 +0000 |
commit | c446f59047136ec3f5c4afda4acaa2871443dba0 (patch) | |
tree | 167b7643e20e8dcb5c61d0d4de5e67e26a6b4e67 /synapse | |
parent | Add a /user/:user_id/info servlet to give user deactivated/expired informatio... (diff) | |
download | synapse-c446f59047136ec3f5c4afda4acaa2871443dba0.tar.xz |
Hide expired users from user directory, optionally show on renewal (#13)
Diffstat (limited to 'synapse')
-rw-r--r-- | synapse/handlers/account_validity.py | 32 | ||||
-rw-r--r-- | synapse/storage/registration.py | 23 |
2 files changed, 55 insertions, 0 deletions
diff --git a/synapse/handlers/account_validity.py b/synapse/handlers/account_validity.py index 396f0059f7..947237d7da 100644 --- a/synapse/handlers/account_validity.py +++ b/synapse/handlers/account_validity.py @@ -42,6 +42,8 @@ class AccountValidityHandler(object): self.clock = self.hs.get_clock() self._account_validity = self.hs.config.account_validity + self._show_users_in_user_directory = self.hs.config.show_users_in_user_directory + self.profile_handler = self.hs.get_profile_handler() if self._account_validity.renew_by_email_enabled and load_jinja2_templates: # Don't do email-specific configuration if renewal by email is disabled. @@ -74,6 +76,12 @@ class AccountValidityHandler(object): 30 * 60 * 1000, ) + # Check every hour to remove expired users from the user directory + self.clock.looping_call( + self._mark_expired_users_as_inactive, + 60 * 60 * 1000, + ) + @defer.inlineCallbacks def send_renewal_emails(self): """Gets the list of users whose account is expiring in the amount of time @@ -261,4 +269,28 @@ class AccountValidityHandler(object): email_sent=email_sent, ) + # Check if renewed users should be reintroduced to the user directory + if self._show_users_in_user_directory: + # Show the user in the directory again by setting them to active + yield self.profile_handler.set_active(UserID.from_string(user_id), True, True) + defer.returnValue(expiration_ts) + + @defer.inlineCallbacks + def _mark_expired_users_as_inactive(self): + """Iterate over expired users. Mark them as inactive in order to hide them from the + user directory. + + Returns: + Deferred + """ + # Get expired users + expired_user_ids = yield self.store.get_expired_users() + expired_users = [ + UserID.from_string(user_id) + for user_id in expired_user_ids + ] + + # Mark each one as non-active + for user in expired_users: + yield self.profile_handler.set_active(user, False, True) diff --git a/synapse/storage/registration.py b/synapse/storage/registration.py index 0b3c656e90..028848cf89 100644 --- a/synapse/storage/registration.py +++ b/synapse/storage/registration.py @@ -152,6 +152,29 @@ class RegistrationWorkerStore(SQLBaseStore): ) @defer.inlineCallbacks + def get_expired_users(self): + """Get IDs of all expired users + + Returns: + Deferred[list[str]]: List of expired user IDs + """ + def get_expired_users_txn(txn, now_ms): + sql = """ + SELECT user_id from account_validity + WHERE expiration_ts_ms <= ? + """ + txn.execute(sql, (now_ms,)) + rows = txn.fetchall() + return [row[0] for row in rows] + + res = yield self.runInteraction( + "get_expired_users", + get_expired_users_txn, + self.clock.time_msec(), + ) + defer.returnValue(res) + + @defer.inlineCallbacks def set_renewal_token_for_user(self, user_id, renewal_token): """Defines a renewal token for a given user. |