From 2c7482808f4add34be2edb40579e5011293a7657 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Tue, 3 May 2022 15:33:56 +0100 Subject: [PATCH 01/10] Add mau_appservice_trial_days --- docs/sample_config.yaml | 3 +++ synapse/config/server.py | 8 ++++++++ synapse/storage/databases/main/registration.py | 6 ++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/sample_config.yaml b/docs/sample_config.yaml index 67184c6b1ae1..e779eafbfb7d 100644 --- a/docs/sample_config.yaml +++ b/docs/sample_config.yaml @@ -416,6 +416,9 @@ manhole_settings: #limit_usage_by_mau: false #max_mau_value: 50 #mau_trial_days: 2 +#mau_appservice_trial_days: +# "appservice-id": 1 +# #mau_limit_alerting: false # If enabled, the metrics for the number of monthly active users will diff --git a/synapse/config/server.py b/synapse/config/server.py index b6cd32641688..9b9a7de7b4ea 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -413,6 +413,7 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None: ) 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 @@ def generate_config_section( # sign up in a short space of time never to return after their initial # session. # + # 'mau_appservice_trial_days' is similar to the above, but applies a different + # trial number depending on the appservice ID registered to the user. A value + # of 0 means no trial days are applied. + # + # # '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 @@ def generate_config_section( #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 d43163c27cae..851840bbf5c0 100644 --- a/synapse/storage/databases/main/registration.py +++ b/synapse/storage/databases/main/registration.py @@ -215,7 +215,8 @@ async def get_userinfo_by_id(self, user_id: str) -> Optional[UserInfo]: 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,8 @@ async def is_trial_user(self, user_id: str) -> bool: return False now = self._clock.time_msec() - trial_duration_ms = self.config.server.mau_trial_days * 24 * 60 * 60 * 1000 + days = self.config.mau_appservice_trial_days.get(info["appservice_id"], self.config.mau_trial_days) + trial_duration_ms = days * 24 * 60 * 60 * 1000 is_trial = (now - info["creation_ts"] * 1000) < trial_duration_ms return is_trial From 446af9b146670542a1f78098eea78ed81519d1da Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Tue, 3 May 2022 15:58:38 +0100 Subject: [PATCH 02/10] Add a test --- tests/test_mau.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/tests/test_mau.py b/tests/test_mau.py index 46bd3075de7b..fe7832309a9f 100644 --- a/tests/test_mau.py +++ b/tests/test_mau.py @@ -229,6 +229,64 @@ def test_tracked_but_not_limited(self): self.reactor.advance(100) self.assertEqual(2, self.successResultOf(count)) + @override_config({"mau_trial_days": 3, "mau_appservice_trial_days": {"SomeASID": 1, "AnotherASID": 2}}) + def test_as_trial_days(self): + """Test that application services can still create users when the MAU + limit has been reached. This only works when application service + user ip tracking is disabled. + """ + + # Create and sync so that the MAU counts get updated + token1 = self.create_user("kermit1") + self.do_sync_for_user(token1) + token2 = self.create_user("kermit2") + self.do_sync_for_user(token2) + + # Cheekily add an application service that we use to register a new user + # with. + as_token_1 = "foobartoken1" + self.store.services_cache.append( + ApplicationService( + token=as_token_1, + hostname=self.hs.hostname, + id="SomeASID", + sender="@as_sender_1:test", + namespaces={"users": [{"regex": "@as_2*", "exclusive": True}]}, + ) + ) + + as_token_2 = "foobartoken2" + self.store.services_cache.append( + ApplicationService( + token=as_token, + hostname=self.hs.hostname, + id="AnotherASID", + sender="@as_sender_2:test", + namespaces={"users": [{"regex": "@as_2*", "exclusive": True}]}, + ) + ) + + token3 = self.create_user("as_kermit3", token=as_token_1, appservice=True) + self.do_sync_for_user(token3) + token4 = self.create_user("as_kermit4", token=as_token_2, appservice=True) + self.do_sync_for_user(token4) + + # Advance time by a day to include the first appservice + self.reactor.advance(24 * 60 * 60) + count = self.store.get_monthly_active_count() + self.assertEqual(1, self.successResultOf(count)) + + # Advance time by a day to include the next appservice + self.reactor.advance(24 * 60 * 60) + count = self.store.get_monthly_active_count() + self.assertEqual(2, self.successResultOf(count)) + + # Advance time by 2 days to include the native users + self.reactor.advance(2 *24 * 60 * 60) + count = self.store.get_monthly_active_count() + self.assertEqual(4, self.successResultOf(count)) + + def create_user(self, localpart, token=None, appservice=False): request_data = { "username": localpart, From 429043c4ccfb64e9a0f82ff3fb64c99813c65d74 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Tue, 3 May 2022 16:01:42 +0100 Subject: [PATCH 03/10] Tweaks --- docs/sample_config.yaml | 7 +++++-- synapse/config/server.py | 1 - synapse/storage/databases/main/registration.py | 4 +++- tests/test_mau.py | 12 ++++++++---- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/sample_config.yaml b/docs/sample_config.yaml index e779eafbfb7d..37e6f7d659ed 100644 --- a/docs/sample_config.yaml +++ b/docs/sample_config.yaml @@ -407,6 +407,10 @@ manhole_settings: # sign up in a short space of time never to return after their initial # session. # +# 'mau_appservice_trial_days' is similar to the above, but applies a different +# trial number depending on the appservice ID registered to the user. A value +# of 0 means no trial days are applied. +# # '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 @@ -416,10 +420,9 @@ manhole_settings: #limit_usage_by_mau: false #max_mau_value: 50 #mau_trial_days: 2 +#mau_limit_alerting: false #mau_appservice_trial_days: # "appservice-id": 1 -# -#mau_limit_alerting: false # 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/config/server.py b/synapse/config/server.py index 9b9a7de7b4ea..a01a4134c3e7 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -1109,7 +1109,6 @@ def generate_config_section( # 'mau_appservice_trial_days' is similar to the above, but applies a different # trial number depending on the appservice ID registered to the user. A value # of 0 means no trial days are applied. - # # # 'mau_limit_alerting' is a means of limiting client side alerting # should the mau limit be reached. This is useful for small instances diff --git a/synapse/storage/databases/main/registration.py b/synapse/storage/databases/main/registration.py index 851840bbf5c0..bcaf957bad5e 100644 --- a/synapse/storage/databases/main/registration.py +++ b/synapse/storage/databases/main/registration.py @@ -227,7 +227,9 @@ async def is_trial_user(self, user_id: str) -> bool: return False now = self._clock.time_msec() - days = self.config.mau_appservice_trial_days.get(info["appservice_id"], self.config.mau_trial_days) + days = self.config.mau_appservice_trial_days.get( + info["appservice_id"], self.config.mau_trial_days + ) trial_duration_ms = days * 24 * 60 * 60 * 1000 is_trial = (now - info["creation_ts"] * 1000) < trial_duration_ms return is_trial diff --git a/tests/test_mau.py b/tests/test_mau.py index fe7832309a9f..365ec9f21edc 100644 --- a/tests/test_mau.py +++ b/tests/test_mau.py @@ -229,7 +229,12 @@ def test_tracked_but_not_limited(self): self.reactor.advance(100) self.assertEqual(2, self.successResultOf(count)) - @override_config({"mau_trial_days": 3, "mau_appservice_trial_days": {"SomeASID": 1, "AnotherASID": 2}}) + @override_config( + { + "mau_trial_days": 3, + "mau_appservice_trial_days": {"SomeASID": 1, "AnotherASID": 2}, + } + ) def test_as_trial_days(self): """Test that application services can still create users when the MAU limit has been reached. This only works when application service @@ -258,7 +263,7 @@ def test_as_trial_days(self): as_token_2 = "foobartoken2" self.store.services_cache.append( ApplicationService( - token=as_token, + token=as_token_2, hostname=self.hs.hostname, id="AnotherASID", sender="@as_sender_2:test", @@ -282,11 +287,10 @@ def test_as_trial_days(self): self.assertEqual(2, self.successResultOf(count)) # Advance time by 2 days to include the native users - self.reactor.advance(2 *24 * 60 * 60) + self.reactor.advance(2 * 24 * 60 * 60) count = self.store.get_monthly_active_count() self.assertEqual(4, self.successResultOf(count)) - def create_user(self, localpart, token=None, appservice=False): request_data = { "username": localpart, From 75fd804602fa16eec5a3de845dec83731cf02b25 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Tue, 3 May 2022 16:04:47 +0100 Subject: [PATCH 04/10] changelog --- changelog.d/12619.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/12619.feature diff --git a/changelog.d/12619.feature b/changelog.d/12619.feature new file mode 100644 index 000000000000..6ae9077ff2a0 --- /dev/null +++ b/changelog.d/12619.feature @@ -0,0 +1 @@ +Add new `enable_registration_token_3pid_bypass` configuration option to specify a different trial period for users registered via an appservice. \ No newline at end of file From 4e73d3c37cdfd7936db0dffb041701c0fb3d99e7 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Tue, 3 May 2022 16:05:53 +0100 Subject: [PATCH 05/10] Ensure we sync after the delay --- tests/test_mau.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/test_mau.py b/tests/test_mau.py index 365ec9f21edc..fd8d84e0c102 100644 --- a/tests/test_mau.py +++ b/tests/test_mau.py @@ -243,9 +243,7 @@ def test_as_trial_days(self): # Create and sync so that the MAU counts get updated token1 = self.create_user("kermit1") - self.do_sync_for_user(token1) token2 = self.create_user("kermit2") - self.do_sync_for_user(token2) # Cheekily add an application service that we use to register a new user # with. @@ -272,22 +270,24 @@ def test_as_trial_days(self): ) token3 = self.create_user("as_kermit3", token=as_token_1, appservice=True) - self.do_sync_for_user(token3) token4 = self.create_user("as_kermit4", token=as_token_2, appservice=True) - self.do_sync_for_user(token4) # Advance time by a day to include the first appservice - self.reactor.advance(24 * 60 * 60) + self.reactor.advance(24 * 60 * 61) + self.do_sync_for_user(token3) count = self.store.get_monthly_active_count() self.assertEqual(1, self.successResultOf(count)) # Advance time by a day to include the next appservice - self.reactor.advance(24 * 60 * 60) + self.reactor.advance(24 * 60 * 61) + self.do_sync_for_user(token4) count = self.store.get_monthly_active_count() self.assertEqual(2, self.successResultOf(count)) # Advance time by 2 days to include the native users - self.reactor.advance(2 * 24 * 60 * 60) + self.reactor.advance(2 * 24 * 60 * 61) + self.do_sync_for_user(token1) + self.do_sync_for_user(token2) count = self.store.get_monthly_active_count() self.assertEqual(4, self.successResultOf(count)) From efd988c76e2567019e7179ad231e59003af57730 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Tue, 3 May 2022 16:13:12 +0100 Subject: [PATCH 06/10] Fix types --- synapse/storage/databases/main/registration.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/synapse/storage/databases/main/registration.py b/synapse/storage/databases/main/registration.py index bcaf957bad5e..4991360b70c9 100644 --- a/synapse/storage/databases/main/registration.py +++ b/synapse/storage/databases/main/registration.py @@ -227,8 +227,8 @@ async def is_trial_user(self, user_id: str) -> bool: return False now = self._clock.time_msec() - days = self.config.mau_appservice_trial_days.get( - info["appservice_id"], self.config.mau_trial_days + 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 From 6823c60093aaddadeddc71d1df6eaa2536233483 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Wed, 4 May 2022 09:15:48 +0100 Subject: [PATCH 07/10] Add config statement --- docs/sample_config.yaml | 12 ------------ docs/sample_log_config.yaml | 7 +++++++ docs/usage/configuration/config_documentation.md | 14 ++++++++++++++ synapse/config/server.py | 7 ++++--- 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/docs/sample_config.yaml b/docs/sample_config.yaml index 37e6f7d659ed..b8d8c0dbf0a1 100644 --- a/docs/sample_config.yaml +++ b/docs/sample_config.yaml @@ -407,10 +407,6 @@ manhole_settings: # sign up in a short space of time never to return after their initial # session. # -# 'mau_appservice_trial_days' is similar to the above, but applies a different -# trial number depending on the appservice ID registered to the user. A value -# of 0 means no trial days are applied. -# # '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 @@ -421,8 +417,6 @@ manhole_settings: #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 @@ -1329,12 +1323,6 @@ oembed: # #registration_requires_token: true -# Allow users to submit a token during registration to bypass any required 3pid -# steps configured in `registrations_require_3pid`. -# Defaults to false, requiring that registration tokens (if enabled) complete a 3pid flow. -# -#enable_registration_token_3pid_bypass: false - # If set, allows registration of standard or admin accounts by anyone who # has the shared secret, even if registration is otherwise disabled. # diff --git a/docs/sample_log_config.yaml b/docs/sample_log_config.yaml index 3065a0e2d986..2485ad25edfc 100644 --- a/docs/sample_log_config.yaml +++ b/docs/sample_log_config.yaml @@ -62,6 +62,13 @@ loggers: # information such as access tokens. level: INFO + twisted: + # We send the twisted logging directly to the file handler, + # to work around https://github.com/matrix-org/synapse/issues/3471 + # when using "buffer" logger. Use "console" to log to stderr instead. + handlers: [file] + propagate: false + root: level: INFO diff --git a/docs/usage/configuration/config_documentation.md b/docs/usage/configuration/config_documentation.md index 968b0fbfaff4..ac432cf2e07f 100644 --- a/docs/usage/configuration/config_documentation.md +++ b/docs/usage/configuration/config_documentation.md @@ -627,6 +627,20 @@ Example configuration: mau_trial_days: 5 ``` --- +Config option: `mau_appservice_trial_days` + +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. + +Example configuration: +```yaml +mau_appservice_trial_days: + my_appservice_id: 3 + another_appservice_id: 6 +``` +--- Config option: `mau_limit_alerting` The option `mau_limit_alerting` is a means of limiting client-side alerting diff --git a/synapse/config/server.py b/synapse/config/server.py index a01a4134c3e7..1e709c7cf519 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -1106,9 +1106,10 @@ def generate_config_section( # sign up in a short space of time never to return after their initial # session. # - # 'mau_appservice_trial_days' is similar to the above, but applies a different - # trial number depending on the appservice ID registered to the user. A value - # of 0 means no trial days are applied. + # 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 From ac55551927d9a0b1ea3e7af1a1d2bd5b42f7d077 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Wed, 4 May 2022 09:51:44 +0100 Subject: [PATCH 08/10] Fix test --- tests/test_mau.py | 66 ++++++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/tests/test_mau.py b/tests/test_mau.py index fd8d84e0c102..5bbc361aa240 100644 --- a/tests/test_mau.py +++ b/tests/test_mau.py @@ -14,6 +14,8 @@ """Tests REST events for /rooms paths.""" +from typing import List + from synapse.api.constants import APP_SERVICE_REGISTRATION_TYPE, LoginType from synapse.api.errors import Codes, HttpResponseException, SynapseError from synapse.appservice import ApplicationService @@ -236,14 +238,12 @@ def test_tracked_but_not_limited(self): } ) def test_as_trial_days(self): - """Test that application services can still create users when the MAU - limit has been reached. This only works when application service - user ip tracking is disabled. - """ + user_tokens: List[str] = [] - # Create and sync so that the MAU counts get updated - token1 = self.create_user("kermit1") - token2 = self.create_user("kermit2") + def advance_time_and_sync(): + self.reactor.advance(24 * 60 * 61) + for token in user_tokens: + self.do_sync_for_user(token) # Cheekily add an application service that we use to register a new user # with. @@ -254,7 +254,7 @@ def test_as_trial_days(self): hostname=self.hs.hostname, id="SomeASID", sender="@as_sender_1:test", - namespaces={"users": [{"regex": "@as_2*", "exclusive": True}]}, + namespaces={"users": [{"regex": "@as_1.*", "exclusive": True}]}, ) ) @@ -265,31 +265,43 @@ def test_as_trial_days(self): hostname=self.hs.hostname, id="AnotherASID", sender="@as_sender_2:test", - namespaces={"users": [{"regex": "@as_2*", "exclusive": True}]}, + namespaces={"users": [{"regex": "@as_2.*", "exclusive": True}]}, ) ) - token3 = self.create_user("as_kermit3", token=as_token_1, appservice=True) - token4 = self.create_user("as_kermit4", token=as_token_2, appservice=True) + user_tokens.append(self.create_user("kermit1")) + user_tokens.append(self.create_user("kermit2")) + user_tokens.append( + self.create_user("as_1kermit3", token=as_token_1, appservice=True) + ) + user_tokens.append( + self.create_user("as_2kermit4", token=as_token_2, appservice=True) + ) - # Advance time by a day to include the first appservice - self.reactor.advance(24 * 60 * 61) - self.do_sync_for_user(token3) - count = self.store.get_monthly_active_count() - self.assertEqual(1, self.successResultOf(count)) + # Advance time by 1 day to include the first appservice + advance_time_and_sync() + self.assertEqual( + self.get_success(self.store.get_monthly_active_count_by_service()), + {"SomeASID": 1}, + ) - # Advance time by a day to include the next appservice - self.reactor.advance(24 * 60 * 61) - self.do_sync_for_user(token4) - count = self.store.get_monthly_active_count() - self.assertEqual(2, self.successResultOf(count)) + # Advance time by 1 day to include the next appservice + advance_time_and_sync() + self.assertEqual( + self.get_success(self.store.get_monthly_active_count_by_service()), + {"SomeASID": 1, "AnotherASID": 1}, + ) - # Advance time by 2 days to include the native users - self.reactor.advance(2 * 24 * 60 * 61) - self.do_sync_for_user(token1) - self.do_sync_for_user(token2) - count = self.store.get_monthly_active_count() - self.assertEqual(4, self.successResultOf(count)) + # Advance time by 1 day to include the native users + advance_time_and_sync() + self.assertEqual( + self.get_success(self.store.get_monthly_active_count_by_service()), + { + "SomeASID": 1, + "AnotherASID": 1, + "native": 2, + }, + ) def create_user(self, localpart, token=None, appservice=False): request_data = { From b3f86bc4e220aaaf4908e3280370a6e423934a8e Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Wed, 4 May 2022 09:57:54 +0100 Subject: [PATCH 09/10] Reinstate logging that got removed --- docs/sample_config.yaml | 13 +++++++++++++ docs/sample_log_config.yaml | 7 ------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/sample_config.yaml b/docs/sample_config.yaml index b8d8c0dbf0a1..c27eb3c600c9 100644 --- a/docs/sample_config.yaml +++ b/docs/sample_config.yaml @@ -407,6 +407,11 @@ manhole_settings: # 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 @@ -417,6 +422,8 @@ manhole_settings: #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 @@ -1323,6 +1330,12 @@ oembed: # #registration_requires_token: true +# Allow users to submit a token during registration to bypass any required 3pid +# steps configured in `registrations_require_3pid`. +# Defaults to false, requiring that registration tokens (if enabled) complete a 3pid flow. +# +#enable_registration_token_3pid_bypass: false + # If set, allows registration of standard or admin accounts by anyone who # has the shared secret, even if registration is otherwise disabled. # diff --git a/docs/sample_log_config.yaml b/docs/sample_log_config.yaml index 2485ad25edfc..3065a0e2d986 100644 --- a/docs/sample_log_config.yaml +++ b/docs/sample_log_config.yaml @@ -62,13 +62,6 @@ loggers: # information such as access tokens. level: INFO - twisted: - # We send the twisted logging directly to the file handler, - # to work around https://github.com/matrix-org/synapse/issues/3471 - # when using "buffer" logger. Use "console" to log to stderr instead. - handlers: [file] - propagate: false - root: level: INFO From 19c8dfde357c7677a5b8f7d3ecb42f8bbb7a865f Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Wed, 4 May 2022 18:28:26 +0100 Subject: [PATCH 10/10] Fix feature name --- changelog.d/12619.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/12619.feature b/changelog.d/12619.feature index 6ae9077ff2a0..b0fc0f5fedf8 100644 --- a/changelog.d/12619.feature +++ b/changelog.d/12619.feature @@ -1 +1 @@ -Add new `enable_registration_token_3pid_bypass` configuration option to specify a different trial period for users registered via an appservice. \ No newline at end of file +Add new `mau_appservice_trial_days` configuration option to specify a different trial period for users registered via an appservice.