Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Add config variables for enabling terms auth and the policy name (#4142)
Browse files Browse the repository at this point in the history
So people can still collect consent the old way if they want to.
  • Loading branch information
turt2live authored and richvdh committed Nov 6, 2018
1 parent f108710 commit 0f5e51f
Show file tree
Hide file tree
Showing 10 changed files with 65 additions and 11 deletions.
2 changes: 1 addition & 1 deletion changelog.d/4004.feature
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Add `m.login.terms` to the registration flow when consent tracking is enabled. **This makes the template arguments conditionally optional on a new `public_version` variable - update your privacy templates to support this.**
Include flags to optionally add `m.login.terms` to the registration flow when consent tracking is enabled.
2 changes: 1 addition & 1 deletion changelog.d/4133.feature
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Add `m.login.terms` to the registration flow when consent tracking is enabled. **This makes the template arguments conditionally optional on a new `public_version` variable - update your privacy templates to support this.**
Include flags to optionally add `m.login.terms` to the registration flow when consent tracking is enabled.
1 change: 1 addition & 0 deletions changelog.d/4142.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Include flags to optionally add `m.login.terms` to the registration flow when consent tracking is enabled.
40 changes: 36 additions & 4 deletions docs/consent_tracking.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,40 @@ should be a matter of `pip install Jinja2`. On debian, try `apt-get install
python-jinja2`.

Once this is complete, and the server has been restarted, try visiting
`https://<server>/_matrix/consent`. If correctly configured, you should see a
default policy document. It is now possible to manually construct URIs where
users can give their consent.
`https://<server>/_matrix/consent`. If correctly configured, this should give
an error "Missing string query parameter 'u'". It is now possible to manually
construct URIs where users can give their consent.

### Enabling consent tracking at registration

1. Add the following to your configuration:

```yaml
user_consent:
require_at_registration: true
policy_name: "Privacy Policy" # or whatever you'd like to call the policy
```

2. In your consent templates, make use of the `public_version` variable to
see if an unauthenticated user is viewing the page. This is typically
wrapped around the form that would be used to actually agree to the document:

```
{% if not public_version %}
<!-- The variables used here are only provided when the 'u' param is given to the homeserver -->
<form method="post" action="consent">
<input type="hidden" name="v" value="{{version}}"/>
<input type="hidden" name="u" value="{{user}}"/>
<input type="hidden" name="h" value="{{userhmac}}"/>
<input type="submit" value="Sure thing!"/>
</form>
{% endif %}
```
3. Restart Synapse to apply the changes.
Visiting `https://<server>/_matrix/consent` should now give you a view of the privacy
document. This is what users will be able to see when registering for accounts.
### Constructing the consent URI
Expand All @@ -108,7 +139,8 @@ query parameters:

Note that not providing a `u` parameter will be interpreted as wanting to view
the document from an unauthenticated perspective, such as prior to registration.
Therefore, the `h` parameter is not required in this scenario.
Therefore, the `h` parameter is not required in this scenario. To enable this
behaviour, set `require_at_registration` to `true` in your `user_consent` config.


Sending users a server notice asking them to agree to the policy
Expand Down
18 changes: 18 additions & 0 deletions synapse/config/consent_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@
# until the user consents to the privacy policy. The value of the setting is
# used as the text of the error.
#
# 'require_at_registration', if enabled, will add a step to the registration
# process, similar to how captcha works. Users will be required to accept the
# policy before their account is created.
#
# 'policy_name' is the display name of the policy users will see when registering
# for an account. Has no effect unless `require_at_registration` is enabled.
# Defaults to "Privacy Policy".
#
# user_consent:
# template_dir: res/templates/privacy
# version: 1.0
Expand All @@ -54,6 +62,8 @@
# block_events_error: >-
# To continue using this homeserver you must review and agree to the
# terms and conditions at %(consent_uri)s
# require_at_registration: False
# policy_name: Privacy Policy
#
"""

Expand All @@ -67,6 +77,8 @@ def __init__(self):
self.user_consent_server_notice_content = None
self.user_consent_server_notice_to_guests = False
self.block_events_without_consent_error = None
self.user_consent_at_registration = False
self.user_consent_policy_name = "Privacy Policy"

def read_config(self, config):
consent_config = config.get("user_consent")
Expand All @@ -83,6 +95,12 @@ def read_config(self, config):
self.user_consent_server_notice_to_guests = bool(consent_config.get(
"send_server_notice_to_guests", False,
))
self.user_consent_at_registration = bool(consent_config.get(
"require_at_registration", False,
))
self.user_consent_policy_name = consent_config.get(
"policy_name", "Privacy Policy",
)

def default_config(self, **kwargs):
return DEFAULT_CONFIG
2 changes: 1 addition & 1 deletion synapse/handlers/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -472,7 +472,7 @@ def _get_params_terms(self):
"privacy_policy": {
"version": self.hs.config.user_consent_version,
"en": {
"name": "Privacy Policy",
"name": self.hs.config.user_consent_policy_name,
"url": "%s/_matrix/consent?v=%s" % (
self.hs.config.public_baseurl,
self.hs.config.user_consent_version,
Expand Down
2 changes: 1 addition & 1 deletion synapse/rest/client/v2_alpha/register.py
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ def on_POST(self, request):
])

# Append m.login.terms to all flows if we're requiring consent
if self.hs.config.block_events_without_consent_error is not None:
if self.hs.config.user_consent_at_registration:
new_flows = []
for flow in flows:
flow.append(LoginType.TERMS)
Expand Down
2 changes: 1 addition & 1 deletion synapse/rest/consent/consent_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ def _async_render_GET(self, request):
userhmac = None
has_consented = False
public_version = username == ""
if not public_version:
if not public_version or not self.hs.config.user_consent_at_registration:
userhmac = parse_string(request, "h", required=True, encoding=None)

self._check_hash(username, userhmac)
Expand Down
5 changes: 3 additions & 2 deletions tests/test_terms_auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ def prepare(self, reactor, clock, hs):
hs.config.enable_registration_captcha = False

def test_ui_auth(self):
self.hs.config.block_events_without_consent_error = True
self.hs.config.user_consent_at_registration = True
self.hs.config.user_consent_policy_name = "My Cool Privacy Policy"
self.hs.config.public_baseurl = "https://example.org"
self.hs.config.user_consent_version = "1.0"

Expand All @@ -66,7 +67,7 @@ def test_ui_auth(self):
"policies": {
"privacy_policy": {
"en": {
"name": "Privacy Policy",
"name": "My Cool Privacy Policy",
"url": "https://example.org/_matrix/consent?v=1.0",
},
"version": "1.0"
Expand Down
2 changes: 2 additions & 0 deletions tests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,8 @@ def default_config(name):
config.user_directory_search_all_users = False
config.user_consent_server_notice_content = None
config.block_events_without_consent_error = None
config.user_consent_at_registration = False
config.user_consent_policy_name = "Privacy Policy"
config.media_storage_providers = []
config.autocreate_auto_join_rooms = True
config.auto_join_rooms = []
Expand Down

0 comments on commit 0f5e51f

Please sign in to comment.