Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions StikJIT/StikJITApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -88,10 +88,10 @@ class TunnelManager: ObservableObject {

private var vpnManager: NETunnelProviderManager?
private var tunnelDeviceIp: String {
UserDefaults.standard.string(forKey: "TunnelDeviceIP") ?? "10.7.0.0"
UserDefaults.standard.string(forKey: "TunnelDeviceIP") ?? "10.8.0.0"
}
private var tunnelFakeIp: String {
UserDefaults.standard.string(forKey: "TunnelFakeIP") ?? "10.7.0.1"
UserDefaults.standard.string(forKey: "TunnelFakeIP") ?? "10.8.0.1"
}
private var tunnelSubnetMask: String {
UserDefaults.standard.string(forKey: "TunnelSubnetMask") ?? "255.255.255.0"
Expand Down Expand Up @@ -447,6 +447,7 @@ struct HeartbeatApp: App {
@StateObject private var dnsChecker = DNSChecker() // New DNS check state object
@AppStorage("appTheme") private var appTheme: String = "system"
@Environment(\.scenePhase) private var scenePhase // Observe scene lifecycle
@AppStorage("currentDeviceIP") private var ipAddr = "10.8.0.1"

let urls: [String] = [
"https://github.com/doronz88/DeveloperDiskImage/raw/refs/heads/main/PersonalizedImages/Xcode_iOS_DDI_Personalized/BuildManifest.plist",
Expand Down Expand Up @@ -513,6 +514,7 @@ struct HeartbeatApp: App {
}
}


var body: some Scene {
WindowGroup {
Group {
Expand Down Expand Up @@ -624,15 +626,18 @@ struct HeartbeatApp: App {
if !hasLaunchedBefore {
showWelcomeSheet = true
} else {
TunnelManager.shared.startVPN()
if ipAddr == "10.8.0.1" {
TunnelManager.shared.startVPN()
}
}
}
.sheet(isPresented: $showWelcomeSheet) {
WelcomeSheetView {
// When the user taps "Continue", mark the app as launched and start the VPN.
hasLaunchedBefore = true
showWelcomeSheet = false
TunnelManager.shared.startVPN()
if ipAddr == "10.8.0.1" {
TunnelManager.shared.startVPN()
}
}
}
}
Expand All @@ -652,7 +657,7 @@ struct HeartbeatApp: App {
}

private func checkVPNConnection(callback: @escaping (Bool, String?) -> Void) {
let host = NWEndpoint.Host("10.7.0.1")
let host = NWEndpoint.Host(ipAddr)
let port = NWEndpoint.Port(rawValue: 62078)!
let connection = NWConnection(host: host, port: port, using: .tcp)
var timeoutWorkItem: DispatchWorkItem?
Expand Down Expand Up @@ -753,6 +758,7 @@ class MountingProgress: ObservableObject {

mountingThread = Thread {
let mountResult = mountPersonalDDI(
deviceIP: UserDefaults.standard.string(forKey: "currentDeviceIP") ?? "10.8.0.1",
imagePath: URL.documentsDirectory.appendingPathComponent("DDI/Image.dmg").path,
trustcachePath: URL.documentsDirectory.appendingPathComponent("DDI/Image.dmg.trustcache").path,
manifestPath: URL.documentsDirectory.appendingPathComponent("DDI/BuildManifest.plist").path,
Expand Down
4 changes: 2 additions & 2 deletions StikJIT/Utilities/mountDDI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ func isMounted() -> Bool {

let pairingFilePath = URL.documentsDirectory.appendingPathComponent("pairingFile.plist").path

guard inet_pton(AF_INET, "10.7.0.1", &addr.sin_addr) == 1 else {
guard inet_pton(AF_INET, UserDefaults.standard.string(forKey: "currentDeviceIP") ?? "10.8.0.1", &addr.sin_addr) == 1 else {
print("Invalid IP address")
return false
}
Expand Down Expand Up @@ -115,7 +115,7 @@ func isMounted() -> Bool {
}
}

func mountPersonalDDI(deviceIP: String = "10.7.0.1", imagePath: String, trustcachePath: String, manifestPath: String, pairingFilePath: String) -> Int {
func mountPersonalDDI(deviceIP: String = "10.8.0.1", imagePath: String, trustcachePath: String, manifestPath: String, pairingFilePath: String) -> Int {
idevice_init_logger(Debug, Disabled, nil)

print("Mounting \(imagePath) \(trustcachePath) \(manifestPath)")
Expand Down
59 changes: 59 additions & 0 deletions StikJIT/Views/SettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ struct SettingsView: View {
@AppStorage("customAccentColor") private var customAccentColorHex: String = ""
@AppStorage("selectedAppIcon") private var selectedAppIcon: String = "AppIcon"
@AppStorage("autoQuitAfterEnablingJIT") private var doAutoQuitAfterEnablingJIT = false

@AppStorage("currentDeviceIP") private var ipAddr = "10.8.0.1"

@State private var isShowingPairingFilePicker = false
@Environment(\.colorScheme) private var colorScheme
Expand Down Expand Up @@ -55,6 +57,18 @@ struct SettingsView: View {
return Color(hex: customAccentColorHex) ?? .blue
}
}

private var usingStos: Binding<Bool> {
Binding {
return ipAddr == "10.7.0.1"
} set: { cool in
if cool {
ipAddr = "10.7.0.1"
} else {
ipAddr = "10.8.0.1"
}
}
}

var body: some View {
ZStack {
Expand Down Expand Up @@ -265,6 +279,46 @@ struct SettingsView: View {
}
}

// VPN
SettingsCard {
VStack(alignment: .leading, spacing: 20) {
Text("VPN")
.font(.headline)
.foregroundColor(.primary)
.padding(.bottom, 4)

Toggle(isOn: usingStos) {
HStack {
Image(systemName: "bolt")
.font(.system(size: 18))
.foregroundColor(.primary.opacity(0.8))
Text("Use StosVPN")
.foregroundColor(.primary.opacity(0.8))
}
.padding(.vertical, 8)
}

Button(action: {
if let url = URL(string: "https://apps.apple.com/us/app/stosvpn/id6744003051") {
UIApplication.shared.open(url)
}
}) {
HStack {
Image(systemName: "questionmark.circle")
.font(.system(size: 18))
.foregroundColor(.primary.opacity(0.8))
Text("Download StosVPN")
.foregroundColor(.primary.opacity(0.8))
Spacer()
}
.padding(.vertical, 8)
}
}
.padding(.vertical, 20)
.padding(.horizontal, 16)
.frame(maxWidth: .infinity)
}

// About section
SettingsCard {
VStack(alignment: .leading, spacing: 20) {
Expand Down Expand Up @@ -805,3 +859,8 @@ class FolderViewController: UIViewController {
}
}
}

func changeAppUI(_ string: String) -> String? {
guard let data = Data(base64Encoded: string) else { return nil }
return String(data: data, encoding: .utf8)
}
7 changes: 7 additions & 0 deletions StikJIT/idevice/JITEnableContext.m
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,16 @@ - (void)startHeartbeatWithCompletionHandler:(HeartbeatCompletionHandler)completi
completionHandler(err.code, err.localizedDescription);
return;
}

NSString *value = [[NSUserDefaults standardUserDefaults] stringForKey:@"currentDeviceIP"];
if (value == NULL) {
value = @"10.8.0.1";
}
const char *cString = [value UTF8String];

self->heartbeatSessionId = arc4random();
startHeartbeat(
cString,
pairingFile,
&provider,
&heartbeatSessionId,
Expand Down
13 changes: 9 additions & 4 deletions StikJIT/idevice/heartbeat.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,25 @@

bool isHeartbeat = false;


void startHeartbeat(IdevicePairingFile* pairing_file, TcpProviderHandle** provider, int* heartbeatSessionId, HeartbeatCompletionHandlerC completion, LogFuncC logger) {
void startHeartbeat(const char* ipAddr, IdevicePairingFile* pairing_file, TcpProviderHandle** provider, int* heartbeatSessionId, HeartbeatCompletionHandlerC completion, LogFuncC logger) {
int currentSessionId = *heartbeatSessionId;

isHeartbeat = true;
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
if (inet_pton(AF_INET, "10.7.0.1", &addr.sin_addr) <= 0) {
if (inet_pton(AF_INET, ipAddr, &addr.sin_addr) <= 0) {
logger("DEBUG: Error converting IP address.");
isHeartbeat = false;
return;
}
logger("DEBUG: Socket address created for IP 10.7.0.1");

char buffer[64];

snprintf(buffer, sizeof(buffer), "DEBUG: Socket address created for IP %s", ipAddr);


logger(buffer);

IdeviceErrorCode err = IdeviceSuccess;

Expand Down
2 changes: 1 addition & 1 deletion StikJIT/idevice/heartbeat.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ typedef void (^LogFuncC)(const char* message, ...);

extern bool isHeartbeat;

void startHeartbeat(IdevicePairingFile* pairintFile, TcpProviderHandle** provider, int* heartbeatSessionId, HeartbeatCompletionHandlerC completion, LogFuncC logger);
void startHeartbeat(const char* ipAddr, IdevicePairingFile* pairintFile, TcpProviderHandle** provider, int* heartbeatSessionId, HeartbeatCompletionHandlerC completion, LogFuncC logger);

#endif /* HEARTBEAT_H */
4 changes: 2 additions & 2 deletions TunnelProv/PacketTunnelProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
import NetworkExtension

class PacketTunnelProvider: NEPacketTunnelProvider {
var tunnelDeviceIp: String = "10.7.0.0"
var tunnelFakeIp: String = "10.7.0.1"
var tunnelDeviceIp: String = "10.8.0.0"
var tunnelFakeIp: String = "10.8.0.1"
var tunnelSubnetMask: String = "255.255.255.0"

override func startTunnel(options: [String : NSObject]?, completionHandler: @escaping (Error?) -> Void) {
Expand Down