From 9d7d8224c4b0aab7bdde6bbd1a865bac96011008 Mon Sep 17 00:00:00 2001 From: zhaoYangguang <1163765691@qq.com> Date: Thu, 27 May 2021 18:31:20 +0800 Subject: [PATCH] automatic refresh of access token --- main.go | 6 ++--- portal.go | 77 ++++++++++++++++++++++++++++++++++++------------------- user.go | 14 +++++++++- 3 files changed, 66 insertions(+), 31 deletions(-) diff --git a/main.go b/main.go index 9bc4dda..1bb2dcb 100644 --- a/main.go +++ b/main.go @@ -244,8 +244,8 @@ func (bridge *Bridge) Start() { bridge.Log.Fatalln("Failed to initialize database:", err) os.Exit(15) } - bridge.Log.Debugln("Checking connection to homeserver") - bridge.ensureConnection() + //bridge.Log.Debugln("Checking connection to homeserver") + //bridge.ensureConnection() if bridge.Crypto != nil { err := bridge.Crypto.Init() if err != nil { @@ -377,7 +377,7 @@ func (bridge *Bridge) Main() { func main() { flag.SetHelpTitles( - "matrix-skype - A Matrix-WhatsApp puppeting bridge.", + "matrix-skype - A Matrix-Skype puppeting bridge.", "matrix-skype [-h] [-c ] [-r ] [-g] [--migrate-db ]") err := flag.Parse() if err != nil { diff --git a/portal.go b/portal.go index 474854d..b27c42b 100644 --- a/portal.go +++ b/portal.go @@ -1476,19 +1476,34 @@ func (portal *Portal) HandleTextMessage(source *User, message skype.Resource) { } } } - // portal.SetReplySkype(content, message) fmt.Printf("\nportal HandleTextMessage2: %+v", content) _, _ = intent.UserTyping(portal.MXID, false, 0) - resp, err := portal.sendMessage(intent, event.EventMessage, content, message.Timestamp * 1000) - if err != nil { - portal.log.Errorfln("Failed to handle message %s: %v", message.Id, err) - return + resp, err := portal.trySendMessage(intent, event.EventMessage, content, source, message) + if err == nil { + portal.finishHandlingSkype(source, &message, resp.EventID) } - fmt.Printf("\nportal HandleTextMessage3: %+v", content) - portal.finishHandlingSkype(source, &message, resp.EventID) } } +func (portal *Portal) trySendMessage(intent *appservice.IntentAPI, eventType event.Type, content interface{}, source *User, message skype.Resource) (resp *mautrix.RespSendEvent, err error) { + resp, err = portal.sendMessage(intent, eventType, content, message.Timestamp * 1000) + if err != nil { + portal.log.Errorfln("Failed to handle message %s: %v", message.Id, err) + if strings.Index(err.Error(), "M_UNKNOWN_TOKEN (HTTP 401)") > -1 { + puppet := source.bridge.GetPuppetByJID(source.JID) + err, accessToken := source.UpdateAccessToken(puppet) + if err == nil && accessToken != "" { + intent.AccessToken = accessToken + resp, err = portal.sendMessage(intent, eventType, content, message.Timestamp * 1000) + if err != nil { + portal.log.Errorfln("Failed to handle message %s: %v", message.Id, err) + } + } + } + } + return +} + func (portal *Portal) HandleLocationMessageSkype(source *User, message skype.Resource) { intent, endHandlePrivateChatFromMe := portal.startHandlingSkype(source, message) if endHandlePrivateChatFromMe != nil { @@ -1517,12 +1532,17 @@ func (portal *Portal) HandleLocationMessageSkype(source *User, message skype.Res // portal.SetReplySkype(content, message) _, _ = intent.UserTyping(portal.MXID, false, 0) - resp, err := portal.sendMessage(intent, event.EventMessage, content, message.Timestamp * 1000) - if err != nil { - portal.log.Errorfln("Failed to handle message %s: %v", message.Id, err) - return + + resp, err := portal.trySendMessage(intent, event.EventMessage, content, source, message) + if err == nil { + portal.finishHandlingSkype(source, &message, resp.EventID) } - portal.finishHandlingSkype(source, &message, resp.EventID) + //resp, err := portal.sendMessage(intent, event.EventMessage, content, message.Timestamp * 1000) + //if err != nil { + // portal.log.Errorfln("Failed to handle message %s: %v", message.Id, err) + // return + //} + //portal.finishHandlingSkype(source, &message, resp.EventID) } func (portal *Portal) HandleContactMessageSkype(source *User, message skype.Resource) { @@ -1547,24 +1567,28 @@ func (portal *Portal) HandleContactMessageSkype(source *User, message skype.Reso // portal.SetReplySkype(content, message) _, _ = intent.UserTyping(portal.MXID, false, 0) - resp, err := portal.sendMessage(intent, event.EventMessage, content, message.Timestamp * 1000) - if err != nil { - portal.log.Errorfln("Failed to handle message %s: %v", message.Id, err) - return + resp, err := portal.trySendMessage(intent, event.EventMessage, content, source, message) + if err == nil { + portal.finishHandlingSkype(source, &message, resp.EventID) } - portal.finishHandlingSkype(source, &message, resp.EventID) + //resp, err := portal.sendMessage(intent, event.EventMessage, content, message.Timestamp * 1000) + //if err != nil { + // portal.log.Errorfln("Failed to handle message %s: %v", message.Id, err) + // return + //} + //portal.finishHandlingSkype(source, &message, resp.EventID) } func (portal *Portal) sendMediaBridgeFailureSkype(source *User, intent *appservice.IntentAPI, info skype.Resource, downloadErr error) { portal.log.Errorfln("Failed to download media for %s: %v", info.Id, downloadErr) - resp, err := portal.sendMessage(intent, event.EventMessage, &event.MessageEventContent{ + resp, err := portal.trySendMessage(intent, event.EventMessage, &event.MessageEventContent{ MsgType: event.MsgNotice, Body: "Failed to bridge media", - }, int64(info.Timestamp*1000)) - if err != nil { - portal.log.Errorfln("Failed to send media download error message for %s: %v", info.Id, err) - } else { + }, source, info) + if err == nil { portal.finishHandlingSkype(source, &info, resp.EventID) + } else { + portal.log.Errorfln("Failed to send media download error message for %s: %v", info.Id, err) } } @@ -1747,10 +1771,10 @@ func (portal *Portal) HandleMediaMessageSkype(source *User, download func(conn * if sendAsSticker { eventType = event.EventSticker } - resp, err := portal.sendMessage(intent, eventType, content, info.Timestamp * 1000) - if err != nil { - portal.log.Errorfln("Failed to handle message %s: %v", info.Id, err) - return + + resp, err := portal.trySendMessage(intent, eventType, content, source, info) + if err == nil { + portal.finishHandlingSkype(source, &info, resp.EventID) } //if len(caption) > 0 { @@ -1767,7 +1791,6 @@ func (portal *Portal) HandleMediaMessageSkype(source *User, download func(conn * // } // // TODO store caption mxid? //} - portal.finishHandlingSkype(source, &info, resp.EventID) } func makeMessageID() *string { diff --git a/user.go b/user.go index ce91661..e022807 100644 --- a/user.go +++ b/user.go @@ -3,6 +3,7 @@ package main import ( "encoding/json" "encoding/xml" + "errors" "fmt" skype "github.com/kelaresg/go-skypeapi" skypeExt "github.com/kelaresg/matrix-skype/skype-ext" @@ -461,7 +462,17 @@ func (user *User) tryAutomaticDoublePuppeting() { return } fmt.Println("tryAutomaticDoublePuppeting2", user.MXID) - accessToken, err := puppet.loginWithSharedSecret(user.MXID) + _,_ = user.UpdateAccessToken(puppet) +} + +func (user *User) UpdateAccessToken(puppet *Puppet) (err error, accessToken string) { + if len(user.bridge.Config.Bridge.LoginSharedSecret) == 0 { + return errors.New("you didn't set LoginSharedSecret"), "" + } else if _, homeserver, _ := user.MXID.Parse(); homeserver != user.bridge.Config.Homeserver.Domain { + // user is on another homeserver + return errors.New("user is on another homeServer"), "" + } + accessToken, err = puppet.loginWithSharedSecret(user.MXID) if err != nil { user.log.Warnln("Failed to login with shared secret:", err) return @@ -472,6 +483,7 @@ func (user *User) tryAutomaticDoublePuppeting() { return } user.log.Infoln("Successfully automatically enabled custom puppet") + return } func (user *User) intPostLogin() {