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

Docs on consent bits #3268

Merged
merged 10 commits into from
May 23, 2018
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
160 changes: 160 additions & 0 deletions docs/consent_tracking.md
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,
Copy link
Contributor

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.''

Copy link
Member Author

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 :/

Copy link
Member Author

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

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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is jinja2 a special cased dependency?

Copy link
Member Author

Choose a reason for hiding this comment

The 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,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe "If correctly configured this should give an error...."

Copy link
Member Author

Choose a reason for hiding this comment

The 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.)
43 changes: 43 additions & 0 deletions docs/manhole.md
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=''>>
```
23 changes: 0 additions & 23 deletions docs/privacy_policy_templates/README.md

This file was deleted.

68 changes: 68 additions & 0 deletions docs/server_notices.md
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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

drop the 'the'?

Copy link
Member Author

Choose a reason for hiding this comment

The 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
Copy link
Contributor

Choose a reason for hiding this comment

The 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?

Copy link
Member Author

Choose a reason for hiding this comment

The 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'})
```