diff --git a/bridgeconfig/meta.tpl.yaml b/bridgeconfig/meta.tpl.yaml index 5ee9665..537f8bf 100644 --- a/bridgeconfig/meta.tpl.yaml +++ b/bridgeconfig/meta.tpl.yaml @@ -1,320 +1,50 @@ -# Homeserver details. -homeserver: - # The address that this appservice can use to connect to the homeserver. - address: {{ .HungryAddress }} - # The domain of the homeserver (also known as server_name, used for MXIDs, etc). - domain: beeper.local - - # What software is the homeserver running? - # Standard Matrix homeservers like Synapse, Dendrite and Conduit should just use "standard" here. - software: hungry - # The URL to push real-time bridge status to. - # If set, the bridge will make POST requests to this URL whenever a user's FB/IG connection state changes. - # The bridge will use the appservice as_token to authorize requests. - status_endpoint: null - # Endpoint for reporting per-message status. - message_send_checkpoint_endpoint: null - # Does the homeserver support https://github.com/matrix-org/matrix-spec-proposals/pull/2246? - async_media: true - - # 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: {{ .Websocket }} - # How often should the websocket be pinged? Pinging will be disabled if this is zero. - ping_interval_seconds: 180 - -# Application service host/registration related details. -# Changing these values requires regeneration of the registration. -appservice: - # The address that the homeserver can use to connect to this appservice. - address: null - - # The hostname and port where this appservice should listen. - hostname: {{ if .Websocket }}null{{ else }}{{ .ListenAddr }}{{ end }} - port: {{ if .Websocket }}null{{ else }}{{ .ListenPort }}{{ end }} - - # Database config. - 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:{{.DatabasePrefix}}mautrix-meta.db?_txlock=immediate - # Maximum number of connections. Mostly relevant for Postgres. - max_open_conns: 5 - max_idle_conns: 2 - # 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 - - # The unique ID of this appservice. - id: {{ .AppserviceID }} - # Appservice bot details. - bot: - # Username of the appservice bot. - username: {{ .BridgeName }}bot - # Display name and avatar for bot. Set to "remove" to remove display name/avatar, leave empty - # to leave display name/avatar as-is. - displayname: {{ if eq .Params.meta_platform "facebook" }}Facebook{{ else }}Instagram{{ end }} bridge bot - avatar: mxc://maunium.net/{{ if eq .Params.meta_platform "facebook" }}ygtkteZsXnGJLJHRchUwYWak{{ else }}JxjlbZUlCPULEeHZSwleUXQv{{ end }} - - # Whether or not to receive ephemeral events via appservice transactions. - # Requires MSC2409 support (i.e. Synapse 1.22+). - 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. - async_transactions: false - - # Authentication tokens for AS <-> HS communication. Autogenerated; do not modify. - as_token: {{ .ASToken }} - hs_token: {{ .HSToken }} - -# Prometheus config. -metrics: - # Enable prometheus metrics? - enabled: false - # IP and port where the metrics listener should be. The path is always /metrics - listen: 127.0.0.1:8000 - -meta: - # Which service is this bridge for? Either "facebook" or "instagram". - # Remember to change the appservice id, bot profile info and bridge username_template too. +# 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: {{ .Params.meta_platform }} # 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 + ig_e2ee: false + # 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: {{ .Params.proxy }} + 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: - -# Bridge config -bridge: - # Localpart template of MXIDs for FB/IG users. - username_template: {{ .BridgeName }}_{{ "{{.}}" }} - # Displayname template for FB/IG users. This is also used as the room name in DMs if private_chat_portal_meta is enabled. - displayname_template: {{ `'{{or .DisplayName .Username "Unknown user" }}'` }} - # Whether to explicitly set the avatar and room name for private chat portal rooms. - # If set to `default`, this will be enabled in encrypted rooms and disabled in unencrypted rooms. - # If set to `always`, all DM rooms will have explicit names and avatars set. - # If set to `never`, DM rooms will never have names and avatars set. - private_chat_portal_meta: default - - portal_message_buffer: 128 - - # Should the bridge create a space for each logged-in user and add bridged rooms to it? - # Users who logged in before turning this on should run `!meta sync-space` to create and fill the space for the first time. - personal_filtering_spaces: true - # Should Matrix m.notice-type messages be bridged? - bridge_notices: true - # Should the bridge send a read receipt from the bridge bot when a message has been sent to FB/IG? - delivery_receipts: false - # Whether the bridge should send the message status as a custom com.beeper.message_send_status event. - message_status_events: true - # Whether the bridge should send error notices via m.notice events when a message fails to bridge. - message_error_notices: false - # Should the bridge never send alerts to the bridge management room? - # These are mostly things like the user being logged out. - disable_bridge_alerts: true - # Should the bridge update the m.direct account data event when double puppeting is enabled. - # Note that updating the m.direct event is not atomic (except with mautrix-asmux) - # and is therefore prone to race conditions. - sync_direct_chat_list: false - # Set this to true to tell the bridge to re-send m.bridge events to all rooms on the next run. - # This field will automatically be changed back to false after it, except if the config file is not writable. - resend_bridge_info: false - # Send captions in the same message as images. This will send data compatible with both MSC2530. - # This is currently not supported in most clients. - caption_in_message: true - # Whether or not created rooms should have federation enabled. - # If false, created portal rooms will never be federated. - federate_rooms: false - # Should mute status be bridged? Allowed options: always, on-create, never - mute_bridging: on-create - - # Servers to always allow double puppeting from - double_puppet_server_map: - {{ .BeeperDomain }}: {{ .HungryAddress }} - # Allow using double puppeting from any server with a valid client .well-known file. - double_puppet_allow_discovery: false - # Shared secrets for https://github.com/devture/matrix-synapse-shared-secret-auth - # - # If set, double puppeting will be enabled automatically for local users - # instead of users having to find an access token and run `login-matrix` - # manually. - login_shared_secret_map: - {{ .BeeperDomain }}: "as_token:{{ .ASToken }}" - - # Maximum time for handling Matrix events. Duration strings formatted for https://pkg.go.dev/time#ParseDuration - # Null means there's no enforced timeout. - message_handling_timeout: - # Send an error message after this timeout, but keep waiting for the response until the deadline. - # This is counted from the origin_server_ts, so the warning time is consistent regardless of the source of delay. - # If the message is older than this when it reaches the bridge, the message won't be handled at all. - error_after: null - # Drop messages after this timeout. They may still go through if the message got sent to the servers. - # This is counted from the time the bridge starts handling the message. - deadline: 120s - - # The prefix for commands. Only required in non-management rooms. - command_prefix: default - - backfill: - # If disabled, old messages will never be bridged. - enabled: true - # By default, Meta sends info about approximately 20 recent threads. If this is set to something else than 0, - # the bridge will request more threads on first login, until it reaches the specified number of pages - # or the end of the inbox. - inbox_fetch_pages: 0 - # By default, Meta only sends one old message per thread. If this is set to a something else than 0, - # the bridge will delay handling the one automatically received message and request more messages to backfill. - # One page usually contains 20 messages. This can technically be set to -1 to fetch all messages, - # but that will block bridging messages until the entire backfill is completed. - history_fetch_pages: 0 - # Same as above, but for catchup backfills (i.e. when the bridge is restarted). - catchup_fetch_pages: 5 - # Maximum age of chats to leave as unread when backfilling. 0 means all chats can be left as unread. - # If non-zero, chats that are older than this will be marked as read, even if they're still unread on Meta. - unread_hours_threshold: 720 - # Backfill queue settings. Only relevant for Beeper, because standard Matrix servers - # don't support inserting messages into room history. - queue: - # How many pages of messages to request in one go (without sleeping between requests)? - pages_at_once: 5 - # Maximum number of pages to fetch. -1 to fetch all pages until the start of the chat. - max_pages: -1 - # How long to sleep after fetching a bunch of pages ("bunch" defined by pages_at_once). - sleep_between_tasks: 180s - # Disable fetching XMA media (reels, stories, etc) when backfilling. - dont_fetch_xma: true - - # Messages sent upon joining a management room. - # Markdown is supported. The defaults are listed below. - management_room_text: - # Sent when joining a room. - welcome: "Hello, I'm {{ if eq .Params.meta_platform "facebook" }}a Facebook{{ else }}an Instagram{{ end }} bridge bot." - # Sent when joining a management room and the user is already logged in. - welcome_connected: "Use `help` for help." - # Sent when joining a management room and the user is not logged in. - welcome_unconnected: "Use `help` for help or `login` to log in." - # Optional extra text sent when joining a management room. - additional_help: "" - - # End-to-bridge encryption support options. - # - # See https://docs.mau.fi/bridges/general/end-to-bridge-encryption.html for more info. - encryption: - # Allow encryption, work in group chat rooms with e2ee enabled - allow: true - # Default to encryption, force-enable encryption in all portals the bridge creates - # This will cause the bridge bot to be in private chats for the encryption to work properly. - default: true - # Whether to use MSC2409/MSC3202 instead of /sync long polling for receiving encryption-related data. - appservice: true - # Require encryption, drop any unencrypted messages. - require: true - # 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 - # 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: true - # Don't store outbound sessions in the inbound table. - dont_store_outbound: false - # Ratchet megolm sessions forward after decrypting messages. - ratchet_on_decrypt: true - # Delete fully used keys (index >= max_messages) after decrypting messages. - delete_fully_used_on_decrypt: true - # Delete previous megolm sessions from same device when receiving a new one. - delete_prev_on_new_session: true - # Delete megolm sessions received from a device when the device is deleted. - delete_on_device_delete: true - # Periodically delete megolm sessions when 2x max_age has passed since receiving the session. - periodically_delete_expired: true - # 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 FB/IG to Matrix. - receive: cross-signed-tofu - # Minimum level that the bridge should accept for incoming Matrix messages. - send: cross-signed-tofu - # 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.3/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: true - # The maximum number of milliseconds a session should be used - # before changing it. The Matrix spec recommends 604800000 (a week) - # as the default. - milliseconds: 2592000000 - # 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: 10000 - - # 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: true - - # Settings for provisioning API - provisioning: - # Prefix for the provisioning API paths. - prefix: /_matrix/provision - # Shared secret for authentication. If set to "generate", a random secret will be generated, - # or if set to "disable", the provisioning API will be disabled. - shared_secret: {{ .ProvisioningSecret }} - # Enable debug API at /debug with provisioning authentication. - debug_endpoints: false - - # Permissions for using the bridge. - # Permitted values: - # relay - Talk through the relaybot (if enabled), no access otherwise - # user - Access to use the bridge to chat with a Meta account. - # admin - User level and some additional administration tools - # Permitted keys: - # * - All Matrix users - # domain - All users on that homeserver - # mxid - Specific user - permissions: - "{{ .UserID }}": admin - -# Logging config. See https://github.com/tulir/zeroconfig for details. -logging: - min_level: debug - writers: - - type: stdout - format: pretty-colored - - type: file - format: json - filename: ./logs/mautrix-meta.log - max_size: 100 - max_backups: 10 - compress: 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 + +{{ setfield . "DatabaseFileName" "mautrix-meta" -}} +{{ setfield . "DefaultPickleKey" "mautrix.bridge.e2ee" -}} +{{ if eq .Params.meta_platform "facebook" "facebook-tor" "messenger" -}} + {{ setfield . "CommandPrefix" "!fb" -}} + {{ setfield . "BridgeTypeName" "Facebook" -}} + {{ setfield . "BridgeTypeIcon" "mxc://maunium.net/ygtkteZsXnGJLJHRchUwYWak" -}} +{{ else if eq .Params.meta_platform "instagram" -}} + {{ setfield . "CommandPrefix" "!ig" -}} + {{ setfield . "BridgeTypeName" "Instagram" -}} + {{ setfield . "BridgeTypeIcon" "mxc://maunium.net/JxjlbZUlCPULEeHZSwleUXQv" -}} +{{ else -}} + {{ setfield . "CommandPrefix" "!meta" -}} + {{ setfield . "BridgeTypeName" "Meta" -}} + {{ setfield . "BridgeTypeIcon" "mxc://maunium.net/DxpVrwwzPUwaUSazpsjXgcKB" -}} +{{ end -}} +{{ template "bridgev2.tpl.yaml" . }} diff --git a/cmd/bbctl/config.go b/cmd/bbctl/config.go index df27e68..fd1d42c 100644 --- a/cmd/bbctl/config.go +++ b/cmd/bbctl/config.go @@ -72,24 +72,17 @@ var askParams = map[string]func(string, map[string]string) (bool, error){ changed := false if metaPlatform == "" { if strings.Contains(bridgeName, "facebook-tor") || strings.Contains(bridgeName, "facebooktor") { - extraParams["meta_platform"] = "facebook-tor" + metaPlatform = "facebook-tor" } else if strings.Contains(bridgeName, "facebook") { - extraParams["meta_platform"] = "facebook" + metaPlatform = "facebook" } else if strings.Contains(bridgeName, "messenger") { - extraParams["meta_platform"] = "messenger" + metaPlatform = "messenger" } else if strings.Contains(bridgeName, "instagram") { - extraParams["meta_platform"] = "instagram" + metaPlatform = "instagram" } else { - err := survey.AskOne(&survey.Select{ - Message: "Which Meta platform do you want to bridge?", - Options: []string{"instagram", "facebook", "facebook-tor", "messenger"}, - }, &metaPlatform) - if err != nil { - return false, err - } - extraParams["meta_platform"] = metaPlatform - changed = true + return false, nil } + extraParams["meta_platform"] = metaPlatform } else if metaPlatform != "instagram" && metaPlatform != "facebook" && metaPlatform != "facebook-tor" && metaPlatform != "messenger" { return false, UserError{"Invalid Meta platform specified"} } diff --git a/cmd/bbctl/run.go b/cmd/bbctl/run.go index 543fc93..5834147 100644 --- a/cmd/bbctl/run.go +++ b/cmd/bbctl/run.go @@ -321,7 +321,7 @@ func runBridge(ctx *cli.Context) error { binaryName := fmt.Sprintf("mautrix-%s", cfg.BridgeType) ciV2 := false switch cfg.BridgeType { - case "gmessages": + case "gmessages", "meta": ciV2 = true } if cfg.BridgeType == "imessagego" {