From 704bdaefd7b5874713f744c1b29f26d5a838a09a Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 13 Sep 2022 14:02:13 +0300 Subject: [PATCH] Update to remote auth v2 --- go.mod | 4 ++-- go.sum | 4 ++-- remoteauth/client.go | 2 +- remoteauth/serverpackets.go | 36 ++++++++++++++++++++++++++---------- 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index bd318d8..8935150 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module go.mau.fi/mautrix-discord go 1.17 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/websocket v1.5.0 github.com/lib/pq v1.10.6 @@ -32,4 +32,4 @@ require ( 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 diff --git a/go.sum b/go.sum index 84e1fb7..21f8a57 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ 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/beeper/discordgo v0.0.0-20220708141955-6445b637ad87 h1:d/pVWbHPkLk3oLDDMfn+4mu6DoyOWwj02/sup5oQpag= -github.com/beeper/discordgo v0.0.0-20220708141955-6445b637ad87/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= +github.com/beeper/discordgo v0.0.0-20220913114117-bbf4447874d5 h1:w/mHH7KoSLUPhqW11mu2rE7cLXhW878bBVRnZ/kiIhs= +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/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= diff --git a/remoteauth/client.go b/remoteauth/client.go index b039319..3189626 100644 --- a/remoteauth/client.go +++ b/remoteauth/client.go @@ -43,7 +43,7 @@ func New() (*Client, error) { } return &Client{ - URL: "wss://remote-auth-gateway.discord.gg/?v=1", + URL: "wss://remote-auth-gateway.discord.gg/?v=2", privateKey: privateKey, }, nil } diff --git a/remoteauth/serverpackets.go b/remoteauth/serverpackets.go index f36be85..b7376d3 100644 --- a/remoteauth/serverpackets.go +++ b/remoteauth/serverpackets.go @@ -8,6 +8,8 @@ import ( "time" "github.com/gorilla/websocket" + + "github.com/bwmarrin/discordgo" ) type serverPacket interface { @@ -53,14 +55,19 @@ func (c *Client) processMessages() { dest = new(serverNonceProof) case "pending_remote_init": dest = new(serverPendingRemoteInit) - case "pending_finish": - dest = new(serverPendingFinish) - case "finish": - dest = new(serverFinish) + case "pending_ticket": + dest = new(serverPendingTicket) + case "pending_login": + dest = new(serverPendingLogin) case "cancel": dest = new(serverCancel) case "heartbeat_ack": 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 { @@ -182,11 +189,11 @@ func (p *serverPendingRemoteInit) process(client *Client) error { // ///////////////////////////////////////////////////////////////////////////// // PendingFinish // ///////////////////////////////////////////////////////////////////////////// -type serverPendingFinish struct { +type serverPendingTicket struct { 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) if err != nil { return err @@ -198,12 +205,21 @@ func (p *serverPendingFinish) process(client *Client) error { // ///////////////////////////////////////////////////////////////////////////// // Finish // ///////////////////////////////////////////////////////////////////////////// -type serverFinish struct { - EncryptedToken string `json:"encrypted_token"` +type serverPendingLogin struct { + Ticket string `json:"ticket"` } -func (f *serverFinish) process(client *Client) error { - plaintext, err := client.decrypt(f.EncryptedToken) +func (p *serverPendingLogin) process(client *Client) error { + 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 { return err }