diff --git a/libgm/client.go b/libgm/client.go index fc71474..4b85a8d 100644 --- a/libgm/client.go +++ b/libgm/client.go @@ -4,6 +4,7 @@ import ( "encoding/base64" "io" "net/http" + "net/http/cookiejar" "net/url" "time" @@ -49,13 +50,16 @@ func NewClient(devicePair *DevicePair, cryptor *crypto.Cryptor, logger zerolog.L if cryptor == nil { cryptor = crypto.NewCryptor(nil, nil) } + jar, _ := cookiejar.New(nil) cli := &Client{ Logger: logger, devicePair: devicePair, sessionHandler: sessionHandler, cryptor: cryptor, imageCryptor: &crypto.ImageCryptor{}, - http: &http.Client{}, + http: &http.Client{ + Jar: jar, + }, } sessionHandler.client = cli cli.instructions = NewInstructions(cli.cryptor) @@ -69,6 +73,16 @@ func NewClient(devicePair *DevicePair, cryptor *crypto.Cryptor, logger zerolog.L return cli } +var baseURL, _ = url.Parse("https://messages.google.com/") + +func (c *Client) GetCookies() []*http.Cookie { + return c.http.Jar.Cookies(baseURL) +} + +func (c *Client) SetCookies(cookies []*http.Cookie) { + c.http.Jar.SetCookies(baseURL, cookies) +} + func (c *Client) SetEventHandler(eventHandler EventHandler) { if eventHandler == nil { eventHandler = func(_ interface{}) {} @@ -200,7 +214,7 @@ func (c *Client) decryptImageData(imageId string, key []byte) ([]byte, error) { Date: &binary.Date{ Year: 2023, Seq1: 6, - Seq2: 8, + Seq2: 22, Seq3: 4, Seq4: 6, }, diff --git a/libgm/media_processor.go b/libgm/media_processor.go index 1c34410..559a9c3 100644 --- a/libgm/media_processor.go +++ b/libgm/media_processor.go @@ -141,7 +141,7 @@ func (c *Client) buildStartUploadPayload() (string, error) { Date: &binary.Date{ Year: 2023, Seq1: 6, - Seq2: 8, + Seq2: 22, Seq3: 4, Seq4: 6, }, diff --git a/libgm/pair.go b/libgm/pair.go index 6c3cfb0..095577c 100644 --- a/libgm/pair.go +++ b/libgm/pair.go @@ -116,11 +116,11 @@ func (p *Pairer) RefreshPhoneRelay() { p.client.triggerEvent(&events.QR{URL: url}) } -func (p *Pairer) GetWebEncryptionKey() { - body, _, err2 := payload.GetWebEncryptionKey(p.client.rpc.webAuthKey) +func (p *Pairer) GetWebEncryptionKey(oldKey []byte) []byte { + body, _, err2 := payload.GetWebEncryptionKey(oldKey) if err2 != nil { p.client.Logger.Err(err2).Msg("web encryption key err") - return + return nil } //p.client.Logger.Debug().Any("keyByteLength", len(rawData.PhoneRelay.RpcKey)).Any("json", rawData).Any("base64", body).Msg("GetWebEncryptionKey Payload") webKeyResponse, reqErr := p.client.MakeRelayRequest(util.GET_WEB_ENCRYPTION_KEY, body) @@ -131,7 +131,7 @@ func (p *Pairer) GetWebEncryptionKey() { defer webKeyResponse.Body.Close() if err2 != nil { p.client.Logger.Err(err2).Msg("Web encryption key read response err") - return + return nil } //p.client.Logger.Debug().Any("responseLength", len(responseBody)).Any("raw", responseBody).Msg("Response Body Length") parsedResponse := &binary.WebEncryptionKeyResponse{} @@ -140,18 +140,22 @@ func (p *Pairer) GetWebEncryptionKey() { p.client.Logger.Err(err2).Msg("Parse webkeyresponse into proto struct error") } p.client.Logger.Debug().Any("parsedResponse", parsedResponse).Msg("WebEncryptionKeyResponse") - p.ticker.Stop() - reconnectErr := p.client.Reconnect(p.client.rpc.webAuthKey) - if reconnectErr != nil { - panic(reconnectErr) + if p.ticker != nil { + p.client.Logger.Info().Msg("Reconnecting") + p.ticker.Stop() + reconnectErr := p.client.Reconnect(p.client.rpc.webAuthKey) + if reconnectErr != nil { + panic(reconnectErr) + } } + return parsedResponse.GetKey() } func (p *Pairer) pairCallback(pairData *binary.Container) { p.client.rpc.webAuthKey = pairData.PairDeviceData.WebAuthKeyData.WebAuthKey p.client.ttl = pairData.PairDeviceData.WebAuthKeyData.ValidFor p.client.devicePair = &DevicePair{Mobile: pairData.PairDeviceData.Mobile, Browser: pairData.PairDeviceData.Browser} - p.client.pairer.GetWebEncryptionKey() + p.client.pairer.GetWebEncryptionKey(p.client.rpc.webAuthKey) p.client.triggerEvent(&events.PairSuccessful{Container: pairData}) p.client.pairer = nil } diff --git a/libgm/payload/getWebEncryptionKey.go b/libgm/payload/getWebEncryptionKey.go index b261410..7ce5ce5 100644 --- a/libgm/payload/getWebEncryptionKey.go +++ b/libgm/payload/getWebEncryptionKey.go @@ -14,7 +14,7 @@ func GetWebEncryptionKey(WebPairKey []byte) ([]byte, *binary.Container, error) { Date: &binary.Date{ Year: 2023, Seq1: 6, - Seq2: 8, + Seq2: 22, Seq3: 4, Seq4: 6, }, diff --git a/libgm/payload/receiveMessages.go b/libgm/payload/receiveMessages.go index 2149f35..140c5d6 100644 --- a/libgm/payload/receiveMessages.go +++ b/libgm/payload/receiveMessages.go @@ -17,7 +17,7 @@ func ReceiveMessages(rpcKey []byte) ([]byte, string, error) { Date: &binary.Date{ Year: 2023, Seq1: 6, - Seq2: 8, + Seq2: 22, Seq3: 4, Seq4: 6, }, diff --git a/libgm/payload/refreshPhoneRelay.go b/libgm/payload/refreshPhoneRelay.go index 3d83681..e335083 100644 --- a/libgm/payload/refreshPhoneRelay.go +++ b/libgm/payload/refreshPhoneRelay.go @@ -14,7 +14,7 @@ func RefreshPhoneRelay(rpcKey []byte) ([]byte, *binary.Container, error) { Date: &binary.Date{ Year: 2023, Seq1: 6, - Seq2: 8, + Seq2: 22, Seq3: 4, Seq4: 6, }, diff --git a/libgm/payload/registerPhoneRelay.go b/libgm/payload/registerPhoneRelay.go index 3b08c69..12a58d1 100644 --- a/libgm/payload/registerPhoneRelay.go +++ b/libgm/payload/registerPhoneRelay.go @@ -37,7 +37,7 @@ func RegisterPhoneRelay(jwk *crypto.JWK) ([]byte, *binary.Container, error) { Date: &binary.Date{ Year: 2023, Seq1: 6, - Seq2: 8, + Seq2: 22, Seq3: 4, Seq4: 6, }, diff --git a/libgm/rpc.go b/libgm/rpc.go index 4ff51e7..90d2ef4 100644 --- a/libgm/rpc.go +++ b/libgm/rpc.go @@ -19,10 +19,13 @@ type RPC struct { conn io.ReadCloser rpcSessionID string webAuthKey []byte + listenID int } func (r *RPC) ListenReceiveMessages(payload []byte) { - for { + r.listenID++ + listenID := r.listenID + for r.listenID == listenID { r.client.Logger.Debug().Msg("Starting new long-polling request") req, err := http.NewRequest("POST", util.RECEIVE_MESSAGES, bytes.NewReader(payload)) if err != nil { @@ -34,6 +37,7 @@ func (r *RPC) ListenReceiveMessages(payload []byte) { if reqErr != nil { panic(fmt.Errorf("Error making request: %v", err)) } + r.client.Logger.Debug().Int("statusCode", resp.StatusCode).Msg("Long polling opened") r.conn = resp.Body r.startReadingData(resp.Body) } @@ -133,6 +137,7 @@ func (r *RPC) startReadingData(rc io.ReadCloser) { func (r *RPC) CloseConnection() { if r.conn != nil { + r.listenID++ r.client.Logger.Debug().Msg("Attempting to connection...") r.conn.Close() r.conn = nil diff --git a/libgm/session_handler.go b/libgm/session_handler.go index b099e4d..d13745e 100644 --- a/libgm/session_handler.go +++ b/libgm/session_handler.go @@ -74,7 +74,7 @@ func (c *Client) createAndSendRequest(instructionId int64, ttl int64, newSession panic(fmt.Errorf("Failed to encode data: %w", encodeErr)) } messageData := payload.NewMessageData(requestId, encodedStr, instruction.RoutingOpCode, instruction.MsgType) - authMessage := payload.NewAuthData(requestId, c.rpcKey, &binary.Date{Year: 2023, Seq1: 6, Seq2: 8, Seq3: 4, Seq4: 6}) + authMessage := payload.NewAuthData(requestId, c.rpcKey, &binary.Date{Year: 2023, Seq1: 6, Seq2: 22, Seq3: 4, Seq4: 6}) sendMessage := payload.NewSendMessage(c.devicePair.Mobile, messageData, authMessage, ttl) sentRequestID, reqErr := c.sessionHandler.completeSendMessage(encodedData.RequestID, instruction.Opcode, sendMessage) @@ -139,7 +139,7 @@ func (s *SessionHandler) sendAckRequest() { AuthData: &binary.AuthMessage{ RequestID: reqId, RpcKey: s.client.rpcKey, - Date: &binary.Date{Year: 2023, Seq1: 6, Seq2: 8, Seq3: 4, Seq4: 6}, + Date: &binary.Date{Year: 2023, Seq1: 6, Seq2: 22, Seq3: 4, Seq4: 6}, }, EmptyArr: &binary.EmptyArr{}, NoClue: nil,