diff --git a/.gitignore b/.gitignore index 6f0531e..37090f4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ bin/ .dub/ dub.selections.json +cmake-build-* diff --git a/CMakeLists.txt b/CMakeLists.txt index de09339..f68e83b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,7 +67,7 @@ else() endif() endif() -target_link_libraries(provision PUBLIC plist slf4d) +target_link_libraries(provision PUBLIC plist slf4d requests) set(RETRIEVE_HEADERS_SOURCE_DIR "retrieve_headers/") file(GLOB_RECURSE RETRIEVE_HEADERS_D_SOURCES "${RETRIEVE_HEADERS_SOURCE_DIR}*.d") diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 9fb2f2c..d8034d3 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -3,6 +3,7 @@ include(UseDub) +DubProject_Add(requests ~2.0.9) DubProject_Add(slf4d ~2.1.1) if(build_anisetteserver) diff --git a/dub.sdl b/dub.sdl index 4b7efe7..14c73af 100644 --- a/dub.sdl +++ b/dub.sdl @@ -9,6 +9,7 @@ targetPath "bin" sourcePaths "lib" importPaths "lib" +dependency "requests" version="~>2.0.9" dependency "slf4d" version="~>2.1.1" configuration "plist-d" { diff --git a/dub.selections.json b/dub.selections.json new file mode 100644 index 0000000..779d5b2 --- /dev/null +++ b/dub.selections.json @@ -0,0 +1,14 @@ +{ + "fileVersion": 1, + "versions": { + "automem": "0.6.9", + "cachetools": "0.4.1", + "dxml": "0.4.3", + "plist": "~master", + "plist-d": {"version":"d494cf3fe79a2bb20583173c0c8cf85ef33b719e","repository":"git+https://github.com/Dadoum/libplist-d.git"}, + "requests": "2.0.9", + "slf4d": "2.1.1", + "test_allocator": "0.3.4", + "unit-threaded": "0.10.8" + } +} diff --git a/lib/provision/adi.d b/lib/provision/adi.d index a1f9d8c..e28b708 100644 --- a/lib/provision/adi.d +++ b/lib/provision/adi.d @@ -7,10 +7,11 @@ import std.digest.sha; import file = std.file; import std.format; import std.json; -import std.net.curl; import std.path; import std.string; +import requests; + import slf4d; import provision.compat.general; @@ -327,7 +328,7 @@ public class Device { } public class ProvisioningSession { - private HTTP httpClient; + private Request request; private string[string] urlBag; private ADI adi; @@ -337,32 +338,34 @@ public class ProvisioningSession { this.adi = adi; this.device = device; - httpClient = HTTP(); + request = Request(); - httpClient.setUserAgent("akd/1.0 CFNetwork/1404.0.5 Darwin/22.3.0"); - httpClient.handle.set(CurlOption.ssl_verifypeer, 0); + request.sslSetVerifyPeer(false); + request.addHeaders([ + "User-Agent": "akd/1.0 CFNetwork/1404.0.5 Darwin/22.3.0", - // they are somehow not using the plist content-type in AuthKit - httpClient.addRequestHeader("Content-Type", "application/x-www-form-urlencoded"); - httpClient.addRequestHeader("Connection", "keep-alive"); + // they are somehow not using the plist content-type in AuthKit + "Content-Type": "application/x-www-form-urlencoded", + "Connection": "keep-alive", - httpClient.addRequestHeader("X-Mme-Device-Id", device.uniqueDeviceIdentifier); - // on macOS, MMe for the Client-Info header is written with 2 caps, while on Windows it is Mme... - // and HTTP headers are supposed to be case-insensitive in the HTTP spec... - httpClient.addRequestHeader("X-MMe-Client-Info", device.serverFriendlyDescription); - httpClient.addRequestHeader("X-Apple-I-MD-LU", device.localUserUUID); + "X-Mme-Device-Id": device.uniqueDeviceIdentifier, + // on macOS, MMe for the Client-Info header is written with 2 caps, while on Windows it is Mme... + // and HTTP headers are supposed to be case-insensitive in the HTTP spec... + "X-MMe-Client-Info": device.serverFriendlyDescription, + "X-Apple-I-MD-LU": device.localUserUUID, - // httpClient.addRequestHeader("X-Apple-I-MLB", device.logicBoardSerialNumber); // 17 letters, uppercase in Apple's base 34 - // httpClient.addRequestHeader("X-Apple-I-ROM", device.romAddress); // 6 bytes, lowercase hexadecimal - // httpClient.addRequestHeader("X-Apple-I-SRL-NO", device.machineSerialNumber); // 12 letters, uppercase + // "X-Apple-I-MLB": device.logicBoardSerialNumber, // 17 letters, uppercase in Apple's base 34 + // "X-Apple-I-ROM": device.romAddress, // 6 bytes, lowercase hexadecimal + // "X-Apple-I-SRL-NO": device.machineSerialNumber, // 12 letters, uppercase - // different apps can be used, I already saw fmfd and Setup here - // and Reprovision uses Xcode in some requests, so maybe it is possible here too. - httpClient.addRequestHeader("X-Apple-Client-App-Name", "Setup"); + // different apps can be used, I already saw fmfd and Setup here + // and Reprovision uses Xcode in some requests, so maybe it is possible here too. + "X-Apple-Client-App-Name": "Setup", + ]); } public void loadURLBag() { - string content = cast(string) std.net.curl.get("https://gsa.apple.com/grandslam/GsService2/lookup", httpClient); + string content = request.get("https://gsa.apple.com/grandslam/GsService2/lookup").responseBody.data!string(); version (LibPlist) { PlistDict plist = cast(PlistDict) Plist.fromXml(content); @@ -393,8 +396,8 @@ public class ProvisioningSession { import std.datetime.systime; - httpClient.addRequestHeader("X-Apple-I-Client-Time", Clock.currTime().toISOExtString()); - string startProvisioningPlist = cast(string) post(urlBag["midStartProvisioning"], + request.headers["X-Apple-I-Client-Time"] = Clock.currTime().stripMilliseconds().toISOExtString(); + string startProvisioningPlist = request.post(urlBag["midStartProvisioning"], " @@ -404,7 +407,7 @@ public class ProvisioningSession { \tRequest \t -", httpClient); +").responseBody.data!string(); scope string spimStr; { @@ -425,8 +428,8 @@ public class ProvisioningSession { scope auto cpim = adi.startProvisioning(dsId, spim); scope (failure) try { adi.destroyProvisioning(cpim.session); } catch(Throwable) {} - httpClient.addRequestHeader("X-Apple-I-Client-Time", Clock.currTime().toISOExtString()); - string endProvisioningPlist = cast(string) post(urlBag["midFinishProvisioning"], format!" + request.headers["X-Apple-I-Client-Time"] = Clock.currTime().stripMilliseconds().toISOExtString(); + string endProvisioningPlist = request.post(urlBag["midFinishProvisioning"], format!" @@ -438,7 +441,7 @@ public class ProvisioningSession { \t\t%s \t -"(Base64.encode(cpim.clientProvisioningIntermediateMetadata)), httpClient); +"(Base64.encode(cpim.clientProvisioningIntermediateMetadata))).responseBody.data!string(); scope ulong routingInformation; scope ubyte[] persistentTokenMetadata; @@ -586,3 +589,9 @@ public class ADIException: Exception { return errorCode; } } + +import std.datetime: dur, SysTime; +private SysTime stripMilliseconds(return SysTime time) { + time.fracSecs = dur!"msecs"(0); + return time; +}