|
19 | 19 | package main
|
20 | 20 |
|
21 | 21 | import (
|
22 |
| - "crypto/hmac" |
23 |
| - "crypto/sha512" |
24 |
| - "encoding/hex" |
25 | 22 | "fmt"
|
26 | 23 | "runtime/debug"
|
27 | 24 | "time"
|
@@ -87,7 +84,6 @@ func (helper *CryptoHelper) Init() error {
|
87 | 84 | helper.mach = crypto.NewOlmMachine(helper.client, logger, helper.store, stateStore)
|
88 | 85 | helper.mach.AllowKeyShare = helper.allowKeyShare
|
89 | 86 |
|
90 |
| - helper.client.Logger = logger.int.Sub("Bot") |
91 | 87 | helper.client.Syncer = &cryptoSyncer{helper.mach}
|
92 | 88 | helper.client.Store = &cryptoClientStore{helper.store}
|
93 | 89 |
|
@@ -123,22 +119,32 @@ func (helper *CryptoHelper) loginBot() (*mautrix.Client, error) {
|
123 | 119 | if len(deviceID) > 0 {
|
124 | 120 | helper.log.Debugln("Found existing device ID for bot in database:", deviceID)
|
125 | 121 | }
|
126 |
| - mac := hmac.New(sha512.New, []byte(helper.bridge.Config.Bridge.LoginSharedSecret)) |
127 |
| - mac.Write([]byte(helper.bridge.AS.BotMXID())) |
128 | 122 | client, err := mautrix.NewClient(helper.bridge.AS.HomeserverURL, "", "")
|
129 | 123 | if err != nil {
|
130 |
| - return nil, err |
| 124 | + return nil, fmt.Errorf("failed to initialize client: %w", err) |
131 | 125 | }
|
| 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 |
132 | 139 | resp, err := client.Login(&mautrix.ReqLogin{
|
133 |
| - Type: mautrix.AuthTypePassword, |
| 140 | + Type: mautrix.AuthTypeAppservice, |
134 | 141 | Identifier: mautrix.UserIdentifier{Type: mautrix.IdentifierTypeUser, User: string(helper.bridge.AS.BotMXID())},
|
135 |
| - Password: hex.EncodeToString(mac.Sum(nil)), |
136 | 142 | DeviceID: deviceID,
|
137 | 143 | InitialDeviceDisplayName: "WhatsApp Bridge",
|
138 | 144 | StoreCredentials: true,
|
139 | 145 | })
|
140 | 146 | if err != nil {
|
141 |
| - return nil, err |
| 147 | + return nil, fmt.Errorf("failed to log in as bridge bot: %w", err) |
142 | 148 | }
|
143 | 149 | if len(deviceID) == 0 {
|
144 | 150 | helper.store.DeviceID = resp.DeviceID
|
|
0 commit comments