Update to remote auth v2

This commit is contained in:
Tulir Asokan 2022-09-13 14:02:13 +03:00
parent 0e12bd58d6
commit 704bdaefd7
4 changed files with 31 additions and 15 deletions

4
go.mod
View file

@ -3,7 +3,7 @@ module go.mau.fi/mautrix-discord
go 1.17 go 1.17
require ( require (
github.com/bwmarrin/discordgo v0.25.0 github.com/bwmarrin/discordgo v0.26.1
github.com/gorilla/mux v1.8.0 github.com/gorilla/mux v1.8.0
github.com/gorilla/websocket v1.5.0 github.com/gorilla/websocket v1.5.0
github.com/lib/pq v1.10.6 github.com/lib/pq v1.10.6
@ -32,4 +32,4 @@ require (
maunium.net/go/mauflag v1.0.0 // indirect maunium.net/go/mauflag v1.0.0 // indirect
) )
replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20220708141955-6445b637ad87 replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20220913114117-bbf4447874d5

4
go.sum
View file

@ -1,7 +1,7 @@
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/beeper/discordgo v0.0.0-20220708141955-6445b637ad87 h1:d/pVWbHPkLk3oLDDMfn+4mu6DoyOWwj02/sup5oQpag= github.com/beeper/discordgo v0.0.0-20220913114117-bbf4447874d5 h1:w/mHH7KoSLUPhqW11mu2rE7cLXhW878bBVRnZ/kiIhs=
github.com/beeper/discordgo v0.0.0-20220708141955-6445b637ad87/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/beeper/discordgo v0.0.0-20220913114117-bbf4447874d5/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY=
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=

View file

@ -43,7 +43,7 @@ func New() (*Client, error) {
} }
return &Client{ return &Client{
URL: "wss://remote-auth-gateway.discord.gg/?v=1", URL: "wss://remote-auth-gateway.discord.gg/?v=2",
privateKey: privateKey, privateKey: privateKey,
}, nil }, nil
} }

View file

@ -8,6 +8,8 @@ import (
"time" "time"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"github.com/bwmarrin/discordgo"
) )
type serverPacket interface { type serverPacket interface {
@ -53,14 +55,19 @@ func (c *Client) processMessages() {
dest = new(serverNonceProof) dest = new(serverNonceProof)
case "pending_remote_init": case "pending_remote_init":
dest = new(serverPendingRemoteInit) dest = new(serverPendingRemoteInit)
case "pending_finish": case "pending_ticket":
dest = new(serverPendingFinish) dest = new(serverPendingTicket)
case "finish": case "pending_login":
dest = new(serverFinish) dest = new(serverPendingLogin)
case "cancel": case "cancel":
dest = new(serverCancel) dest = new(serverCancel)
case "heartbeat_ack": case "heartbeat_ack":
dest = new(serverHeartbeatAck) dest = new(serverHeartbeatAck)
default:
c.Lock()
c.err = fmt.Errorf("unknown op %s", raw.OP)
c.Unlock()
return
} }
if err := json.Unmarshal(packet, dest); err != nil { if err := json.Unmarshal(packet, dest); err != nil {
@ -182,11 +189,11 @@ func (p *serverPendingRemoteInit) process(client *Client) error {
// ///////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////
// PendingFinish // PendingFinish
// ///////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////
type serverPendingFinish struct { type serverPendingTicket struct {
EncryptedUserPayload string `json:"encrypted_user_payload"` EncryptedUserPayload string `json:"encrypted_user_payload"`
} }
func (p *serverPendingFinish) process(client *Client) error { func (p *serverPendingTicket) process(client *Client) error {
plaintext, err := client.decrypt(p.EncryptedUserPayload) plaintext, err := client.decrypt(p.EncryptedUserPayload)
if err != nil { if err != nil {
return err return err
@ -198,12 +205,21 @@ func (p *serverPendingFinish) process(client *Client) error {
// ///////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////
// Finish // Finish
// ///////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////
type serverFinish struct { type serverPendingLogin struct {
EncryptedToken string `json:"encrypted_token"` Ticket string `json:"ticket"`
} }
func (f *serverFinish) process(client *Client) error { func (p *serverPendingLogin) process(client *Client) error {
plaintext, err := client.decrypt(f.EncryptedToken) sess, err := discordgo.New("")
if err != nil {
return err
}
encryptedToken, err := sess.RemoteAuthLogin(p.Ticket)
if err != nil {
return err
}
plaintext, err := client.decrypt(encryptedToken)
if err != nil { if err != nil {
return err return err
} }