diff --git a/servers/containers/conduwuit.container b/servers/containers/conduwuit.container index 334d75a4..a9d45af0 100644 --- a/servers/containers/conduwuit.container +++ b/servers/containers/conduwuit.container @@ -14,7 +14,7 @@ Image=ghcr.io/girlbossceo/conduwuit:main ReadOnly=true Volume=/var/opt/conduwuit:/var/lib/conduwuit:z,U AutoUpdate=registry -# Network=web.network +Network=web.network # conduwuit uses quite a few file descriptors, and on some systems it defaults to 1024 Ulimit=nofile=1048567:1048567 diff --git a/servers/containers/mautrix-meta.container b/servers/containers/mautrix-meta.container new file mode 100644 index 00000000..ffce1235 --- /dev/null +++ b/servers/containers/mautrix-meta.container @@ -0,0 +1,46 @@ +[Unit] +Description=Matrix Meta Bridge +Wants=network-online.target +After=network-online.target +After=conduwuit.service +Documentation=https://github.com/mautrix/meta + +[Container] +ContainerName=mautrix-meta +Image=dock.mau.dev/mautrix/meta:latest +Volume=/var/opt/mautrix/meta:/data:z +AutoUpdate=registry +Network=web.network + +Label="traefik.enable=true" +Label="traefik.http.routers.mautrix-meta.rule=Host(`mautrix-meta.ellis.link`)" + +Label="traefik.http.routers.mautrix-meta.entrypoints=https" +Label="traefik.http.services.mautrix-meta.loadbalancer.server.port=29319" + +Label="traefik.http.routers.mautrix-meta.middlewares=default@file" + +Label="homepage.group=Services" +Label="homepage.name=mautrix-meta" +# Label="homepage.href=https://jade.ellis.link/" +# Label="homepage.siteMonitor=https://matrix.ellis.link/client/server.json" +Label="homepage.description=Matrix bridge" +Label="homepage.siteMonitor=https://mautrix-meta.ellis.link/_matrix/mau/ready" +# https://github.com/mautrix/go/blob/d89912cfcb416ffe26101790c043dd47e4508811/appservice/appservice.go#L69 +Label=kuma.__monitor='' + +StopTimeout=100 + +[Service] + +Restart=on-failure +RestartSec=5 + +TimeoutStopSec=2m +TimeoutStartSec=2m + +# StartLimitInterval=1m +StartLimitBurst=5 + +[Install] +WantedBy=default.target \ No newline at end of file diff --git a/servers/containers/mautrix-slack.container b/servers/containers/mautrix-slack.container new file mode 100644 index 00000000..c86a9ff0 --- /dev/null +++ b/servers/containers/mautrix-slack.container @@ -0,0 +1,46 @@ +[Unit] +Description=Matrix Slack Bridge +Wants=network-online.target +After=network-online.target +After=conduwuit.service +Documentation=https://github.com/mautrix/slack + +[Container] +ContainerName=mautrix-slack +Image=dock.mau.dev/mautrix/slack:latest +Volume=/var/opt/mautrix/slack:/data:z +AutoUpdate=registry +Network=web.network + +Label="traefik.enable=true" +Label="traefik.http.routers.mautrix-slack.rule=Host(`mautrix-slack.ellis.link`)" + +Label="traefik.http.routers.mautrix-slack.entrypoints=https" +Label="traefik.http.services.mautrix-slack.loadbalancer.server.port=29335" + +Label="traefik.http.routers.mautrix-slack.middlewares=default@file" + +Label="homepage.group=Services" +Label="homepage.name=mautrix-slack" +# Label="homepage.href=https://jade.ellis.link/" +# Label="homepage.siteMonitor=https://matrix.ellis.link/client/server.json" +Label="homepage.description=Matrix bridge" +Label="homepage.siteMonitor=https://mautrix-slack.ellis.link/_matrix/mau/ready" +# https://github.com/mautrix/go/blob/d89912cfcb416ffe26101790c043dd47e4508811/appservice/appservice.go#L69 +Label=kuma.__monitor='' + +StopTimeout=100 + +[Service] + +Restart=on-failure +RestartSec=5 + +TimeoutStopSec=2m +TimeoutStartSec=2m + +# StartLimitInterval=1m +StartLimitBurst=5 + +[Install] +WantedBy=default.target \ No newline at end of file diff --git a/servers/containers/mautrix-whatsapp.container b/servers/containers/mautrix-whatsapp.container new file mode 100644 index 00000000..265bef9f --- /dev/null +++ b/servers/containers/mautrix-whatsapp.container @@ -0,0 +1,46 @@ +[Unit] +Description=Matrix Whatsapp Bridge +Wants=network-online.target +After=network-online.target +After=conduwuit.service +Documentation=https://github.com/mautrix/whatsapp + +[Container] +ContainerName=mautrix-whatsapp +Image=dock.mau.dev/mautrix/whatsapp:latest +Volume=/var/opt/mautrix/whatsapp:/data:z +AutoUpdate=registry +Network=web.network + +Label="traefik.enable=true" +Label="traefik.http.routers.mautrix-whatsapp.rule=Host(`mautrix-whatsapp.ellis.link`)" + +Label="traefik.http.routers.mautrix-whatsapp.entrypoints=https" +Label="traefik.http.services.mautrix-whatsapp.loadbalancer.server.port=29318" + +Label="traefik.http.routers.mautrix-whatsapp.middlewares=default@file" + +Label="homepage.group=Services" +Label="homepage.name=mautrix-whatsapp" +# Label="homepage.href=https://jade.ellis.link/" +# Label="homepage.siteMonitor=https://matrix.ellis.link/client/server.json" +Label="homepage.description=Matrix bridge" +Label="homepage.siteMonitor=https://mautrix-whatsapp.ellis.link/_matrix/mau/ready" +# https://github.com/mautrix/go/blob/d89912cfcb416ffe26101790c043dd47e4508811/appservice/appservice.go#L69 +Label=kuma.__monitor='' + +StopTimeout=100 + +[Service] + +Restart=on-failure +RestartSec=5 + +TimeoutStopSec=2m +TimeoutStartSec=2m + +# StartLimitInterval=1m +StartLimitBurst=5 + +[Install] +WantedBy=default.target \ No newline at end of file diff --git a/servers/mautrix/discord/config.yaml b/servers/mautrix/discord/config.yaml index 546d0df1..42f4f3b2 100644 --- a/servers/mautrix/discord/config.yaml +++ b/servers/mautrix/discord/config.yaml @@ -27,7 +27,7 @@ homeserver: # Changing these values requires regeneration of the registration. appservice: # The address that the homeserver can use to connect to this appservice. - address: https://mautrix-discord.ellis.link + address: http://mautrix-discord:29334 # The hostname and port where this appservice should listen. hostname: 0.0.0.0 @@ -70,8 +70,8 @@ appservice: async_transactions: false # Authentication tokens for AS <-> HS communication. Autogenerated; do not modify. - as_token: "BeqHdZlIs5kscUgQG03TxLO6dWjjuFKTL0T0T5CGoBNxUfsAaYMGuNONgzrvXSni" - hs_token: "IvmSDAdVFV63hR7hjQDEDOptyyNm81JRvkr3l5l653lWG0MLJKlOc7mbNm0extWA" + as_token: "mR1qkqQ8XCgJ61ZkhPdPUfgrjpZFVUhwRqizD8AiAsPFKdHVtvwnNVAH4vvDKyks" + hs_token: "F3WF7uirTPUwMoUNBObcjZghoOUikYkFZtV8yPI3l4UxrNvVOjndmW3ev7Ypl099" # Bridge config bridge: @@ -264,7 +264,7 @@ bridge: require: false # Enable key sharing? If enabled, key requests for rooms where users are in will be fulfilled. # You must use a client that supports requesting keys from other users to use this feature. - allow_key_sharing: false + allow_key_sharing: true # Should users mentions be in the event wire content to enable the server to send push notifications? plaintext_mentions: false # Options for deleting megolm sessions from the bridge. diff --git a/servers/mautrix/discord/registration.yaml b/servers/mautrix/discord/registration.yaml index c92ed566..a1bc40f0 100644 --- a/servers/mautrix/discord/registration.yaml +++ b/servers/mautrix/discord/registration.yaml @@ -1,8 +1,8 @@ id: mautrix-discord -url: http://mautrix-discord -as_token: BeqHdZlIs5kscUgQG03TxLO6dWjjuFKTL0T0T5CGoBNxUfsAaYMGuNONgzrvXSni -hs_token: IvmSDAdVFV63hR7hjQDEDOptyyNm81JRvkr3l5l653lWG0MLJKlOc7mbNm0extWA -sender_localpart: zByRv7CUznpsLSEXztOuO05F3qhgRiqG +url: http://mautrix-discord:29334 +as_token: mR1qkqQ8XCgJ61ZkhPdPUfgrjpZFVUhwRqizD8AiAsPFKdHVtvwnNVAH4vvDKyks +hs_token: F3WF7uirTPUwMoUNBObcjZghoOUikYkFZtV8yPI3l4UxrNvVOjndmW3ev7Ypl099 +sender_localpart: KFwAMWXBNgYvWToZxHzoxdUvFCGe7W4d rate_limited: false namespaces: users: diff --git a/servers/mautrix/gmessages/config.yaml b/servers/mautrix/gmessages/config.yaml index 0b0c5a43..e90622e7 100644 --- a/servers/mautrix/gmessages/config.yaml +++ b/servers/mautrix/gmessages/config.yaml @@ -39,7 +39,7 @@ bridge: # By default, users who are in the same group on the remote network will be # in the same Matrix room bridged to that group. If this is set to true, # every user will get their own Matrix room instead. - split_portals: false + split_portals: true # Should the bridge resend `m.bridge` events to all portals on startup? resend_bridge_info: false @@ -48,6 +48,8 @@ bridge: # Should room tags only be synced when creating the portal? Tags mean things like favorite/pin and archive/low priority. # Tags currently can't be synced back to the remote network, so a continuous sync means tagging from Matrix will be undone. tag_only_on_create: true + # List of tags to allow bridging. If empty, no tags will be bridged. + only_bridge_tags: [m.favourite, m.lowpriority] # Should room mute status only be synced when creating the portal? # Like tags, mutes can't currently be synced back to the remote network. mute_only_on_create: false @@ -187,7 +189,7 @@ appservice: # Like the homeserver address, a local non-https address is recommended when the bridge is on the same machine. # If the bridge is elsewhere, you must secure the connection yourself (e.g. with https or wireguard) # If you want to use https, you need to use a reverse proxy. The bridge does not have TLS support built in. - address: https://mautrix-gmessages.ellis.link + address: http://mautrix-gmessages:29336 # A public address that external services can use to reach this appservice. # This is only needed for things like public media. A reverse proxy is generally necessary when using this field. # This value doesn't affect the registration file. @@ -218,8 +220,8 @@ appservice: async_transactions: false # Authentication tokens for AS <-> HS communication. Autogenerated; do not modify. - as_token: "APWnNkbbzv0qLd9ipuK7r6uYpSZz7p9PrbNU77YSPor6zaXAL8InKxPkgMpKH6KP" - hs_token: "Q8Ide055pQfvQwfDXusifJSscHkbB07DRaGoHQN39oj50DCbXiGXmTAYyCb61spa" + as_token: "wnU42Rb4pelI5yKKw92sTmjfsT9REURDfVzMg8ViNq2DsFs0lhhDVBx6j0AyLenS" + hs_token: "KY2MyJXVrR10FW2I53MPVC5WzzFOy3HGA34qE8bdmxMkymtvgdV5K7rEtuVe8GfQ" # Localpart template of MXIDs for remote users. # {{.}} is replaced with the internal ID of the user. @@ -366,7 +368,7 @@ encryption: appservice: false # Enable key sharing? If enabled, key requests for rooms where users are in will be fulfilled. # You must use a client that supports requesting keys from other users to use this feature. - allow_key_sharing: false + allow_key_sharing: true # Pickle key for encrypting encryption keys in the bridge database. # If set to generate, a random key will be generated. pickle_key: mEuyKHmmq99kA9uu5YNt89Ka2qHxuUequfH2RiIqqvzqO9txKTaRtO2CwujSxyAn diff --git a/servers/mautrix/gmessages/registration.yaml b/servers/mautrix/gmessages/registration.yaml index 109105b9..5e43147c 100644 --- a/servers/mautrix/gmessages/registration.yaml +++ b/servers/mautrix/gmessages/registration.yaml @@ -1,8 +1,8 @@ id: gmessages -url: https://mautrix-gmessages.ellis.link -as_token: APWnNkbbzv0qLd9ipuK7r6uYpSZz7p9PrbNU77YSPor6zaXAL8InKxPkgMpKH6KP -hs_token: Q8Ide055pQfvQwfDXusifJSscHkbB07DRaGoHQN39oj50DCbXiGXmTAYyCb61spa -sender_localpart: IDSTAgz6EZUIU4rLdnGkbeCT0fFUH14E +url: http://mautrix-gmessages:29336 +as_token: wnU42Rb4pelI5yKKw92sTmjfsT9REURDfVzMg8ViNq2DsFs0lhhDVBx6j0AyLenS +hs_token: KY2MyJXVrR10FW2I53MPVC5WzzFOy3HGA34qE8bdmxMkymtvgdV5K7rEtuVe8GfQ +sender_localpart: D9hn9fHRxePmuLxki8hcOLD6xiYUbzAf rate_limited: false namespaces: users: @@ -11,4 +11,4 @@ namespaces: - regex: ^@gmessages_mautrix_.*:ellis\.link$ exclusive: true de.sorunome.msc2409.push_ephemeral: true -push_ephemeral: true +receive_ephemeral: true diff --git a/servers/mautrix/meta/config.yaml b/servers/mautrix/meta/config.yaml new file mode 100644 index 00000000..f24011db --- /dev/null +++ b/servers/mautrix/meta/config.yaml @@ -0,0 +1,448 @@ +# Network-specific config options +network: + # Which service is this bridge for? Available options: + # * unset - allow users to pick any service when logging in (except facebook-tor) + # * facebook - connect to FB Messenger via facebook.com + # * facebook-tor - connect to FB Messenger via facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion + # (note: does not currently proxy media downloads) + # * messenger - connect to FB Messenger via messenger.com (can be used with the facebook side deactivated) + # * instagram - connect to Instagram DMs via instagram.com + # + # Remember to change the appservice id, bot profile info, bridge username_template and management_room_text too. + mode: + # When in Instagram mode, should the bridge connect to WhatsApp servers for encrypted chats? + # In FB/Messenger mode encryption is always enabled, this option only affects Instagram mode. + ig_e2ee: true + # Displayname template for FB/IG users. Available variables: + # .DisplayName - The display name set by the user. + # .Username - The username set by the user. + # .ID - The internal user ID of the user. + displayname_template: '{{or .DisplayName .Username "Unknown user"}}' + # Static proxy address (HTTP or SOCKS5) for connecting to Meta. + proxy: + # HTTP endpoint to request new proxy address from, for dynamically assigned proxies. + # The endpoint must return a JSON body with a string field called proxy_url. + get_proxy_from: + # Should media be proxied too? + proxy_media: false + # Minimum interval between full reconnects in seconds, default is 1 hour + min_full_reconnect_interval_seconds: 3600 + # Interval to force refresh the connection (full reconnect), default is 20 hours. Set 0 to disable force refreshes. + force_refresh_interval_seconds: 72000 + # Disable fetching XMA media (reels, stories, etc) when backfilling. + disable_xma_backfill: true + # Disable fetching XMA media entirely. + disable_xma_always: false + +# Config options that affect the central bridge module. +bridge: + # The prefix for commands. Only required in non-management rooms. + command_prefix: '!meta' + # Should the bridge create a space for each login containing the rooms that account is in? + personal_filtering_spaces: true + # Whether the bridge should set names and avatars explicitly for DM portals. + # This is only necessary when using clients that don't support MSC4171. + private_chat_portal_meta: true + # Should events be handled asynchronously within portal rooms? + # If true, events may end up being out of order, but slow events won't block other ones. + # This is not yet safe to use. + async_events: false + # Should every user have their own portals rather than sharing them? + # By default, users who are in the same group on the remote network will be + # in the same Matrix room bridged to that group. If this is set to true, + # every user will get their own Matrix room instead. + split_portals: false + # Should the bridge resend `m.bridge` events to all portals on startup? + resend_bridge_info: false + + # Should leaving Matrix rooms be bridged as leaving groups on the remote network? + bridge_matrix_leave: false + # Should room tags only be synced when creating the portal? Tags mean things like favorite/pin and archive/low priority. + # Tags currently can't be synced back to the remote network, so a continuous sync means tagging from Matrix will be undone. + tag_only_on_create: true + # List of tags to allow bridging. If empty, no tags will be bridged. + only_bridge_tags: [m.favourite, m.lowpriority] + # Should room mute status only be synced when creating the portal? + # Like tags, mutes can't currently be synced back to the remote network. + mute_only_on_create: true + + # What should be done to portal rooms when a user logs out or is logged out? + # Permitted values: + # nothing - Do nothing, let the user stay in the portals + # kick - Remove the user from the portal rooms, but don't delete them + # unbridge - Remove all ghosts in the room and disassociate it from the remote chat + # delete - Remove all ghosts and users from the room (i.e. delete it) + cleanup_on_logout: + # Should cleanup on logout be enabled at all? + enabled: false + # Settings for manual logouts (explicitly initiated by the Matrix user) + manual: + # Action for private portals which will never be shared with other Matrix users. + private: nothing + # Action for portals with a relay user configured. + relayed: nothing + # Action for portals which may be shared, but don't currently have any other Matrix users. + shared_no_users: nothing + # Action for portals which have other logged-in Matrix users. + shared_has_users: nothing + # Settings for credentials being invalidated (initiated by the remote network, possibly through user action). + # Keys have the same meanings as in the manual section. + bad_credentials: + private: nothing + relayed: nothing + shared_no_users: nothing + shared_has_users: nothing + + # Settings for relay mode + relay: + # Whether relay mode should be allowed. If allowed, the set-relay command can be used to turn any + # authenticated user into a relaybot for that chat. + enabled: false + # Should only admins be allowed to set themselves as relay users? + # If true, non-admins can only set users listed in default_relays as relays in a room. + admin_only: true + # List of user login IDs which anyone can set as a relay, as long as the relay user is in the room. + default_relays: [] + # The formats to use when sending messages via the relaybot. + # Available variables: + # .Sender.UserID - The Matrix user ID of the sender. + # .Sender.Displayname - The display name of the sender (if set). + # .Sender.RequiresDisambiguation - Whether the sender's name may be confused with the name of another user in the room. + # .Sender.DisambiguatedName - The disambiguated name of the sender. This will be the displayname if set, + # plus the user ID in parentheses if the displayname is not unique. + # If the displayname is not set, this is just the user ID. + # .Message - The `formatted_body` field of the message. + # .Caption - The `formatted_body` field of the message, if it's a caption. Otherwise an empty string. + # .FileName - The name of the file being sent. + message_formats: + m.text: "{{ .Sender.DisambiguatedName }}: {{ .Message }}" + m.notice: "{{ .Sender.DisambiguatedName }}: {{ .Message }}" + m.emote: "* {{ .Sender.DisambiguatedName }} {{ .Message }}" + m.file: "{{ .Sender.DisambiguatedName }} sent a file{{ if .Caption }}: {{ .Caption }}{{ end }}" + m.image: "{{ .Sender.DisambiguatedName }} sent an image{{ if .Caption }}: {{ .Caption }}{{ end }}" + m.audio: "{{ .Sender.DisambiguatedName }} sent an audio file{{ if .Caption }}: {{ .Caption }}{{ end }}" + m.video: "{{ .Sender.DisambiguatedName }} sent a video{{ if .Caption }}: {{ .Caption }}{{ end }}" + m.location: "{{ .Sender.DisambiguatedName }} sent a location{{ if .Caption }}: {{ .Caption }}{{ end }}" + # For networks that support per-message displaynames (i.e. Slack and Discord), the template for those names. + # This has all the Sender variables available under message_formats (but without the .Sender prefix). + # Note that you need to manually remove the displayname from message_formats above. + displayname_format: "{{ .DisambiguatedName }}" + + # Permissions for using the bridge. + # Permitted values: + # relay - Talk through the relaybot (if enabled), no access otherwise + # commands - Access to use commands in the bridge, but not login. + # user - Access to use the bridge with puppeting. + # admin - Full access, user level with some additional administration tools. + # Permitted keys: + # * - All Matrix users + # domain - All users on that homeserver + # mxid - Specific user + permissions: + "*": relay + "ellis.link": user + "pissing.dev": user + "@jade:ellis.link": admin + +# Config for the bridge's database. +database: + # The database type. "sqlite3-fk-wal" and "postgres" are supported. + type: sqlite3-fk-wal + # The database URI. + # SQLite: A raw file path is supported, but `file:?_txlock=immediate` is recommended. + # https://github.com/mattn/go-sqlite3#connection-string + # Postgres: Connection string. For example, postgres://user:password@host/database?sslmode=disable + # To connect via Unix socket, use something like postgres:///dbname?host=/var/run/postgresql + uri: file:/data/mautrix-meta.db?_txlock=immediate + # Maximum number of connections. + max_open_conns: 5 + max_idle_conns: 1 + # Maximum connection idle time and lifetime before they're closed. Disabled if null. + # Parsed with https://pkg.go.dev/time#ParseDuration + max_conn_idle_time: null + max_conn_lifetime: null + +# Homeserver details. +homeserver: + # The address that this appservice can use to connect to the homeserver. + # Local addresses without HTTPS are generally recommended when the bridge is running on the same machine, + # but https also works if they run on different machines. + address: https://matrix.ellis.link + # The domain of the homeserver (also known as server_name, used for MXIDs, etc). + domain: ellis.link + + # What software is the homeserver running? + # Standard Matrix homeservers like Synapse, Dendrite and Conduit should just use "standard" here. + software: standard + # The URL to push real-time bridge status to. + # If set, the bridge will make POST requests to this URL whenever a user's remote network connection state changes. + # The bridge will use the appservice as_token to authorize requests. + status_endpoint: + # Endpoint for reporting per-message status. + # If set, the bridge will make POST requests to this URL when processing a message from Matrix. + # It will make one request when receiving the message (step BRIDGE), one after decrypting if applicable + # (step DECRYPTED) and one after sending to the remote network (step REMOTE). Errors will also be reported. + # The bridge will use the appservice as_token to authorize requests. + message_send_checkpoint_endpoint: + # Does the homeserver support https://github.com/matrix-org/matrix-spec-proposals/pull/2246? + async_media: false + + # Should the bridge use a websocket for connecting to the homeserver? + # The server side is currently not documented anywhere and is only implemented by mautrix-wsproxy, + # mautrix-asmux (deprecated), and hungryserv (proprietary). + websocket: false + # How often should the websocket be pinged? Pinging will be disabled if this is zero. + ping_interval_seconds: 0 + +# Application service host/registration related details. +# Changing these values requires regeneration of the registration (except when noted otherwise) +appservice: + # The address that the homeserver can use to connect to this appservice. + # Like the homeserver address, a local non-https address is recommended when the bridge is on the same machine. + # If the bridge is elsewhere, you must secure the connection yourself (e.g. with https or wireguard) + # If you want to use https, you need to use a reverse proxy. The bridge does not have TLS support built in. + address: http://mautrix-meta:29319 + # A public address that external services can use to reach this appservice. + # This is only needed for things like public media. A reverse proxy is generally necessary when using this field. + # This value doesn't affect the registration file. + public_address: https://mautrix-meta.ellis.link + + # The hostname and port where this appservice should listen. + # For Docker, you generally have to change the hostname to 0.0.0.0. + hostname: 0.0.0.0 + port: 29319 + + # The unique ID of this appservice. + id: meta + # Appservice bot details. + bot: + # Username of the appservice bot. + username: metabot + # Display name and avatar for bot. Set to "remove" to remove display name/avatar, leave empty + # to leave display name/avatar as-is. + displayname: Meta bridge bot + avatar: mxc://maunium.net/DxpVrwwzPUwaUSazpsjXgcKB + + # Whether to receive ephemeral events via appservice transactions. + ephemeral_events: true + # Should incoming events be handled asynchronously? + # This may be necessary for large public instances with lots of messages going through. + # However, messages will not be guaranteed to be bridged in the same order they were sent in. + # This value doesn't affect the registration file. + async_transactions: false + + # Authentication tokens for AS <-> HS communication. Autogenerated; do not modify. + as_token: "0lyeofAXPdUo8CGiaRSDf9AznhSn2uwVTWz7rk8uMjzgYoPVmml9HsVV69qw05GY" + hs_token: "niBvXHLbGcwS85ytNyRqRQ4RLHtsE23n3nA62ufulH11Aui7nvVWXNr1Yc59qizm" + + # Localpart template of MXIDs for remote users. + # {{.}} is replaced with the internal ID of the user. + username_template: meta_mautrix_{{.}} + +# Config options that affect the Matrix connector of the bridge. +matrix: + # Whether the bridge should send the message status as a custom com.beeper.message_send_status event. + message_status_events: false + # Whether the bridge should send a read receipt after successfully bridging a message. + delivery_receipts: true + # Whether the bridge should send error notices via m.notice events when a message fails to bridge. + message_error_notices: true + # Whether the bridge should update the m.direct account data event when double puppeting is enabled. + sync_direct_chat_list: true + # Whether created rooms should have federation enabled. If false, created portal rooms + # will never be federated. Changing this option requires recreating rooms. + federate_rooms: true + # The threshold as bytes after which the bridge should roundtrip uploads via the disk + # rather than keeping the whole file in memory. + upload_file_threshold: 5242880 + +# Segment-compatible analytics endpoint for tracking some events, like provisioning API login and encryption errors. +analytics: + # API key to send with tracking requests. Tracking is disabled if this is null. + token: null + # Address to send tracking requests to. + url: https://api.segment.io/v1/track + # Optional user ID for tracking events. If null, defaults to using Matrix user ID. + user_id: null + +# Settings for provisioning API +provisioning: + # Prefix for the provisioning API paths. + prefix: /_matrix/provision + # Shared secret for authentication. If set to "generate" or null, a random secret will be generated, + # or if set to "disable", the provisioning API will be disabled. + shared_secret: p4KjPCSsV8IWuffblnhDuUsWGN98tdZMiQ7Uy5RBAY3VOwtf6NNlb3Weo6kMDBJb + # Whether to allow provisioning API requests to be authed using Matrix access tokens. + # This follows the same rules as double puppeting to determine which server to contact to check the token, + # which means that by default, it only works for users on the same server as the bridge. + allow_matrix_auth: true + # Enable debug API at /debug with provisioning authentication. + debug_endpoints: false + +# Some networks require publicly accessible media download links (e.g. for user avatars when using Discord webhooks). +# These settings control whether the bridge will provide such public media access. +public_media: + # Should public media be enabled at all? + # The public_address field under the appservice section MUST be set when enabling public media. + enabled: true + # A key for signing public media URLs. + # If set to "generate", a random key will be generated. + signing_key: rUU8zdYwJ5t2YxBW46NiOkYj1XAYZGE78YaCvqmsQVPgRxP5r7qlt9FjejuBolKw + # Number of seconds that public media URLs are valid for. + # If set to 0, URLs will never expire. + expiry: 0 + # Length of hash to use for public media URLs. Must be between 0 and 32. + hash_length: 32 + +# Settings for converting remote media to custom mxc:// URIs instead of reuploading. +# More details can be found at https://docs.mau.fi/bridges/go/discord/direct-media.html +direct_media: + # Should custom mxc:// URIs be used instead of reuploading media? + enabled: false + # The server name to use for the custom mxc:// URIs. + # This server name will effectively be a real Matrix server, it just won't implement anything other than media. + # You must either set up .well-known delegation from this domain to the bridge, or proxy the domain directly to the bridge. + server_name: mautrix-meta.ellis.link + # Optionally a custom .well-known response. This defaults to `server_name:443` + well_known_response: + # Optionally specify a custom prefix for the media ID part of the MXC URI. + media_id_prefix: + # If the remote network supports media downloads over HTTP, then the bridge will use MSC3860/MSC3916 + # media download redirects if the requester supports it. Optionally, you can force redirects + # and not allow proxying at all by setting this to false. + # This option does nothing if the remote network does not support media downloads over HTTP. + allow_proxy: true + # Matrix server signing key to make the federation tester pass, same format as synapse's .signing.key file. + # This key is also used to sign the mxc:// URIs to ensure only the bridge can generate them. + server_key: ed25519 EvLWeg lnhT3MBOejlgcZjbH4TzW9wrrPShgk9lHm7ZMtr9g1Y + +# Settings for backfilling messages. +# Note that the exact way settings are applied depends on the network connector. +# See https://docs.mau.fi/bridges/general/backfill.html for more details. +backfill: + # Whether to do backfilling at all. + enabled: true + # Maximum number of messages to backfill in empty rooms. + max_initial_messages: 200 + # Maximum number of missed messages to backfill after bridge restarts. + max_catchup_messages: 500 + # If a backfilled chat is older than this number of hours, + # mark it as read even if it's unread on the remote network. + unread_hours_threshold: 720 + # Settings for backfilling threads within other backfills. + threads: + # Maximum number of messages to backfill in a new thread. + max_initial_messages: 500 + # Settings for the backwards backfill queue. This only applies when connecting to + # Beeper as standard Matrix servers don't support inserting messages into history. + queue: + # Should the backfill queue be enabled? + enabled: false + # Number of messages to backfill in one batch. + batch_size: 100 + # Delay between batches in seconds. + batch_delay: 20 + # Maximum number of batches to backfill per portal. + # If set to -1, all available messages will be backfilled. + max_batches: -1 + # Optional network-specific overrides for max batches. + # Interpretation of this field depends on the network connector. + max_batches_override: {} + +# Settings for enabling double puppeting +double_puppet: + # Servers to always allow double puppeting from. + # This is only for other servers and should NOT contain the server the bridge is on. + servers: + anotherserver.example.org: https://matrix.anotherserver.example.org + # Whether to allow client API URL discovery for other servers. When using this option, + # users on other servers can use double puppeting even if their server URLs aren't + # explicitly added to the servers map above. + allow_discovery: false + # Shared secrets for automatic double puppeting. + # See https://docs.mau.fi/bridges/general/double-puppeting.html for instructions. + secrets: + ellis.link: "as_token:fR52cysNJ2s7MbQ7PscEfHIyiW" + pissing.dev: "as_token:fR52cysNJ2s7MbQ7PscEfHIyiW" + +# End-to-bridge encryption support options. +# +# See https://docs.mau.fi/bridges/general/end-to-bridge-encryption.html for more info. +encryption: + # Whether to enable encryption at all. If false, the bridge will not function in encrypted rooms. + allow: true + # Whether to force-enable encryption in all bridged rooms. + default: false + # Whether to require all messages to be encrypted and drop any unencrypted messages. + require: false + # Whether to use MSC2409/MSC3202 instead of /sync long polling for receiving encryption-related data. + # This option is not yet compatible with standard Matrix servers like Synapse and should not be used. + appservice: false + # Enable key sharing? If enabled, key requests for rooms where users are in will be fulfilled. + # You must use a client that supports requesting keys from other users to use this feature. + allow_key_sharing: true + # Pickle key for encrypting encryption keys in the bridge database. + # If set to generate, a random key will be generated. + pickle_key: SCn8tBvXYXttBnRQvzfo1vPGGjemnQD1sRzSwqReQ1Mdxr6I92PlwrGnSr3nEfwf + # Options for deleting megolm sessions from the bridge. + delete_keys: + # Beeper-specific: delete outbound sessions when hungryserv confirms + # that the user has uploaded the key to key backup. + delete_outbound_on_ack: false + # Don't store outbound sessions in the inbound table. + dont_store_outbound: false + # Ratchet megolm sessions forward after decrypting messages. + ratchet_on_decrypt: false + # Delete fully used keys (index >= max_messages) after decrypting messages. + delete_fully_used_on_decrypt: false + # Delete previous megolm sessions from same device when receiving a new one. + delete_prev_on_new_session: false + # Delete megolm sessions received from a device when the device is deleted. + delete_on_device_delete: false + # Periodically delete megolm sessions when 2x max_age has passed since receiving the session. + periodically_delete_expired: false + # Delete inbound megolm sessions that don't have the received_at field used for + # automatic ratcheting and expired session deletion. This is meant as a migration + # to delete old keys prior to the bridge update. + delete_outdated_inbound: false + # What level of device verification should be required from users? + # + # Valid levels: + # unverified - Send keys to all device in the room. + # cross-signed-untrusted - Require valid cross-signing, but trust all cross-signing keys. + # cross-signed-tofu - Require valid cross-signing, trust cross-signing keys on first use (and reject changes). + # cross-signed-verified - Require valid cross-signing, plus a valid user signature from the bridge bot. + # Note that creating user signatures from the bridge bot is not currently possible. + # verified - Require manual per-device verification + # (currently only possible by modifying the `trust` column in the `crypto_device` database table). + verification_levels: + # Minimum level for which the bridge should send keys to when bridging messages from the remote network to Matrix. + receive: unverified + # Minimum level that the bridge should accept for incoming Matrix messages. + send: unverified + # Minimum level that the bridge should require for accepting key requests. + share: cross-signed-tofu + # Options for Megolm room key rotation. These options allow you to configure the m.room.encryption event content. + # See https://spec.matrix.org/v1.10/client-server-api/#mroomencryption for more information about that event. + rotation: + # Enable custom Megolm room key rotation settings. Note that these + # settings will only apply to rooms created after this option is set. + enable_custom: false + # The maximum number of milliseconds a session should be used + # before changing it. The Matrix spec recommends 604800000 (a week) + # as the default. + milliseconds: 604800000 + # The maximum number of messages that should be sent with a given a + # session before changing it. The Matrix spec recommends 100 as the + # default. + messages: 100 + # Disable rotating keys when a user's devices change? + # You should not enable this option unless you understand all the implications. + disable_device_change_key_rotation: false + +# Logging config. See https://github.com/tulir/zeroconfig for details. +logging: + min_level: debug + writers: + - type: stdout + format: pretty-colored diff --git a/servers/mautrix/meta/registration.yaml b/servers/mautrix/meta/registration.yaml new file mode 100644 index 00000000..b12e6f37 --- /dev/null +++ b/servers/mautrix/meta/registration.yaml @@ -0,0 +1,14 @@ +id: meta +url: http://mautrix-meta:29319 +as_token: 0lyeofAXPdUo8CGiaRSDf9AznhSn2uwVTWz7rk8uMjzgYoPVmml9HsVV69qw05GY +hs_token: niBvXHLbGcwS85ytNyRqRQ4RLHtsE23n3nA62ufulH11Aui7nvVWXNr1Yc59qizm +sender_localpart: Th7nrwqlBwmYlwg749Qa8IGlHYPjYQC5 +rate_limited: false +namespaces: + users: + - regex: ^@metabot:ellis\.link$ + exclusive: true + - regex: ^@meta_mautrix_.*:ellis\.link$ + exclusive: true +de.sorunome.msc2409.push_ephemeral: true +receive_ephemeral: true diff --git a/servers/mautrix/signal/config.yaml b/servers/mautrix/signal/config.yaml index d317962e..9c371e0b 100644 --- a/servers/mautrix/signal/config.yaml +++ b/servers/mautrix/signal/config.yaml @@ -6,13 +6,13 @@ network: # {{.PhoneNumber}} - The phone number of the user. # {{.UUID}} - The UUID of the Signal user. # {{.AboutEmoji}} - The emoji set by the user in their profile. - displayname_template: '{{or .ProfileName .PhoneNumber "Unknown user"}}' + displayname_template: '{{or .ContactName .ProfileName .PhoneNumber "Unknown user"}} ({{.AboutEmoji}})' # Should avatars from the user's contact list be used? This is not safe on multi-user instances. use_contact_avatars: false # Should the bridge request the user's contact list from the phone on startup? sync_contacts_on_startup: true # Should the bridge sync ghost user info even if profile fetching fails? This is not safe on multi-user instances. - use_outdated_profiles: false + use_outdated_profiles: true # Should the Signal user's phone number be included in the room topic in private chat portal rooms? number_in_topic: true # Default device name that shows up in the Signal app. @@ -41,7 +41,7 @@ bridge: # By default, users who are in the same group on the remote network will be # in the same Matrix room bridged to that group. If this is set to true, # every user will get their own Matrix room instead. - split_portals: false + split_portals: true # Should the bridge resend `m.bridge` events to all portals on startup? resend_bridge_info: false @@ -50,6 +50,8 @@ bridge: # Should room tags only be synced when creating the portal? Tags mean things like favorite/pin and archive/low priority. # Tags currently can't be synced back to the remote network, so a continuous sync means tagging from Matrix will be undone. tag_only_on_create: true + # List of tags to allow bridging. If empty, no tags will be bridged. + only_bridge_tags: [m.favourite, m.lowpriority] # Should room mute status only be synced when creating the portal? # Like tags, mutes can't currently be synced back to the remote network. mute_only_on_create: true @@ -189,7 +191,7 @@ appservice: # Like the homeserver address, a local non-https address is recommended when the bridge is on the same machine. # If the bridge is elsewhere, you must secure the connection yourself (e.g. with https or wireguard) # If you want to use https, you need to use a reverse proxy. The bridge does not have TLS support built in. - address: https://mautrix-signal.ellis.link + address: http://mautrix-signal:29328 # A public address that external services can use to reach this appservice. # This is only needed for things like public media. A reverse proxy is generally necessary when using this field. # This value doesn't affect the registration file. @@ -220,8 +222,8 @@ appservice: async_transactions: false # Authentication tokens for AS <-> HS communication. Autogenerated; do not modify. - as_token: "rVGOwgNx47PAAG4FKGyJ8RTBVykukhCTX7mFgaw5bssQp0XxZqOuVxZNEBcbL6ye" - hs_token: "OEaJcaOwEsvSiYqQ8B48YPUN4RNvEWFGX9Jtp3u99teVNIkyW8WOKgCjaoYkLuGf" + as_token: "ldsvjlrfQ1J20jkEpiLcQWV0ao3s6HnQUnZSoxwD0C9TaC6KtXuIg7BQfLzy0MBS" + hs_token: "IXI940ZGDb0YOugWLBAroVVsl32cUpukL8y2JdCqcvyqJZzjG4XRWodlvwR73RTL" # Localpart template of MXIDs for remote users. # {{.}} is replaced with the internal ID of the user. diff --git a/servers/mautrix/signal/registration.yaml b/servers/mautrix/signal/registration.yaml index 574fe827..0f576a43 100644 --- a/servers/mautrix/signal/registration.yaml +++ b/servers/mautrix/signal/registration.yaml @@ -1,8 +1,8 @@ id: signal -url: https://mautrix-signal.ellis.link -as_token: rVGOwgNx47PAAG4FKGyJ8RTBVykukhCTX7mFgaw5bssQp0XxZqOuVxZNEBcbL6ye -hs_token: OEaJcaOwEsvSiYqQ8B48YPUN4RNvEWFGX9Jtp3u99teVNIkyW8WOKgCjaoYkLuGf -sender_localpart: HNbLNuLwQBDrav8OHEzhatWaZXC67aKn +url: http://mautrix-signal:29328 +as_token: ldsvjlrfQ1J20jkEpiLcQWV0ao3s6HnQUnZSoxwD0C9TaC6KtXuIg7BQfLzy0MBS +hs_token: IXI940ZGDb0YOugWLBAroVVsl32cUpukL8y2JdCqcvyqJZzjG4XRWodlvwR73RTL +sender_localpart: fqdcOOEFXg119Er1ZGhybnolo0G2qWaR rate_limited: false namespaces: users: @@ -11,4 +11,4 @@ namespaces: - regex: ^@signal_mautrix_.*:ellis\.link$ exclusive: true de.sorunome.msc2409.push_ephemeral: true -push_ephemeral: true +receive_ephemeral: true diff --git a/servers/mautrix/slack/config.yaml b/servers/mautrix/slack/config.yaml new file mode 100644 index 00000000..c41169f0 --- /dev/null +++ b/servers/mautrix/slack/config.yaml @@ -0,0 +1,473 @@ +# Network-specific config options +network: + # Displayname template for Slack users. Available variables: + # .Name - The username of the user + # .Team.Name - The name of the team the channel is in + # .Team.Domain - The Slack subdomain of the team the channel is in + # .ID - The internal ID of the user + # .IsBot - Whether the user is a bot + # .Profile.DisplayName - The username or real name of the user (depending on settings) + # Variables only available for users (not bots): + # .TeamID - The internal ID of the workspace the user is in + # .TZ - The timezone region of the user (e.g. Europe/London) + # .TZLabel - The label of the timezone of the user (e.g. Greenwich Mean Time) + # .TZOffset - The UTC offset of the timezone of the user (e.g. 0) + # .Profile.RealName - The real name of the user + # .Profile.FirstName - The first name of the user + # .Profile.LastName - The last name of the user + # .Profile.Title - The job title of the user + # .Profile.Pronouns - The pronouns of the user + # .Profile.Email - The email address of the user + # .Profile.Phone - The formatted phone number of the user + displayname_template: '{{or .Profile.DisplayName .Profile.RealName .Name}}{{if .IsBot}} (bot){{end}}' + # Channel name template for Slack channels (all types). Available variables: + # .Name - The name of the channel + # .Team.Name - The name of the team the channel is in + # .Team.Domain - The Slack subdomain of the team the channel is in + # .ID - The internal ID of the channel + # .IsNoteToSelf - Whether the channel is a DM with yourself + # .IsGeneral - Whether the channel is the #general channel + # .IsChannel - Whether the channel is a channel (rather than a DM) + # .IsPrivate - Whether the channel is private + # .IsIM - Whether the channel is a one-to-one DM + # .IsMpIM - Whether the channel is a group DM + # .IsShared - Whether the channel is shared with another workspace. + # .IsExtShared - Whether the channel is shared with an external organization. + # .IsOrgShared - Whether the channel is shared with an organization in the same enterprise grid. + channel_name_template: '{{if and .IsChannel (not .IsPrivate)}}#{{end}}{{.Name}}{{if .IsNoteToSelf}} (you){{end}}' + # Displayname template for Slack workspaces. Available variables: + # .Name - The name of the team + # .Domain - The Slack subdomain of the team + # .ID - The internal ID of the team + team_name_template: "{{ .Name }}" + # Should incoming custom emoji reactions be bridged as mxc:// URIs? + # If set to false, custom emoji reactions will be bridged as the shortcode instead, and the image won't be available. + custom_emoji_reactions: true + # Should channels and group DMs have the workspace icon as the Matrix room avatar? + workspace_avatar_in_rooms: true + # Number of participants to sync in channels (doesn't affect group DMs) + participant_sync_count: 5 + # Should channel participants only be synced when creating the room? + # If you want participants to always be accurately synced, set participant_sync_count to a high value and this to false. + participant_sync_only_on_create: true + # Should channel portals be muted by default? + mute_channels_by_default: false + # Options for backfilling messages from Slack. + backfill: + # Number of conversations to fetch from Slack when syncing workspace. + # This option applies even if message backfill is disabled below. + # If set to -1, all chats in the client.boot response will be bridged, and nothing will be fetched separately. + conversation_count: -1 + +# Config options that affect the central bridge module. +bridge: + # The prefix for commands. Only required in non-management rooms. + command_prefix: '!slack' + # Should the bridge create a space for each login containing the rooms that account is in? + personal_filtering_spaces: true + # Whether the bridge should set names and avatars explicitly for DM portals. + # This is only necessary when using clients that don't support MSC4171. + private_chat_portal_meta: true + # Should events be handled asynchronously within portal rooms? + # If true, events may end up being out of order, but slow events won't block other ones. + # This is not yet safe to use. + async_events: false + # Should every user have their own portals rather than sharing them? + # By default, users who are in the same group on the remote network will be + # in the same Matrix room bridged to that group. If this is set to true, + # every user will get their own Matrix room instead. + split_portals: false + # Should the bridge resend `m.bridge` events to all portals on startup? + resend_bridge_info: false + + # Should leaving Matrix rooms be bridged as leaving groups on the remote network? + bridge_matrix_leave: false + # Should room tags only be synced when creating the portal? Tags mean things like favorite/pin and archive/low priority. + # Tags currently can't be synced back to the remote network, so a continuous sync means tagging from Matrix will be undone. + tag_only_on_create: true + # List of tags to allow bridging. If empty, no tags will be bridged. + only_bridge_tags: [m.favourite, m.lowpriority] + # Should room mute status only be synced when creating the portal? + # Like tags, mutes can't currently be synced back to the remote network. + mute_only_on_create: true + + # What should be done to portal rooms when a user logs out or is logged out? + # Permitted values: + # nothing - Do nothing, let the user stay in the portals + # kick - Remove the user from the portal rooms, but don't delete them + # unbridge - Remove all ghosts in the room and disassociate it from the remote chat + # delete - Remove all ghosts and users from the room (i.e. delete it) + cleanup_on_logout: + # Should cleanup on logout be enabled at all? + enabled: false + # Settings for manual logouts (explicitly initiated by the Matrix user) + manual: + # Action for private portals which will never be shared with other Matrix users. + private: nothing + # Action for portals with a relay user configured. + relayed: nothing + # Action for portals which may be shared, but don't currently have any other Matrix users. + shared_no_users: nothing + # Action for portals which have other logged-in Matrix users. + shared_has_users: nothing + # Settings for credentials being invalidated (initiated by the remote network, possibly through user action). + # Keys have the same meanings as in the manual section. + bad_credentials: + private: nothing + relayed: nothing + shared_no_users: nothing + shared_has_users: nothing + + # Settings for relay mode + relay: + # Whether relay mode should be allowed. If allowed, the set-relay command can be used to turn any + # authenticated user into a relaybot for that chat. + enabled: false + # Should only admins be allowed to set themselves as relay users? + # If true, non-admins can only set users listed in default_relays as relays in a room. + admin_only: true + # List of user login IDs which anyone can set as a relay, as long as the relay user is in the room. + default_relays: [] + # The formats to use when sending messages via the relaybot. + # Available variables: + # .Sender.UserID - The Matrix user ID of the sender. + # .Sender.Displayname - The display name of the sender (if set). + # .Sender.RequiresDisambiguation - Whether the sender's name may be confused with the name of another user in the room. + # .Sender.DisambiguatedName - The disambiguated name of the sender. This will be the displayname if set, + # plus the user ID in parentheses if the displayname is not unique. + # If the displayname is not set, this is just the user ID. + # .Message - The `formatted_body` field of the message. + # .Caption - The `formatted_body` field of the message, if it's a caption. Otherwise an empty string. + # .FileName - The name of the file being sent. + message_formats: + m.text: "{{ .Sender.DisambiguatedName }}: {{ .Message }}" + m.notice: "{{ .Sender.DisambiguatedName }}: {{ .Message }}" + m.emote: "* {{ .Sender.DisambiguatedName }} {{ .Message }}" + m.file: "{{ .Sender.DisambiguatedName }} sent a file{{ if .Caption }}: {{ .Caption }}{{ end }}" + m.image: "{{ .Sender.DisambiguatedName }} sent an image{{ if .Caption }}: {{ .Caption }}{{ end }}" + m.audio: "{{ .Sender.DisambiguatedName }} sent an audio file{{ if .Caption }}: {{ .Caption }}{{ end }}" + m.video: "{{ .Sender.DisambiguatedName }} sent a video{{ if .Caption }}: {{ .Caption }}{{ end }}" + m.location: "{{ .Sender.DisambiguatedName }} sent a location{{ if .Caption }}: {{ .Caption }}{{ end }}" + # For networks that support per-message displaynames (i.e. Slack and Discord), the template for those names. + # This has all the Sender variables available under message_formats (but without the .Sender prefix). + # Note that you need to manually remove the displayname from message_formats above. + displayname_format: "{{ .DisambiguatedName }}" + + # Permissions for using the bridge. + # Permitted values: + # relay - Talk through the relaybot (if enabled), no access otherwise + # commands - Access to use commands in the bridge, but not login. + # user - Access to use the bridge with puppeting. + # admin - Full access, user level with some additional administration tools. + # Permitted keys: + # * - All Matrix users + # domain - All users on that homeserver + # mxid - Specific user + permissions: + "*": relay + "ellis.link": user + "pissing.dev": user + "@jade:ellis.link": admin + +# Config for the bridge's database. +database: + # The database type. "sqlite3-fk-wal" and "postgres" are supported. + type: sqlite3-fk-wal + # The database URI. + # SQLite: A raw file path is supported, but `file:?_txlock=immediate` is recommended. + # https://github.com/mattn/go-sqlite3#connection-string + # Postgres: Connection string. For example, postgres://user:password@host/database?sslmode=disable + # To connect via Unix socket, use something like postgres:///dbname?host=/var/run/postgresql + uri: file:/data/mautrix-slack.db?_txlock=immediate + # Maximum number of connections. + max_open_conns: 5 + max_idle_conns: 1 + # Maximum connection idle time and lifetime before they're closed. Disabled if null. + # Parsed with https://pkg.go.dev/time#ParseDuration + max_conn_idle_time: null + max_conn_lifetime: null + +# Homeserver details. +homeserver: + # The address that this appservice can use to connect to the homeserver. + # Local addresses without HTTPS are generally recommended when the bridge is running on the same machine, + # but https also works if they run on different machines. + address: https://matrix.ellis.link + # The domain of the homeserver (also known as server_name, used for MXIDs, etc). + domain: ellis.link + + # What software is the homeserver running? + # Standard Matrix homeservers like Synapse, Dendrite and Conduit should just use "standard" here. + software: standard + # The URL to push real-time bridge status to. + # If set, the bridge will make POST requests to this URL whenever a user's remote network connection state changes. + # The bridge will use the appservice as_token to authorize requests. + status_endpoint: + # Endpoint for reporting per-message status. + # If set, the bridge will make POST requests to this URL when processing a message from Matrix. + # It will make one request when receiving the message (step BRIDGE), one after decrypting if applicable + # (step DECRYPTED) and one after sending to the remote network (step REMOTE). Errors will also be reported. + # The bridge will use the appservice as_token to authorize requests. + message_send_checkpoint_endpoint: + # Does the homeserver support https://github.com/matrix-org/matrix-spec-proposals/pull/2246? + async_media: false + + # Should the bridge use a websocket for connecting to the homeserver? + # The server side is currently not documented anywhere and is only implemented by mautrix-wsproxy, + # mautrix-asmux (deprecated), and hungryserv (proprietary). + websocket: false + # How often should the websocket be pinged? Pinging will be disabled if this is zero. + ping_interval_seconds: 0 + +# Application service host/registration related details. +# Changing these values requires regeneration of the registration (except when noted otherwise) +appservice: + # The address that the homeserver can use to connect to this appservice. + # Like the homeserver address, a local non-https address is recommended when the bridge is on the same machine. + # If the bridge is elsewhere, you must secure the connection yourself (e.g. with https or wireguard) + # If you want to use https, you need to use a reverse proxy. The bridge does not have TLS support built in. + address: http://mautrix-slack:29335 + # A public address that external services can use to reach this appservice. + # This is only needed for things like public media. A reverse proxy is generally necessary when using this field. + # This value doesn't affect the registration file. + public_address: https://mautrix-slack.ellis.link + + # The hostname and port where this appservice should listen. + # For Docker, you generally have to change the hostname to 0.0.0.0. + hostname: 0.0.0.0 + port: 29335 + + # The unique ID of this appservice. + id: slack + # Appservice bot details. + bot: + # Username of the appservice bot. + username: slackbot + # Display name and avatar for bot. Set to "remove" to remove display name/avatar, leave empty + # to leave display name/avatar as-is. + displayname: Slack bridge bot + avatar: mxc://maunium.net/pVtzLmChZejGxLqmXtQjFxem + + # Whether to receive ephemeral events via appservice transactions. + ephemeral_events: true + # Should incoming events be handled asynchronously? + # This may be necessary for large public instances with lots of messages going through. + # However, messages will not be guaranteed to be bridged in the same order they were sent in. + # This value doesn't affect the registration file. + async_transactions: false + + # Authentication tokens for AS <-> HS communication. Autogenerated; do not modify. + as_token: "hKvxR9H2FUQusZY5Ug7JWtrOqugLLU3m8kIQnGApTTIYGTbIvKNOS0bFv1BAAtwg" + hs_token: "SptrHkculXlvYvMUHwv1Tmr7TxnfD9RY6NKM89mTXgdMkgKC6j9WdlDOUWvxuTd5" + + # Localpart template of MXIDs for remote users. + # {{.}} is replaced with the internal ID of the user. + username_template: slack_mautrix_{{.}} + +# Config options that affect the Matrix connector of the bridge. +matrix: + # Whether the bridge should send the message status as a custom com.beeper.message_send_status event. + message_status_events: false + # Whether the bridge should send a read receipt after successfully bridging a message. + delivery_receipts: true + # Whether the bridge should send error notices via m.notice events when a message fails to bridge. + message_error_notices: true + # Whether the bridge should update the m.direct account data event when double puppeting is enabled. + sync_direct_chat_list: true + # Whether created rooms should have federation enabled. If false, created portal rooms + # will never be federated. Changing this option requires recreating rooms. + federate_rooms: true + # The threshold as bytes after which the bridge should roundtrip uploads via the disk + # rather than keeping the whole file in memory. + upload_file_threshold: 5242880 + +# Segment-compatible analytics endpoint for tracking some events, like provisioning API login and encryption errors. +analytics: + # API key to send with tracking requests. Tracking is disabled if this is null. + token: null + # Address to send tracking requests to. + url: https://api.segment.io/v1/track + # Optional user ID for tracking events. If null, defaults to using Matrix user ID. + user_id: null + +# Settings for provisioning API +provisioning: + # Prefix for the provisioning API paths. + prefix: /_matrix/provision + # Shared secret for authentication. If set to "generate" or null, a random secret will be generated, + # or if set to "disable", the provisioning API will be disabled. + shared_secret: GkjU4w46RquPB1ghAbXuN7HPSlQsVGbANutYKxuj8oedVp2vyk4NcUrsTmqN5Oi4 + # Whether to allow provisioning API requests to be authed using Matrix access tokens. + # This follows the same rules as double puppeting to determine which server to contact to check the token, + # which means that by default, it only works for users on the same server as the bridge. + allow_matrix_auth: true + # Enable debug API at /debug with provisioning authentication. + debug_endpoints: false + +# Some networks require publicly accessible media download links (e.g. for user avatars when using Discord webhooks). +# These settings control whether the bridge will provide such public media access. +public_media: + # Should public media be enabled at all? + # The public_address field under the appservice section MUST be set when enabling public media. + enabled: true + # A key for signing public media URLs. + # If set to "generate", a random key will be generated. + signing_key: x5ldVpWu7UNg1D63tn52bDPRWlpG5cUlY8Oxihnm0tcd9WSWbSb63p1Csl4prs7Y + # Number of seconds that public media URLs are valid for. + # If set to 0, URLs will never expire. + expiry: 0 + # Length of hash to use for public media URLs. Must be between 0 and 32. + hash_length: 32 + +# Settings for converting remote media to custom mxc:// URIs instead of reuploading. +# More details can be found at https://docs.mau.fi/bridges/go/discord/direct-media.html +direct_media: + # Should custom mxc:// URIs be used instead of reuploading media? + enabled: false + # The server name to use for the custom mxc:// URIs. + # This server name will effectively be a real Matrix server, it just won't implement anything other than media. + # You must either set up .well-known delegation from this domain to the bridge, or proxy the domain directly to the bridge. + server_name: mautrix-slack.ellis.link + # Optionally a custom .well-known response. This defaults to `server_name:443` + well_known_response: + # Optionally specify a custom prefix for the media ID part of the MXC URI. + media_id_prefix: + # If the remote network supports media downloads over HTTP, then the bridge will use MSC3860/MSC3916 + # media download redirects if the requester supports it. Optionally, you can force redirects + # and not allow proxying at all by setting this to false. + # This option does nothing if the remote network does not support media downloads over HTTP. + allow_proxy: true + # Matrix server signing key to make the federation tester pass, same format as synapse's .signing.key file. + # This key is also used to sign the mxc:// URIs to ensure only the bridge can generate them. + server_key: ed25519 kdQNLw NU9lNJD9eVa3x9SYXPGIau6DrLW060h/VuIDX7Yinkg + +# Settings for backfilling messages. +# Note that the exact way settings are applied depends on the network connector. +# See https://docs.mau.fi/bridges/general/backfill.html for more details. +backfill: + # Whether to do backfilling at all. + enabled: true + # Maximum number of messages to backfill in empty rooms. + max_initial_messages: 5000 + # Maximum number of missed messages to backfill after bridge restarts. + max_catchup_messages: 5000 + # If a backfilled chat is older than this number of hours, + # mark it as read even if it's unread on the remote network. + unread_hours_threshold: 720 + # Settings for backfilling threads within other backfills. + threads: + # Maximum number of messages to backfill in a new thread. + max_initial_messages: 500 + # Settings for the backwards backfill queue. This only applies when connecting to + # Beeper as standard Matrix servers don't support inserting messages into history. + queue: + # Should the backfill queue be enabled? + enabled: false + # Number of messages to backfill in one batch. + batch_size: 100 + # Delay between batches in seconds. + batch_delay: 20 + # Maximum number of batches to backfill per portal. + # If set to -1, all available messages will be backfilled. + max_batches: -1 + # Optional network-specific overrides for max batches. + # Interpretation of this field depends on the network connector. + max_batches_override: {} + +# Settings for enabling double puppeting +double_puppet: + # Servers to always allow double puppeting from. + # This is only for other servers and should NOT contain the server the bridge is on. + servers: + anotherserver.example.org: https://matrix.anotherserver.example.org + # Whether to allow client API URL discovery for other servers. When using this option, + # users on other servers can use double puppeting even if their server URLs aren't + # explicitly added to the servers map above. + allow_discovery: false + # Shared secrets for automatic double puppeting. + # See https://docs.mau.fi/bridges/general/double-puppeting.html for instructions. + secrets: + ellis.link: "as_token:fR52cysNJ2s7MbQ7PscEfHIyiW" + pissing.dev: "as_token:fR52cysNJ2s7MbQ7PscEfHIyiW" + +# End-to-bridge encryption support options. +# +# See https://docs.mau.fi/bridges/general/end-to-bridge-encryption.html for more info. +encryption: + # Whether to enable encryption at all. If false, the bridge will not function in encrypted rooms. + allow: true + # Whether to force-enable encryption in all bridged rooms. + default: false + # Whether to require all messages to be encrypted and drop any unencrypted messages. + require: false + # Whether to use MSC2409/MSC3202 instead of /sync long polling for receiving encryption-related data. + # This option is not yet compatible with standard Matrix servers like Synapse and should not be used. + appservice: false + # Enable key sharing? If enabled, key requests for rooms where users are in will be fulfilled. + # You must use a client that supports requesting keys from other users to use this feature. + allow_key_sharing: true + # Pickle key for encrypting encryption keys in the bridge database. + # If set to generate, a random key will be generated. + pickle_key: JtjJUeXBR2JCtBvx1F2oxeE2c2c6SdsGGPaYqNbty9jcDZMlSw7SnVFSWPtJh9eF + # Options for deleting megolm sessions from the bridge. + delete_keys: + # Beeper-specific: delete outbound sessions when hungryserv confirms + # that the user has uploaded the key to key backup. + delete_outbound_on_ack: false + # Don't store outbound sessions in the inbound table. + dont_store_outbound: false + # Ratchet megolm sessions forward after decrypting messages. + ratchet_on_decrypt: false + # Delete fully used keys (index >= max_messages) after decrypting messages. + delete_fully_used_on_decrypt: false + # Delete previous megolm sessions from same device when receiving a new one. + delete_prev_on_new_session: false + # Delete megolm sessions received from a device when the device is deleted. + delete_on_device_delete: false + # Periodically delete megolm sessions when 2x max_age has passed since receiving the session. + periodically_delete_expired: false + # Delete inbound megolm sessions that don't have the received_at field used for + # automatic ratcheting and expired session deletion. This is meant as a migration + # to delete old keys prior to the bridge update. + delete_outdated_inbound: false + # What level of device verification should be required from users? + # + # Valid levels: + # unverified - Send keys to all device in the room. + # cross-signed-untrusted - Require valid cross-signing, but trust all cross-signing keys. + # cross-signed-tofu - Require valid cross-signing, trust cross-signing keys on first use (and reject changes). + # cross-signed-verified - Require valid cross-signing, plus a valid user signature from the bridge bot. + # Note that creating user signatures from the bridge bot is not currently possible. + # verified - Require manual per-device verification + # (currently only possible by modifying the `trust` column in the `crypto_device` database table). + verification_levels: + # Minimum level for which the bridge should send keys to when bridging messages from the remote network to Matrix. + receive: unverified + # Minimum level that the bridge should accept for incoming Matrix messages. + send: unverified + # Minimum level that the bridge should require for accepting key requests. + share: cross-signed-tofu + # Options for Megolm room key rotation. These options allow you to configure the m.room.encryption event content. + # See https://spec.matrix.org/v1.10/client-server-api/#mroomencryption for more information about that event. + rotation: + # Enable custom Megolm room key rotation settings. Note that these + # settings will only apply to rooms created after this option is set. + enable_custom: false + # The maximum number of milliseconds a session should be used + # before changing it. The Matrix spec recommends 604800000 (a week) + # as the default. + milliseconds: 604800000 + # The maximum number of messages that should be sent with a given a + # session before changing it. The Matrix spec recommends 100 as the + # default. + messages: 100 + # Disable rotating keys when a user's devices change? + # You should not enable this option unless you understand all the implications. + disable_device_change_key_rotation: false + +# Logging config. See https://github.com/tulir/zeroconfig for details. +logging: + min_level: debug + writers: + - type: stdout + format: pretty-colored diff --git a/servers/mautrix/slack/registration.yaml b/servers/mautrix/slack/registration.yaml new file mode 100644 index 00000000..6968c763 --- /dev/null +++ b/servers/mautrix/slack/registration.yaml @@ -0,0 +1,14 @@ +id: slack +url: http://mautrix-slack:29335 +as_token: hKvxR9H2FUQusZY5Ug7JWtrOqugLLU3m8kIQnGApTTIYGTbIvKNOS0bFv1BAAtwg +hs_token: SptrHkculXlvYvMUHwv1Tmr7TxnfD9RY6NKM89mTXgdMkgKC6j9WdlDOUWvxuTd5 +sender_localpart: BPv5f9VoCPflaOvndjDnG56dgLLeTq7g +rate_limited: false +namespaces: + users: + - regex: ^@slackbot:ellis\.link$ + exclusive: true + - regex: ^@slack_mautrix_.*:ellis\.link$ + exclusive: true +de.sorunome.msc2409.push_ephemeral: true +receive_ephemeral: true diff --git a/servers/mautrix/whatsapp/config.yaml b/servers/mautrix/whatsapp/config.yaml new file mode 100644 index 00000000..32a54131 --- /dev/null +++ b/servers/mautrix/whatsapp/config.yaml @@ -0,0 +1,525 @@ +# Network-specific config options +network: + # Device name that's shown in the "WhatsApp Web" section in the mobile app. + os_name: Mautrix-WhatsApp bridge + # Browser name that determines the logo shown in the mobile app. + # Must be "unknown" for a generic icon or a valid browser name if you want a specific icon. + # List of valid browser names: https://github.com/tulir/whatsmeow/blob/efc632c008604016ddde63bfcfca8de4e5304da9/binary/proto/def.proto#L43-L64 + browser_name: unknown + + # Proxy to use for all WhatsApp connections. + proxy: null + # Alternative to proxy: an HTTP endpoint that returns the proxy URL to use for WhatsApp connections. + get_proxy_url: null + # Whether the proxy options should only apply to the login websocket and not to authenticated connections. + proxy_only_login: false + + # Displayname template for WhatsApp users. + # {{.PushName}} - nickname set by the WhatsApp user + # {{.BusinessName}} - validated WhatsApp business name + # {{.Phone}} - phone number (international format) + # {{.FullName}} - Name you set in the contacts list + displayname_template: "{{or .FullName .BusinessName .PushName .Phone}}" + + # Should incoming calls send a message to the Matrix room? + call_start_notices: true + # Should another user's cryptographic identity changing send a message to Matrix? + identity_change_notices: false + # Should the bridge mark you as online on WhatsApp when you send typing notifications? + # Full presence bridging is not supported. + send_presence_on_typing: false + # Should WhatsApp status messages be bridged into a Matrix room? + enable_status_broadcast: true + # Should sending WhatsApp status messages be allowed? + # This can cause issues if the user has lots of contacts, so it's disabled by default. + disable_status_broadcast_send: true + # Should the status broadcast room be muted and moved into low priority by default? + # This is only applied when creating the room, the user can unmute it later. + mute_status_broadcast: true + # Tag to apply to pinned chats on WhatsApp. + pinned_tag: m.favourite + # Tag to apply to archived chats on WhatsApp. + # Set to m.lowpriority to move them to low priority. + archive_tag: m.lowpriority + # Tag to apply to the status broadcast room. + status_broadcast_tag: m.lowpriority + # Should the bridge use thumbnails from WhatsApp? + # They're disabled by default due to very low resolution. + whatsapp_thumbnail: false + # Should the bridge detect URLs in outgoing messages, ask the homeserver to generate a preview, + # and send it to WhatsApp? URL previews can always be sent using the `com.beeper.linkpreviews` + # key in the event content even if this is disabled. + url_previews: false + # Should polls be sent using unstable MSC3381 event types? + extev_polls: false + # Should view-once messages be disabled entirely? + disable_view_once: false + # Should the bridge always send "active" delivery receipts (two gray ticks on WhatsApp) + # even if the user isn't marked as online (e.g. when presence bridging isn't enabled)? + # + # By default, the bridge acts like WhatsApp web, which only sends active delivery + # receipts when it's in the foreground. + force_active_delivery_receipts: false + # When direct media is enabled and a piece of media isn't available on the WhatsApp servers, + # should it be automatically requested from the phone? + direct_media_auto_request: true + # Settings for converting animated stickers. + animated_sticker: + # Format to which animated stickers should be converted. + # disable - No conversion, just unzip and send raw lottie JSON + # png - converts to non-animated png (fastest) + # gif - converts to animated gif + # webm - converts to webm video, requires ffmpeg executable with vp9 codec and webm container support + # webp - converts to animated webp, requires ffmpeg executable with webp codec/container support + target: webp + # Arguments for converter. All converters take width and height. + args: + width: 320 + height: 320 + fps: 25 # only for webm, webp and gif (2, 5, 10, 20 or 25 recommended) + + # Settings for handling history sync payloads. + history_sync: + # How many conversations should the bridge create after login? + # If -1, all conversations received from history sync will be bridged. + # Other conversations will be backfilled on demand when receiving a message. + max_initial_conversations: -1 + # Should the bridge request a full sync from the phone when logging in? + # This bumps the size of history syncs from 3 months to 1 year. + request_full_sync: true + # Configuration parameters that are sent to the phone along with the request full sync flag. + # By default, (when the values are null or 0), the config isn't sent at all. + full_sync_config: + # Number of days of history to request. + # The limit seems to be around 3 years, but using higher values doesn't break. + days_limit: 1826 + # This is presumably the maximum size of the transferred history sync blob, which may affect what the phone includes in the blob. + size_mb_limit: 50000 + # This is presumably the local storage quota, which may affect what the phone includes in the history sync blob. + storage_quota_mb: 1000000 + # Settings for media requests. If the media expired, then it will not be on the WA servers. + # Media can always be requested by reacting with the ♻️ (recycle) emoji. + # These settings determine if the media requests should be done automatically during or after backfill. + media_requests: + # Should the expired media be automatically requested from the server as part of the backfill process? + auto_request_media: true + # Whether to request the media immediately after the media message is backfilled ("immediate") + # or at a specific time of the day ("local_time"). + request_method: immediate + # If request_method is "local_time", what time should the requests be sent (in minutes after midnight)? + request_local_time: 120 + # Maximum number of media request responses to handle in parallel per user. + max_async_handle: 2 + +# Config options that affect the central bridge module. +bridge: + # The prefix for commands. Only required in non-management rooms. + command_prefix: '!whatsapp' + # Should the bridge create a space for each login containing the rooms that account is in? + personal_filtering_spaces: true + # Whether the bridge should set names and avatars explicitly for DM portals. + # This is only necessary when using clients that don't support MSC4171. + private_chat_portal_meta: true + # Should events be handled asynchronously within portal rooms? + # If true, events may end up being out of order, but slow events won't block other ones. + # This is not yet safe to use. + async_events: false + # Should every user have their own portals rather than sharing them? + # By default, users who are in the same group on the remote network will be + # in the same Matrix room bridged to that group. If this is set to true, + # every user will get their own Matrix room instead. + split_portals: true + # Should the bridge resend `m.bridge` events to all portals on startup? + resend_bridge_info: false + + # Should leaving Matrix rooms be bridged as leaving groups on the remote network? + bridge_matrix_leave: false + # Should room tags only be synced when creating the portal? Tags mean things like favorite/pin and archive/low priority. + # Tags currently can't be synced back to the remote network, so a continuous sync means tagging from Matrix will be undone. + tag_only_on_create: true + # List of tags to allow bridging. If empty, no tags will be bridged. + only_bridge_tags: [m.favourite, m.lowpriority] + # Should room mute status only be synced when creating the portal? + # Like tags, mutes can't currently be synced back to the remote network. + mute_only_on_create: true + + # What should be done to portal rooms when a user logs out or is logged out? + # Permitted values: + # nothing - Do nothing, let the user stay in the portals + # kick - Remove the user from the portal rooms, but don't delete them + # unbridge - Remove all ghosts in the room and disassociate it from the remote chat + # delete - Remove all ghosts and users from the room (i.e. delete it) + cleanup_on_logout: + # Should cleanup on logout be enabled at all? + enabled: false + # Settings for manual logouts (explicitly initiated by the Matrix user) + manual: + # Action for private portals which will never be shared with other Matrix users. + private: nothing + # Action for portals with a relay user configured. + relayed: nothing + # Action for portals which may be shared, but don't currently have any other Matrix users. + shared_no_users: nothing + # Action for portals which have other logged-in Matrix users. + shared_has_users: nothing + # Settings for credentials being invalidated (initiated by the remote network, possibly through user action). + # Keys have the same meanings as in the manual section. + bad_credentials: + private: nothing + relayed: nothing + shared_no_users: nothing + shared_has_users: nothing + + # Settings for relay mode + relay: + # Whether relay mode should be allowed. If allowed, the set-relay command can be used to turn any + # authenticated user into a relaybot for that chat. + enabled: false + # Should only admins be allowed to set themselves as relay users? + # If true, non-admins can only set users listed in default_relays as relays in a room. + admin_only: true + # List of user login IDs which anyone can set as a relay, as long as the relay user is in the room. + default_relays: [] + # The formats to use when sending messages via the relaybot. + # Available variables: + # .Sender.UserID - The Matrix user ID of the sender. + # .Sender.Displayname - The display name of the sender (if set). + # .Sender.RequiresDisambiguation - Whether the sender's name may be confused with the name of another user in the room. + # .Sender.DisambiguatedName - The disambiguated name of the sender. This will be the displayname if set, + # plus the user ID in parentheses if the displayname is not unique. + # If the displayname is not set, this is just the user ID. + # .Message - The `formatted_body` field of the message. + # .Caption - The `formatted_body` field of the message, if it's a caption. Otherwise an empty string. + # .FileName - The name of the file being sent. + message_formats: + m.text: "{{ .Sender.DisambiguatedName }}: {{ .Message }}" + m.notice: "{{ .Sender.DisambiguatedName }}: {{ .Message }}" + m.emote: "* {{ .Sender.DisambiguatedName }} {{ .Message }}" + m.file: "{{ .Sender.DisambiguatedName }} sent a file{{ if .Caption }}: {{ .Caption }}{{ end }}" + m.image: "{{ .Sender.DisambiguatedName }} sent an image{{ if .Caption }}: {{ .Caption }}{{ end }}" + m.audio: "{{ .Sender.DisambiguatedName }} sent an audio file{{ if .Caption }}: {{ .Caption }}{{ end }}" + m.video: "{{ .Sender.DisambiguatedName }} sent a video{{ if .Caption }}: {{ .Caption }}{{ end }}" + m.location: "{{ .Sender.DisambiguatedName }} sent a location{{ if .Caption }}: {{ .Caption }}{{ end }}" + # For networks that support per-message displaynames (i.e. Slack and Discord), the template for those names. + # This has all the Sender variables available under message_formats (but without the .Sender prefix). + # Note that you need to manually remove the displayname from message_formats above. + displayname_format: "{{ .DisambiguatedName }}" + + # Permissions for using the bridge. + # Permitted values: + # relay - Talk through the relaybot (if enabled), no access otherwise + # commands - Access to use commands in the bridge, but not login. + # user - Access to use the bridge with puppeting. + # admin - Full access, user level with some additional administration tools. + # Permitted keys: + # * - All Matrix users + # domain - All users on that homeserver + # mxid - Specific user + permissions: + "*": relay + "ellis.link": user + "pissing.dev": user + "@jade:ellis.link": admin + +# Config for the bridge's database. +database: + # The database type. "sqlite3-fk-wal" and "postgres" are supported. + type: sqlite3-fk-wal + # The database URI. + # SQLite: A raw file path is supported, but `file:?_txlock=immediate` is recommended. + # https://github.com/mattn/go-sqlite3#connection-string + # Postgres: Connection string. For example, postgres://user:password@host/database?sslmode=disable + # To connect via Unix socket, use something like postgres:///dbname?host=/var/run/postgresql + uri: file:/data/mautrix-whatsapp.db?_txlock=immediate + # Maximum number of connections. + max_open_conns: 5 + max_idle_conns: 1 + # Maximum connection idle time and lifetime before they're closed. Disabled if null. + # Parsed with https://pkg.go.dev/time#ParseDuration + max_conn_idle_time: null + max_conn_lifetime: null + +# Homeserver details. +homeserver: + # The address that this appservice can use to connect to the homeserver. + # Local addresses without HTTPS are generally recommended when the bridge is running on the same machine, + # but https also works if they run on different machines. + address: https://matrix.ellis.link + # The domain of the homeserver (also known as server_name, used for MXIDs, etc). + domain: ellis.link + + # What software is the homeserver running? + # Standard Matrix homeservers like Synapse, Dendrite and Conduit should just use "standard" here. + software: standard + # The URL to push real-time bridge status to. + # If set, the bridge will make POST requests to this URL whenever a user's remote network connection state changes. + # The bridge will use the appservice as_token to authorize requests. + status_endpoint: + # Endpoint for reporting per-message status. + # If set, the bridge will make POST requests to this URL when processing a message from Matrix. + # It will make one request when receiving the message (step BRIDGE), one after decrypting if applicable + # (step DECRYPTED) and one after sending to the remote network (step REMOTE). Errors will also be reported. + # The bridge will use the appservice as_token to authorize requests. + message_send_checkpoint_endpoint: + # Does the homeserver support https://github.com/matrix-org/matrix-spec-proposals/pull/2246? + async_media: false + + # Should the bridge use a websocket for connecting to the homeserver? + # The server side is currently not documented anywhere and is only implemented by mautrix-wsproxy, + # mautrix-asmux (deprecated), and hungryserv (proprietary). + websocket: false + # How often should the websocket be pinged? Pinging will be disabled if this is zero. + ping_interval_seconds: 0 + +# Application service host/registration related details. +# Changing these values requires regeneration of the registration (except when noted otherwise) +appservice: + # The address that the homeserver can use to connect to this appservice. + # Like the homeserver address, a local non-https address is recommended when the bridge is on the same machine. + # If the bridge is elsewhere, you must secure the connection yourself (e.g. with https or wireguard) + # If you want to use https, you need to use a reverse proxy. The bridge does not have TLS support built in. + address: http://mautrix-whatsapp:29318 + # A public address that external services can use to reach this appservice. + # This is only needed for things like public media. A reverse proxy is generally necessary when using this field. + # This value doesn't affect the registration file. + public_address: https://mautrix-whatsapp.ellis.link + + # The hostname and port where this appservice should listen. + # For Docker, you generally have to change the hostname to 0.0.0.0. + hostname: 0.0.0.0 + port: 29318 + + # The unique ID of this appservice. + id: whatsapp + # Appservice bot details. + bot: + # Username of the appservice bot. + username: whatsappbot + # Display name and avatar for bot. Set to "remove" to remove display name/avatar, leave empty + # to leave display name/avatar as-is. + displayname: WhatsApp bridge bot + avatar: mxc://maunium.net/NeXNQarUbrlYBiPCpprYsRqr + + # Whether to receive ephemeral events via appservice transactions. + ephemeral_events: true + # Should incoming events be handled asynchronously? + # This may be necessary for large public instances with lots of messages going through. + # However, messages will not be guaranteed to be bridged in the same order they were sent in. + # This value doesn't affect the registration file. + async_transactions: false + + # Authentication tokens for AS <-> HS communication. Autogenerated; do not modify. + as_token: "zmjejOVmK9RYLZ8fSUshhq8WmX3D0C3oYT0Z1fEWjnGFmm6dl8XSRcwujVMyknj0" + hs_token: "zxTT6FG5qL8igfSzubyoL5XU2pSSpaIKAGglXCEdGLQ5aCQrDxsWsV8otyOXDtFY" + + # Localpart template of MXIDs for remote users. + # {{.}} is replaced with the internal ID of the user. + username_template: whatsapp_mautrix_{{.}} + +# Config options that affect the Matrix connector of the bridge. +matrix: + # Whether the bridge should send the message status as a custom com.beeper.message_send_status event. + message_status_events: false + # Whether the bridge should send a read receipt after successfully bridging a message. + delivery_receipts: true + # Whether the bridge should send error notices via m.notice events when a message fails to bridge. + message_error_notices: true + # Whether the bridge should update the m.direct account data event when double puppeting is enabled. + sync_direct_chat_list: true + # Whether created rooms should have federation enabled. If false, created portal rooms + # will never be federated. Changing this option requires recreating rooms. + federate_rooms: true + # The threshold as bytes after which the bridge should roundtrip uploads via the disk + # rather than keeping the whole file in memory. + upload_file_threshold: 5242880 + +# Segment-compatible analytics endpoint for tracking some events, like provisioning API login and encryption errors. +analytics: + # API key to send with tracking requests. Tracking is disabled if this is null. + token: null + # Address to send tracking requests to. + url: https://api.segment.io/v1/track + # Optional user ID for tracking events. If null, defaults to using Matrix user ID. + user_id: null + +# Settings for provisioning API +provisioning: + # Prefix for the provisioning API paths. + prefix: /_matrix/provision + # Shared secret for authentication. If set to "generate" or null, a random secret will be generated, + # or if set to "disable", the provisioning API will be disabled. + shared_secret: dSCBfLRPQWRQ8jquAhzjrJAzVpVIRTLXXjXrxnPoo3rPTwTH0XWY3GN6jH8GdEQa + # Whether to allow provisioning API requests to be authed using Matrix access tokens. + # This follows the same rules as double puppeting to determine which server to contact to check the token, + # which means that by default, it only works for users on the same server as the bridge. + allow_matrix_auth: true + # Enable debug API at /debug with provisioning authentication. + debug_endpoints: false + +# Some networks require publicly accessible media download links (e.g. for user avatars when using Discord webhooks). +# These settings control whether the bridge will provide such public media access. +public_media: + # Should public media be enabled at all? + # The public_address field under the appservice section MUST be set when enabling public media. + enabled: true + # A key for signing public media URLs. + # If set to "generate", a random key will be generated. + signing_key: y6ErW3xIFZhtMuuU1sbj8j9NQqh2VpuqLOemxlOpQYXNq6QvyjycGwxfyiWBk5Ww + # Number of seconds that public media URLs are valid for. + # If set to 0, URLs will never expire. + expiry: 0 + # Length of hash to use for public media URLs. Must be between 0 and 32. + hash_length: 32 + +# Settings for converting remote media to custom mxc:// URIs instead of reuploading. +# More details can be found at https://docs.mau.fi/bridges/go/discord/direct-media.html +direct_media: + # Should custom mxc:// URIs be used instead of reuploading media? + enabled: true + # The server name to use for the custom mxc:// URIs. + # This server name will effectively be a real Matrix server, it just won't implement anything other than media. + # You must either set up .well-known delegation from this domain to the bridge, or proxy the domain directly to the bridge. + server_name: mautrix-whatsapp.ellis.link + # Optionally a custom .well-known response. This defaults to `server_name:443` + well_known_response: + # Optionally specify a custom prefix for the media ID part of the MXC URI. + media_id_prefix: + # If the remote network supports media downloads over HTTP, then the bridge will use MSC3860/MSC3916 + # media download redirects if the requester supports it. Optionally, you can force redirects + # and not allow proxying at all by setting this to false. + # This option does nothing if the remote network does not support media downloads over HTTP. + allow_proxy: true + # Matrix server signing key to make the federation tester pass, same format as synapse's .signing.key file. + # This key is also used to sign the mxc:// URIs to ensure only the bridge can generate them. + server_key: ed25519 S5cL7Q Z6rYTwk8l+YFFyJyaizkrfm8R48+el5SRfZ7f5og+7I + +# Settings for backfilling messages. +# Note that the exact way settings are applied depends on the network connector. +# See https://docs.mau.fi/bridges/general/backfill.html for more details. +backfill: + # Whether to do backfilling at all. + enabled: true + # Maximum number of messages to backfill in empty rooms. + max_initial_messages: 500000000 + # Maximum number of missed messages to backfill after bridge restarts. + max_catchup_messages: 5000 + # If a backfilled chat is older than this number of hours, + # mark it as read even if it's unread on the remote network. + unread_hours_threshold: 720 + # Settings for backfilling threads within other backfills. + threads: + # Maximum number of messages to backfill in a new thread. + max_initial_messages: 5000 + # Settings for the backwards backfill queue. This only applies when connecting to + # Beeper as standard Matrix servers don't support inserting messages into history. + queue: + # Should the backfill queue be enabled? + enabled: false + # Number of messages to backfill in one batch. + batch_size: 100 + # Delay between batches in seconds. + batch_delay: 20 + # Maximum number of batches to backfill per portal. + # If set to -1, all available messages will be backfilled. + max_batches: -1 + # Optional network-specific overrides for max batches. + # Interpretation of this field depends on the network connector. + max_batches_override: {} + +# Settings for enabling double puppeting +double_puppet: + # Servers to always allow double puppeting from. + # This is only for other servers and should NOT contain the server the bridge is on. + servers: + anotherserver.example.org: https://matrix.anotherserver.example.org + # Whether to allow client API URL discovery for other servers. When using this option, + # users on other servers can use double puppeting even if their server URLs aren't + # explicitly added to the servers map above. + allow_discovery: false + # Shared secrets for automatic double puppeting. + # See https://docs.mau.fi/bridges/general/double-puppeting.html for instructions. + secrets: + ellis.link: "as_token:fR52cysNJ2s7MbQ7PscEfHIyiW" + pissing.dev: "as_token:fR52cysNJ2s7MbQ7PscEfHIyiW" + +# End-to-bridge encryption support options. +# +# See https://docs.mau.fi/bridges/general/end-to-bridge-encryption.html for more info. +encryption: + # Whether to enable encryption at all. If false, the bridge will not function in encrypted rooms. + allow: true + # Whether to force-enable encryption in all bridged rooms. + default: true + # Whether to require all messages to be encrypted and drop any unencrypted messages. + require: false + # Whether to use MSC2409/MSC3202 instead of /sync long polling for receiving encryption-related data. + # This option is not yet compatible with standard Matrix servers like Synapse and should not be used. + appservice: false + # Enable key sharing? If enabled, key requests for rooms where users are in will be fulfilled. + # You must use a client that supports requesting keys from other users to use this feature. + allow_key_sharing: true + # Pickle key for encrypting encryption keys in the bridge database. + # If set to generate, a random key will be generated. + pickle_key: xM8IxQ67JLhv3MhAYS6vcbXn7AwKinZyRryJgliX5wiHP4qvp9gf512W1O080Pz6 + # Options for deleting megolm sessions from the bridge. + delete_keys: + # Beeper-specific: delete outbound sessions when hungryserv confirms + # that the user has uploaded the key to key backup. + delete_outbound_on_ack: false + # Don't store outbound sessions in the inbound table. + dont_store_outbound: false + # Ratchet megolm sessions forward after decrypting messages. + ratchet_on_decrypt: false + # Delete fully used keys (index >= max_messages) after decrypting messages. + delete_fully_used_on_decrypt: false + # Delete previous megolm sessions from same device when receiving a new one. + delete_prev_on_new_session: false + # Delete megolm sessions received from a device when the device is deleted. + delete_on_device_delete: false + # Periodically delete megolm sessions when 2x max_age has passed since receiving the session. + periodically_delete_expired: false + # Delete inbound megolm sessions that don't have the received_at field used for + # automatic ratcheting and expired session deletion. This is meant as a migration + # to delete old keys prior to the bridge update. + delete_outdated_inbound: false + # What level of device verification should be required from users? + # + # Valid levels: + # unverified - Send keys to all device in the room. + # cross-signed-untrusted - Require valid cross-signing, but trust all cross-signing keys. + # cross-signed-tofu - Require valid cross-signing, trust cross-signing keys on first use (and reject changes). + # cross-signed-verified - Require valid cross-signing, plus a valid user signature from the bridge bot. + # Note that creating user signatures from the bridge bot is not currently possible. + # verified - Require manual per-device verification + # (currently only possible by modifying the `trust` column in the `crypto_device` database table). + verification_levels: + # Minimum level for which the bridge should send keys to when bridging messages from the remote network to Matrix. + receive: unverified + # Minimum level that the bridge should accept for incoming Matrix messages. + send: unverified + # Minimum level that the bridge should require for accepting key requests. + share: cross-signed-tofu + # Options for Megolm room key rotation. These options allow you to configure the m.room.encryption event content. + # See https://spec.matrix.org/v1.10/client-server-api/#mroomencryption for more information about that event. + rotation: + # Enable custom Megolm room key rotation settings. Note that these + # settings will only apply to rooms created after this option is set. + enable_custom: false + # The maximum number of milliseconds a session should be used + # before changing it. The Matrix spec recommends 604800000 (a week) + # as the default. + milliseconds: 604800000 + # The maximum number of messages that should be sent with a given a + # session before changing it. The Matrix spec recommends 100 as the + # default. + messages: 100 + # Disable rotating keys when a user's devices change? + # You should not enable this option unless you understand all the implications. + disable_device_change_key_rotation: false + +# Logging config. See https://github.com/tulir/zeroconfig for details. +logging: + min_level: debug + writers: + - type: stdout + format: pretty-colored diff --git a/servers/mautrix/whatsapp/registration.yaml b/servers/mautrix/whatsapp/registration.yaml new file mode 100644 index 00000000..827569c5 --- /dev/null +++ b/servers/mautrix/whatsapp/registration.yaml @@ -0,0 +1,14 @@ +id: whatsapp +url: http://mautrix-whatsapp:29318 +as_token: zmjejOVmK9RYLZ8fSUshhq8WmX3D0C3oYT0Z1fEWjnGFmm6dl8XSRcwujVMyknj0 +hs_token: zxTT6FG5qL8igfSzubyoL5XU2pSSpaIKAGglXCEdGLQ5aCQrDxsWsV8otyOXDtFY +sender_localpart: 6FrdNTxqe5cu5653vU9OoOf4hwxG9FUC +rate_limited: false +namespaces: + users: + - regex: ^@whatsappbot:ellis\.link$ + exclusive: true + - regex: ^@whatsapp_mautrix_.*:ellis\.link$ + exclusive: true +de.sorunome.msc2409.push_ephemeral: true +receive_ephemeral: true