This project is no longer maintained.
mxgwd is a gateway/reverse proxy for the Matrix REST API that aims to:
- Control what users can do with the Matrix API, depending on roles backed by an extended Identity server.
- Control what federation calls are allowed and from which server(s).
- Filter and/or transform endpoints.
- Perform additional actions for matching requests.
mxgwd wishes to be client and server agnostic, so policies can be consistently applied across implementations.
THIS SOFTWARE IS CURRENTLY ALPHA, USAGE IN PRODUCTION IS DISCOURAGED
mxgwd processes requests of configured hosts by matching endpoints/actions and processing ACLs linked to them. If all applicable ACLs allow the request, it is then sent to the backend.
A host matches the host:port
of the requested URL.
There is currently no catch-all or wildcard/regexp support, and each host must be fully configured.
If a request's host is not matched in the configuration, it will be denied.
An endpoint matches either:
- A well-identified action from the client, which is translated to the appropriate HTTP method and URL path
- A custom HTTP method and/or URL path
The following configuration keys are available:
action
to match Actionsmethod
to match HTTP methodspath
to match URL pathsmatch
to specify the type of matching onpath
to
to overwrite the target URL defined at the host level
The following match
type are available:
regexp
: perform a regexp match.- Anything else (or key not present) will be used with
startsWith()
on the requested URL.
As actions represent well-defined messages and/or endpoints from the Matrix specification, the default Matrix naming scheme has been kept which is based on the Java packages naming scheme.
The following actions are available:
m.room.create
: When a client attempts to create a room.
ACLs are the rules applied to a matched endpoint, allowing or disallowing the request.
With: whitelist
Grant access if the condition is true.
With: blacklist
Deny access if the condition is true.
With: method
The HTTP method value (e.g. GET
, POST
, etc.), if the provided value is a match.
With: group
The groups the authenticated user belongs to, if the provided value matches one of the groups in the list.
This ACL type will deny access if one of the following conditions is true:
- The client did not provide an access token
- The Gateway is unable to validate the access token
- The access token is not valid
- The Gateway is not configured with an Identity server that supports the appropriate endpoint
- The Gateway is unable to retrieve the list of groups.
- Java JRE 8+ to run, JDK to build
- Reverse proxy for TLS/SSL support
By default, the gateway will listen on port 8000
of all IPs. To change, add the following line to your config file:
server.port: <HTTP port to listen to>
Configure your reverse proxy to send all /_matrix
request to it.
In the VirtualHost
section handling the domain with SSL, add the following and replace 0.0.0.0
by the internal
hostname/IP pointing to the gateway.
This line MUST replace the one for the homeserver and MUST be after the one to your Identity server, if applicable.
ProxyPass /_matrix http://0.0.0.0:8000/_matrix
Typical configuration would look like:
<VirtualHost *:443>
ServerName example.org
...
ProxyPreserveHost on
...
ProxyPass /_matrix http://localhost:8000/_matrix
</VirtualHost>
In the server
section handling the domain with SSL, add the following and replace 0.0.0.0
with the internal
hostname/IP pointing to gateway.
This line MUST replace the one for the homeserver and MUST be after the one to your Identity server, if applicable.
location /_matrix {
proxy_pass http://0.0.0.0:8000/_matrix;
}
Typical configuration would look like:
server {
listen 443 ssl;
server_name example.org;
...
location /_matrix {
proxy_pass http://localhost:8000/_matrix;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
Create a file mxgwd.yaml
in your current working directory and add the appropriate options.
You can provide another path using the environment variable MXGWD_CONFIG_FILE
.
Example of pseudo-config file:
# Base configuration key
matrix.client.hosts:
# A host definition using the default protocol port
example.org:
to: <Base URL to the Homeserver Client API>
toIdentity: <Base URL to the extended Identity server API>
# Endpoints definitions for this host
endpoints:
- action: <Well-defined Matrix action, overwriten by method and path below>
method: <HTTP method to match>
path: <Start of the URL path to match>
match: <Path matching style>
# List of ACLs to be applied to this endpoint
acls:
- type: <Type of this ACL>
target: <Target of this ACL>
value: <Value to match against for this ACL>
# another ACL
- type: ...
# Another endpoint definition
- action: ...
to: <Specific backend target URL, takes precedence over the Host one>
acls:
- ...
- ...
# Another host definition with a non-default port
example.org:8443:
...
# Another host definition with a hostname including a sub-domain
another.example.org:
...
Example of a working configuration:
matrix.client.hosts:
synapse.localhost:
to: 'http://localhost:8008'
toIdentity: 'http://localhost:8090'
endpoints:
- path: '/_matrix/client/r0/profile/'
acls:
- type: 'whitelist'
target: 'method'
value: 'GET'
- action: 'm.room.create'
acls:
- type: 'whitelist'
target: 'group'
value: 'Admins'
This configuration will allow requests to http://synapse.localhost
or https://synapse.localhost
.
Requests will be forwarded to http://localhost:8008
.
An extended Identity server at http://localhost:8090
will be used for groups lookups.
Two endpoint definitions are given:
- A generic endpoint matching all HTTP method and URL paths starting with
/_matrix/client/r0/profile/
.
One ACL is applied which will only allow requests using a HTTPGET
method and deny all others.
This will restrict all clients (authenticated or not) to edit profiles (theirs or anyone else's). - A well-defined Matrix action of creating a room, which will be mapped to the appropriate HTTP method and URL path.
One ACL is applied which will only allow requests from authenticated users belonging to theAdmins
group.
This will restrict room creation to an opaque group provided by the extended Identity server.
All other requests to synapse.localhost
will be allowed.
All other requests to any other host will be denied.
# Build mxgwd
./gradlew shadowJar
# You should create a configuration file if you haven't already
# Run mxgwd
java -jar build/libs/mxgwd.jar