From f7cf0decaec6cb7aca8e33f6a5aefd47b88bacfa Mon Sep 17 00:00:00 2001 From: LossyDragon Date: Tue, 13 May 2025 16:46:54 -0500 Subject: [PATCH 1/2] Update emsg and enums --- src/main/steamd/in/dragonbra/javasteam/emsg.steamd | 10 ++++++++++ src/main/steamd/in/dragonbra/javasteam/enums.steamd | 1 + 2 files changed, 11 insertions(+) diff --git a/src/main/steamd/in/dragonbra/javasteam/emsg.steamd b/src/main/steamd/in/dragonbra/javasteam/emsg.steamd index a7583cdf..bdd58f70 100644 --- a/src/main/steamd/in/dragonbra/javasteam/emsg.steamd +++ b/src/main/steamd/in/dragonbra/javasteam/emsg.steamd @@ -1874,6 +1874,8 @@ enum EMsg ClientPICSProductInfoResponse = 8904; ClientPICSAccessTokenRequest = 8905; ClientPICSAccessTokenResponse = 8906; + ClientPICSPrivateBetaRequest = 8907; + ClientPICSPrivateBetaResponse = 8908; WorkerProcess = 9000; WorkerProcessPingRequest = 9000; @@ -1915,6 +1917,8 @@ enum EMsg DRMWorkerProcessUnpackBlobResponse = 9131; DRMWorkerProcessInstallAllRequest = 9132; DRMWorkerProcessInstallAllResponse = 9133; + DRMWorkerProcessSignFile = 9134; + DRMWorkerProcessSignFileResponse = 9135; TestWorkerProcess = 9200; TestWorkerProcessLoadUnloadModuleRequest = 9200; @@ -1956,6 +1960,12 @@ enum EMsg ClientUnlockHEVCResponse = 9514; RemoteClientStatusRequest = 9515; RemoteClientStatusResponse = 9516; + RemoteClientAuthorizationRequest = 9517; + RemoteClientAuthorizationResponse = 9518; + RemoteClientAuthorizationCancelRequest = 9519; + RemoteClientAuthorizationConfirmed = 9520; + RemoteClientProofRequest = 9521; + RemoteClientProofResponse = 9522; ClientConcurrentSessionsBase = 9600; ClientPlayingSessionState = 9600; diff --git a/src/main/steamd/in/dragonbra/javasteam/enums.steamd b/src/main/steamd/in/dragonbra/javasteam/enums.steamd index e6c31a03..26245299 100644 --- a/src/main/steamd/in/dragonbra/javasteam/enums.steamd +++ b/src/main/steamd/in/dragonbra/javasteam/enums.steamd @@ -1,3 +1,4 @@ + enum EUniverse { Invalid = 0; From 188bebd47eed37166a1742be43bb12018cc7b1d1 Mon Sep 17 00:00:00 2001 From: LossyDragon Date: Tue, 13 May 2025 16:57:25 -0500 Subject: [PATCH 2/2] Add picsGetPrivateBeta in SteamApps --- .../steam/handlers/steamapps/SteamApps.kt | 36 ++++++++++++++- .../steamapps/callback/PrivateBetaCallback.kt | 46 +++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/PrivateBetaCallback.kt diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/SteamApps.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/SteamApps.kt index 1d292a7f..809f7c22 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/SteamApps.kt +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/SteamApps.kt @@ -16,6 +16,7 @@ import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver2 import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserver2.CMsgClientRequestFreeLicense import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserverAppinfo.CMsgClientPICSAccessTokenRequest import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserverAppinfo.CMsgClientPICSChangesSinceRequest +import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserverAppinfo.CMsgClientPICSPrivateBetaRequest import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserverAppinfo.CMsgClientPICSProductInfoRequest import `in`.dragonbra.javasteam.steam.handlers.ClientMsgHandler import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.AppOwnershipTicketCallback @@ -29,6 +30,7 @@ import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.LicenseListCal import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.PICSChangesCallback import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.PICSProductInfoCallback import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.PICSTokensCallback +import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.PrivateBetaCallback import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.PurchaseResponseCallback import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.RedeemGuestPassResponseCallback import `in`.dragonbra.javasteam.steam.handlers.steamapps.callback.VACStatusCallback @@ -37,6 +39,7 @@ import `in`.dragonbra.javasteam.types.AsyncJobMultiple import `in`.dragonbra.javasteam.types.AsyncJobSingle import `in`.dragonbra.javasteam.types.GameID import `in`.dragonbra.javasteam.util.NetHelpers +import io.ktor.client.request.request /** * This handler is used for interacting with apps and packages on the Steam network. @@ -293,7 +296,7 @@ class SteamApps : ClientMsgHandler() { */ fun getLegacyGameKey(appId: Int): AsyncJobSingle { val request = ClientMsg(MsgClientGetLegacyGameKey::class.java).apply { - sourceJobID = (client.getNextJobID()) + sourceJobID = client.getNextJobID() body.appId = appId } @@ -302,6 +305,37 @@ class SteamApps : ClientMsgHandler() { return AsyncJobSingle(client, request.sourceJobID) } + /** + * Submit a beta password for a given app to retrieve any betas and their encryption keys. + * Results are returned in a [CheckAppBetaPasswordCallback] callback. + * The returned [AsyncJobSingle] can also be awaited to retrieve the callback result. + * @param app App id requested. + * @param accessToken Access token associated with the app. + * @param branch The branch name. + * @param branchPasswordHash The branch password from [CheckAppBetaPasswordCallback] + * @return The Job ID of the request. This can be used to find the appropriate [CheckAppBetaPasswordCallback]. + */ + fun picsGetPrivateBeta( + app: Int, + accessToken: Long, + branch: String, + branchPasswordHash: ByteArray, + ): AsyncJobSingle { + val request = ClientMsgProtobuf( + CMsgClientPICSPrivateBetaRequest::class.java, + EMsg.ClientPICSPrivateBetaRequest + ).apply { + sourceJobID = client.getNextJobID() + + body.appid = app + body.accessToken = accessToken + body.betaName = branch + body.passwordHash = ByteString.copyFrom(branchPasswordHash) + } + + return AsyncJobSingle(client, request.sourceJobID) + } + /** * An event sent to Steam after syncing user files during launch to notify Steam of the * app that is launching. diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/PrivateBetaCallback.kt b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/PrivateBetaCallback.kt new file mode 100644 index 00000000..f92783c8 --- /dev/null +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/callback/PrivateBetaCallback.kt @@ -0,0 +1,46 @@ +package `in`.dragonbra.javasteam.steam.handlers.steamapps.callback + +import `in`.dragonbra.javasteam.base.ClientMsgProtobuf +import `in`.dragonbra.javasteam.base.IPacketMsg +import `in`.dragonbra.javasteam.enums.EResult +import `in`.dragonbra.javasteam.protobufs.steamclient.SteammessagesClientserverAppinfo.CMsgClientPICSPrivateBetaResponse +import `in`.dragonbra.javasteam.steam.steamclient.callbackmgr.CallbackMsg +import `in`.dragonbra.javasteam.types.KeyValue +import `in`.dragonbra.javasteam.util.stream.MemoryStream + +/** + * This callback is received when a private beta request has been completed + */ +class PrivateBetaCallback(packetMsg: IPacketMsg) : CallbackMsg() { + + /** + * Result of the operation + */ + val result: EResult + + /** + * Gets the keyvalue info to be merged into main appinfo + */ + val depotSection: KeyValue + + init { + val response = ClientMsgProtobuf( + CMsgClientPICSPrivateBetaResponse::class.java, + packetMsg + ) + val msg = response.body + + jobID = response.targetJobID + + result = EResult.from(msg.eresult) + + depotSection = KeyValue() + + if (msg.depotSection != null && msg.depotSection.size() > 0) { + // we don't want to read the trailing null byte + MemoryStream(msg.depotSection.toByteArray(), 0, msg.depotSection.size() - 1).use { ms -> + depotSection.readAsText(ms) + } + } + } +}