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)
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 <path>] [-r <path>] [-g] [--migrate-db <source type> <source uri>]")
err := flag.Parse()
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)
_, _ = 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 {

14
user.go
View File

@ -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() {