Skip to content

Commit ead8a86

Browse files
committed
Use MSC2778 instead of shared secret for bridge bot login
1 parent 0329dd5 commit ead8a86

File tree

3 files changed

+19
-11
lines changed

3 files changed

+19
-11
lines changed

crypto.go

+16-10
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@
1919
package main
2020

2121
import (
22-
"crypto/hmac"
23-
"crypto/sha512"
24-
"encoding/hex"
2522
"fmt"
2623
"runtime/debug"
2724
"time"
@@ -87,7 +84,6 @@ func (helper *CryptoHelper) Init() error {
8784
helper.mach = crypto.NewOlmMachine(helper.client, logger, helper.store, stateStore)
8885
helper.mach.AllowKeyShare = helper.allowKeyShare
8986

90-
helper.client.Logger = logger.int.Sub("Bot")
9187
helper.client.Syncer = &cryptoSyncer{helper.mach}
9288
helper.client.Store = &cryptoClientStore{helper.store}
9389

@@ -123,22 +119,32 @@ func (helper *CryptoHelper) loginBot() (*mautrix.Client, error) {
123119
if len(deviceID) > 0 {
124120
helper.log.Debugln("Found existing device ID for bot in database:", deviceID)
125121
}
126-
mac := hmac.New(sha512.New, []byte(helper.bridge.Config.Bridge.LoginSharedSecret))
127-
mac.Write([]byte(helper.bridge.AS.BotMXID()))
128122
client, err := mautrix.NewClient(helper.bridge.AS.HomeserverURL, "", "")
129123
if err != nil {
130-
return nil, err
124+
return nil, fmt.Errorf("failed to initialize client: %w", err)
131125
}
126+
client.Logger = helper.baseLog.Sub("Bot")
127+
flows, err := client.GetLoginFlows()
128+
if err != nil {
129+
return nil, fmt.Errorf("failed to get supported login flows: %w", err)
130+
}
131+
if !flows.HasFlow(mautrix.AuthTypeAppservice) {
132+
// TODO after synapse 1.22, turn this into an error
133+
helper.log.Warnln("Encryption enabled in config, but homeserver does not advertise appservice login")
134+
//return nil, fmt.Errorf("homeserver does not support appservice login")
135+
}
136+
// We set the API token to the AS token here to authenticate the appservice login
137+
// It'll get overridden after the login
138+
client.AccessToken = helper.bridge.AS.Registration.AppToken
132139
resp, err := client.Login(&mautrix.ReqLogin{
133-
Type: mautrix.AuthTypePassword,
140+
Type: mautrix.AuthTypeAppservice,
134141
Identifier: mautrix.UserIdentifier{Type: mautrix.IdentifierTypeUser, User: string(helper.bridge.AS.BotMXID())},
135-
Password: hex.EncodeToString(mac.Sum(nil)),
136142
DeviceID: deviceID,
137143
InitialDeviceDisplayName: "WhatsApp Bridge",
138144
StoreCredentials: true,
139145
})
140146
if err != nil {
141-
return nil, err
147+
return nil, fmt.Errorf("failed to log in as bridge bot: %w", err)
142148
}
143149
if len(deviceID) == 0 {
144150
helper.store.DeviceID = resp.DeviceID

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ require (
1313
gopkg.in/yaml.v2 v2.3.0
1414
maunium.net/go/mauflag v1.0.0
1515
maunium.net/go/maulogger/v2 v2.1.1
16-
maunium.net/go/mautrix v0.7.12
16+
maunium.net/go/mautrix v0.7.13
1717
)
1818

1919
replace github.com/Rhymen/go-whatsapp => github.com/tulir/go-whatsapp v0.3.10

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,5 @@ maunium.net/go/mautrix v0.7.11 h1:3MdKRs8Dt1H8PvKH/6ES1AdooJngBVEGAwLLeVTnouk=
189189
maunium.net/go/mautrix v0.7.11/go.mod h1:FpsAvwNdG3Zeup7Y2Nlv81Lk0h6iVRPoIy6D7g/7YCE=
190190
maunium.net/go/mautrix v0.7.12 h1:kJN5ErlzGAQdNMv58Rv4GATkLlb4OJ3l0IOwxFovlVc=
191191
maunium.net/go/mautrix v0.7.12/go.mod h1:Jn0ijwXwMFvJFIN9IljirIVKpZQbZP/Dk7pdX2qDmXk=
192+
maunium.net/go/mautrix v0.7.13 h1:qfnvLxvQafvLgHbdZF/+9qs9gyArYf8fUnzfQbjgQaU=
193+
maunium.net/go/mautrix v0.7.13/go.mod h1:Jn0ijwXwMFvJFIN9IljirIVKpZQbZP/Dk7pdX2qDmXk=

0 commit comments

Comments
 (0)