Add `mau_appservice_trial_days` config (#12619)
* Add mau_appservice_trial_days
* Add a test
* Tweaks
* changelog
* Ensure we sync after the delay
* Fix types
* Add config statement
* Fix test
* Reinstate logging that got removed
* Fix feature name
2 files changed, 14 insertions, 2 deletions
diff --git a/synapse/config/server.py b/synapse/config/server.py
index b6cd326416..1e709c7cf5 100644
--- a/synapse/config/server.py
+++ b/synapse/config/server.py
@@ -413,6 +413,7 @@ class ServerConfig(Config):
)
self.mau_trial_days = config.get("mau_trial_days", 0)
+ self.mau_appservice_trial_days = config.get("mau_appservice_trial_days", {})
self.mau_limit_alerting = config.get("mau_limit_alerting", True)
# How long to keep redacted events in the database in unredacted form
@@ -1105,6 +1106,11 @@ class ServerConfig(Config):
# sign up in a short space of time never to return after their initial
# session.
#
+ # The option `mau_appservice_trial_days` is similar to `mau_trial_days`, but
+ # applies a different trial number if the user was registered by an appservice.
+ # A value of 0 means no trial days are applied. Appservices not listed in this
+ # dictionary use the value of `mau_trial_days` instead.
+ #
# 'mau_limit_alerting' is a means of limiting client side alerting
# should the mau limit be reached. This is useful for small instances
# where the admin has 5 mau seats (say) for 5 specific people and no
@@ -1115,6 +1121,8 @@ class ServerConfig(Config):
#max_mau_value: 50
#mau_trial_days: 2
#mau_limit_alerting: false
+ #mau_appservice_trial_days:
+ # "appservice-id": 1
# If enabled, the metrics for the number of monthly active users will
# be populated, however no one will be limited. If limit_usage_by_mau
diff --git a/synapse/storage/databases/main/registration.py b/synapse/storage/databases/main/registration.py
index d43163c27c..4991360b70 100644
--- a/synapse/storage/databases/main/registration.py
+++ b/synapse/storage/databases/main/registration.py
@@ -215,7 +215,8 @@ class RegistrationWorkerStore(CacheInvalidationWorkerStore):
async def is_trial_user(self, user_id: str) -> bool:
"""Checks if user is in the "trial" period, i.e. within the first
- N days of registration defined by `mau_trial_days` config
+ N days of registration defined by `mau_trial_days` config or the
+ `mau_appservice_trial_days` config.
Args:
user_id: The user to check for trial status.
@@ -226,7 +227,10 @@ class RegistrationWorkerStore(CacheInvalidationWorkerStore):
return False
now = self._clock.time_msec()
- trial_duration_ms = self.config.server.mau_trial_days * 24 * 60 * 60 * 1000
+ days = self.config.server.mau_appservice_trial_days.get(
+ info["appservice_id"], self.config.server.mau_trial_days
+ )
+ trial_duration_ms = days * 24 * 60 * 60 * 1000
is_trial = (now - info["creation_ts"] * 1000) < trial_duration_ms
return is_trial
|