automatic refresh of access token

This commit is contained in:
zhaoYangguang 2021-05-27 18:31:20 +08:00
parent 9a39b69dce
commit 9d7d8224c4
3 changed files with 66 additions and 31 deletions

View File

@ -244,8 +244,8 @@ func (bridge *Bridge) Start() {
bridge.Log.Fatalln("Failed to initialize database:", err) bridge.Log.Fatalln("Failed to initialize database:", err)
os.Exit(15) os.Exit(15)
} }
bridge.Log.Debugln("Checking connection to homeserver") //bridge.Log.Debugln("Checking connection to homeserver")
bridge.ensureConnection() //bridge.ensureConnection()
if bridge.Crypto != nil { if bridge.Crypto != nil {
err := bridge.Crypto.Init() err := bridge.Crypto.Init()
if err != nil { if err != nil {
@ -377,7 +377,7 @@ func (bridge *Bridge) Main() {
func main() { func main() {
flag.SetHelpTitles( flag.SetHelpTitles(
"matrix-skype - A Matrix-WhatsApp puppeting bridge.", "matrix-skype - A Matrix-Skype puppeting bridge.",
"matrix-skype [-h] [-c <path>] [-r <path>] [-g] [--migrate-db <source type> <source uri>]") "matrix-skype [-h] [-c <path>] [-r <path>] [-g] [--migrate-db <source type> <source uri>]")
err := flag.Parse() err := flag.Parse()
if err != nil { if err != nil {

View File

@ -1476,19 +1476,34 @@ func (portal *Portal) HandleTextMessage(source *User, message skype.Resource) {
} }
} }
} }
// portal.SetReplySkype(content, message)
fmt.Printf("\nportal HandleTextMessage2: %+v", content) fmt.Printf("\nportal HandleTextMessage2: %+v", content)
_, _ = intent.UserTyping(portal.MXID, false, 0) _, _ = intent.UserTyping(portal.MXID, false, 0)
resp, err := portal.sendMessage(intent, event.EventMessage, content, message.Timestamp * 1000) resp, err := portal.trySendMessage(intent, event.EventMessage, content, source, message)
if err != nil { if err == nil {
portal.log.Errorfln("Failed to handle message %s: %v", message.Id, err) portal.finishHandlingSkype(source, &message, resp.EventID)
return
} }
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) { func (portal *Portal) HandleLocationMessageSkype(source *User, message skype.Resource) {
intent, endHandlePrivateChatFromMe := portal.startHandlingSkype(source, message) intent, endHandlePrivateChatFromMe := portal.startHandlingSkype(source, message)
if endHandlePrivateChatFromMe != nil { if endHandlePrivateChatFromMe != nil {
@ -1517,12 +1532,17 @@ func (portal *Portal) HandleLocationMessageSkype(source *User, message skype.Res
// portal.SetReplySkype(content, message) // portal.SetReplySkype(content, message)
_, _ = intent.UserTyping(portal.MXID, false, 0) _, _ = intent.UserTyping(portal.MXID, false, 0)
resp, err := portal.sendMessage(intent, event.EventMessage, content, message.Timestamp * 1000)
if err != nil { resp, err := portal.trySendMessage(intent, event.EventMessage, content, source, message)
portal.log.Errorfln("Failed to handle message %s: %v", message.Id, err) if err == nil {
return 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) { 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) // portal.SetReplySkype(content, message)
_, _ = intent.UserTyping(portal.MXID, false, 0) _, _ = intent.UserTyping(portal.MXID, false, 0)
resp, err := portal.sendMessage(intent, event.EventMessage, content, message.Timestamp * 1000) resp, err := portal.trySendMessage(intent, event.EventMessage, content, source, message)
if err != nil { if err == nil {
portal.log.Errorfln("Failed to handle message %s: %v", message.Id, err) portal.finishHandlingSkype(source, &message, resp.EventID)
return
} }
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) { 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) 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, MsgType: event.MsgNotice,
Body: "Failed to bridge media", Body: "Failed to bridge media",
}, int64(info.Timestamp*1000)) }, source, info)
if err != nil { if err == nil {
portal.log.Errorfln("Failed to send media download error message for %s: %v", info.Id, err)
} else {
portal.finishHandlingSkype(source, &info, resp.EventID) 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 { if sendAsSticker {
eventType = event.EventSticker eventType = event.EventSticker
} }
resp, err := portal.sendMessage(intent, eventType, content, info.Timestamp * 1000)
if err != nil { resp, err := portal.trySendMessage(intent, eventType, content, source, info)
portal.log.Errorfln("Failed to handle message %s: %v", info.Id, err) if err == nil {
return portal.finishHandlingSkype(source, &info, resp.EventID)
} }
//if len(caption) > 0 { //if len(caption) > 0 {
@ -1767,7 +1791,6 @@ func (portal *Portal) HandleMediaMessageSkype(source *User, download func(conn *
// } // }
// // TODO store caption mxid? // // TODO store caption mxid?
//} //}
portal.finishHandlingSkype(source, &info, resp.EventID)
} }
func makeMessageID() *string { func makeMessageID() *string {

14
user.go
View File

@ -3,6 +3,7 @@ package main
import ( import (
"encoding/json" "encoding/json"
"encoding/xml" "encoding/xml"
"errors"
"fmt" "fmt"
skype "github.com/kelaresg/go-skypeapi" skype "github.com/kelaresg/go-skypeapi"
skypeExt "github.com/kelaresg/matrix-skype/skype-ext" skypeExt "github.com/kelaresg/matrix-skype/skype-ext"
@ -461,7 +462,17 @@ func (user *User) tryAutomaticDoublePuppeting() {
return return
} }
fmt.Println("tryAutomaticDoublePuppeting2", user.MXID) 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 { if err != nil {
user.log.Warnln("Failed to login with shared secret:", err) user.log.Warnln("Failed to login with shared secret:", err)
return return
@ -472,6 +483,7 @@ func (user *User) tryAutomaticDoublePuppeting() {
return return
} }
user.log.Infoln("Successfully automatically enabled custom puppet") user.log.Infoln("Successfully automatically enabled custom puppet")
return
} }
func (user *User) intPostLogin() { func (user *User) intPostLogin() {