diff --git a/docker/Dockerfile b/docker/Dockerfile index 95776f0583..be59c3a4a7 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -69,7 +69,8 @@ RUN apt-get update && apt-get install -y \ mtr-tiny \ inetutils-ping \ less \ - lsof + lsof \ + supervisor # for topologiser RUN pip install flask @@ -77,14 +78,17 @@ RUN pip install flask COPY --from=builder /install /usr/local COPY ./docker/start.py /start.py COPY ./docker/conf /conf +COPY ./docker/proxy/proxy /proxy +COPY ./docker/proxy/maps /maps +COPY ./docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf VOLUME ["/data"] -EXPOSE 8008/tcp 8448/tcp 3000/tcp +EXPOSE 8008/tcp 8448/tcp 3000/tcp 5683/udp ENV LD_PRELOAD=/usr/local/lib/libksm_preload.so # default is 32768 (8 4KB pages) ENV KSMP_MERGE_THRESHOLD=16384 -ENTRYPOINT ["/start.py"] +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/docker/proxy/maps/common_keys.json b/docker/proxy/maps/common_keys.json new file mode 100644 index 0000000000..f26ab397a1 --- /dev/null +++ b/docker/proxy/maps/common_keys.json @@ -0,0 +1,27 @@ +[ + "errcode", + "error", + "msgtype", + "body", + "formatted_body", + "format", + "avatar_url", + "displayname", + "membership", + "url", + "name", + "origin", + "origin_server_ts", + "pdus", + "sender", + "type", + "auth_events", + "unsigned", + "prev_events", + "depth", + "redacts", + "event_id", + "room_id", + "state_key", + "content" +] diff --git a/docker/proxy/maps/common_values.json b/docker/proxy/maps/common_values.json new file mode 100644 index 0000000000..65473c7b1b --- /dev/null +++ b/docker/proxy/maps/common_values.json @@ -0,0 +1,5 @@ +[ + "m.text", + "m.emote", + "m.notice" +] diff --git a/docker/proxy/maps/error_codes.json b/docker/proxy/maps/error_codes.json new file mode 100644 index 0000000000..daab96d72b --- /dev/null +++ b/docker/proxy/maps/error_codes.json @@ -0,0 +1,36 @@ +[ + "M_BAD_JSON", + "M_BAD_STATE", + "M_CANNOT_LEAVE_SERVER_NOTICE_ROOM", + "M_CAPTCHA_INVALID", + "M_CAPTCHA_NEEDED", + "M_CONSENT_NOT_GIVEN", + "M_EXAMPLE_ERROR", + "M_EXCLUSIVE", + "M_FORBIDDEN", + "M_GUEST_ACCESS_FORBIDDEN", + "M_INCOMPATIBLE_ROOM_VERSION", + "M_INVALID_PARAM", + "M_INVALID_ROOM_STATE", + "M_INVALID_USERNAME", + "M_LIMIT_EXCEEDED", + "M_MISSING_PARAM", + "M_MISSING_TOKEN", + "M_NOT_FOUND", + "M_NOT_JSON", + "M_RESOURCE_LIMIT_EXCEEDED", + "M_ROOM_IN_USE", + "M_SERVER_NOT_TRUSTED", + "M_THREEPID_AUTH_FAILED", + "M_THREEPID_DENIED", + "M_THREEPID_IN_USE", + "M_THREEPID_NOT_FOUND", + "M_TOO_LARGE", + "M_UNAUTHORIZED", + "M_UNKNOWN", + "M_UNKNOWN_TOKEN", + "M_UNRECOGNIZED", + "M_UNSUPPORTED_ROOM_VERSION", + "M_USER_IN_USE", + "M_WEAK_PASSWORD" +] diff --git a/docker/proxy/maps/event_types.json b/docker/proxy/maps/event_types.json new file mode 100644 index 0000000000..b28d202d44 --- /dev/null +++ b/docker/proxy/maps/event_types.json @@ -0,0 +1,26 @@ +[ + "m.call.answer", + "m.call.candidates", + "m.call.hangup", + "m.call.invite", + "m.direct", + "m.presence", + "m.receipt", + "m.room.aliases", + "m.room.avatar", + "m.room.canonical_alias", + "m.room.create", + "m.room.guest_access", + "m.room.history_visibility", + "m.room.join_rules", + "m.room.member", + "m.room.message", + "m.room.message.feedback", + "m.room.name", + "m.room.power_levels", + "m.room.redaction", + "m.room.third_party_invite", + "m.room.topic", + "m.tag", + "m.typing" +] diff --git a/docker/proxy/maps/routes.json b/docker/proxy/maps/routes.json new file mode 100644 index 0000000000..251f035be9 --- /dev/null +++ b/docker/proxy/maps/routes.json @@ -0,0 +1,518 @@ +[ + { + "path": "/_matrix/client/r0/profile/{userId}/displayname", + "method": "get" + }, + { + "path": "/_matrix/client/r0/profile/{userId}/displayname", + "method": "put" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/join", + "method": "post" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/kick", + "method": "post" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/send/{eventType}/{txnId}", + "method": "put" + }, + { + "path": "/_matrix/client/r0/admin/whois/{userId}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/receipt/{receiptType}/{eventId}", + "method": "post" + }, + { + "path": "/_matrix/client/versions", + "method": "get" + }, + { + "path": "/_matrix/media/r0/config", + "method": "get" + }, + { + "path": "/_matrix/media/r0/download/{serverName}/{mediaId}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/invite ", + "method": "post" + }, + { + "path": "/_matrix/client/r0/join/{roomIdOrAlias}", + "method": "post" + }, + { + "path": "/_matrix/client/r0/presence/list/{userId}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/presence/list/{userId}", + "method": "post" + }, + { + "path": "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}", + "method": "delete" + }, + { + "path": "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}", + "method": "put" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/state/{eventType}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/state/{eventType}", + "method": "put" + }, + { + "path": "/_matrix/client/r0/account/whoami", + "method": "get" + }, + { + "path": "/_matrix/client/r0/devices", + "method": "get" + }, + { + "path": "/_matrix/client/r0/keys/claim", + "method": "post" + }, + { + "path": "/_matrix/client/r0/login", + "method": "get" + }, + { + "path": "/_matrix/client/r0/login", + "method": "post" + }, + { + "path": "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}/actions", + "method": "put" + }, + { + "path": "/_matrix/client/r0/register/available", + "method": "get" + }, + { + "path": "/_matrix/client/r0/user/{userId}/filter", + "method": "post" + }, + { + "path": "/_matrix/client/r0/user_directory/search", + "method": "post" + }, + { + "path": "/_matrix/client/r0/account/3pid", + "method": "get" + }, + { + "path": "/_matrix/client/r0/account/3pid", + "method": "post" + }, + { + "path": "/_matrix/client/r0/publicRooms", + "method": "get" + }, + { + "path": "/_matrix/client/r0/publicRooms", + "method": "post" + }, + { + "path": "/_matrix/client/r0/register", + "method": "post" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/ban", + "method": "post" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/typing/{userId}", + "method": "put" + }, + { + "path": "/_matrix/client/r0/search", + "method": "post" + }, + { + "path": "/_matrix/client/r0/account/password", + "method": "post" + }, + { + "path": "/_matrix/client/r0/initialSync", + "method": "get" + }, + { + "path": "/_matrix/client/r0/logout/all", + "method": "post" + }, + { + "path": "/_matrix/client/r0/account/deactivate", + "method": "post" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/forget", + "method": "post" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/redact/{eventId}/{txnId}", + "method": "put" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/unban", + "method": "post" + }, + { + "path": "/_matrix/client/r0/keys/query", + "method": "post" + }, + { + "path": "/_matrix/client/r0/user/{userId}/account_data/{type}", + "method": "put" + }, + { + "path": "/_matrix/client/r0/user/{userId}/rooms/{roomId}/tags/{tag}", + "method": "delete" + }, + { + "path": "/_matrix/client/r0/user/{userId}/rooms/{roomId}/tags/{tag}", + "method": "put" + }, + { + "path": "/_matrix/media/r0/upload", + "method": "post" + }, + { + "path": "/_matrix/client/r0/events", + "method": "get" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/context/{eventId}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/invite", + "method": "post" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/messages", + "method": "get" + }, + { + "path": "/_matrix/client/r0/account/3pid/delete", + "method": "post" + }, + { + "path": "/_matrix/client/r0/createRoom", + "method": "post" + }, + { + "path": "/_matrix/client/r0/profile/{userId}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}/enabled", + "method": "put" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/leave", + "method": "post" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/members", + "method": "get" + }, + { + "path": "/_matrix/client/r0/sendToDevice/{eventType}/{txnId}", + "method": "put" + }, + { + "path": "/_matrix/client/r0/voip/turnServer", + "method": "get" + }, + { + "path": "/.well-known/matrix/client", + "method": "get" + }, + { + "path": "/_matrix/client/r0/directory/list/appservice/{networkId}/{roomId}", + "method": "put" + }, + { + "path": "/_matrix/client/r0/keys/upload", + "method": "post" + }, + { + "path": "/_matrix/client/r0/pushrules/", + "method": "get" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/initialSync", + "method": "get" + }, + { + "path": "/_matrix/client/r0/user/{userId}/openid/request_token", + "method": "post" + }, + { + "path": "/_matrix/client/r0/user/{userId}/rooms/{roomId}/tags", + "method": "get" + }, + { + "path": "/_matrix/media/r0/download/{serverName}/{mediaId}/{fileName}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/delete_devices", + "method": "post" + }, + { + "path": "/_matrix/client/r0/events/{eventId}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/profile/{userId}/avatar_url", + "method": "get" + }, + { + "path": "/_matrix/client/r0/profile/{userId}/avatar_url", + "method": "put" + }, + { + "path": "/_matrix/client/r0/pushers/set", + "method": "post" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/event/{eventId}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/report/{eventId}", + "method": "post" + }, + { + "path": "/_matrix/media/r0/preview_url", + "method": "get" + }, + { + "path": "/_matrix/client/r0/directory/room/{roomAlias}", + "method": "delete" + }, + { + "path": "/_matrix/client/r0/directory/room/{roomAlias}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/directory/room/{roomAlias}", + "method": "put" + }, + { + "path": "/_matrix/client/r0/sync", + "method": "get" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/read_markers", + "method": "post" + }, + { + "path": "/_matrix/client/r0/logout", + "method": "post" + }, + { + "path": "/_matrix/client/r0/notifications", + "method": "get" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/joined_members", + "method": "get" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/state/{eventType}/{stateKey}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/state/{eventType}/{stateKey}", + "method": "put" + }, + { + "path": "/_matrix/client/r0/user/{userId}/filter/{filterId}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/user/{userId}/rooms/{roomId}/account_data/{type}", + "method": "put" + }, + { + "path": "/_matrix/client/r0/joined_rooms", + "method": "get" + }, + { + "path": "/_matrix/client/r0/keys/changes", + "method": "get" + }, + { + "path": "/_matrix/client/r0/presence/{userId}/status", + "method": "get" + }, + { + "path": "/_matrix/client/r0/presence/{userId}/status", + "method": "put" + }, + { + "path": "/_matrix/client/r0/pushers", + "method": "get" + }, + { + "path": "/_matrix/client/r0/rooms/{roomId}/state", + "method": "get" + }, + { + "path": "/_matrix/media/r0/thumbnail/{serverName}/{mediaId}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/devices/{deviceId}", + "method": "delete" + }, + { + "path": "/_matrix/client/r0/devices/{deviceId}", + "method": "get" + }, + { + "path": "/_matrix/client/r0/devices/{deviceId}", + "method": "put" + }, + { + "path": "/_matrix/federation/v1/backfill/{roomId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/get_missing_events/{roomId}", + "method": "post" + }, + { + "path": "/_matrix/federation/v1/event_auth/{roomId}/{eventId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/query_auth/{roomId}/{eventId}", + "method": "post" + }, + { + "path": "/_matrix/federation/v1/state/{roomId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/state_ids/{roomId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/event/{eventId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/invite/{roomId}/{eventId}", + "method": "put" + }, + { + "path": "/_matrix/federation/v1/make_join/{roomId}/{userId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/send_join/{roomId}/{eventId}", + "method": "put" + }, + { + "path": "/_matrix/federation/v1/query/{serverName}/{keyId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/query", + "method": "post" + }, + { + "path": "/_matrix/federation/v1/server/{keyId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/make_leave/{roomId}/{userId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/send_leave/{roomId}/{eventId}", + "method": "put" + }, + { + "path": "/_matrix/federation/v1/openid/userinfo", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/publicRooms", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/query/directory", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/query/profile", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/query/{queryType}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/query_auth/{roomId}/{eventId}", + "method": "post" + }, + { + "path": "/_matrix/federation/v1/state/{roomId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/state_ids/{roomId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/event/{eventId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/event_auth/{roomId}/{eventId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/exchange_third_party_invite/{roomId}", + "method": "put" + }, + { + "path": "/_matrix/federation/v1/3pid/onbind", + "method": "put" + }, + { + "path": "/_matrix/federation/v1/send/{txnId}", + "method": "put" + }, + { + "path": "/_matrix/federation/v1/user/devices/{userId}", + "method": "get" + }, + { + "path": "/_matrix/federation/v1/user/keys/claim", + "method": "post" + }, + { + "path": "/_matrix/federation/v1/user/keys/query", + "method": "post" + } +] diff --git a/docker/proxy/proxy b/docker/proxy/proxy new file mode 100755 index 0000000000..17361fe726 Binary files /dev/null and b/docker/proxy/proxy differ diff --git a/docker/supervisord.conf b/docker/supervisord.conf new file mode 100644 index 0000000000..a37bbaf9b4 --- /dev/null +++ b/docker/supervisord.conf @@ -0,0 +1,8 @@ +[supervisord] +nodaemon=true + +[program:synapse] +command=/start.py + +[program:proxy] +command=/proxy