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;
+}