diff --git a/README.md b/README.md index 2c69793..24a2dbe 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ Response Route: /raw Web Interface to View Protos: / Traffic Route mode /traffic Golbat Route mode /golbat +PolyX Route mode /PolygonX/PostProtos Web Interface: @@ -83,6 +84,33 @@ interface CombinedMessage { } ``` +### Support for PolygonX interfaces +**Sent to** `/PolygonX/PostProtos` + +```js +interface CombinedMessage { + protos: [ + { + method: number + proto: bytes + request: bytes + trainer_id: string + trainer_level: number + has_geotargeted_ar_scan_quest: boolean + } + ] + push_gateway_protos: [ + { + method: number + proto: bytes + trainer_id: string + trainer_level: number + has_geotargeted_ar_scan_quest: boolean + } + ] +} +``` + ### Requirements ``` diff --git a/src/constants/index.ts b/src/constants/index.ts index cdd6961..96a651e 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -118,6 +118,11 @@ export const requestMessagesResponses = { REQUEST_TYPE_METHOD_SATURDAY_TRANSACTION_COMPLETE: [828, POGOProtos.Rpc.SaturdayCompleteProto, POGOProtos.Rpc.SaturdayCompleteOutProto], REQUEST_TYPE_METHOD_REIMBURSE_ITEM: [829, null, null], REQUEST_TYPE_METHOD_LIFT_USER_AGE_CONFIRMATION: [830, POGOProtos.Rpc.LiftUserAgeGateConfirmationProto, POGOProtos.Rpc.LiftUserAgeGateConfirmationOutProto], + REQUEST_TYPE_METHOD_SOFT_SFIDA_START: [831, POGOProtos.Rpc.SoftSfidaStartProto, POGOProtos.Rpc.SoftSfidaStartOutProto], + REQUEST_TYPE_METHOD_SOFT_SFIDA_PAUSE: [832, POGOProtos.Rpc.SoftSfidaPauseProto, POGOProtos.Rpc.SoftSfidaPauseOutProto], + REQUEST_TYPE_METHOD_SOFT_SFIDA_CAPTURE: [833, POGOProtos.Rpc.SoftSfidaCaptureProto, POGOProtos.Rpc.SoftSfidaCaptureOutProto], + REQUEST_TYPE_METHOD_SOFT_SFIDA_LOCATION_UPDATE: [834, POGOProtos.Rpc.SoftSfidaLocationUpdateProto, POGOProtos.Rpc.SoftSfidaLocationUpdateOutProto], + REQUEST_TYPE_METHOD_SOFT_SFIDA_RECAP: [835, POGOProtos.Rpc.SoftSfidaRecapProto, POGOProtos.Rpc.SoftSfidaRecapOutProto], REQUEST_TYPE_METHOD_GET_NEW_QUESTS: [900, POGOProtos.Rpc.GetNewQuestsProto, POGOProtos.Rpc.GetNewQuestsOutProto], REQUEST_TYPE_METHOD_GET_QUEST_DETAILS: [901, POGOProtos.Rpc.GetQuestDetailsProto, POGOProtos.Rpc.GetQuestDetailsOutProto], REQUEST_TYPE_METHOD_COMPLETE_QUEST: [902, POGOProtos.Rpc.CompleteQuestProto, POGOProtos.Rpc.CompleteQuestOutProto], @@ -127,6 +132,7 @@ export const requestMessagesResponses = { REQUEST_TYPE_METHOD_PROGRESS_QUEST: [906, POGOProtos.Rpc.ProgressQuestProto, POGOProtos.Rpc.ProgressQuestOutProto], REQUEST_TYPE_METHOD_START_QUEST_INCIDENT: [907, POGOProtos.Rpc.StartQuestIncidentProto, null], REQUEST_TYPE_METHOD_READ_QUEST_DIALOG: [908, POGOProtos.Rpc.ReadQuestDialogProto, POGOProtos.Rpc.ReadQuestDialogOutProto], + REQUEST_TYPE_METHOD_DEQUEUE_QUEST_DIALOGUE: [909, POGOProtos.Rpc.DequeueQuestDialogueProto, POGOProtos.Rpc.DequeueQuestDialogueOutProto], REQUEST_TYPE_METHOD_SEND_GIFT: [950, POGOProtos.Rpc.SendGiftProto, POGOProtos.Rpc.SendGiftOutProto], REQUEST_TYPE_METHOD_OPEN_GIFT: [951, POGOProtos.Rpc.OpenGiftProto, POGOProtos.Rpc.OpenGiftOutProto], REQUEST_TYPE_METHOD_GIFT_DETAILS: [952, POGOProtos.Rpc.GetGiftBoxDetailsProto, POGOProtos.Rpc.GetGiftBoxDetailsOutProto], @@ -183,7 +189,7 @@ export const requestMessagesResponses = { REQUEST_TYPE_METHOD_INVASION_ENCOUNTER: [1204, POGOProtos.Rpc.InvasionEncounterProto, POGOProtos.Rpc.InvasionEncounterOutProto], REQUEST_TYPE_METHOD_PURIFY_POKEMON: [1205, POGOProtos.Rpc.PurifyPokemonProto, POGOProtos.Rpc.PurifyPokemonOutProto], REQUEST_TYPE_METHOD_GET_ROCKET_BALLOON: [1206, POGOProtos.Rpc.GetRocketBalloonProto, POGOProtos.Rpc.GetRocketBalloonOutProto], - REQUEST_TYPE_METHOD_START_ROCKET_BALLOON_INCIDENT: [1207, POGOProtos.Rpc.StartRocketBalloonIncidentProto, null], + REQUEST_TYPE_METHOD_START_ROCKET_BALLOON_INCIDENT: [1207, POGOProtos.Rpc.StartRocketBalloonIncidentProto, POGOProtos.Rpc.StartIncidentOutProto], REQUEST_TYPE_METHOD_VS_SEEKER_START_MATCHMAKING: [1300, POGOProtos.Rpc.VsSeekerStartMatchmakingProto, POGOProtos.Rpc.VsSeekerStartMatchmakingOutProto], REQUEST_TYPE_METHOD_CANCEL_MATCHMAKING: [1301, POGOProtos.Rpc.CancelMatchmakingProto, POGOProtos.Rpc.CancelMatchmakingOutProto], REQUEST_TYPE_METHOD_GET_MATCHMAKING_STATUS: [1302, POGOProtos.Rpc.GetMatchmakingStatusProto, POGOProtos.Rpc.GetMatchmakingStatusOutProto], @@ -234,6 +240,7 @@ export const requestMessagesResponses = { REQUEST_TYPE_METHOD_REMOTE_GIFT_PING: [1503, POGOProtos.Rpc.RemoteGiftPingRequestProto, POGOProtos.Rpc.RemoteGiftPingResponseProto], REQUEST_TYPE_METHOD_SEND_RAID_INVITATION: [1504, POGOProtos.Rpc.SendRaidInvitationProto, POGOProtos.Rpc.SendRaidInvitationOutProto], REQUEST_TYPE_METHOD_SEND_BREAD_BATTLE_INVITATION: [1505, POGOProtos.Rpc.SendBreadBattleInvitationProto, POGOProtos.Rpc.SendBreadBattleInvitationOutProto], + REQUEST_TYPE_METHOD_UNLOCK_TEMPORARY_EVOLUTION_LEVEL: [1506, POGOProtos.Rpc.UnlockTemporaryEvolutionLevelProto, POGOProtos.Rpc.UnlockTemporaryEvolutionLevelOutProto], REQUEST_TYPE_METHOD_GET_DAILY_ENCOUNTER: [1601, POGOProtos.Rpc.GetDailyEncounterProto, POGOProtos.Rpc.GetDailyEncounterOutProto], REQUEST_TYPE_METHOD_DAILY_ENCOUNTER: [1602, POGOProtos.Rpc.DailyEncounterProto, POGOProtos.Rpc.DailyEncounterOutProto], REQUEST_TYPE_METHOD_OPEN_SPONSORED_GIFT: [1650, POGOProtos.Rpc.OpenSponsoredGiftProto, POGOProtos.Rpc.OpenSponsoredGiftOutProto], @@ -419,6 +426,10 @@ export const requestMessagesResponses = { REQUEST_TYPE_METHOD_START_PVP_BATTLE: [3071, POGOProtos.Rpc.StartPvpBattleProto, POGOProtos.Rpc.StartPvpBattleOutProto], REQUEST_TYPE_METHOD_COMPLETE_PVP_BATTLE: [3072, POGOProtos.Rpc.CompletePvpBattleProto, POGOProtos.Rpc.CompletePvpBattleOutProto], REQUEST_TYPE_METHOD_AR_PHOTO_REWARD: [3074, null, null], + REQUEST_TYPE_METHOD_UPDATE_FIELD_BOOK_POST_CATCH_POKEMON: [3075, POGOProtos.Rpc.UpdateFieldBookPostCatchPokemonProto, POGOProtos.Rpc.UpdateFieldBookPostCatchPokemonOutProto], + REQUEST_TYPE_METHOD_GET_TIME_TRAVEL_INFORMATION: [3076, POGOProtos.Rpc.GetTimeTravelInformationProto, POGOProtos.Rpc.GetTimeTravelInformationOutProto], + REQUEST_TYPE_METHOD_DAY_NIGHT_POI_ENCOUNTER: [3077, POGOProtos.Rpc.DayNightPoiEncounterProto, POGOProtos.Rpc.DayNightPoiEncounterOutProto], + REQUEST_TYPE_METHOD_MARK_FIELDBOOK_SEEN: [3078, POGOProtos.Rpc.MarkFieldbookSeenRequestProto, POGOProtos.Rpc.MarkFieldbookSeenResponseProto], REQUEST_TYPE_PLATFORM_REGISTER_PUSH_NOTIFICATION: [5000, POGOProtos.Rpc.PushNotificationRegistryProto, POGOProtos.Rpc.PushNotificationRegistryOutProto], REQUEST_TYPE_PLATFORM_UNREGISTER_PUSH_NOTIFICATION: [5001, null, null], REQUEST_TYPE_PLATFORM_UPDATE_NOTIFICATION_STATUS: [5002, POGOProtos.Rpc.UpdateNotificationProto, POGOProtos.Rpc.UpdateNotificationOutProto], @@ -469,6 +480,19 @@ export const requestMessagesResponses = { REQUEST_TYPE_PLATFORM_SET_BIRTHDAY: [5048, POGOProtos.Rpc.SetBirthdayRequestProto, POGOProtos.Rpc.SetBirthdayResponseProto], REQUEST_TYPE_PLATFORM_FETCH_NEWSFEED_ACTION: [5049, POGOProtos.Rpc.PlatformFetchNewsfeedRequest, POGOProtos.Rpc.FetchNewsfeedResponse], REQUEST_TYPE_PLATFORM_MARK_NEWSFEED_READ_ACTION: [5050, POGOProtos.Rpc.PlatformMarkNewsfeedReadRequest, POGOProtos.Rpc.MarkNewsfeedReadResponse], + REQUEST_TYPE_ENABLE_CAMPFIRE_FOR_REFEREE: [6001, POGOProtos.Rpc.EnableCampfireForRefereeProto, POGOProtos.Rpc.EnableCampfireForRefereeOutProto], + REQUEST_TYPE_REMOVE_CAMPFIRE_FOR_REFEREE: [6002, POGOProtos.Rpc.RemoveCampfireForRefereeProto, POGOProtos.Rpc.RemoveCampfireForRefereeOutProto], + REQUEST_TYPE_GET_PLAYER_RAID_ELIGIBILITY: [6003, POGOProtos.Rpc.GetPlayerRaidEligibilityProto, POGOProtos.Rpc.GetPlayerRaidEligibilityOutProto], + REQUEST_TYPE_GRANT_CAMPFIRE_CHECK_IN_REWARDS: [6004, null, null], + REQUEST_TYPE_GET_NUM_POKEMON_IN_IRIS_SOCIAL_SCENE: [6005, POGOProtos.Rpc.GetNumPokemonInIrisSocialSceneProto, POGOProtos.Rpc.GetNumPokemonInIrisSocialSceneOutProto], + REQUEST_TYPE_GET_RSVP_COUNT: [6006, null, null], + REQUEST_TYPE_GET_RSVP_TIMESLOTS: [6007, null, null], + REQUEST_TYPE_GET_PLAYER_RSVPS: [6008, null, null], + REQUEST_TYPE_CAMPFIRE_CREATE_EVENT_RSVP: [6009, null, null], + REQUEST_TYPE_CAMPFIRE_CANCEL_EVENT_RSVP: [6010, null, null], + REQUEST_TYPE_CAMPFIRE_UPDATE_EVENT_RSVP_SELECTION: [6011, null, null], + REQUEST_TYPE_GET_MAP_OBJECTS_FOR_CAMPFIRE: [6012, POGOProtos.Rpc.GetMapObjectsForCampfireProto, POGOProtos.Rpc.GetMapObjectsForCampfireOutProto], + REQUEST_TYPE_GET_MAP_OBJECTS_DETAIL_FOR_CAMPFIRE: [6013, POGOProtos.Rpc.GetMapObjectsDetailForCampfireProto, POGOProtos.Rpc.GetMapObjectsDetailForCampfireOutProto], REQUEST_TYPE_SOCIAL_ACTION_SEARCH_PLAYER: [10000, POGOProtos.Rpc.InternalSearchPlayerProto, POGOProtos.Rpc.InternalSearchPlayerOutProto], REQUEST_TYPE_SOCIAL_ACTION_SEND_FRIEND_INVITE: [10002, POGOProtos.Rpc.InternalSendFriendInviteProto, POGOProtos.Rpc.InternalSendFriendInviteOutProto], REQUEST_TYPE_SOCIAL_ACTION_CANCEL_FRIEND_INVITE: [10003, POGOProtos.Rpc.InternalCancelFriendInviteProto, POGOProtos.Rpc.InternalCancelFriendInviteOutProto], @@ -533,6 +557,23 @@ export const requestMessagesResponses = { REQUEST_TYPE_SOCIAL_ACTION_RESERVED_ACTION_4: [20401, null, null], REQUEST_TYPE_SOCIAL_ACTION_RESERVED_ACTION_5: [20402, null, null], REQUEST_TYPE_SOCIAL_ACTION_GET_FRIEND_RECOMMENDATION: [20500, POGOProtos.Rpc.InternalGetFriendRecommendationRequest, POGOProtos.Rpc.InternalGetFriendRecommendationResponse], + REQUEST_TYPE_SOCIAL_ACTION_BATCH_GET_FEATURED_MOMENTS: [20600, null, null], + REQUEST_TYPE_SOCIAL_ACTION_REACT_TO_MOMENT: [20601, null, null], + REQUEST_TYPE_SOCIAL_ACTION_UPDATE_MOMENT_SETTINGS: [20602, null, null], + REQUEST_TYPE_SOCIAL_ACTION_GET_MOMENT_SETTINGS: [20603, null, null], + REQUEST_TYPE_SOCIAL_ACTION_GET_MOMENT_HISTORY: [20604, null, null], + REQUEST_TYPE_SOCIAL_ACTION_GET_LAST_UNPINNED_PLAYER_MOMENT: [20605, null, null], + REQUEST_TYPE_SOCIAL_ACTION_PIN_PLAYER_MOMENT: [20606, null, null], + REQUEST_TYPE_SOCIAL_ACTION_UNPIN_PLAYER_MOMENT: [20607, null, null], + REQUEST_TYPE_SOCIAL_ACTION_LIST_MOMENT_REACTIONS: [20608, null, null], + REQUEST_TYPE_SOCIAL_ACTION_SEND_ACTIVITY_INVITE: [20700, null, null], + REQUEST_TYPE_SOCIAL_ACTION_RESERVED_ACTION8: [20701, null, null], + REQUEST_TYPE_SOCIAL_ACTION_RESERVED_ACTION9: [20702, null, null], + REQUEST_TYPE_SOCIAL_ACTION_LIST_INCOMING_ACTIVITY_INVITES: [20703, null, null], + REQUEST_TYPE_SOCIAL_ACTION_LIST_OUTGOING_ACTIVITY_INVITES: [20704, null, null], + REQUEST_TYPE_SOCIAL_ACTION_UPDATE_ACTIVITY_INVITE: [20705, null, null], + REQUEST_TYPE_SOCIAL_ACTION_CANCEL_ACTIVITY_INVITE: [20706, null, null], + REQUEST_TYPE_SOCIAL_ACTION_CHECK_ACTIVITY_INVITE_INBOX: [20707, null, null], REQUEST_TYPE_DOWNSTREAM_ACTION_NEW_INBOX_MESSAGE_ACTION: [121000, null, null], REQUEST_TYPE_DOWNSTREAM_ACTION_CUSTOM_DOWNSTREAM_ACTION: [121001, null, null], REQUEST_TYPE_DOWNSTREAM_ACTION_CHAT_SIGNAL: [121002, null, null], @@ -590,7 +631,7 @@ export const requestMessagesResponses = { REQUEST_TYPE_GAME_ACCOUNT_REGISTRY_ACTION_LINK_TO_ACCOUNT_LOGIN_ACTION: [600006, POGOProtos.Rpc.InternalLinkToAccountLoginRequestProto, POGOProtos.Rpc.InternalLinkToAccountLoginResponseProto], REQUEST_TYPE_GAME_ACCOUNT_REGISTRY_ACTION_GET_APP_REQUEST_TOKEN_REDIRECT_URL_PLATFORM_ACTION: [600007, null, null], REQUEST_TYPE_GAME_TELEMETRY_ACTION_COLLECT_CLIENT_TELEMETRY: [610000, POGOProtos.Rpc.MapsClientTelemetryBatchProto, POGOProtos.Rpc.MapsClientTelemetryResponseProto], - REQUEST_TYPE_GAME_TELEMETRY_ACTION_GET_CLIENT_TELEMETRY_SETTINGS: [610001, null, null], + REQUEST_TYPE_GAME_TELEMETRY_ACTION_GET_CLIENT_TELEMETRY_SETTINGS: [610001, POGOProtos.Rpc.ClientTelemetrySettingsRequestProto, POGOProtos.Rpc.ClientTelemetryClientSettingsProto], REQUEST_TYPE_TITAN_PLAYER_SUBMISSION_ACTION_ADD_NEW_POI: [620000, POGOProtos.Rpc.TitanSubmitNewPoiProto, POGOProtos.Rpc.TitanSubmitNewPoiOutProto], REQUEST_TYPE_TITAN_PLAYER_SUBMISSION_ACTION_GET_AVAILABLE_SUBMISSIONS: [620001, POGOProtos.Rpc.TitanGetAvailableSubmissionsProto, POGOProtos.Rpc.TitanGetAvailableSubmissionsOutProto], REQUEST_TYPE_TITAN_PLAYER_SUBMISSION_ACTION_GET_SIGNED_URL_FOR_PHOTO_UPLOAD: [620002, null, null], diff --git a/src/index.ts b/src/index.ts index d2bb8ff..0cc1a7c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,8 +2,9 @@ import http from "http"; import fs from "fs"; import crypto from "crypto"; import { WebStreamBuffer, getIPAddress, handleData, moduleConfigIsAvailable, redirect_post_golbat } from "./utils"; -import { decodePayload, decodePayloadTraffic } from "./parser/proto-parser"; +import { decodePayload, decodePayloadTraffic, decodeProtoFromBytes } from "./parser/proto-parser"; import SampleSaver from "./utils/sample-saver"; +import POGOProtos from "@na-ji/pogo-protos"; // try looking if config file exists... let config = require("./config/example.config.json"); @@ -206,6 +207,85 @@ const httpServer = http.createServer(function (req, res) { } }); break; + case "/PolygonX/PostProtos": + req.on("data", function (chunk) { + incomingData.push(chunk); + }); + req.on("end", function () { + try { + const binaryData = Buffer.concat(incomingData); + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(""); + + if (binaryData.length === 0) { + console.error("Invalid PolygonX data: empty request body"); + return; + } + + // Decode the RawProtoCollection from binary protobuf + const decoded = POGOProtos.Rpc.AllTypesAndMessagesResponsesProto.Hexagon.RawProtoCollectionMessage.decode(binaryData); + + // Process RawProto entries (have both request and response) + if (decoded.protos && Array.isArray(decoded.protos)) { + for (const rawProto of decoded.protos) { + const identifier = rawProto.trainer_id || "unknown"; + const method = rawProto.method?.valueOf() || 0; + const requestBytes = rawProto.request; + const responseBytes = rawProto.proto; + + // Decode request + if (requestBytes && requestBytes.length > 0 && method !== 0) { + const parsedRequestData = decodeProtoFromBytes(method, requestBytes, "request"); + if (typeof parsedRequestData !== "string") { + parsedRequestData.identifier = identifier; + outgoingProtoWebBufferInst.write(parsedRequestData); + } + } + + // Decode response + if (responseBytes && responseBytes.length > 0) { + const parsedResponseData = decodeProtoFromBytes(method, responseBytes, "response"); + if (typeof parsedResponseData !== "string") { + parsedResponseData.identifier = identifier; + incomingProtoWebBufferInst.write(parsedResponseData); + } + } + + // Save sample if enabled + if (sampleSaver && requestBytes && responseBytes) { + const requestB64 = Buffer.from(requestBytes).toString("base64"); + const responseB64 = Buffer.from(responseBytes).toString("base64"); + const parsedRequest = decodeProtoFromBytes(method, requestBytes, "request"); + const parsedResponse = decodeProtoFromBytes(method, responseBytes, "response"); + if (typeof parsedRequest !== "string" && typeof parsedResponse !== "string") { + sampleSaver.savePair(parsedRequest, parsedResponse, requestB64, responseB64, "polygonx"); + } + } + } + } + + // Process RawPushGatewayProto entries (response only) + if (decoded.push_gateway_protos && Array.isArray(decoded.push_gateway_protos)) { + for (const pushProto of decoded.push_gateway_protos) { + const identifier = pushProto.trainer_id || "unknown"; + const method = pushProto.method?.valueOf() || 0; + const responseBytes = pushProto.proto; + + // Decode response + if (responseBytes && responseBytes.length > 0) { + const parsedResponseData = decodeProtoFromBytes(method, responseBytes, "response"); + if (typeof parsedResponseData !== "string") { + parsedResponseData.identifier = identifier; + incomingProtoWebBufferInst.write(parsedResponseData); + } + } + } + } + } catch (error) { + console.error("Error processing PolygonX request:", error); + } + }); + break; case "/traffic": req.on("data", function (chunk) { incomingData.push(chunk); @@ -387,7 +467,7 @@ Server start access of this in urls: http://localhost:${portBind} or WLAN mode h - Clients MITM: 1) --=FurtiF™=- Tools EndPoints: http://${getIPAddress()}:${portBind}/traffic or http://${getIPAddress()}:${portBind}/golbat (depending on the modes chosen) - 2) If Other set here... + 2) PolygonX EndPoint: http://${getIPAddress()}:${portBind}/PolygonX/PostProtos (application/x-protobuf) 3) ... ProtoDecoderUI is not responsible for your errors. diff --git a/src/parser/proto-parser.ts b/src/parser/proto-parser.ts index 054cde8..22ead9f 100644 --- a/src/parser/proto-parser.ts +++ b/src/parser/proto-parser.ts @@ -51,7 +51,7 @@ function DecoderInternalPayloadAsResponse(method: number, data: any): any { return result; } -function remasterOrCleanMethodString(str: string) { +export function remasterOrCleanMethodString(str: string) { return str.replace(/^REQUEST_TYPE_/, '') .replace(/^METHOD_/, '') .replace(/^PLATFORM_/, '') @@ -209,5 +209,125 @@ export const decodeProto = (method: number, data: string, dataType: string): Dec }; } + return returnObject; +}; + +// Decode proto from raw bytes (not base64 encoded) - used for PolygonX endpoint +export const decodeProtoFromBytes = (method: number, data: Uint8Array, dataType: string): DecodedProto | string => { + let returnObject: DecodedProto | string = "Not Found"; + let methodFound = false; + + for (let i = 0; i < Object.keys(requestMessagesResponses).length; i++) { + let foundMethod: any = Object.values(requestMessagesResponses)[i]; + let foundMethodString: string = Object.keys(requestMessagesResponses)[i]; + const foundReq = foundMethod[0]; + if (foundReq == method) { + methodFound = true; + if (foundMethod[1] != null && dataType === "request") { + try { + let parsedData; + if (!data || data.length === 0) { + parsedData = {}; + } else { + parsedData = foundMethod[1].decode(data).toJSON(); + } + if (foundMethod[0] === 5012) { + action_social = parsedData.action; + Object.values(requestMessagesResponses).forEach(val => { + let req: any = val; + if (req[0] == action_social && req[1] != null && parsedData.payload && b64Decode(parsedData.payload)) { + parsedData.payload = req[1].decode(b64Decode(parsedData.payload)).toJSON(); + } + }); + } + else if (foundMethod[0] === 600005) { + action_gar_proxy = parsedData.action; + switch (action_gar_proxy) { + case 4: + parsedData.payload = POGOProtos.Rpc.InternalGarAccountInfoProto.decode(b64Decode(parsedData.payload)).toJSON(); + break; + default: + break; + } + } + returnObject = { + methodId: foundMethod[0], + methodName: remasterOrCleanMethodString(foundMethodString), + data: parsedData, + }; + } catch (error) { + console.error(`Error parsing request ${foundMethodString} -> ${error}`); + returnObject = { + methodId: foundMethod[0], + methodName: remasterOrCleanMethodString(foundMethodString) + " [PARSE ERROR]", + data: { + error: "Failed to decode proto", + errorMessage: error.toString() + }, + }; + } + } else if (dataType === "request") { + console.warn(`Request ${foundMethod[0]} Not Implemented`) + returnObject = { + methodId: foundMethod[0], + methodName: remasterOrCleanMethodString(foundMethodString) + " [NOT IMPLEMENTED]", + data: { + error: "Proto not implemented" + }, + }; + } + if (foundMethod[2] != null && dataType === "response") { + try { + let parsedData; + if (!data || data.length === 0) { + parsedData = {}; + } else { + parsedData = foundMethod[2].decode(data).toJSON(); + } + if (foundMethod[0] === 5012 && action_social > 0 && parsedData.payload) { + parsedData.payload = DecoderInternalPayloadAsResponse(action_social, parsedData.payload); + } + else if (foundMethod[0] === 600005 && action_gar_proxy > 0 && parsedData.payload) { + parsedData.payload = DecoderInternalGarPayloadAsResponse(action_gar_proxy, parsedData.payload); + } + returnObject = { + methodId: foundMethod[0], + methodName: remasterOrCleanMethodString(foundMethodString), + data: parsedData, + }; + } catch (error) { + console.error(`Error parsing response ${foundMethodString} method: [${foundReq}] -> ${error}`); + returnObject = { + methodId: foundMethod[0], + methodName: remasterOrCleanMethodString(foundMethodString) + " [PARSE ERROR]", + data: { + error: "Failed to decode proto", + errorMessage: error.toString() + }, + }; + } + } else if (dataType === "response") { + console.warn(`Response ${foundReq} Not Implemented`) + returnObject = { + methodId: foundMethod[0], + methodName: remasterOrCleanMethodString(foundMethodString) + " [NOT IMPLEMENTED]", + data: { + error: "Proto not implemented" + }, + }; + } + } + } + + if (!methodFound && returnObject === "Not Found") { + returnObject = { + methodId: method.toString(), + methodName: `Unknown Method ${method} [UNKNOWN]`, + data: { + error: "Unknown method ID" + }, + }; + } + return returnObject; }; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 1e97ecb..2bfd6b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,9 +15,9 @@ wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" "@na-ji/pogo-protos@^2.131.0": - version "2.209.0" - resolved "https://registry.yarnpkg.com/@na-ji/pogo-protos/-/pogo-protos-2.209.0.tgz#ab44722a6e400a9ad7f3e6cbbf05738c042b6615" - integrity sha512-TVL0DAkK8khYPo9SOvKrj50mzFLmV/C8bPbUxEI8r8igU6f4Y7ehkGEnbaJ0P65lHI7W5g6oSTX9TXbhOe13fg== + version "2.228.0" + resolved "https://registry.yarnpkg.com/@na-ji/pogo-protos/-/pogo-protos-2.228.0.tgz#82977b9c9160c6d78222cfb7a007c6b99d3be240" + integrity sha512-Irtm7TiOFx5HONjdliP/hAleVOCtmKSPFF2e/wqX86mdHXSJwWTKDyAo8fTfS7LDshV5ozdH5t48oyrWNZPwSQ== dependencies: protobufjs "^6.11.4" @@ -97,19 +97,26 @@ integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=13.7.0": - version "24.10.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.10.1.tgz#91e92182c93db8bd6224fca031e2370cef9a8f01" - integrity sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ== + version "25.5.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.5.0.tgz#5c99f37c443d9ccc4985866913f1ed364217da31" + integrity sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw== dependencies: - undici-types "~7.16.0" + undici-types "~7.18.0" "@types/node@^20.3.1": - version "20.19.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.25.tgz#467da94a2fd966b57cc39c357247d68047611190" - integrity sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ== + version "20.19.37" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.37.tgz#b4fb4033408dd97becce63ec932c9ec57a9e2919" + integrity sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw== dependencies: undici-types "~6.21.0" +"@types/ws@^8.5.12": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" + integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== + dependencies: + "@types/node" "*" + accepts@~1.3.4: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -123,7 +130,7 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: +ansi-regex@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== @@ -158,7 +165,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: +brace-expansion@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== @@ -215,9 +222,9 @@ core-util-is@~1.0.0: integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cors@~2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + version "2.8.6" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.6.tgz#ff5dd69bd95e547503820d29aba4f8faf8dfec96" + integrity sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw== dependencies: object-assign "^4" vary "^1" @@ -231,10 +238,10 @@ cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" -debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== +debug@~4.4.1: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" @@ -259,19 +266,20 @@ engine.io-parser@~5.2.1: integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== engine.io@~6.6.0: - version "6.6.4" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.4.tgz#0a89a3e6b6c1d4b0c2a2a637495e7c149ec8d8ee" - integrity sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g== + version "6.6.6" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.6.tgz#9942111e7a4dc31f057e73470d7b7fcc7f74c390" + integrity sha512-U2SN0w3OpjFRVlrc17E6TMDmH58Xl9rai1MblNjAdwWp07Kk+llmzX0hjDpQdrDGzwmvOtgM5yI+meYX6iZ2xA== dependencies: "@types/cors" "^2.8.12" "@types/node" ">=10.0.0" + "@types/ws" "^8.5.12" accepts "~1.3.4" base64id "2.0.0" cookie "~0.7.2" cors "~2.8.5" - debug "~4.3.1" + debug "~4.4.1" engine.io-parser "~5.2.1" - ws "~8.17.1" + ws "~8.18.3" escalade@^3.1.1: version "3.2.0" @@ -297,9 +305,9 @@ get-caller-file@^2.0.5: integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== glob@^10.3.7: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + version "10.5.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c" + integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" @@ -390,23 +398,23 @@ mime-types@~2.1.34: mime-db "1.52.0" minimatch@^3.0.3, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== dependencies: brace-expansion "^1.1.7" minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + version "9.0.9" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e" + integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== dependencies: - brace-expansion "^2.0.1" + brace-expansion "^2.0.2" "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + version "7.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== mkdirp@^1.0.4: version "1.0.4" @@ -548,30 +556,30 @@ signal-exit@^4.0.1: integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== socket.io-adapter@~2.5.2: - version "2.5.5" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" - integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg== + version "2.5.6" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz#c697f609d36a676a46749782274607d8df52c1d8" + integrity sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ== dependencies: - debug "~4.3.4" - ws "~8.17.1" + debug "~4.4.1" + ws "~8.18.3" socket.io-parser@~4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" - integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + version "4.2.6" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.6.tgz#19156bf179af3931abd05260cfb1491822578a6f" + integrity sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg== dependencies: "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" + debug "~4.4.1" socket.io@^4.6.2: - version "4.8.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.1.tgz#fa0eaff965cc97fdf4245e8d4794618459f7558a" - integrity sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg== + version "4.8.3" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.3.tgz#ca6ba1431c69532e1e0a6f496deebeb601dbc4df" + integrity sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A== dependencies: accepts "~1.3.4" base64id "~2.0.0" cors "~2.8.5" - debug "~4.3.2" + debug "~4.4.1" engine.io "~6.6.0" socket.io-adapter "~2.5.2" socket.io-parser "~4.2.4" @@ -630,11 +638,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: ansi-regex "^5.0.1" strip-ansi@^7.0.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" - integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== + version "7.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" + integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== dependencies: - ansi-regex "^6.0.1" + ansi-regex "^6.2.2" through2@^2.0.1: version "2.0.5" @@ -654,10 +662,10 @@ undici-types@~6.21.0: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== -undici-types@~7.16.0: - version "7.16.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" - integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== +undici-types@~7.18.0: + version "7.18.2" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9" + integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== untildify@^4.0.0: version "4.0.0" @@ -713,10 +721,10 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@~8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== +ws@~8.18.3: + version "8.18.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" + integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== xtend@~4.0.1: version "4.0.2"