From 596c6452e497c5d085528add2d66244aab2ce96a Mon Sep 17 00:00:00 2001 From: Ronak Sanpui Date: Wed, 28 Oct 2026 23:39:46 +0530 Subject: [PATCH 1/2] [AltServer] Overrides anisette client info to fix -23782 sign-in error Apple rejects the client info that remote anisette servers currently report, failing sign-in with "A Mac with macOS version 10.13 or later is required to sign in with this Apple Account. (-23782)". Identify as akd on macOS instead, for anisette provisioning and GrandSlam authentication, using the same override as iloader v2.4.1 (nab138/iloader@d319ce7). The server-reported client info is used again once the override is removed. Fixes #1852 Co-Authored-By: Claude Opus 5.5 --- .../Anisette Data/RemoteAnisetteDataFetcher.swift | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/AltServer/Anisette Data/RemoteAnisetteDataFetcher.swift b/AltServer/Anisette Data/RemoteAnisetteDataFetcher.swift index 8f2706735b..2acb2968ba 100644 --- a/AltServer/Anisette Data/RemoteAnisetteDataFetcher.swift +++ b/AltServer/Anisette Data/RemoteAnisetteDataFetcher.swift @@ -87,6 +87,10 @@ actor RemoteAnisetteDataFetcher private static let timeout: TimeInterval = 90 private static let placeholderSerialNumber = "C02LKHBBFD57" + // Apple rejects the client info anisette servers currently report with -23782 ("A Mac with macOS version 10.13 or later is required"), + // so identify as akd on macOS instead until servers report client info Apple accepts. Same override as iloader v2.4.1 (nab138/iloader@d319ce7). + private static let clientInfoOverride: (clientInfo: String, userAgent: String)? = (" ", "akd/1.0 CFNetwork/811.5.4") + private let session: URLSession private let sessionDelegate = AnisetteSessionDelegate() @@ -265,7 +269,7 @@ private extension RemoteAnisetteDataFetcher throw AnisetteError.remoteServerInvalidResponse(serverURL: serverURL) } - // 5. Assemble the result. deviceDescription and userAgent must be the server's, so they match the client that generated the anisette data. + // 5. Assemble the result. deviceDescription and userAgent must match the client info used for provisioning. let anisetteData = RemoteAnisetteData(machineID: machineID, oneTimePassword: oneTimePassword, localUserID: identity.localUserID, @@ -279,6 +283,11 @@ private extension RemoteAnisetteDataFetcher func fetchClientInfo(from serverURL: URL) async throws -> (clientInfo: String, userAgent: String) { + if let clientInfoOverride = RemoteAnisetteDataFetcher.clientInfoOverride + { + return clientInfoOverride + } + struct Response: Decodable { var clientInfo: String From c0b5021495b21afef17f62ccae40456b497f2f8c Mon Sep 17 00:00:00 2001 From: Ronak Sanpui Date: Thu, 29 Oct 2026 09:38:29 +0530 Subject: [PATCH 2/2] [AltStore] Overrides anisette client info to fix -23782 sign-in error AltStore signs in to Apple on-device when sideloading and refreshing apps, so it needs the same client info override as AltServer: - When fetching anisette data from a remote anisette server, use akd's client info for provisioning and the anisette data instead of the server's. - Always send akd's user agent with GrandSlam requests, including when the anisette data comes from AltServer. AltStore never set authenticationUserAgent, so it fell back to "akd/1.0 CFNetwork/808.1.4". Fixes #1852 Co-Authored-By: Claude Opus 5.5 --- .../FetchAnisetteDataOperation.swift | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/AltStore/Operations/FetchAnisetteDataOperation.swift b/AltStore/Operations/FetchAnisetteDataOperation.swift index 8d84fc1760..cbabc82c12 100644 --- a/AltStore/Operations/FetchAnisetteDataOperation.swift +++ b/AltStore/Operations/FetchAnisetteDataOperation.swift @@ -48,6 +48,10 @@ class FetchAnisetteDataOperation: ResultOperation, @unchecked S { let context: OperationContext + // Apple rejects the client info anisette servers currently report with -23782 ("A Mac with macOS version 10.13 or later is required"), + // so identify as akd on macOS instead until servers report client info Apple accepts. Same override as AltServer and iloader v2.4.1 (nab138/iloader@d319ce7). + fileprivate static let clientInfoOverride: (clientInfo: String, userAgent: String)? = (" ", "akd/1.0 CFNetwork/811.5.4") + // Set to Apple's X-Apple-I-MD-DATA to resynchronize the existing anisette data instead of fetching it normally. var resynchronizationData: String? @@ -126,6 +130,12 @@ class FetchAnisetteDataOperation: ResultOperation, @unchecked S anisetteData.deviceDescription = sanitizedDescription } + if let clientInfoOverride = FetchAnisetteDataOperation.clientInfoOverride + { + // GrandSlam also rejects akd's client info unless it's sent with a matching user agent, including anisette data from AltServer. + ALTAppleAPI.shared.authenticationUserAgent = clientInfoOverride.userAgent + } + self.finish(.success(anisetteData)) } catch @@ -245,7 +255,15 @@ private extension FetchAnisetteDataOperation let decoder = Foundation.JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase - let response: Response = try await self.send(URLRequest(url: clientInfoURL), decoder: decoder, anisetteServerURL: serverURL) + let response: Response + if let clientInfoOverride = FetchAnisetteDataOperation.clientInfoOverride + { + response = Response(clientInfo: clientInfoOverride.clientInfo, userAgent: clientInfoOverride.userAgent) + } + else + { + response = try await self.send(URLRequest(url: clientInfoURL), decoder: decoder, anisetteServerURL: serverURL) + } // 2. Provision against this server unless we have a cached anisette identifier + adi.pb with the same client info. // A cached adi.pb from a different anisette implementation is no longer accepted, so discard it when the client info changes.