Skip to content

Commit

Permalink
Merge dlang-requests in windows-support
Browse files Browse the repository at this point in the history
  • Loading branch information
Dadoum committed Jun 13, 2023
2 parents 690bb79 + 1f9e2f3 commit 1f2985f
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 27 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
bin/
.dub/
dub.selections.json
cmake-build-*
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
1 change: 1 addition & 0 deletions cmake/dependencies.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

include(UseDub)

DubProject_Add(requests ~2.0.9)
DubProject_Add(slf4d ~2.1.1)

if(build_anisetteserver)
Expand Down
1 change: 1 addition & 0 deletions dub.sdl
Original file line number Diff line number Diff line change
Expand Up @@ -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" {
Expand Down
14 changes: 14 additions & 0 deletions dub.selections.json
Original file line number Diff line number Diff line change
@@ -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"
}
}
61 changes: 35 additions & 26 deletions lib/provision/adi.d
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -327,7 +328,7 @@ public class Device {
}

public class ProvisioningSession {
private HTTP httpClient;
private Request request;
private string[string] urlBag;

private ADI adi;
Expand All @@ -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);
Expand Down Expand Up @@ -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"],
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
<plist version=\"1.0\">
Expand All @@ -404,7 +407,7 @@ public class ProvisioningSession {
\t<key>Request</key>
\t<dict/>
</dict>
</plist>", httpClient);
</plist>").responseBody.data!string();

scope string spimStr;
{
Expand All @@ -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!"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
request.headers["X-Apple-I-Client-Time"] = Clock.currTime().stripMilliseconds().toISOExtString();
string endProvisioningPlist = request.post(urlBag["midFinishProvisioning"], format!"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
<plist version=\"1.0\">
<dict>
Expand All @@ -438,7 +441,7 @@ public class ProvisioningSession {
\t\t<string>%s</string>
\t</dict>
</dict>
</plist>"(Base64.encode(cpim.clientProvisioningIntermediateMetadata)), httpClient);
</plist>"(Base64.encode(cpim.clientProvisioningIntermediateMetadata))).responseBody.data!string();

scope ulong routingInformation;
scope ubyte[] persistentTokenMetadata;
Expand Down Expand Up @@ -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;
}

0 comments on commit 1f2985f

Please sign in to comment.