-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Docs on consent bits #3268
Docs on consent bits #3268
Changes from 8 commits
e7598b6
833db2d
2574ea3
563606b
5ad1149
052d08a
1cbb8e5
cd8ab9a
2df8c31
e206b2c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
Support in Synapse for tracking agreement to server terms and conditions | ||
======================================================================== | ||
|
||
Synapse 0.30 introduces support for tracking whether users have agreed to the | ||
terms and conditions set by the administrator of a server - and blocking access | ||
to the server until they have. | ||
|
||
There are several parts to this functionality; each requires some specific | ||
configuration in `homeserver.yaml` to be enabled. | ||
|
||
Note that various parts of the configuation and this document refer to the | ||
"privacy policy": agreement with a privacy policy is one particular use of this | ||
feature, but of course adminstrators can specify other terms and conditions | ||
unrelated to "privacy" per se. | ||
|
||
Collecting policy agreement from a user | ||
--------------------------------------- | ||
|
||
Synapse can be configured to serve the user a simple policy form with an | ||
"accept" button. Clicking "Accept" records the user's acceptance in the | ||
database and shows a success page. | ||
|
||
To enable this, first create templates for the policy and success pages. | ||
These should be stored on the local filesystem. | ||
|
||
These templates use the [Jinja2](http://jinja.pocoo.org) templating language, | ||
and the `privacy_policy_templates` subdirectory of this `docs` directory gives | ||
examples of the sort of thing that can be done. | ||
|
||
Note that the templates must be stored under a name giving the language of the | ||
template - currently this must always be `en` (for "English"); | ||
internationalisation support is intended for the future. | ||
|
||
The template for the policy itself should be versioned and named according to | ||
the version: for example `1.0.html`. The version of the policy which the user | ||
has agreed to is stored in the database. | ||
|
||
Once the templates are in place, make the following changes to `homeserver.yaml`: | ||
|
||
1. Add a `user_consent` section, which should look like: | ||
|
||
```yaml | ||
user_consent: | ||
template_dir: privacy_policy_templates | ||
version: 1.0 | ||
``` | ||
|
||
`template_dir` points to the directory containing the policy | ||
templates. `version` defines the version of the policy which will be served | ||
to the user. In the example above, Synapse will serve | ||
`privacy_policy_templates/en/1.0.html`. | ||
|
||
|
||
2. Add a `form_secret` setting at the top level: | ||
|
||
|
||
```yaml | ||
form_secret: "<unique secret>" | ||
``` | ||
|
||
This should be set to an arbitrary secret string (try `pwgen -y 30` to | ||
generate suitable secrets). | ||
|
||
More on what this is used for below. | ||
|
||
3. Add `consent` wherever the `client` resource is currently enabled in the | ||
`listeners` configuration. For example: | ||
|
||
```yaml | ||
listeners: | ||
- port: 8008 | ||
resources: | ||
- names: | ||
- client | ||
- consent | ||
``` | ||
|
||
|
||
Finally, ensure that `jinja2` is installed. If you are using a virtualenv, this | ||
should be a matter of `pip install Jinja2`. On debian, try `apt-get install | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why is jinja2 a special cased dependency? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. well, because if you aren't doing this sort of stuff, you don't need it. Though maybe we should reconsider this. |
||
python-jinja2`. | ||
|
||
Once this is complete, and the server has been restarted, try visiting | ||
`https://<server>/_matrix/consent`. If configuration has been done correctly, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. maybe "If correctly configured this should give an error...." There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
this should give an error "Missing string query parameter 'u'". It is now | ||
possible to manually construct URIs where users can give their consent. | ||
|
||
### Constructing the consent URI | ||
|
||
It may be useful to manually construct the "consent URI" for a given user - for | ||
instance, in order to send them an email asking them to consent. To do this, | ||
take the base `https://<server>/_matrix/consent` URL and add the following | ||
query parameters: | ||
|
||
* `u`: the user id of the user. This can either be a full MXID | ||
(`@user:server.com`) or just the localpart (`user`). | ||
|
||
* `h`: hex-encoded HMAC-SHA256 of `u` using the `form_secret` as a key. It is | ||
possible to calculate this on the commandline with something like: | ||
|
||
```bash | ||
echo -n '<user>' | openssl sha256 -hmac '<form_secret>' | ||
``` | ||
|
||
This should result in a URI which looks something like: | ||
`https://<server>/_matrix/consent?u=<user>&h=68a152465a4d...`. | ||
|
||
|
||
Sending users a server notice asking them to agree to the policy | ||
---------------------------------------------------------------- | ||
|
||
It is possible to configure Synapse to send a [server | ||
notice](server_notices.md) to anybody who has not yet agreed to the current | ||
version of the policy. To do so: | ||
|
||
* ensure that the consent resource is configured, as in the previous section | ||
|
||
* ensure that server notices are configured, as in [server_notices.md](server_notices.md). | ||
|
||
* Add `server_notice_content` under `user_consent` in `homeserver.yaml`. For | ||
example: | ||
|
||
```yaml | ||
user_consent: | ||
server_notice_content: | ||
msgtype: m.text | ||
body: >- | ||
Please give your consent to the privacy policy at %(consent_uri)s. | ||
``` | ||
|
||
Synapse automatically replaces the placeholder `%(consent_uri)s` with the | ||
consent uri for that user. | ||
|
||
* ensure that `public_baseurl` is set in `homeserver.yaml`, and gives the base | ||
URI that clients use to connect to the server. (It is used to construct | ||
`consent_uri` in the server notice.) | ||
|
||
|
||
Blocking users from using the server until they agree to the policy | ||
------------------------------------------------------------------- | ||
|
||
Synapse can be configured to block any attempts to join rooms or send messages | ||
until the user has given their agreement to the policy. (Joining the server | ||
notices room is exempted from this). | ||
|
||
To enable this, add `block_events_error` under `user_consent`. For example: | ||
|
||
```yaml | ||
user_consent: | ||
block_events_error: >- | ||
You can't send any messages until you consent to the privacy policy at | ||
%(consent_uri)s. | ||
``` | ||
|
||
Synapse automatically replaces the placeholder `%(consent_uri)s` with the | ||
consent uri for that user. | ||
|
||
ensure that `public_baseurl` is set in `homeserver.yaml`, and gives the base | ||
URI that clients use to connect to the server. (It is used to construct | ||
`consent_uri` in the error.) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
Using the synapse manhole | ||
========================= | ||
|
||
The "manhole" allows server administrators to access a Python shell on a running | ||
Synapse installation. This is a very powerful mechanism for administration and | ||
debugging. | ||
|
||
To enable it, first uncomment the `manhole` listener configuration in | ||
`homeserver.yaml`: | ||
|
||
```yaml | ||
listeners: | ||
- port: 9000 | ||
bind_addresses: ['::1', '127.0.0.1'] | ||
type: manhole | ||
``` | ||
|
||
(`bind_addresses` in the above is important: it ensures that access to the | ||
manhole is only possible for local users). | ||
|
||
Note that this will give administrative access to synapse to **all users** with | ||
shell access to the server. It should therefore **not** be enabled in | ||
environments where untrusted users have shell access. | ||
|
||
Then restart synapse, and point an ssh client at port 9000 on localhost, using | ||
the username `matrix`: | ||
|
||
```bash | ||
ssh -p9000 matrix@localhost | ||
``` | ||
|
||
The password is `rabbithole`. | ||
|
||
This gives a Python REPL in which `hs` gives access to the | ||
`synapse.server.HomeServer` object - which in turn gives access to many other | ||
parts of the process. | ||
|
||
As a simple example, retrieving an event from the database: | ||
|
||
``` | ||
>>> hs.get_datastore().get_event('$1416420717069yeQaw:matrix.org') | ||
<Deferred at 0x7ff253fc6998 current result: <FrozenEvent event_id='$1416420717069yeQaw:matrix.org', type='m.room.create', state_key=''>> | ||
``` |
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
Server Notices | ||
============== | ||
|
||
'Server Notices' are a new feature introduced in Synapse 0.30. They provide a | ||
channel whereby server administrators can send messages to users on the server. | ||
|
||
They are used as part of the communication of the server polices (see | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. drop the 'the'? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "part of communication of the server polices" ? really? "part of communicating" maybe? |
||
[consent_tracking.md](consent_tracking.md)), however the intention is that | ||
they may also find a use for features such as "Message of the day". | ||
|
||
This is a feature specific to Synapse, but it uses standard Matrix | ||
communication mechanisms, so should work with any Matrix client. | ||
|
||
User experience | ||
--------------- | ||
|
||
When the user is first sent a server notice, they will get an invitation to a | ||
room (typically called 'Server Notices', though this is configurable in | ||
`homeserver.yaml`). They will be **unable to reject** this invitation - | ||
attempts to do so will receive an error. | ||
|
||
Once they accept the invitation, they will see the notice message in the room | ||
history; it will appear to have come from the 'server notices user' (see | ||
below). | ||
|
||
The user is prevented from sending any messages in this room by the power | ||
levels. They also cannot leave it. | ||
|
||
Synapse configuration | ||
--------------------- | ||
|
||
Server notices come from a specific user id on the server. Server | ||
administrators are free to choose the user id - something like `server` is | ||
suggested, meaning the notices will come from | ||
`@server:<your_server_name>`. Once the server notices user is configured, that | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Easy to misinterpret as the server noticing something - at first I thought it was a typo. Perhaps capitalise Server Notices User? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. good point, done |
||
user id becomes a special, privileged user, so administrators should ensure | ||
that **it is not already allocated**. | ||
|
||
In order to support server notices, it is necessary to add some configuration | ||
to the `homeserver.yaml` file. In particular, you should add a `server_notices` | ||
section, which should look like this: | ||
|
||
```yaml | ||
server_notices: | ||
system_mxid_localpart: server | ||
system_mxid_display_name: "Server Notices" | ||
room_name: "Server Notices" | ||
``` | ||
|
||
The only compulsory setting is `system_mxid_localpart`, which defines the user | ||
id of the server notices user, as above. `system_mxid_display_name` and | ||
`room_name` define the displayname of the system notices user, and of | ||
the notices room, respectively. | ||
|
||
Sending notices | ||
--------------- | ||
|
||
As of the current version of synapse, there is no convenient interface for | ||
sending notices (other than the automated ones sent as part of consent | ||
tracking). | ||
|
||
In the meantime, it is possible to test this feature using the manhole. Having | ||
gone into the manhole as described in [manhole.md](manhole.md), a notice can be | ||
sent with something like: | ||
|
||
``` | ||
>>> hs.get_server_notices_manager().send_notice('@user:server.com', {'msgtype':'m.text', 'body':'foo'}) | ||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I found it hard to parse this section, perhaps
"These templates use the Jinja2 templating language, and
docs/privacy_policy_templates
gives examples of the sort of thing that can be done.''There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I suspect it's not in
docs
if you've got a debian installation :/There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok, should be better now