Wait up to 3 seconds for encryption keys to arrive

This commit is contained in:
Tulir Asokan
2020-09-24 15:25:36 +03:00
parent 0b2fd69bf1
commit d67c3a8c96
8 changed files with 38 additions and 13 deletions

View File

@@ -17,12 +17,14 @@
package main
import (
"errors"
"fmt"
"strings"
"time"
"maunium.net/go/maulogger/v2"
"maunium.net/go/mautrix"
"maunium.net/go/mautrix"
"maunium.net/go/mautrix/appservice"
"maunium.net/go/mautrix/event"
"maunium.net/go/mautrix/format"
@@ -330,6 +332,8 @@ func (mx *MatrixHandler) shouldIgnoreEvent(evt *event.Event) bool {
return false
}
const sessionWaitTimeout = 3 * time.Second
func (mx *MatrixHandler) HandleEncrypted(evt *event.Event) {
defer mx.bridge.Metrics.TrackEvent(evt.Type)()
if mx.shouldIgnoreEvent(evt) || mx.bridge.Crypto == nil {
@@ -337,10 +341,17 @@ func (mx *MatrixHandler) HandleEncrypted(evt *event.Event) {
}
decrypted, err := mx.bridge.Crypto.Decrypt(evt)
if err != nil {
content := evt.Content.AsEncrypted()
if errors.Is(err, NoSessionFound) && mx.bridge.Crypto.WaitForSession(evt.RoomID, content.SenderKey, content.SessionID, sessionWaitTimeout) {
mx.log.Debugfln("Got session %s to decrypt %s after waiting a while, trying to decrypt again", evt.ID, content.SessionID)
decrypted, err = mx.bridge.Crypto.Decrypt(evt)
}
}
if err != nil {
mx.log.Warnfln("Failed to decrypt %s: %v", evt.ID, err)
_, _ = mx.bridge.Bot.SendNotice(evt.RoomID, fmt.Sprintf(
"\u26a0 Your message was not bridged: %v. " +
"\u26a0 Your message was not bridged: %v. "+
"Try restarting your client if this error keeps happening.", err))
return
}