mirror of
https://github.com/SideStore/SideStore.git
synced 2026-04-10 04:35:41 +02:00
Compare commits
2 Commits
auto-updat
...
feature/Wi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
93b1c4d834 | ||
|
|
e96245b9d8 |
22
.github/workflows/attach_build_products.yml
vendored
22
.github/workflows/attach_build_products.yml
vendored
@@ -1,22 +0,0 @@
|
|||||||
name: Add artifact links to pull request and related issues
|
|
||||||
on:
|
|
||||||
workflow_run:
|
|
||||||
workflows: [Pull Request SideStore build]
|
|
||||||
types: [completed]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
artifacts-url-comments:
|
|
||||||
name: add artifact links to pull request and related issues job
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
|
||||||
steps:
|
|
||||||
- name: add artifact links to pull request and related issues step
|
|
||||||
uses: tonyhallett/artifacts-url-comments@v1.1.0
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
prefix: Builds for this Pull Request are available at
|
|
||||||
suffix: Have a nice day.
|
|
||||||
format: name
|
|
||||||
addTo: pull
|
|
||||||
# addTo: pullandissues
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -34,3 +34,4 @@ xcuserdata
|
|||||||
|
|
||||||
## AppCode specific
|
## AppCode specific
|
||||||
.idea/
|
.idea/
|
||||||
|
/.build
|
||||||
|
|||||||
@@ -23,6 +23,21 @@
|
|||||||
4879A9622861049C00FC1BBD /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = 4879A9612861049C00FC1BBD /* OpenSSL */; };
|
4879A9622861049C00FC1BBD /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = 4879A9612861049C00FC1BBD /* OpenSSL */; };
|
||||||
B3146ED2284F581E00BBC3FD /* Roxas.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3146ECD284F580500BBC3FD /* Roxas.framework */; };
|
B3146ED2284F581E00BBC3FD /* Roxas.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3146ECD284F580500BBC3FD /* Roxas.framework */; };
|
||||||
B3146ED3284F581E00BBC3FD /* Roxas.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B3146ECD284F580500BBC3FD /* Roxas.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
B3146ED3284F581E00BBC3FD /* Roxas.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B3146ECD284F580500BBC3FD /* Roxas.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
|
B355DFB129209C6900E4C858 /* WireGuardKit in Frameworks */ = {isa = PBXBuildFile; productRef = B355DFB029209C6900E4C858 /* WireGuardKit */; };
|
||||||
|
B355DFC029209E2400E4C858 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B355DFBF29209E2400E4C858 /* NetworkExtension.framework */; };
|
||||||
|
B355DFC329209E2500E4C858 /* AppProxyProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = B355DFC229209E2500E4C858 /* AppProxyProvider.swift */; };
|
||||||
|
B355DFC829209E2500E4C858 /* WireguardNetworkExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = B355DFBE29209E2400E4C858 /* WireguardNetworkExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||||
|
B355DFCF29209E4C00E4C858 /* WireGuardKit in Frameworks */ = {isa = PBXBuildFile; productRef = B355DFCE29209E4C00E4C858 /* WireGuardKit */; };
|
||||||
|
B355DFEF2920A75E00E4C858 /* ringlogger.c in Sources */ = {isa = PBXBuildFile; fileRef = B355DFE42920A75D00E4C858 /* ringlogger.c */; };
|
||||||
|
B355DFF02920A75E00E4C858 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = B355DFE52920A75D00E4C858 /* Logger.swift */; };
|
||||||
|
B355DFF12920A75E00E4C858 /* test_ringlogger.c in Sources */ = {isa = PBXBuildFile; fileRef = B355DFE62920A75D00E4C858 /* test_ringlogger.c */; };
|
||||||
|
B355DFF22920A75E00E4C858 /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = B355DFE82920A75D00E4C858 /* Keychain.swift */; };
|
||||||
|
B355DFF32920A75E00E4C858 /* FileManager+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B355DFE92920A75D00E4C858 /* FileManager+Extension.swift */; };
|
||||||
|
B355DFF42920A75E00E4C858 /* TunnelConfiguration+WgQuickConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = B355DFEB2920A75D00E4C858 /* TunnelConfiguration+WgQuickConfig.swift */; };
|
||||||
|
B355DFF52920A75E00E4C858 /* NETunnelProviderProtocol+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B355DFEC2920A75D00E4C858 /* NETunnelProviderProtocol+Extension.swift */; };
|
||||||
|
B355DFF62920A75E00E4C858 /* String+ArrayConversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = B355DFED2920A75D00E4C858 /* String+ArrayConversion.swift */; };
|
||||||
|
B355DFF72920A75E00E4C858 /* NotificationToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = B355DFEE2920A75E00E4C858 /* NotificationToken.swift */; };
|
||||||
|
B355DFF92920A79E00E4C858 /* ErrorNotifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = B355DFF82920A79E00E4C858 /* ErrorNotifier.swift */; };
|
||||||
B33FFBA8295F8E98002259E6 /* libfragmentzip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B343F894295F7F9B002B1159 /* libfragmentzip.a */; };
|
B33FFBA8295F8E98002259E6 /* libfragmentzip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B343F894295F7F9B002B1159 /* libfragmentzip.a */; };
|
||||||
B33FFBAA295F8F78002259E6 /* preboard.c in Sources */ = {isa = PBXBuildFile; fileRef = B33FFBA9295F8F78002259E6 /* preboard.c */; };
|
B33FFBAA295F8F78002259E6 /* preboard.c in Sources */ = {isa = PBXBuildFile; fileRef = B33FFBA9295F8F78002259E6 /* preboard.c */; };
|
||||||
B33FFBAC295F8F98002259E6 /* companion_proxy.c in Sources */ = {isa = PBXBuildFile; fileRef = B33FFBAB295F8F98002259E6 /* companion_proxy.c */; };
|
B33FFBAC295F8F98002259E6 /* companion_proxy.c in Sources */ = {isa = PBXBuildFile; fileRef = B33FFBAB295F8F98002259E6 /* companion_proxy.c */; };
|
||||||
@@ -386,6 +401,26 @@
|
|||||||
remoteGlobalIDString = BFADB00319AE7BB80050CF31;
|
remoteGlobalIDString = BFADB00319AE7BB80050CF31;
|
||||||
remoteInfo = RoxasTests;
|
remoteInfo = RoxasTests;
|
||||||
};
|
};
|
||||||
|
B355DFC629209E2500E4C858 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = BFD247622284B9A500981D42 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = B355DFBD29209E2400E4C858;
|
||||||
|
remoteInfo = WireguardNetworkExtension;
|
||||||
|
};
|
||||||
|
B355DFCC29209E3F00E4C858 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = BFD247622284B9A500981D42 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = B355DFB229209DB000E4C858;
|
||||||
|
remoteInfo = WireGuardGoBridgeiOS;
|
||||||
|
};
|
||||||
|
BF4588442298D48B00BD7491 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = BFD247622284B9A500981D42 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = BF45872A2298D31600BD7491;
|
||||||
|
remoteInfo = libimobiledevice;
|
||||||
B343F84B295F6321002B1159 /* PBXContainerItemProxy */ = {
|
B343F84B295F6321002B1159 /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = B343F847295F6321002B1159 /* minimuxer.xcodeproj */;
|
containerPortal = B343F847295F6321002B1159 /* minimuxer.xcodeproj */;
|
||||||
@@ -492,6 +527,7 @@
|
|||||||
dstPath = "";
|
dstPath = "";
|
||||||
dstSubfolderSpec = 13;
|
dstSubfolderSpec = 13;
|
||||||
files = (
|
files = (
|
||||||
|
B355DFC829209E2500E4C858 /* WireguardNetworkExtension.appex in Embed App Extensions */,
|
||||||
BF989177250AABF4002ACF50 /* AltWidgetExtension.appex in Embed App Extensions */,
|
BF989177250AABF4002ACF50 /* AltWidgetExtension.appex in Embed App Extensions */,
|
||||||
);
|
);
|
||||||
name = "Embed App Extensions";
|
name = "Embed App Extensions";
|
||||||
@@ -513,6 +549,23 @@
|
|||||||
1920B04E2924AC8300744F60 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
|
1920B04E2924AC8300744F60 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
|
||||||
19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectTeamViewController.swift; sourceTree = "<group>"; };
|
19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectTeamViewController.swift; sourceTree = "<group>"; };
|
||||||
B3146EC6284F580500BBC3FD /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Roxas.xcodeproj; path = Dependencies/Roxas/Roxas.xcodeproj; sourceTree = "<group>"; };
|
B3146EC6284F580500BBC3FD /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Roxas.xcodeproj; path = Dependencies/Roxas/Roxas.xcodeproj; sourceTree = "<group>"; };
|
||||||
|
B355DFBE29209E2400E4C858 /* WireguardNetworkExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = WireguardNetworkExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
B355DFBF29209E2400E4C858 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; };
|
||||||
|
B355DFC229209E2500E4C858 /* AppProxyProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppProxyProvider.swift; sourceTree = "<group>"; };
|
||||||
|
B355DFC429209E2500E4C858 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
B355DFC529209E2500E4C858 /* WireguardNetworkExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WireguardNetworkExtension.entitlements; sourceTree = "<group>"; };
|
||||||
|
B355DFE22920A6C200E4C858 /* WireguardNetworkExtension-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WireguardNetworkExtension-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||||
|
B355DFE42920A75D00E4C858 /* ringlogger.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ringlogger.c; sourceTree = "<group>"; };
|
||||||
|
B355DFE52920A75D00E4C858 /* Logger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = "<group>"; };
|
||||||
|
B355DFE62920A75D00E4C858 /* test_ringlogger.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = test_ringlogger.c; sourceTree = "<group>"; };
|
||||||
|
B355DFE72920A75D00E4C858 /* ringlogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ringlogger.h; sourceTree = "<group>"; };
|
||||||
|
B355DFE82920A75D00E4C858 /* Keychain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Keychain.swift; sourceTree = "<group>"; };
|
||||||
|
B355DFE92920A75D00E4C858 /* FileManager+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FileManager+Extension.swift"; sourceTree = "<group>"; };
|
||||||
|
B355DFEB2920A75D00E4C858 /* TunnelConfiguration+WgQuickConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TunnelConfiguration+WgQuickConfig.swift"; sourceTree = "<group>"; };
|
||||||
|
B355DFEC2920A75D00E4C858 /* NETunnelProviderProtocol+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NETunnelProviderProtocol+Extension.swift"; sourceTree = "<group>"; };
|
||||||
|
B355DFED2920A75D00E4C858 /* String+ArrayConversion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+ArrayConversion.swift"; sourceTree = "<group>"; };
|
||||||
|
B355DFEE2920A75E00E4C858 /* NotificationToken.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationToken.swift; sourceTree = "<group>"; };
|
||||||
|
B355DFF82920A79E00E4C858 /* ErrorNotifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ErrorNotifier.swift; sourceTree = "<group>"; };
|
||||||
B33FFBA9295F8F78002259E6 /* preboard.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = preboard.c; path = src/preboard.c; sourceTree = "<group>"; };
|
B33FFBA9295F8F78002259E6 /* preboard.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = preboard.c; path = src/preboard.c; sourceTree = "<group>"; };
|
||||||
B33FFBAB295F8F98002259E6 /* companion_proxy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = companion_proxy.c; path = src/companion_proxy.c; sourceTree = "<group>"; };
|
B33FFBAB295F8F98002259E6 /* companion_proxy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = companion_proxy.c; path = src/companion_proxy.c; sourceTree = "<group>"; };
|
||||||
B343F847295F6321002B1159 /* minimuxer.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = minimuxer.xcodeproj; path = Dependencies/minimuxer.xcodeproj; sourceTree = SOURCE_ROOT; };
|
B343F847295F6321002B1159 /* minimuxer.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = minimuxer.xcodeproj; path = Dependencies/minimuxer.xcodeproj; sourceTree = SOURCE_ROOT; };
|
||||||
@@ -876,6 +929,15 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
B355DFBB29209E2400E4C858 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
B355DFCF29209E4C00E4C858 /* WireGuardKit in Frameworks */,
|
||||||
|
B355DFC029209E2400E4C858 /* NetworkExtension.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
BF18BFE424857D7900DD5981 /* Frameworks */ = {
|
BF18BFE424857D7900DD5981 /* Frameworks */ = {
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -922,6 +984,7 @@
|
|||||||
D533E8B72727841800A9B5DD /* libAppleArchive.tbd in Frameworks */,
|
D533E8B72727841800A9B5DD /* libAppleArchive.tbd in Frameworks */,
|
||||||
B3C395F9284F362400DA9E2F /* AppCenterCrashes in Frameworks */,
|
B3C395F9284F362400DA9E2F /* AppCenterCrashes in Frameworks */,
|
||||||
D533E8BE2727BBF800A9B5DD /* libcurl.a in Frameworks */,
|
D533E8BE2727BBF800A9B5DD /* libcurl.a in Frameworks */,
|
||||||
|
B355DFB129209C6900E4C858 /* WireGuardKit in Frameworks */,
|
||||||
4879A9622861049C00FC1BBD /* OpenSSL in Frameworks */,
|
4879A9622861049C00FC1BBD /* OpenSSL in Frameworks */,
|
||||||
B3C395F4284F35DD00DA9E2F /* Nuke in Frameworks */,
|
B3C395F4284F35DD00DA9E2F /* Nuke in Frameworks */,
|
||||||
BF1614F1250822F100767AEA /* Roxas.framework in Frameworks */,
|
BF1614F1250822F100767AEA /* Roxas.framework in Frameworks */,
|
||||||
@@ -980,6 +1043,44 @@
|
|||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
B355DFC129209E2500E4C858 /* WireguardNetworkExtension */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
B355DFC529209E2500E4C858 /* WireguardNetworkExtension.entitlements */,
|
||||||
|
B355DFE22920A6C200E4C858 /* WireguardNetworkExtension-Bridging-Header.h */,
|
||||||
|
B355DFC429209E2500E4C858 /* Info.plist */,
|
||||||
|
B355DFC229209E2500E4C858 /* AppProxyProvider.swift */,
|
||||||
|
B355DFF82920A79E00E4C858 /* ErrorNotifier.swift */,
|
||||||
|
B355DFE92920A75D00E4C858 /* FileManager+Extension.swift */,
|
||||||
|
B355DFE82920A75D00E4C858 /* Keychain.swift */,
|
||||||
|
B355DFEE2920A75E00E4C858 /* NotificationToken.swift */,
|
||||||
|
B355DFE32920A75D00E4C858 /* Logging */,
|
||||||
|
B355DFEA2920A75D00E4C858 /* Model */,
|
||||||
|
);
|
||||||
|
path = WireguardNetworkExtension;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
B355DFE32920A75D00E4C858 /* Logging */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
B355DFE42920A75D00E4C858 /* ringlogger.c */,
|
||||||
|
B355DFE52920A75D00E4C858 /* Logger.swift */,
|
||||||
|
B355DFE62920A75D00E4C858 /* test_ringlogger.c */,
|
||||||
|
B355DFE72920A75D00E4C858 /* ringlogger.h */,
|
||||||
|
);
|
||||||
|
path = Logging;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
B355DFEA2920A75D00E4C858 /* Model */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
B355DFEB2920A75D00E4C858 /* TunnelConfiguration+WgQuickConfig.swift */,
|
||||||
|
B355DFEC2920A75D00E4C858 /* NETunnelProviderProtocol+Extension.swift */,
|
||||||
|
B355DFED2920A75D00E4C858 /* String+ArrayConversion.swift */,
|
||||||
|
);
|
||||||
|
path = Model;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
B33FFB8F295F8CF2002259E6 /* Recovered References */ = {
|
B33FFB8F295F8CF2002259E6 /* Recovered References */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1509,6 +1610,7 @@
|
|||||||
BF98916C250AABF3002ACF50 /* AltWidget */,
|
BF98916C250AABF3002ACF50 /* AltWidget */,
|
||||||
19104DB32909C06D00C49C7B /* EmotionalDamage */,
|
19104DB32909C06D00C49C7B /* EmotionalDamage */,
|
||||||
191E5FAC290A5D92001A3B7C /* minimuxer */,
|
191E5FAC290A5D92001A3B7C /* minimuxer */,
|
||||||
|
B355DFC129209E2500E4C858 /* WireguardNetworkExtension */,
|
||||||
B343F886295F7F9B002B1159 /* libfragmentzip.xcodeproj */,
|
B343F886295F7F9B002B1159 /* libfragmentzip.xcodeproj */,
|
||||||
BFD247852284BB3300981D42 /* Frameworks */,
|
BFD247852284BB3300981D42 /* Frameworks */,
|
||||||
B3146EC6284F580500BBC3FD /* Roxas.xcodeproj */,
|
B3146EC6284F580500BBC3FD /* Roxas.xcodeproj */,
|
||||||
@@ -1528,6 +1630,7 @@
|
|||||||
BF989167250AABF3002ACF50 /* AltWidgetExtension.appex */,
|
BF989167250AABF3002ACF50 /* AltWidgetExtension.appex */,
|
||||||
19104DB22909C06C00C49C7B /* libEmotionalDamage.a */,
|
19104DB22909C06C00C49C7B /* libEmotionalDamage.a */,
|
||||||
191E5FAB290A5D92001A3B7C /* libminimuxer.a */,
|
191E5FAB290A5D92001A3B7C /* libminimuxer.a */,
|
||||||
|
B355DFBE29209E2400E4C858 /* WireguardNetworkExtension.appex */,
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -1575,6 +1678,7 @@
|
|||||||
BF580497246A3D19008AE704 /* UIKit.framework */,
|
BF580497246A3D19008AE704 /* UIKit.framework */,
|
||||||
BF4588872298DD3F00BD7491 /* libxml2.tbd */,
|
BF4588872298DD3F00BD7491 /* libxml2.tbd */,
|
||||||
BFD247862284BB3B00981D42 /* Roxas.framework */,
|
BFD247862284BB3B00981D42 /* Roxas.framework */,
|
||||||
|
B355DFBF29209E2400E4C858 /* NetworkExtension.framework */,
|
||||||
);
|
);
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -1833,6 +1937,37 @@
|
|||||||
};
|
};
|
||||||
/* End PBXHeadersBuildPhase section */
|
/* End PBXHeadersBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXLegacyTarget section */
|
||||||
|
B355DFB229209DB000E4C858 /* WireGuardGoBridgeiOS */ = {
|
||||||
|
isa = PBXLegacyTarget;
|
||||||
|
buildArgumentsString = "$(ACTION)";
|
||||||
|
buildConfigurationList = B355DFB329209DB000E4C858 /* Build configuration list for PBXLegacyTarget "WireGuardGoBridgeiOS" */;
|
||||||
|
buildPhases = (
|
||||||
|
);
|
||||||
|
buildToolPath = /usr/bin/make;
|
||||||
|
buildWorkingDirectory = "${BUILD_DIR}/../../SourcePackages/checkouts/wireguard-apple/Sources/WireGuardKitGo";
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = WireGuardGoBridgeiOS;
|
||||||
|
passBuildSettingsInEnvironment = 1;
|
||||||
|
productName = WireGuardGoBridgeiOS;
|
||||||
|
};
|
||||||
|
B355DFB629209DD200E4C858 /* WireGuardGoBridgemacOS */ = {
|
||||||
|
isa = PBXLegacyTarget;
|
||||||
|
buildArgumentsString = "$(ACTION)";
|
||||||
|
buildConfigurationList = B355DFB729209DD200E4C858 /* Build configuration list for PBXLegacyTarget "WireGuardGoBridgemacOS" */;
|
||||||
|
buildPhases = (
|
||||||
|
);
|
||||||
|
buildToolPath = /usr/bin/make;
|
||||||
|
buildWorkingDirectory = "${BUILD_DIR%Build/*}SourcePackages/checkouts/wireguard-apple/Sources/WireGuardKitGo";
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = WireGuardGoBridgemacOS;
|
||||||
|
passBuildSettingsInEnvironment = 1;
|
||||||
|
productName = WireGuardGoBridgeiOS;
|
||||||
|
};
|
||||||
|
/* End PBXLegacyTarget section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
19104DB12909C06C00C49C7B /* EmotionalDamage */ = {
|
19104DB12909C06C00C49C7B /* EmotionalDamage */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
@@ -1869,6 +2004,27 @@
|
|||||||
productReference = 191E5FAB290A5D92001A3B7C /* libminimuxer.a */;
|
productReference = 191E5FAB290A5D92001A3B7C /* libminimuxer.a */;
|
||||||
productType = "com.apple.product-type.library.static";
|
productType = "com.apple.product-type.library.static";
|
||||||
};
|
};
|
||||||
|
B355DFBD29209E2400E4C858 /* WireguardNetworkExtension */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = B355DFC929209E2600E4C858 /* Build configuration list for PBXNativeTarget "WireguardNetworkExtension" */;
|
||||||
|
buildPhases = (
|
||||||
|
B355DFBA29209E2400E4C858 /* Sources */,
|
||||||
|
B355DFBB29209E2400E4C858 /* Frameworks */,
|
||||||
|
B355DFBC29209E2400E4C858 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
B355DFCD29209E3F00E4C858 /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = WireguardNetworkExtension;
|
||||||
|
packageProductDependencies = (
|
||||||
|
B355DFCE29209E4C00E4C858 /* WireGuardKit */,
|
||||||
|
);
|
||||||
|
productName = WireguardNetworkExtension;
|
||||||
|
productReference = B355DFBE29209E2400E4C858 /* WireguardNetworkExtension.appex */;
|
||||||
|
productType = "com.apple.product-type.app-extension";
|
||||||
|
};
|
||||||
BF18BFE624857D7900DD5981 /* AltDaemon */ = {
|
BF18BFE624857D7900DD5981 /* AltDaemon */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = BF18BFEB24857D7900DD5981 /* Build configuration list for PBXNativeTarget "AltDaemon" */;
|
buildConfigurationList = BF18BFEB24857D7900DD5981 /* Build configuration list for PBXNativeTarget "AltDaemon" */;
|
||||||
@@ -1983,6 +2139,7 @@
|
|||||||
19104D942909BADB00C49C7B /* PBXTargetDependency */,
|
19104D942909BADB00C49C7B /* PBXTargetDependency */,
|
||||||
BF66EE842501AE50007EE018 /* PBXTargetDependency */,
|
BF66EE842501AE50007EE018 /* PBXTargetDependency */,
|
||||||
BF989176250AABF4002ACF50 /* PBXTargetDependency */,
|
BF989176250AABF4002ACF50 /* PBXTargetDependency */,
|
||||||
|
B355DFC729209E2500E4C858 /* PBXTargetDependency */,
|
||||||
);
|
);
|
||||||
name = SideStore;
|
name = SideStore;
|
||||||
packageProductDependencies = (
|
packageProductDependencies = (
|
||||||
@@ -1990,6 +2147,7 @@
|
|||||||
B3C395F6284F362400DA9E2F /* AppCenterAnalytics */,
|
B3C395F6284F362400DA9E2F /* AppCenterAnalytics */,
|
||||||
B3C395F8284F362400DA9E2F /* AppCenterCrashes */,
|
B3C395F8284F362400DA9E2F /* AppCenterCrashes */,
|
||||||
4879A9612861049C00FC1BBD /* OpenSSL */,
|
4879A9612861049C00FC1BBD /* OpenSSL */,
|
||||||
|
B355DFB029209C6900E4C858 /* WireGuardKit */,
|
||||||
);
|
);
|
||||||
productName = AltStore;
|
productName = AltStore;
|
||||||
productReference = BFD2476A2284B9A500981D42 /* SideStore.app */;
|
productReference = BFD2476A2284B9A500981D42 /* SideStore.app */;
|
||||||
@@ -2001,7 +2159,7 @@
|
|||||||
BFD247622284B9A500981D42 /* Project object */ = {
|
BFD247622284B9A500981D42 /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
LastSwiftUpdateCheck = 1400;
|
LastSwiftUpdateCheck = 1410;
|
||||||
LastUpgradeCheck = 1020;
|
LastUpgradeCheck = 1020;
|
||||||
ORGANIZATIONNAME = SideStore;
|
ORGANIZATIONNAME = SideStore;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
@@ -2011,6 +2169,12 @@
|
|||||||
191E5FAA290A5D92001A3B7C = {
|
191E5FAA290A5D92001A3B7C = {
|
||||||
CreatedOnToolsVersion = 14.0;
|
CreatedOnToolsVersion = 14.0;
|
||||||
};
|
};
|
||||||
|
B355DFB229209DB000E4C858 = {
|
||||||
|
CreatedOnToolsVersion = 14.1;
|
||||||
|
};
|
||||||
|
B355DFBD29209E2400E4C858 = {
|
||||||
|
CreatedOnToolsVersion = 14.1;
|
||||||
|
};
|
||||||
BF18BFE624857D7900DD5981 = {
|
BF18BFE624857D7900DD5981 = {
|
||||||
CreatedOnToolsVersion = 11.5;
|
CreatedOnToolsVersion = 11.5;
|
||||||
LastSwiftMigration = 1150;
|
LastSwiftMigration = 1150;
|
||||||
@@ -2060,6 +2224,7 @@
|
|||||||
B3C395FD284F3C0900DA9E2F /* XCRemoteSwiftPackageReference "STPrivilegedTask" */,
|
B3C395FD284F3C0900DA9E2F /* XCRemoteSwiftPackageReference "STPrivilegedTask" */,
|
||||||
4879A95D2861046500FC1BBD /* XCRemoteSwiftPackageReference "AltSign" */,
|
4879A95D2861046500FC1BBD /* XCRemoteSwiftPackageReference "AltSign" */,
|
||||||
4879A9602861049C00FC1BBD /* XCRemoteSwiftPackageReference "OpenSSL" */,
|
4879A9602861049C00FC1BBD /* XCRemoteSwiftPackageReference "OpenSSL" */,
|
||||||
|
B355DFAF29209C6900E4C858 /* XCRemoteSwiftPackageReference "wireguard-apple" */,
|
||||||
);
|
);
|
||||||
productRefGroup = BFD2476B2284B9A500981D42 /* Products */;
|
productRefGroup = BFD2476B2284B9A500981D42 /* Products */;
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
@@ -2091,6 +2256,9 @@
|
|||||||
BF989166250AABF3002ACF50 /* AltWidgetExtension */,
|
BF989166250AABF3002ACF50 /* AltWidgetExtension */,
|
||||||
19104DB12909C06C00C49C7B /* EmotionalDamage */,
|
19104DB12909C06C00C49C7B /* EmotionalDamage */,
|
||||||
191E5FAA290A5D92001A3B7C /* minimuxer */,
|
191E5FAA290A5D92001A3B7C /* minimuxer */,
|
||||||
|
B355DFB229209DB000E4C858 /* WireGuardGoBridgeiOS */,
|
||||||
|
B355DFB629209DD200E4C858 /* WireGuardGoBridgemacOS */,
|
||||||
|
B355DFBD29209E2400E4C858 /* WireguardNetworkExtension */,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
@@ -2169,6 +2337,23 @@
|
|||||||
/* End PBXReferenceProxy section */
|
/* End PBXReferenceProxy section */
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
B355DFBC29209E2400E4C858 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
BF45868B229872EA00BD7491 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
BFE4FFB6251BF7BA0018CF9B /* AltPlugin.zip in Resources */,
|
||||||
|
BF458694229872EA00BD7491 /* Assets.xcassets in Resources */,
|
||||||
|
BF458697229872EA00BD7491 /* Main.storyboard in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
BF580479246A28F7008AE704 /* Resources */ = {
|
BF580479246A28F7008AE704 /* Resources */ = {
|
||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -2236,6 +2421,24 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
B355DFBA29209E2400E4C858 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
B355DFC329209E2500E4C858 /* AppProxyProvider.swift in Sources */,
|
||||||
|
B355DFF52920A75E00E4C858 /* NETunnelProviderProtocol+Extension.swift in Sources */,
|
||||||
|
B355DFF42920A75E00E4C858 /* TunnelConfiguration+WgQuickConfig.swift in Sources */,
|
||||||
|
B355DFF12920A75E00E4C858 /* test_ringlogger.c in Sources */,
|
||||||
|
B355DFF92920A79E00E4C858 /* ErrorNotifier.swift in Sources */,
|
||||||
|
B355DFF02920A75E00E4C858 /* Logger.swift in Sources */,
|
||||||
|
B355DFEF2920A75E00E4C858 /* ringlogger.c in Sources */,
|
||||||
|
B355DFF72920A75E00E4C858 /* NotificationToken.swift in Sources */,
|
||||||
|
B355DFF22920A75E00E4C858 /* Keychain.swift in Sources */,
|
||||||
|
B355DFF32920A75E00E4C858 /* FileManager+Extension.swift in Sources */,
|
||||||
|
B355DFF62920A75E00E4C858 /* String+ArrayConversion.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
BF18BFE324857D7900DD5981 /* Sources */ = {
|
BF18BFE324857D7900DD5981 /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -2543,6 +2746,20 @@
|
|||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
productRef = 191E5FD9290AFA49001A3B7C /* OpenSSL */;
|
productRef = 191E5FD9290AFA49001A3B7C /* OpenSSL */;
|
||||||
};
|
};
|
||||||
|
B355DFC729209E2500E4C858 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = B355DFBD29209E2400E4C858 /* WireguardNetworkExtension */;
|
||||||
|
targetProxy = B355DFC629209E2500E4C858 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
B355DFCD29209E3F00E4C858 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = B355DFB229209DB000E4C858 /* WireGuardGoBridgeiOS */;
|
||||||
|
targetProxy = B355DFCC29209E3F00E4C858 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
BF4588452298D48B00BD7491 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = BF45872A2298D31600BD7491 /* libimobiledevice */;
|
||||||
|
targetProxy = BF4588442298D48B00BD7491 /* PBXContainerItemProxy */;
|
||||||
B343F86F295F76FD002B1159 /* PBXTargetDependency */ = {
|
B343F86F295F76FD002B1159 /* PBXTargetDependency */ = {
|
||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
name = "minimuxer-staticlib";
|
name = "minimuxer-staticlib";
|
||||||
@@ -2700,6 +2917,138 @@
|
|||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
B355DFB429209DB000E4C858 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEBUGGING_SYMBOLS = YES;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
DEVELOPMENT_TEAM = S32Z3HMYVQ;
|
||||||
|
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
OTHER_CFLAGS = "";
|
||||||
|
OTHER_LDFLAGS = "";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
B355DFB529209DB000E4C858 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
DEVELOPMENT_TEAM = S32Z3HMYVQ;
|
||||||
|
OTHER_CFLAGS = "";
|
||||||
|
OTHER_LDFLAGS = "";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
B355DFB829209DD200E4C858 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEBUGGING_SYMBOLS = YES;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
DEVELOPMENT_TEAM = S32Z3HMYVQ;
|
||||||
|
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
OTHER_CFLAGS = "";
|
||||||
|
OTHER_LDFLAGS = "";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SDKROOT = macos;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
B355DFB929209DD200E4C858 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
DEVELOPMENT_TEAM = S32Z3HMYVQ;
|
||||||
|
OTHER_CFLAGS = "";
|
||||||
|
OTHER_LDFLAGS = "";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SDKROOT = macos;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
B355DFCA29209E2600E4C858 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = WireguardNetworkExtension/WireguardNetworkExtension.entitlements;
|
||||||
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)";
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
INFOPLIST_FILE = WireguardNetworkExtension/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = WireguardNetworkExtension;
|
||||||
|
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Riley Testut. All rights reserved.";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.1;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@executable_path/../../Frameworks",
|
||||||
|
);
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.joemattiello.AltStore.WireguardNetworkExtension;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
B355DFCB29209E2600E4C858 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = WireguardNetworkExtension/WireguardNetworkExtension.entitlements;
|
||||||
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)";
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
INFOPLIST_FILE = WireguardNetworkExtension/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = WireguardNetworkExtension;
|
||||||
|
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Riley Testut. All rights reserved.";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.1;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@executable_path/../../Frameworks",
|
||||||
|
);
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.joemattiello.AltStore.WireguardNetworkExtension;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
BF18BFEC24857D7900DD5981 /* Debug */ = {
|
BF18BFEC24857D7900DD5981 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
@@ -3264,6 +3613,33 @@
|
|||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
|
B355DFB329209DB000E4C858 /* Build configuration list for PBXLegacyTarget "WireGuardGoBridgeiOS" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
B355DFB429209DB000E4C858 /* Debug */,
|
||||||
|
B355DFB529209DB000E4C858 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
B355DFB729209DD200E4C858 /* Build configuration list for PBXLegacyTarget "WireGuardGoBridgemacOS" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
B355DFB829209DD200E4C858 /* Debug */,
|
||||||
|
B355DFB929209DD200E4C858 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
B355DFC929209E2600E4C858 /* Build configuration list for PBXNativeTarget "WireguardNetworkExtension" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
B355DFCA29209E2600E4C858 /* Debug */,
|
||||||
|
B355DFCB29209E2600E4C858 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
BF18BFEB24857D7900DD5981 /* Build configuration list for PBXNativeTarget "AltDaemon" */ = {
|
BF18BFEB24857D7900DD5981 /* Build configuration list for PBXNativeTarget "AltDaemon" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
@@ -3346,6 +3722,14 @@
|
|||||||
minimumVersion = 1.1.180;
|
minimumVersion = 1.1.180;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
B355DFAF29209C6900E4C858 /* XCRemoteSwiftPackageReference "wireguard-apple" */ = {
|
||||||
|
isa = XCRemoteSwiftPackageReference;
|
||||||
|
repositoryURL = "https://github.com/WireGuard/wireguard-apple";
|
||||||
|
requirement = {
|
||||||
|
branch = master;
|
||||||
|
kind = branch;
|
||||||
|
};
|
||||||
|
};
|
||||||
B3C395EF284F2DE700DA9E2F /* XCRemoteSwiftPackageReference "KeychainAccess" */ = {
|
B3C395EF284F2DE700DA9E2F /* XCRemoteSwiftPackageReference "KeychainAccess" */ = {
|
||||||
isa = XCRemoteSwiftPackageReference;
|
isa = XCRemoteSwiftPackageReference;
|
||||||
repositoryURL = "https://github.com/kishikawakatsumi/KeychainAccess.git";
|
repositoryURL = "https://github.com/kishikawakatsumi/KeychainAccess.git";
|
||||||
@@ -3417,6 +3801,16 @@
|
|||||||
package = 4879A9602861049C00FC1BBD /* XCRemoteSwiftPackageReference "OpenSSL" */;
|
package = 4879A9602861049C00FC1BBD /* XCRemoteSwiftPackageReference "OpenSSL" */;
|
||||||
productName = OpenSSL;
|
productName = OpenSSL;
|
||||||
};
|
};
|
||||||
|
B355DFB029209C6900E4C858 /* WireGuardKit */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = B355DFAF29209C6900E4C858 /* XCRemoteSwiftPackageReference "wireguard-apple" */;
|
||||||
|
productName = WireGuardKit;
|
||||||
|
};
|
||||||
|
B355DFCE29209E4C00E4C858 /* WireGuardKit */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = B355DFAF29209C6900E4C858 /* XCRemoteSwiftPackageReference "wireguard-apple" */;
|
||||||
|
productName = WireGuardKit;
|
||||||
|
};
|
||||||
B3C395F0284F2DE700DA9E2F /* KeychainAccess */ = {
|
B3C395F0284F2DE700DA9E2F /* KeychainAccess */ = {
|
||||||
isa = XCSwiftPackageProductDependency;
|
isa = XCSwiftPackageProductDependency;
|
||||||
package = B3C395EF284F2DE700DA9E2F /* XCRemoteSwiftPackageReference "KeychainAccess" */;
|
package = B3C395EF284F2DE700DA9E2F /* XCRemoteSwiftPackageReference "KeychainAccess" */;
|
||||||
|
|||||||
@@ -1,86 +0,0 @@
|
|||||||
{
|
|
||||||
"pins" : [
|
|
||||||
{
|
|
||||||
"identity" : "altsign",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/SideStore/AltSign",
|
|
||||||
"state" : {
|
|
||||||
"branch" : "master",
|
|
||||||
"revision" : "7e0e7edcf8fbc44ac1e35da3e9030a297aa18b84"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "appcenter-sdk-apple",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/microsoft/appcenter-sdk-apple.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "8354a50fe01a7e54e196d3b5493b5ab53dd5866a",
|
|
||||||
"version" : "4.4.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "keychainaccess",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/kishikawakatsumi/KeychainAccess.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "84e546727d66f1adc5439debad16270d0fdd04e7",
|
|
||||||
"version" : "4.2.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "launchatlogin",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/sindresorhus/LaunchAtLogin.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "e8171b3e38a2816f579f58f3dac1522aa39efe41",
|
|
||||||
"version" : "4.2.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "nuke",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/kean/Nuke.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "9318d02a8a6d20af56505c9673261c1fd3b3aebe",
|
|
||||||
"version" : "7.6.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "openssl",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/krzyzanowskim/OpenSSL",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "033fcb41dac96b1b6effa945ca1f9ade002370b2",
|
|
||||||
"version" : "1.1.1501"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "plcrashreporter",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/microsoft/PLCrashReporter.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "6b27393cad517c067dceea85fadf050e70c4ceaa",
|
|
||||||
"version" : "1.10.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "sparkle",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/sparkle-project/Sparkle.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "286edd1fa22505a9e54d170e9fd07d775ea233f2",
|
|
||||||
"version" : "2.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "stprivilegedtask",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/JoeMatt/STPrivilegedTask.git",
|
|
||||||
"state" : {
|
|
||||||
"branch" : "master",
|
|
||||||
"revision" : "10a9150ef32d444af326beba76356ae9af95a3e7"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"version" : 2
|
|
||||||
}
|
|
||||||
@@ -4,11 +4,35 @@
|
|||||||
<dict>
|
<dict>
|
||||||
<key>aps-environment</key>
|
<key>aps-environment</key>
|
||||||
<string>development</string>
|
<string>development</string>
|
||||||
|
<key>com.apple.developer.associated-domains</key>
|
||||||
|
<array>
|
||||||
|
<string>webcredentials:sidestore.io</string>
|
||||||
|
</array>
|
||||||
|
<key>com.apple.developer.icloud-container-identifiers</key>
|
||||||
|
<array/>
|
||||||
|
<key>com.apple.developer.kernel.increased-memory-limit</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.developer.networking.multipath</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.developer.networking.vpn.api</key>
|
||||||
|
<array>
|
||||||
|
<string>allow-vpn</string>
|
||||||
|
</array>
|
||||||
|
<key>com.apple.developer.networking.wifi-info</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.developer.shared-with-you</key>
|
||||||
|
<true/>
|
||||||
<key>com.apple.developer.siri</key>
|
<key>com.apple.developer.siri</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>com.apple.developer.ubiquity-kvstore-identifier</key>
|
||||||
|
<string>$(TeamIdentifierPrefix)$(CFBundleIdentifier)</string>
|
||||||
<key>com.apple.security.application-groups</key>
|
<key>com.apple.security.application-groups</key>
|
||||||
<array>
|
<array>
|
||||||
<string>group.$(APP_GROUP_IDENTIFIER)</string>
|
<string>group.$(APP_GROUP_IDENTIFIER)</string>
|
||||||
</array>
|
</array>
|
||||||
|
<key>keychain-access-groups</key>
|
||||||
|
<array>
|
||||||
|
<string>$(AppIdentifierPrefix)$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ extension AnalyticsManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class AnalyticsManager
|
class AnalyticsManager
|
||||||
{
|
{
|
||||||
static let shared = AnalyticsManager()
|
static let shared = AnalyticsManager()
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ extension AppContentViewController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class AppContentViewController: UITableViewController
|
class AppContentViewController: UITableViewController
|
||||||
{
|
{
|
||||||
var app: StoreApp!
|
var app: StoreApp!
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class PermissionCollectionViewCell: UICollectionViewCell
|
class PermissionCollectionViewCell: UICollectionViewCell
|
||||||
{
|
{
|
||||||
@IBOutlet var button: UIButton!
|
@IBOutlet var button: UIButton!
|
||||||
@IBOutlet var textLabel: UILabel!
|
@IBOutlet var textLabel: UILabel!
|
||||||
@@ -29,7 +29,7 @@ final class PermissionCollectionViewCell: UICollectionViewCell
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class AppContentTableViewCell: UITableViewCell
|
class AppContentTableViewCell: UITableViewCell
|
||||||
{
|
{
|
||||||
override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize
|
override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import Roxas
|
|||||||
|
|
||||||
import Nuke
|
import Nuke
|
||||||
|
|
||||||
final class AppViewController: UIViewController
|
class AppViewController: UIViewController
|
||||||
{
|
{
|
||||||
var app: StoreApp!
|
var app: StoreApp!
|
||||||
|
|
||||||
@@ -352,7 +352,7 @@ final class AppViewController: UIViewController
|
|||||||
|
|
||||||
extension AppViewController
|
extension AppViewController
|
||||||
{
|
{
|
||||||
final class func makeAppViewController(app: StoreApp) -> AppViewController
|
class func makeAppViewController(app: StoreApp) -> AppViewController
|
||||||
{
|
{
|
||||||
let storyboard = UIStoryboard(name: "Main", bundle: nil)
|
let storyboard = UIStoryboard(name: "Main", bundle: nil)
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import UIKit
|
|||||||
|
|
||||||
import AltStoreCore
|
import AltStoreCore
|
||||||
|
|
||||||
final class PermissionPopoverViewController: UIViewController
|
class PermissionPopoverViewController: UIViewController
|
||||||
{
|
{
|
||||||
var permission: AppPermission!
|
var permission: AppPermission!
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import UIKit
|
|||||||
import AltStoreCore
|
import AltStoreCore
|
||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
final class AppIDsViewController: UICollectionViewController
|
class AppIDsViewController: UICollectionViewController
|
||||||
{
|
{
|
||||||
private lazy var dataSource = self.makeDataSource()
|
private lazy var dataSource = self.makeDataSource()
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ extension AppDelegate
|
|||||||
}
|
}
|
||||||
|
|
||||||
@UIApplicationMain
|
@UIApplicationMain
|
||||||
final class AppDelegate: UIResponder, UIApplicationDelegate {
|
class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||||
|
|
||||||
var window: UIWindow?
|
var window: UIWindow?
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import UIKit
|
|||||||
|
|
||||||
import AltSign
|
import AltSign
|
||||||
|
|
||||||
final class AuthenticationViewController: UIViewController
|
class AuthenticationViewController: UIViewController
|
||||||
{
|
{
|
||||||
var authenticationHandler: ((String, String, @escaping (Result<(ALTAccount, ALTAppleAPISession), Error>) -> Void) -> Void)?
|
var authenticationHandler: ((String, String, @escaping (Result<(ALTAccount, ALTAppleAPISession), Error>) -> Void) -> Void)?
|
||||||
var completionHandler: (((ALTAccount, ALTAppleAPISession, String)?) -> Void)?
|
var completionHandler: (((ALTAccount, ALTAppleAPISession, String)?) -> Void)?
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class InstructionsViewController: UIViewController
|
class InstructionsViewController: UIViewController
|
||||||
{
|
{
|
||||||
var completionHandler: (() -> Void)?
|
var completionHandler: (() -> Void)?
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import AltStoreCore
|
|||||||
import AltSign
|
import AltSign
|
||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
final class RefreshAltStoreViewController: UIViewController
|
class RefreshAltStoreViewController: UIViewController
|
||||||
{
|
{
|
||||||
var context: AuthenticatedOperationContext!
|
var context: AuthenticatedOperationContext!
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import IntentsUI
|
|||||||
|
|
||||||
import AltSign
|
import AltSign
|
||||||
|
|
||||||
final class SelectTeamViewController: UITableViewController
|
class SelectTeamViewController: UITableViewController
|
||||||
{
|
{
|
||||||
public var teams: [ALTTeam]?
|
public var teams: [ALTTeam]?
|
||||||
public var completionHandler: ((Result<ALTTeam, Swift.Error>) -> Void)?
|
public var completionHandler: ((Result<ALTTeam, Swift.Error>) -> Void)?
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import Roxas
|
|||||||
|
|
||||||
import Nuke
|
import Nuke
|
||||||
|
|
||||||
@objc final class BrowseCollectionViewCell: UICollectionViewCell
|
@objc class BrowseCollectionViewCell: UICollectionViewCell
|
||||||
{
|
{
|
||||||
var imageURLs: [URL] = [] {
|
var imageURLs: [URL] = [] {
|
||||||
didSet {
|
didSet {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class AppIconImageView: UIImageView
|
class AppIconImageView: UIImageView
|
||||||
{
|
{
|
||||||
override func awakeFromNib()
|
override func awakeFromNib()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import AVFoundation
|
import AVFoundation
|
||||||
|
|
||||||
final class BackgroundTaskManager
|
class BackgroundTaskManager
|
||||||
{
|
{
|
||||||
static let shared = BackgroundTaskManager()
|
static let shared = BackgroundTaskManager()
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class BannerCollectionViewCell: UICollectionViewCell
|
class BannerCollectionViewCell: UICollectionViewCell
|
||||||
{
|
{
|
||||||
private(set) var errorBadge: UIView?
|
private(set) var errorBadge: UIView?
|
||||||
@IBOutlet private(set) var bannerView: AppBannerView!
|
@IBOutlet private(set) var bannerView: AppBannerView!
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class Button: UIButton
|
class Button: UIButton
|
||||||
{
|
{
|
||||||
override var intrinsicContentSize: CGSize {
|
override var intrinsicContentSize: CGSize {
|
||||||
var size = super.intrinsicContentSize
|
var size = super.intrinsicContentSize
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class CollapsingTextView: UITextView
|
class CollapsingTextView: UITextView
|
||||||
{
|
{
|
||||||
var isCollapsed = true {
|
var isCollapsed = true {
|
||||||
didSet {
|
didSet {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class ForwardingNavigationController: UINavigationController
|
class ForwardingNavigationController: UINavigationController
|
||||||
{
|
{
|
||||||
override var childForStatusBarStyle: UIViewController? {
|
override var childForStatusBarStyle: UIViewController? {
|
||||||
return self.topViewController
|
return self.topViewController
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import UIKit
|
|||||||
|
|
||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
final class NavigationBar: UINavigationBar
|
class NavigationBar: UINavigationBar
|
||||||
{
|
{
|
||||||
@IBInspectable var automaticallyAdjustsItemPositions: Bool = true
|
@IBInspectable var automaticallyAdjustsItemPositions: Bool = true
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class PillButton: UIButton
|
class PillButton: UIButton
|
||||||
{
|
{
|
||||||
override var accessibilityValue: String? {
|
override var accessibilityValue: String? {
|
||||||
get {
|
get {
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ extension TimeInterval
|
|||||||
static let longToastViewDuration = 8.0
|
static let longToastViewDuration = 8.0
|
||||||
}
|
}
|
||||||
|
|
||||||
final class ToastView: RSTToastView
|
class ToastView: RSTToastView
|
||||||
{
|
{
|
||||||
var preferredDuration: TimeInterval
|
var preferredDuration: TimeInterval
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import OSLog
|
import OSLog
|
||||||
|
|
||||||
public let customLog = OSLog(subsystem: "org.sidestore.sidestore",
|
let customLog = OSLog(subsystem: "org.sidestore.sidestore",
|
||||||
category: "ios")
|
category: "ios")
|
||||||
|
|
||||||
|
|
||||||
@@ -18,7 +18,6 @@ public extension OSLog {
|
|||||||
/// - Parameters:
|
/// - Parameters:
|
||||||
/// - message: String or format string
|
/// - message: String or format string
|
||||||
/// - args: optional args for format string
|
/// - args: optional args for format string
|
||||||
@inlinable
|
|
||||||
static func error(_ message: StaticString, _ args: CVarArg...) {
|
static func error(_ message: StaticString, _ args: CVarArg...) {
|
||||||
os_log(message, log: customLog, type: .error, args)
|
os_log(message, log: customLog, type: .error, args)
|
||||||
}
|
}
|
||||||
@@ -27,7 +26,6 @@ public extension OSLog {
|
|||||||
/// - Parameters:
|
/// - Parameters:
|
||||||
/// - message: String or format string
|
/// - message: String or format string
|
||||||
/// - args: optional args for format string
|
/// - args: optional args for format string
|
||||||
@inlinable
|
|
||||||
static func info(_ message: StaticString, _ args: CVarArg...) {
|
static func info(_ message: StaticString, _ args: CVarArg...) {
|
||||||
os_log(message, log: customLog, type: .info, args)
|
os_log(message, log: customLog, type: .info, args)
|
||||||
}
|
}
|
||||||
@@ -36,7 +34,6 @@ public extension OSLog {
|
|||||||
/// - Parameters:
|
/// - Parameters:
|
||||||
/// - message: String or format string
|
/// - message: String or format string
|
||||||
/// - args: optional args for format string
|
/// - args: optional args for format string
|
||||||
@inlinable
|
|
||||||
static func debug(_ message: StaticString, _ args: CVarArg...) {
|
static func debug(_ message: StaticString, _ args: CVarArg...) {
|
||||||
os_log(message, log: customLog, type: .debug, args)
|
os_log(message, log: customLog, type: .debug, args)
|
||||||
}
|
}
|
||||||
@@ -48,7 +45,6 @@ public extension OSLog {
|
|||||||
/// - Parameters:
|
/// - Parameters:
|
||||||
/// - message: String or format string
|
/// - message: String or format string
|
||||||
/// - args: optional args for format string
|
/// - args: optional args for format string
|
||||||
@inlinable
|
|
||||||
public func ELOG(_ message: StaticString, file: StaticString = #file, function: StaticString = #function, line: UInt = #line, _ args: CVarArg...) {
|
public func ELOG(_ message: StaticString, file: StaticString = #file, function: StaticString = #function, line: UInt = #line, _ args: CVarArg...) {
|
||||||
OSLog.error(message, args)
|
OSLog.error(message, args)
|
||||||
}
|
}
|
||||||
@@ -57,7 +53,6 @@ public func ELOG(_ message: StaticString, file: StaticString = #file, function:
|
|||||||
/// - Parameters:
|
/// - Parameters:
|
||||||
/// - message: String or format string
|
/// - message: String or format string
|
||||||
/// - args: optional args for format string
|
/// - args: optional args for format string
|
||||||
@inlinable
|
|
||||||
public func ILOG(_ message: StaticString, file: StaticString = #file, function: StaticString = #function, line: UInt = #line, _ args: CVarArg...) {
|
public func ILOG(_ message: StaticString, file: StaticString = #file, function: StaticString = #function, line: UInt = #line, _ args: CVarArg...) {
|
||||||
OSLog.info(message, args)
|
OSLog.info(message, args)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,6 +93,40 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>NSAppTransportSecurity</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSExceptionDomains</key>
|
||||||
|
<dict>
|
||||||
|
<key>127.0.0.1</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSExceptionAllowsInsecureHTTPLoads</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSIncludesSubdomains</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>New Exception Domain 1</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSExceptionAllowsInsecureHTTPLoads</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSIncludesSubdomains</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>apps.sidestore.io</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSExceptionAllowsInsecureHTTPLoads</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSIncludesSubdomains</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>sidestore.io</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSExceptionAllowsInsecureHTTPLoads</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSIncludesSubdomains</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
<key>NSBonjourServices</key>
|
<key>NSBonjourServices</key>
|
||||||
<array>
|
<array>
|
||||||
<string>_altserver._tcp</string>
|
<string>_altserver._tcp</string>
|
||||||
@@ -129,6 +163,7 @@
|
|||||||
<array>
|
<array>
|
||||||
<string>audio</string>
|
<string>audio</string>
|
||||||
<string>fetch</string>
|
<string>fetch</string>
|
||||||
|
<string>processing</string>
|
||||||
<string>remote-notification</string>
|
<string>remote-notification</string>
|
||||||
</array>
|
</array>
|
||||||
<key>UILaunchStoryboardName</key>
|
<key>UILaunchStoryboardName</key>
|
||||||
@@ -204,7 +239,5 @@
|
|||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>UIFileSharingEnabled</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import Foundation
|
|||||||
import AltStoreCore
|
import AltStoreCore
|
||||||
|
|
||||||
@available(iOS 14, *)
|
@available(iOS 14, *)
|
||||||
final class IntentHandler: NSObject, RefreshAllIntentHandling
|
class IntentHandler: NSObject, RefreshAllIntentHandling
|
||||||
{
|
{
|
||||||
private let queue = DispatchQueue(label: "io.altstore.IntentHandler")
|
private let queue = DispatchQueue(label: "io.altstore.IntentHandler")
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import minimuxer
|
|||||||
import AltStoreCore
|
import AltStoreCore
|
||||||
import UniformTypeIdentifiers
|
import UniformTypeIdentifiers
|
||||||
|
|
||||||
final class LaunchViewController: RSTLaunchViewController, UIDocumentPickerDelegate
|
class LaunchViewController: RSTLaunchViewController, UIDocumentPickerDelegate
|
||||||
{
|
{
|
||||||
private var didFinishLaunching = false
|
private var didFinishLaunching = false
|
||||||
|
|
||||||
@@ -47,7 +47,6 @@ final class LaunchViewController: RSTLaunchViewController, UIDocumentPickerDeleg
|
|||||||
|
|
||||||
override func viewDidAppear(_ animated: Bool) {
|
override func viewDidAppear(_ animated: Bool) {
|
||||||
super.viewDidAppear(true)
|
super.viewDidAppear(true)
|
||||||
#if !targetEnvironment(simulator)
|
|
||||||
start_em_proxy(bind_addr: Consts.Proxy.serverURL)
|
start_em_proxy(bind_addr: Consts.Proxy.serverURL)
|
||||||
|
|
||||||
guard let pf = fetchPairingFile() else {
|
guard let pf = fetchPairingFile() else {
|
||||||
@@ -55,7 +54,6 @@ final class LaunchViewController: RSTLaunchViewController, UIDocumentPickerDeleg
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
start_minimuxer_threads(pf)
|
start_minimuxer_threads(pf)
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func fetchPairingFile() -> String? {
|
func fetchPairingFile() -> String? {
|
||||||
@@ -149,17 +147,7 @@ final class LaunchViewController: RSTLaunchViewController, UIDocumentPickerDeleg
|
|||||||
|
|
||||||
func start_minimuxer_threads(_ pairing_file: String) {
|
func start_minimuxer_threads(_ pairing_file: String) {
|
||||||
set_usbmuxd_socket()
|
set_usbmuxd_socket()
|
||||||
#if false // Retries
|
|
||||||
var res = start_minimuxer(pairing_file: pairing_file)
|
|
||||||
var attempts = 10
|
|
||||||
while (attempts != 0 && res != 0) {
|
|
||||||
print("start_minimuxer `res` != 0, retry #\(attempts)")
|
|
||||||
res = start_minimuxer(pairing_file: pairing_file)
|
|
||||||
attempts -= 1
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
let res = start_minimuxer(pairing_file: pairing_file)
|
let res = start_minimuxer(pairing_file: pairing_file)
|
||||||
#endif
|
|
||||||
if res != 0 {
|
if res != 0 {
|
||||||
displayError("minimuxer failed to start. Incorrect arguments were passed.")
|
displayError("minimuxer failed to start. Incorrect arguments were passed.")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ extension AppManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
@available(iOS 13, *)
|
@available(iOS 13, *)
|
||||||
final class AppManagerPublisher: ObservableObject
|
class AppManagerPublisher: ObservableObject
|
||||||
{
|
{
|
||||||
@Published
|
@Published
|
||||||
fileprivate(set) var installationProgress = [String: Progress]()
|
fileprivate(set) var installationProgress = [String: Progress]()
|
||||||
@@ -42,7 +42,7 @@ private func ==(lhs: OperatingSystemVersion, rhs: OperatingSystemVersion) -> Boo
|
|||||||
return (lhs.majorVersion == rhs.majorVersion && lhs.minorVersion == rhs.minorVersion && lhs.patchVersion == rhs.patchVersion)
|
return (lhs.majorVersion == rhs.majorVersion && lhs.minorVersion == rhs.minorVersion && lhs.patchVersion == rhs.patchVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
final class AppManager
|
class AppManager
|
||||||
{
|
{
|
||||||
static let shared = AppManager()
|
static let shared = AppManager()
|
||||||
|
|
||||||
@@ -664,7 +664,7 @@ extension AppManager
|
|||||||
@available(iOS 14, *)
|
@available(iOS 14, *)
|
||||||
func enableJIT(for installedApp: InstalledApp, completionHandler: @escaping (Result<Void, Error>) -> Void)
|
func enableJIT(for installedApp: InstalledApp, completionHandler: @escaping (Result<Void, Error>) -> Void)
|
||||||
{
|
{
|
||||||
final class Context: OperationContext, EnableJITContext
|
class Context: OperationContext, EnableJITContext
|
||||||
{
|
{
|
||||||
var installedApp: InstalledApp?
|
var installedApp: InstalledApp?
|
||||||
}
|
}
|
||||||
@@ -684,7 +684,7 @@ extension AppManager
|
|||||||
@available(iOS 14.0, *)
|
@available(iOS 14.0, *)
|
||||||
func patch(resignedApp: ALTApplication, presentingViewController: UIViewController, context authContext: AuthenticatedOperationContext, completionHandler: @escaping (Result<InstalledApp, Error>) -> Void) -> PatchAppOperation
|
func patch(resignedApp: ALTApplication, presentingViewController: UIViewController, context authContext: AuthenticatedOperationContext, completionHandler: @escaping (Result<InstalledApp, Error>) -> Void) -> PatchAppOperation
|
||||||
{
|
{
|
||||||
final class Context: InstallAppOperationContext, PatchAppContext
|
class Context: InstallAppOperationContext, PatchAppContext
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class InstalledAppsCollectionHeaderView: UICollectionReusableView
|
class InstalledAppsCollectionHeaderView: UICollectionReusableView
|
||||||
{
|
{
|
||||||
let textLabel: UILabel
|
let textLabel: UILabel
|
||||||
let button: UIButton
|
let button: UIButton
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
import UIKit
|
import UIKit
|
||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
final class InstalledAppCollectionViewCell: UICollectionViewCell
|
class InstalledAppCollectionViewCell: UICollectionViewCell
|
||||||
{
|
{
|
||||||
private(set) var deactivateBadge: UIView?
|
private(set) var deactivateBadge: UIView?
|
||||||
|
|
||||||
@@ -55,13 +55,13 @@ final class InstalledAppCollectionViewCell: UICollectionViewCell
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class InstalledAppsCollectionFooterView: UICollectionReusableView
|
class InstalledAppsCollectionFooterView: UICollectionReusableView
|
||||||
{
|
{
|
||||||
@IBOutlet var textLabel: UILabel!
|
@IBOutlet var textLabel: UILabel!
|
||||||
@IBOutlet var button: UIButton!
|
@IBOutlet var button: UIButton!
|
||||||
}
|
}
|
||||||
|
|
||||||
final class NoUpdatesCollectionViewCell: UICollectionViewCell
|
class NoUpdatesCollectionViewCell: UICollectionViewCell
|
||||||
{
|
{
|
||||||
@IBOutlet var blurView: UIVisualEffectView!
|
@IBOutlet var blurView: UIVisualEffectView!
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@ final class NoUpdatesCollectionViewCell: UICollectionViewCell
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class UpdatesCollectionHeaderView: UICollectionReusableView
|
class UpdatesCollectionHeaderView: UICollectionReusableView
|
||||||
{
|
{
|
||||||
let button = PillButton(type: .system)
|
let button = PillButton(type: .system)
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ extension MyAppsViewController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class MyAppsViewController: UICollectionViewController
|
class MyAppsViewController: UICollectionViewController
|
||||||
{
|
{
|
||||||
private let coordinator = NSFileCoordinator()
|
private let coordinator = NSFileCoordinator()
|
||||||
private let operationQueue = OperationQueue()
|
private let operationQueue = OperationQueue()
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ extension UpdateCollectionViewCell
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc final class UpdateCollectionViewCell: UICollectionViewCell
|
@objc class UpdateCollectionViewCell: UICollectionViewCell
|
||||||
{
|
{
|
||||||
var mode: Mode = .expanded {
|
var mode: Mode = .expanded {
|
||||||
didSet {
|
didSet {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class NewsCollectionViewCell: UICollectionViewCell
|
class NewsCollectionViewCell: UICollectionViewCell
|
||||||
{
|
{
|
||||||
@IBOutlet var titleLabel: UILabel!
|
@IBOutlet var titleLabel: UILabel!
|
||||||
@IBOutlet var captionLabel: UILabel!
|
@IBOutlet var captionLabel: UILabel!
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import Roxas
|
|||||||
|
|
||||||
import Nuke
|
import Nuke
|
||||||
|
|
||||||
private final class AppBannerFooterView: UICollectionReusableView
|
private class AppBannerFooterView: UICollectionReusableView
|
||||||
{
|
{
|
||||||
let bannerView = AppBannerView(frame: .zero)
|
let bannerView = AppBannerView(frame: .zero)
|
||||||
let tapGestureRecognizer = UITapGestureRecognizer(target: nil, action: nil)
|
let tapGestureRecognizer = UITapGestureRecognizer(target: nil, action: nil)
|
||||||
@@ -41,7 +41,7 @@ private final class AppBannerFooterView: UICollectionReusableView
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class NewsViewController: UICollectionViewController
|
class NewsViewController: UICollectionViewController
|
||||||
{
|
{
|
||||||
private lazy var dataSource = self.makeDataSource()
|
private lazy var dataSource = self.makeDataSource()
|
||||||
private lazy var placeholderView = RSTPlaceholderView(frame: .zero)
|
private lazy var placeholderView = RSTPlaceholderView(frame: .zero)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ enum AuthenticationError: LocalizedError
|
|||||||
}
|
}
|
||||||
|
|
||||||
@objc(AuthenticationOperation)
|
@objc(AuthenticationOperation)
|
||||||
final class AuthenticationOperation: ResultOperation<(ALTTeam, ALTCertificate, ALTAppleAPISession)>
|
class AuthenticationOperation: ResultOperation<(ALTTeam, ALTCertificate, ALTAppleAPISession)>
|
||||||
{
|
{
|
||||||
let context: AuthenticatedOperationContext
|
let context: AuthenticatedOperationContext
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ private let ReceivedApplicationState: @convention(c) (CFNotificationCenter?, Uns
|
|||||||
}
|
}
|
||||||
|
|
||||||
@objc(BackgroundRefreshAppsOperation)
|
@objc(BackgroundRefreshAppsOperation)
|
||||||
final class BackgroundRefreshAppsOperation: ResultOperation<[String: Result<InstalledApp, Error>]>
|
class BackgroundRefreshAppsOperation: ResultOperation<[String: Result<InstalledApp, Error>]>
|
||||||
{
|
{
|
||||||
let installedApps: [InstalledApp]
|
let installedApps: [InstalledApp]
|
||||||
private let managedObjectContext: NSManagedObjectContext
|
private let managedObjectContext: NSManagedObjectContext
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import Roxas
|
|||||||
import minimuxer
|
import minimuxer
|
||||||
|
|
||||||
@objc(DeactivateAppOperation)
|
@objc(DeactivateAppOperation)
|
||||||
final class DeactivateAppOperation: ResultOperation<InstalledApp>
|
class DeactivateAppOperation: ResultOperation<InstalledApp>
|
||||||
{
|
{
|
||||||
let app: InstalledApp
|
let app: InstalledApp
|
||||||
let context: OperationContext
|
let context: OperationContext
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ private extension DownloadAppOperation
|
|||||||
}
|
}
|
||||||
|
|
||||||
@objc(DownloadAppOperation)
|
@objc(DownloadAppOperation)
|
||||||
final class DownloadAppOperation: ResultOperation<ALTApplication>
|
class DownloadAppOperation: ResultOperation<ALTApplication>
|
||||||
{
|
{
|
||||||
let app: AppProtocol
|
let app: AppProtocol
|
||||||
let context: AppOperationContext
|
let context: AppOperationContext
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ protocol EnableJITContext
|
|||||||
}
|
}
|
||||||
|
|
||||||
@available(iOS 14, *)
|
@available(iOS 14, *)
|
||||||
final class EnableJITOperation<Context: EnableJITContext>: ResultOperation<Void>
|
class EnableJITOperation<Context: EnableJITContext>: ResultOperation<Void>
|
||||||
{
|
{
|
||||||
let context: Context
|
let context: Context
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import AltSign
|
|||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
@objc(FetchAnisetteDataOperation)
|
@objc(FetchAnisetteDataOperation)
|
||||||
final class FetchAnisetteDataOperation: ResultOperation<ALTAnisetteData>
|
class FetchAnisetteDataOperation: ResultOperation<ALTAnisetteData>
|
||||||
{
|
{
|
||||||
let context: OperationContext
|
let context: OperationContext
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import AltSign
|
|||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
@objc(FetchAppIDsOperation)
|
@objc(FetchAppIDsOperation)
|
||||||
final class FetchAppIDsOperation: ResultOperation<([AppID], NSManagedObjectContext)>
|
class FetchAppIDsOperation: ResultOperation<([AppID], NSManagedObjectContext)>
|
||||||
{
|
{
|
||||||
let context: AuthenticatedOperationContext
|
let context: AuthenticatedOperationContext
|
||||||
let managedObjectContext: NSManagedObjectContext
|
let managedObjectContext: NSManagedObjectContext
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import AltSign
|
|||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
@objc(FetchProvisioningProfilesOperation)
|
@objc(FetchProvisioningProfilesOperation)
|
||||||
final class FetchProvisioningProfilesOperation: ResultOperation<[String: ALTProvisioningProfile]>
|
class FetchProvisioningProfilesOperation: ResultOperation<[String: ALTProvisioningProfile]>
|
||||||
{
|
{
|
||||||
let context: AppOperationContext
|
let context: AppOperationContext
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import AltStoreCore
|
|||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
@objc(FetchSourceOperation)
|
@objc(FetchSourceOperation)
|
||||||
final class FetchSourceOperation: ResultOperation<Source>
|
class FetchSourceOperation: ResultOperation<Source>
|
||||||
{
|
{
|
||||||
let sourceURL: URL
|
let sourceURL: URL
|
||||||
let managedObjectContext: NSManagedObjectContext
|
let managedObjectContext: NSManagedObjectContext
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ extension FetchTrustedSourcesOperation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class FetchTrustedSourcesOperation: ResultOperation<[FetchTrustedSourcesOperation.TrustedSource]>
|
class FetchTrustedSourcesOperation: ResultOperation<[FetchTrustedSourcesOperation.TrustedSource]>
|
||||||
{
|
{
|
||||||
override func main()
|
override func main()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import AltSign
|
|||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
@objc(InstallAppOperation)
|
@objc(InstallAppOperation)
|
||||||
final class InstallAppOperation: ResultOperation<InstalledApp>
|
class InstallAppOperation: ResultOperation<InstalledApp>
|
||||||
{
|
{
|
||||||
let context: InstallAppOperationContext
|
let context: InstallAppOperationContext
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class OperationContext
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class AuthenticatedOperationContext: OperationContext
|
class AuthenticatedOperationContext: OperationContext
|
||||||
{
|
{
|
||||||
var session: ALTAppleAPISession?
|
var session: ALTAppleAPISession?
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ private struct OTAUpdate
|
|||||||
}
|
}
|
||||||
|
|
||||||
@available(iOS 14, *)
|
@available(iOS 14, *)
|
||||||
final class PatchAppOperation: ResultOperation<Void>
|
class PatchAppOperation: ResultOperation<Void>
|
||||||
{
|
{
|
||||||
let context: PatchAppContext
|
let context: PatchAppContext
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ extension PatchViewController
|
|||||||
}
|
}
|
||||||
|
|
||||||
@available(iOS 14.0, *)
|
@available(iOS 14.0, *)
|
||||||
final class PatchViewController: UIViewController
|
class PatchViewController: UIViewController
|
||||||
{
|
{
|
||||||
var patchApp: AnyApp?
|
var patchApp: AnyApp?
|
||||||
var installedApp: InstalledApp?
|
var installedApp: InstalledApp?
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import Roxas
|
|||||||
import minimuxer
|
import minimuxer
|
||||||
|
|
||||||
@objc(RefreshAppOperation)
|
@objc(RefreshAppOperation)
|
||||||
final class RefreshAppOperation: ResultOperation<InstalledApp>
|
class RefreshAppOperation: ResultOperation<InstalledApp>
|
||||||
{
|
{
|
||||||
let context: AppOperationContext
|
let context: AppOperationContext
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import CoreData
|
|||||||
import AltStoreCore
|
import AltStoreCore
|
||||||
import AltSign
|
import AltSign
|
||||||
|
|
||||||
final class RefreshGroup: NSObject
|
class RefreshGroup: NSObject
|
||||||
{
|
{
|
||||||
let context: AuthenticatedOperationContext
|
let context: AuthenticatedOperationContext
|
||||||
let progress = Progress.discreteProgress(totalUnitCount: 0)
|
let progress = Progress.discreteProgress(totalUnitCount: 0)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
@objc(RemoveAppBackupOperation)
|
@objc(RemoveAppBackupOperation)
|
||||||
final class RemoveAppBackupOperation: ResultOperation<Void>
|
class RemoveAppBackupOperation: ResultOperation<Void>
|
||||||
{
|
{
|
||||||
let context: InstallAppOperationContext
|
let context: InstallAppOperationContext
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import AltStoreCore
|
|||||||
import minimuxer
|
import minimuxer
|
||||||
|
|
||||||
@objc(RemoveAppOperation)
|
@objc(RemoveAppOperation)
|
||||||
final class RemoveAppOperation: ResultOperation<InstalledApp>
|
class RemoveAppOperation: ResultOperation<InstalledApp>
|
||||||
{
|
{
|
||||||
let context: InstallAppOperationContext
|
let context: InstallAppOperationContext
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import AltStoreCore
|
|||||||
import AltSign
|
import AltSign
|
||||||
|
|
||||||
@objc(ResignAppOperation)
|
@objc(ResignAppOperation)
|
||||||
final class ResignAppOperation: ResultOperation<ALTApplication>
|
class ResignAppOperation: ResultOperation<ALTApplication>
|
||||||
{
|
{
|
||||||
let context: InstallAppOperationContext
|
let context: InstallAppOperationContext
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import Network
|
|||||||
import AltStoreCore
|
import AltStoreCore
|
||||||
|
|
||||||
@objc(SendAppOperation)
|
@objc(SendAppOperation)
|
||||||
final class SendAppOperation: ResultOperation<()>
|
class SendAppOperation: ResultOperation<()>
|
||||||
{
|
{
|
||||||
let context: InstallAppOperationContext
|
let context: InstallAppOperationContext
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ extension UpdatePatronsOperation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class UpdatePatronsOperation: ResultOperation<Void>
|
class UpdatePatronsOperation: ResultOperation<Void>
|
||||||
{
|
{
|
||||||
let context: NSManagedObjectContext
|
let context: NSManagedObjectContext
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ enum VerificationError: ALTLocalizedError
|
|||||||
}
|
}
|
||||||
|
|
||||||
@objc(VerifyAppOperation)
|
@objc(VerifyAppOperation)
|
||||||
final class VerifyAppOperation: ResultOperation<Void>
|
class VerifyAppOperation: ResultOperation<Void>
|
||||||
{
|
{
|
||||||
let context: AppOperationContext
|
let context: AppOperationContext
|
||||||
var verificationHandler: ((VerificationError) -> Bool)?
|
var verificationHandler: ((VerificationError) -> Bool)?
|
||||||
|
|||||||
Binary file not shown.
@@ -11,7 +11,7 @@ import AltStoreCore
|
|||||||
import EmotionalDamage
|
import EmotionalDamage
|
||||||
|
|
||||||
@available(iOS 13, *)
|
@available(iOS 13, *)
|
||||||
final class SceneDelegate: UIResponder, UIWindowSceneDelegate
|
class SceneDelegate: UIResponder, UIWindowSceneDelegate
|
||||||
{
|
{
|
||||||
var window: UIWindow?
|
var window: UIWindow?
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
@objc(ErrorLogTableViewCell)
|
@objc(ErrorLogTableViewCell)
|
||||||
final class ErrorLogTableViewCell: UITableViewCell
|
class ErrorLogTableViewCell: UITableViewCell
|
||||||
{
|
{
|
||||||
@IBOutlet var appIconImageView: AppIconImageView!
|
@IBOutlet var appIconImageView: AppIconImageView!
|
||||||
|
|
||||||
|
|||||||
@@ -14,9 +14,7 @@ import Roxas
|
|||||||
|
|
||||||
import Nuke
|
import Nuke
|
||||||
|
|
||||||
import QuickLook
|
class ErrorLogViewController: UITableViewController
|
||||||
|
|
||||||
final class ErrorLogViewController: UITableViewController
|
|
||||||
{
|
{
|
||||||
private lazy var dataSource = self.makeDataSource()
|
private lazy var dataSource = self.makeDataSource()
|
||||||
private var expandedErrorIDs = Set<NSManagedObjectID>()
|
private var expandedErrorIDs = Set<NSManagedObjectID>()
|
||||||
@@ -178,15 +176,6 @@ private extension ErrorLogViewController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func showMinimuxerLogs(_ sender: UIBarButtonItem)
|
|
||||||
{
|
|
||||||
// Show minimuxer.log
|
|
||||||
let previewController = QLPreviewController()
|
|
||||||
previewController.dataSource = self
|
|
||||||
let navigationController = UINavigationController(rootViewController: previewController)
|
|
||||||
present(navigationController, animated: true, completion: nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
@IBAction func clearLoggedErrors(_ sender: UIBarButtonItem)
|
@IBAction func clearLoggedErrors(_ sender: UIBarButtonItem)
|
||||||
{
|
{
|
||||||
let alertController = UIAlertController(title: NSLocalizedString("Are you sure you want to clear the error log?", comment: ""), message: nil, preferredStyle: .actionSheet)
|
let alertController = UIAlertController(title: NSLocalizedString("Are you sure you want to clear the error log?", comment: ""), message: nil, preferredStyle: .actionSheet)
|
||||||
@@ -310,14 +299,3 @@ extension ErrorLogViewController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension ErrorLogViewController: QLPreviewControllerDataSource {
|
|
||||||
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
|
|
||||||
let fileURL = FileManager.default.documentsDirectory.appendingPathComponent("minimuxer.log")
|
|
||||||
return fileURL as QLPreviewItem
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ extension InsetGroupTableViewCell
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class InsetGroupTableViewCell: UITableViewCell
|
class InsetGroupTableViewCell: UITableViewCell
|
||||||
{
|
{
|
||||||
#if !TARGET_INTERFACE_BUILDER
|
#if !TARGET_INTERFACE_BUILDER
|
||||||
@IBInspectable var style: Style = .single {
|
@IBInspectable var style: Style = .single {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class LicensesViewController: UIViewController
|
class LicensesViewController: UIViewController
|
||||||
{
|
{
|
||||||
private var _didAppear = false
|
private var _didAppear = false
|
||||||
|
|
||||||
|
|||||||
@@ -8,12 +8,12 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class PatronCollectionViewCell: UICollectionViewCell
|
class PatronCollectionViewCell: UICollectionViewCell
|
||||||
{
|
{
|
||||||
@IBOutlet var textLabel: UILabel!
|
@IBOutlet var textLabel: UILabel!
|
||||||
}
|
}
|
||||||
|
|
||||||
final class PatronsHeaderView: UICollectionReusableView
|
class PatronsHeaderView: UICollectionReusableView
|
||||||
{
|
{
|
||||||
let textLabel = UILabel()
|
let textLabel = UILabel()
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ final class PatronsHeaderView: UICollectionReusableView
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class PatronsFooterView: UICollectionReusableView
|
class PatronsFooterView: UICollectionReusableView
|
||||||
{
|
{
|
||||||
let button = UIButton(type: .system)
|
let button = UIButton(type: .system)
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ final class PatronsFooterView: UICollectionReusableView
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class AboutPatreonHeaderView: UICollectionReusableView
|
class AboutPatreonHeaderView: UICollectionReusableView
|
||||||
{
|
{
|
||||||
@IBOutlet var supportButton: UIButton!
|
@IBOutlet var supportButton: UIButton!
|
||||||
@IBOutlet var accountButton: UIButton!
|
@IBOutlet var accountButton: UIButton!
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ extension PatreonViewController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class PatreonViewController: UICollectionViewController
|
class PatreonViewController: UICollectionViewController
|
||||||
{
|
{
|
||||||
private lazy var dataSource = self.makeDataSource()
|
private lazy var dataSource = self.makeDataSource()
|
||||||
private lazy var patronsDataSource = self.makePatronsDataSource()
|
private lazy var patronsDataSource = self.makePatronsDataSource()
|
||||||
|
|||||||
@@ -12,14 +12,14 @@ import AltStoreCore
|
|||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
@objc(RefreshAttemptTableViewCell)
|
@objc(RefreshAttemptTableViewCell)
|
||||||
private final class RefreshAttemptTableViewCell: UITableViewCell
|
private class RefreshAttemptTableViewCell: UITableViewCell
|
||||||
{
|
{
|
||||||
@IBOutlet var successLabel: UILabel!
|
@IBOutlet var successLabel: UILabel!
|
||||||
@IBOutlet var dateLabel: UILabel!
|
@IBOutlet var dateLabel: UILabel!
|
||||||
@IBOutlet var errorDescriptionLabel: UILabel!
|
@IBOutlet var errorDescriptionLabel: UILabel!
|
||||||
}
|
}
|
||||||
|
|
||||||
final class RefreshAttemptsViewController: UITableViewController
|
class RefreshAttemptsViewController: UITableViewController
|
||||||
{
|
{
|
||||||
private lazy var dataSource = self.makeDataSource()
|
private lazy var dataSource = self.makeDataSource()
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<color key="separatorColor" white="1" alpha="0.25" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="separatorColor" white="1" alpha="0.25" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<label key="tableFooterView" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SideStore 1.0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="bUR-rp-Nw2">
|
<label key="tableFooterView" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SideStore 1.0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="bUR-rp-Nw2">
|
||||||
<rect key="frame" x="0.0" y="1082" width="375" height="25"/>
|
<rect key="frame" x="0.0" y="1092" width="375" height="25"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
@@ -577,7 +577,7 @@
|
|||||||
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
||||||
<userDefinedRuntimeAttributes>
|
<userDefinedRuntimeAttributes>
|
||||||
<userDefinedRuntimeAttribute type="number" keyPath="style">
|
<userDefinedRuntimeAttribute type="number" keyPath="style">
|
||||||
<integer key="value" value="2"/>
|
<integer key="value" value="3"/>
|
||||||
</userDefinedRuntimeAttribute>
|
</userDefinedRuntimeAttribute>
|
||||||
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
@@ -585,41 +585,8 @@
|
|||||||
<segue destination="g8a-Rf-zWa" kind="show" identifier="showErrorLog" id="SSW-vL-86I"/>
|
<segue destination="g8a-Rf-zWa" kind="show" identifier="showErrorLog" id="SSW-vL-86I"/>
|
||||||
</connections>
|
</connections>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="VNn-u4-cN8" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
|
||||||
<rect key="frame" x="0.0" y="1023" width="375" height="51"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VNn-u4-cN8" id="4bh-qe-l2N">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
<subviews>
|
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Reset Pairing File" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ysS-9s-dXm">
|
|
||||||
<rect key="frame" x="30" y="15.5" width="140" height="20.5"/>
|
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
||||||
<nil key="highlightedColor"/>
|
|
||||||
</label>
|
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Next" translatesAutoresizingMaskIntoConstraints="NO" id="r09-mH-pOD">
|
|
||||||
<rect key="frame" x="327" y="16.5" width="18" height="18"/>
|
|
||||||
</imageView>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstItem="r09-mH-pOD" firstAttribute="centerY" secondItem="4bh-qe-l2N" secondAttribute="centerY" id="02u-Os-L7r"/>
|
|
||||||
<constraint firstItem="ysS-9s-dXm" firstAttribute="centerY" secondItem="4bh-qe-l2N" secondAttribute="centerY" id="QOA-3E-85e"/>
|
|
||||||
<constraint firstItem="ysS-9s-dXm" firstAttribute="leading" secondItem="4bh-qe-l2N" secondAttribute="leadingMargin" id="gRE-CM-w21"/>
|
|
||||||
<constraint firstAttribute="trailingMargin" secondItem="r09-mH-pOD" secondAttribute="trailing" id="udf-VS-o6t"/>
|
|
||||||
</constraints>
|
|
||||||
</tableViewCellContentView>
|
|
||||||
<color key="backgroundColor" white="1" alpha="0.14999999999999999" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
||||||
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
|
||||||
<userDefinedRuntimeAttributes>
|
|
||||||
<userDefinedRuntimeAttribute type="number" keyPath="style">
|
|
||||||
<integer key="value" value="2"/>
|
|
||||||
</userDefinedRuntimeAttribute>
|
|
||||||
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
|
||||||
</userDefinedRuntimeAttributes>
|
|
||||||
</tableViewCell>
|
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="fj2-EJ-Z98" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="fj2-EJ-Z98" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1074" width="375" height="51"/>
|
<rect key="frame" x="0.0" y="1023" width="375" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="fj2-EJ-Z98" id="BcT-Fs-KNg">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="fj2-EJ-Z98" id="BcT-Fs-KNg">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
|
||||||
@@ -1051,18 +1018,11 @@ Settings by i cons from the Noun Project</string>
|
|||||||
</connections>
|
</connections>
|
||||||
</tableView>
|
</tableView>
|
||||||
<navigationItem key="navigationItem" title="Error Log" largeTitleDisplayMode="never" id="a1p-3W-bSi">
|
<navigationItem key="navigationItem" title="Error Log" largeTitleDisplayMode="never" id="a1p-3W-bSi">
|
||||||
<rightBarButtonItems>
|
<barButtonItem key="rightBarButtonItem" systemItem="trash" id="BnQ-Eh-1gC">
|
||||||
<barButtonItem systemItem="trash" id="BnQ-Eh-1gC">
|
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="clearLoggedErrors:" destination="g8a-Rf-zWa" id="faq-89-H5j"/>
|
<action selector="clearLoggedErrors:" destination="g8a-Rf-zWa" id="faq-89-H5j"/>
|
||||||
</connections>
|
</connections>
|
||||||
</barButtonItem>
|
</barButtonItem>
|
||||||
<barButtonItem image="ladybug" catalog="system" id="1cD-4y-vTJ" userLabel="Share">
|
|
||||||
<connections>
|
|
||||||
<action selector="showMinimuxerLogs:" destination="g8a-Rf-zWa" id="V0f-0y-C6C"/>
|
|
||||||
</connections>
|
|
||||||
</barButtonItem>
|
|
||||||
</rightBarButtonItems>
|
|
||||||
</navigationItem>
|
</navigationItem>
|
||||||
</tableViewController>
|
</tableViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="rU1-TZ-TD8" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="rU1-TZ-TD8" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
@@ -1073,7 +1033,6 @@ Settings by i cons from the Noun Project</string>
|
|||||||
<resources>
|
<resources>
|
||||||
<image name="Next" width="18" height="18"/>
|
<image name="Next" width="18" height="18"/>
|
||||||
<image name="Settings" width="20" height="20"/>
|
<image name="Settings" width="20" height="20"/>
|
||||||
<image name="ladybug" catalog="system" width="128" height="122"/>
|
|
||||||
<namedColor name="SettingsBackground">
|
<namedColor name="SettingsBackground">
|
||||||
<color red="0.45098039215686275" green="0.015686274509803921" blue="0.68627450980392157" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color red="0.45098039215686275" green="0.015686274509803921" blue="0.68627450980392157" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</namedColor>
|
</namedColor>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import UIKit
|
|||||||
|
|
||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
final class SettingsHeaderFooterView: UITableViewHeaderFooterView
|
class SettingsHeaderFooterView: UITableViewHeaderFooterView
|
||||||
{
|
{
|
||||||
@IBOutlet var primaryLabel: UILabel!
|
@IBOutlet var primaryLabel: UILabel!
|
||||||
@IBOutlet var secondaryLabel: UILabel!
|
@IBOutlet var secondaryLabel: UILabel!
|
||||||
|
|||||||
@@ -53,12 +53,11 @@ extension SettingsViewController
|
|||||||
case sendFeedback
|
case sendFeedback
|
||||||
case refreshAttempts
|
case refreshAttempts
|
||||||
case errorLog
|
case errorLog
|
||||||
case resetPairingFile
|
|
||||||
case advancedSettings
|
case advancedSettings
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class SettingsViewController: UITableViewController
|
class SettingsViewController: UITableViewController
|
||||||
{
|
{
|
||||||
private var activeTeam: Team?
|
private var activeTeam: Team?
|
||||||
|
|
||||||
@@ -269,8 +268,6 @@ private extension SettingsViewController
|
|||||||
let alertController = UIAlertController(title: NSLocalizedString("Are you sure you want to sign out?", comment: ""), message: NSLocalizedString("You will no longer be able to install or refresh apps once you sign out.", comment: ""), preferredStyle: .actionSheet)
|
let alertController = UIAlertController(title: NSLocalizedString("Are you sure you want to sign out?", comment: ""), message: NSLocalizedString("You will no longer be able to install or refresh apps once you sign out.", comment: ""), preferredStyle: .actionSheet)
|
||||||
alertController.addAction(UIAlertAction(title: NSLocalizedString("Sign Out", comment: ""), style: .destructive) { _ in signOut() })
|
alertController.addAction(UIAlertAction(title: NSLocalizedString("Sign Out", comment: ""), style: .destructive) { _ in signOut() })
|
||||||
alertController.addAction(.cancel)
|
alertController.addAction(.cancel)
|
||||||
//Fix crash on iPad
|
|
||||||
alertController.popoverPresentationController?.barButtonItem = sender
|
|
||||||
self.present(alertController, animated: true, completion: nil)
|
self.present(alertController, animated: true, completion: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -506,30 +503,6 @@ extension SettingsViewController
|
|||||||
let toastView = ToastView(text: NSLocalizedString("Cannot Send Mail", comment: ""), detailText: nil)
|
let toastView = ToastView(text: NSLocalizedString("Cannot Send Mail", comment: ""), detailText: nil)
|
||||||
toastView.show(in: self)
|
toastView.show(in: self)
|
||||||
}
|
}
|
||||||
case .resetPairingFile:
|
|
||||||
let filename = "ALTPairingFile.mobiledevicepairing"
|
|
||||||
let fm = FileManager.default
|
|
||||||
let documentsPath = fm.documentsDirectory.appendingPathComponent("/\(filename)")
|
|
||||||
let alertController = UIAlertController(
|
|
||||||
title: NSLocalizedString("Are you sure to reset the pairing file?", comment: ""),
|
|
||||||
message: NSLocalizedString("You can reset the pairing file when you cannot sideload apps or enable JIT. You need to restart SideStore.", comment: ""),
|
|
||||||
preferredStyle: UIAlertController.Style.actionSheet)
|
|
||||||
|
|
||||||
alertController.addAction(UIAlertAction(title: NSLocalizedString("Delete and Reset", comment: ""), style: .destructive){ _ in
|
|
||||||
if fm.fileExists(atPath: documentsPath.path), let contents = try? String(contentsOf: documentsPath), !contents.isEmpty {
|
|
||||||
try? fm.removeItem(atPath: documentsPath.path)
|
|
||||||
NSLog("Pairing File Reseted")
|
|
||||||
}
|
|
||||||
self.tableView.deselectRow(at: indexPath, animated: true)
|
|
||||||
let dialogMessage = UIAlertController(title: NSLocalizedString("Pairing File Reseted", comment: ""), message: NSLocalizedString("Please restart SideStore", comment: ""), preferredStyle: .alert)
|
|
||||||
self.present(dialogMessage, animated: true, completion: nil)
|
|
||||||
})
|
|
||||||
alertController.addAction(.cancel)
|
|
||||||
//Fix crash on iPad
|
|
||||||
alertController.popoverPresentationController?.sourceView = self.tableView
|
|
||||||
alertController.popoverPresentationController?.sourceRect = self.tableView.rectForRow(at: indexPath)
|
|
||||||
self.present(alertController, animated: true)
|
|
||||||
self.tableView.deselectRow(at: indexPath, animated: true)
|
|
||||||
case .advancedSettings:
|
case .advancedSettings:
|
||||||
// Create the URL that deep links to your app's custom settings.
|
// Create the URL that deep links to your app's custom settings.
|
||||||
if let url = URL(string: UIApplication.openSettingsURLString) {
|
if let url = URL(string: UIApplication.openSettingsURLString) {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ struct SourceError: LocalizedError
|
|||||||
}
|
}
|
||||||
|
|
||||||
@objc(SourcesFooterView)
|
@objc(SourcesFooterView)
|
||||||
private final class SourcesFooterView: TextCollectionReusableView
|
private class SourcesFooterView: TextCollectionReusableView
|
||||||
{
|
{
|
||||||
@IBOutlet var activityIndicatorView: UIActivityIndicatorView!
|
@IBOutlet var activityIndicatorView: UIActivityIndicatorView!
|
||||||
@IBOutlet var textView: UITextView!
|
@IBOutlet var textView: UITextView!
|
||||||
@@ -46,7 +46,7 @@ extension SourcesViewController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class SourcesViewController: UICollectionViewController
|
class SourcesViewController: UICollectionViewController
|
||||||
{
|
{
|
||||||
var deepLinkSourceURL: URL? {
|
var deepLinkSourceURL: URL? {
|
||||||
didSet {
|
didSet {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ extension TabBarController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final class TabBarController: UITabBarController
|
class TabBarController: UITabBarController
|
||||||
{
|
{
|
||||||
private var initialSegue: (identifier: String, sender: Any?)?
|
private var initialSegue: (identifier: String, sender: Any?)?
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import CoreData
|
import CoreData
|
||||||
import UIKit
|
|
||||||
|
|
||||||
public extension Source
|
public extension Source
|
||||||
{
|
{
|
||||||
@@ -36,146 +35,6 @@ public extension Source
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct AppPermissionFeed: Codable {
|
|
||||||
let type: String // ALTAppPermissionType
|
|
||||||
let usageDescription: String
|
|
||||||
|
|
||||||
enum CodingKeys: String, CodingKey
|
|
||||||
{
|
|
||||||
case type
|
|
||||||
case usageDescription
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public struct AppVersionFeed: Codable {
|
|
||||||
/* Properties */
|
|
||||||
let version: String
|
|
||||||
let date: Date
|
|
||||||
let localizedDescription: String?
|
|
||||||
|
|
||||||
let downloadURL: URL
|
|
||||||
let size: Int64
|
|
||||||
|
|
||||||
enum CodingKeys: String, CodingKey
|
|
||||||
{
|
|
||||||
case version
|
|
||||||
case date
|
|
||||||
case localizedDescription
|
|
||||||
case downloadURL
|
|
||||||
case size
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public struct PlatformURLFeed: Codable {
|
|
||||||
/* Properties */
|
|
||||||
let platform: Platform
|
|
||||||
let downloadURL: URL
|
|
||||||
|
|
||||||
|
|
||||||
private enum CodingKeys: String, CodingKey
|
|
||||||
{
|
|
||||||
case platform
|
|
||||||
case downloadURL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public struct StoreAppFeed: Codable {
|
|
||||||
let name: String
|
|
||||||
let bundleIdentifier: String
|
|
||||||
let subtitle: String?
|
|
||||||
|
|
||||||
let developerName: String
|
|
||||||
let localizedDescription: String
|
|
||||||
let size: Int64
|
|
||||||
|
|
||||||
let iconURL: URL
|
|
||||||
let screenshotURLs: [URL]
|
|
||||||
|
|
||||||
let version: String
|
|
||||||
let versionDate: Date
|
|
||||||
let versionDescription: String?
|
|
||||||
let downloadURL: URL
|
|
||||||
let platformURLs: [PlatformURLFeed]?
|
|
||||||
|
|
||||||
let tintColor: String? // UIColor?
|
|
||||||
let isBeta: Bool
|
|
||||||
|
|
||||||
// let source: Source?
|
|
||||||
let appPermission: [AppPermissionFeed]
|
|
||||||
let versions: [AppVersionFeed]
|
|
||||||
|
|
||||||
enum CodingKeys: String, CodingKey
|
|
||||||
{
|
|
||||||
case bundleIdentifier
|
|
||||||
case developerName
|
|
||||||
case downloadURL
|
|
||||||
case iconURL
|
|
||||||
case isBeta = "beta"
|
|
||||||
case localizedDescription
|
|
||||||
case name
|
|
||||||
case appPermission = "permissions"
|
|
||||||
case platformURLs
|
|
||||||
case screenshotURLs
|
|
||||||
case size
|
|
||||||
case subtitle
|
|
||||||
case tintColor
|
|
||||||
case version
|
|
||||||
case versionDate
|
|
||||||
case versionDescription
|
|
||||||
case versions
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public struct NewsItemFeed: Codable {
|
|
||||||
let identifier: String
|
|
||||||
let date: Date
|
|
||||||
|
|
||||||
let title: String
|
|
||||||
let caption: String
|
|
||||||
let tintColor: String //UIColor
|
|
||||||
let notify: Bool
|
|
||||||
|
|
||||||
let imageURL: URL?
|
|
||||||
let externalURL: URL?
|
|
||||||
|
|
||||||
let appID: String?
|
|
||||||
|
|
||||||
private enum CodingKeys: String, CodingKey
|
|
||||||
{
|
|
||||||
case identifier
|
|
||||||
case date
|
|
||||||
case title
|
|
||||||
case caption
|
|
||||||
case tintColor
|
|
||||||
case imageURL
|
|
||||||
case externalURL = "url"
|
|
||||||
case appID
|
|
||||||
case notify
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public struct SourceJSON: Codable {
|
|
||||||
let name: String
|
|
||||||
let identifier: String
|
|
||||||
let sourceURL: URL
|
|
||||||
let userInfo: [String:String]? //[ALTSourceUserInfoKey:String]?
|
|
||||||
let apps: [StoreAppFeed]
|
|
||||||
let news: [NewsItemFeed]
|
|
||||||
|
|
||||||
enum CodingKeys: String, CodingKey
|
|
||||||
{
|
|
||||||
case name
|
|
||||||
case identifier
|
|
||||||
case sourceURL
|
|
||||||
case userInfo
|
|
||||||
case apps
|
|
||||||
case news
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc(Source)
|
@objc(Source)
|
||||||
public class Source: NSManagedObject, Fetchable, Decodable
|
public class Source: NSManagedObject, Fetchable, Decodable
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -26,12 +26,14 @@ public extension StoreApp
|
|||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
public enum Platform: UInt, Codable {
|
public enum Platform: UInt {
|
||||||
case ios
|
case ios
|
||||||
case tvos
|
case tvos
|
||||||
case macos
|
case macos
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension Platform: Decodable {}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
public final class PlatformURL: NSManagedObject, Decodable {
|
public final class PlatformURL: NSManagedObject, Decodable {
|
||||||
/* Properties */
|
/* Properties */
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ Why iOS 14? Targeting such a recent version of iOS allows us to accelerate devel
|
|||||||
SideStore is a just regular, sandboxed iOS application. The AltStore app target contains the vast majority of SideStore's functionality, including all the logic for downloading and updating apps through SideStore. SideStore makes heavy use of standard iOS frameworks and technologies most iOS developers are familiar with.
|
SideStore is a just regular, sandboxed iOS application. The AltStore app target contains the vast majority of SideStore's functionality, including all the logic for downloading and updating apps through SideStore. SideStore makes heavy use of standard iOS frameworks and technologies most iOS developers are familiar with.
|
||||||
|
|
||||||
### EM Proxy
|
### EM Proxy
|
||||||
[SideServer mobile](https://github.com/jkcoxson/em_proxy) powers the defining feature of SideStore: untethered app installation. By levaraging an App Store app with additional entitlements (WireGuard) to create the VPN tunnel for us, it allows SideStore to take advantage of [Jitterbug](https://github.com/osy/Jitterbug)'s loopback method without requiring a paid developer account.
|
[EM-Proxy](https://github.com/jkcoxson/em_proxy) powers the defining feature of SideStore: untethered app installation. By levaraging an App Store app with additional entitlements (WireGuard) to create the VPN tunnel for us, it allows SideStore to take advantage of [Jitterbug](https://github.com/osy/Jitterbug)'s loopback method without requiring a paid developer account.
|
||||||
|
|
||||||
### Minimuxer
|
### Minimuxer
|
||||||
[Minimuxer](https://github.com/jkcoxson/minimuxer) is a lockdown muxer that can run inside iOS’s sandbox. It replicates Apple’s usbmuxd protocol on MacOS to “discover” devices to interface with wireguard On-Device.
|
[Minimuxer](https://github.com/jkcoxson/minimuxer) is a lockdown muxer that can run inside iOS’s sandbox. It replicates Apple’s usbmuxd protocol on MacOS to “discover” devices to interface with wireguard On-Device.
|
||||||
|
|||||||
133
WireguardNetworkExtension/AppProxyProvider.swift
Normal file
133
WireguardNetworkExtension/AppProxyProvider.swift
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
//
|
||||||
|
// AppProxyProvider.swift
|
||||||
|
// WireguardNetworkExtension
|
||||||
|
//
|
||||||
|
// Created by Joseph Mattiello on 11/12/22.
|
||||||
|
// Copyright © 2022 Riley Testut. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import NetworkExtension
|
||||||
|
import os
|
||||||
|
import WireGuardKit
|
||||||
|
|
||||||
|
class PacketTunnelProvider: NEPacketTunnelProvider {
|
||||||
|
|
||||||
|
private lazy var adapter: WireGuardAdapter = {
|
||||||
|
return WireGuardAdapter(with: self) { logLevel, message in
|
||||||
|
wg_log(logLevel.osLogLevel, message: message)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) {
|
||||||
|
let activationAttemptId = options?["activationAttemptId"] as? String
|
||||||
|
let errorNotifier = ErrorNotifier(activationAttemptId: activationAttemptId)
|
||||||
|
|
||||||
|
Logger.configureGlobal(tagged: "NET", withFilePath: FileManager.logFileURL?.path)
|
||||||
|
|
||||||
|
wg_log(.info, message: "Starting tunnel from the " + (activationAttemptId == nil ? "OS directly, rather than the app" : "app"))
|
||||||
|
|
||||||
|
guard let tunnelProviderProtocol = self.protocolConfiguration as? NETunnelProviderProtocol,
|
||||||
|
let tunnelConfiguration = tunnelProviderProtocol.asTunnelConfiguration() else {
|
||||||
|
errorNotifier.notify(PacketTunnelProviderError.savedProtocolConfigurationIsInvalid)
|
||||||
|
completionHandler(PacketTunnelProviderError.savedProtocolConfigurationIsInvalid)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start the tunnel
|
||||||
|
adapter.start(tunnelConfiguration: tunnelConfiguration) { adapterError in
|
||||||
|
guard let adapterError = adapterError else {
|
||||||
|
let interfaceName = self.adapter.interfaceName ?? "unknown"
|
||||||
|
|
||||||
|
wg_log(.info, message: "Tunnel interface is \(interfaceName)")
|
||||||
|
|
||||||
|
completionHandler(nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
switch adapterError {
|
||||||
|
case .cannotLocateTunnelFileDescriptor:
|
||||||
|
wg_log(.error, staticMessage: "Starting tunnel failed: could not determine file descriptor")
|
||||||
|
errorNotifier.notify(PacketTunnelProviderError.couldNotDetermineFileDescriptor)
|
||||||
|
completionHandler(PacketTunnelProviderError.couldNotDetermineFileDescriptor)
|
||||||
|
|
||||||
|
case .dnsResolution(let dnsErrors):
|
||||||
|
let hostnamesWithDnsResolutionFailure = dnsErrors.map { $0.address }
|
||||||
|
.joined(separator: ", ")
|
||||||
|
wg_log(.error, message: "DNS resolution failed for the following hostnames: \(hostnamesWithDnsResolutionFailure)")
|
||||||
|
errorNotifier.notify(PacketTunnelProviderError.dnsResolutionFailure)
|
||||||
|
completionHandler(PacketTunnelProviderError.dnsResolutionFailure)
|
||||||
|
|
||||||
|
case .setNetworkSettings(let error):
|
||||||
|
wg_log(.error, message: "Starting tunnel failed with setTunnelNetworkSettings returning \(error.localizedDescription)")
|
||||||
|
errorNotifier.notify(PacketTunnelProviderError.couldNotSetNetworkSettings)
|
||||||
|
completionHandler(PacketTunnelProviderError.couldNotSetNetworkSettings)
|
||||||
|
|
||||||
|
case .startWireGuardBackend(let errorCode):
|
||||||
|
wg_log(.error, message: "Starting tunnel failed with wgTurnOn returning \(errorCode)")
|
||||||
|
errorNotifier.notify(PacketTunnelProviderError.couldNotStartBackend)
|
||||||
|
completionHandler(PacketTunnelProviderError.couldNotStartBackend)
|
||||||
|
|
||||||
|
case .invalidState:
|
||||||
|
// Must never happen
|
||||||
|
fatalError()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
|
||||||
|
wg_log(.info, staticMessage: "Stopping tunnel")
|
||||||
|
|
||||||
|
adapter.stop { error in
|
||||||
|
ErrorNotifier.removeLastErrorFile()
|
||||||
|
|
||||||
|
if let error = error {
|
||||||
|
wg_log(.error, message: "Failed to stop WireGuard adapter: \(error.localizedDescription)")
|
||||||
|
}
|
||||||
|
completionHandler()
|
||||||
|
|
||||||
|
#if os(macOS)
|
||||||
|
// HACK: This is a filthy hack to work around Apple bug 32073323 (dup'd by us as 47526107).
|
||||||
|
// Remove it when they finally fix this upstream and the fix has been rolled out to
|
||||||
|
// sufficient quantities of users.
|
||||||
|
exit(0)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) {
|
||||||
|
guard let completionHandler = completionHandler else { return }
|
||||||
|
|
||||||
|
if messageData.count == 1 && messageData[0] == 0 {
|
||||||
|
adapter.getRuntimeConfiguration { settings in
|
||||||
|
var data: Data?
|
||||||
|
if let settings = settings {
|
||||||
|
data = settings.data(using: .utf8)!
|
||||||
|
}
|
||||||
|
completionHandler(data)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
completionHandler(nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// override func sleep(completionHandler: @escaping() -> Void) {
|
||||||
|
// // Add code here to get ready to sleep.
|
||||||
|
// completionHandler()
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// override func wake() {
|
||||||
|
// // Add code here to wake up.
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
extension WireGuardLogLevel {
|
||||||
|
var osLogLevel: OSLogType {
|
||||||
|
switch self {
|
||||||
|
case .verbose:
|
||||||
|
return .debug
|
||||||
|
case .error:
|
||||||
|
return .error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
25
WireguardNetworkExtension/ErrorNotifier.swift
Normal file
25
WireguardNetworkExtension/ErrorNotifier.swift
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
import NetworkExtension
|
||||||
|
|
||||||
|
class ErrorNotifier {
|
||||||
|
let activationAttemptId: String?
|
||||||
|
|
||||||
|
init(activationAttemptId: String?) {
|
||||||
|
self.activationAttemptId = activationAttemptId
|
||||||
|
ErrorNotifier.removeLastErrorFile()
|
||||||
|
}
|
||||||
|
|
||||||
|
func notify(_ error: PacketTunnelProviderError) {
|
||||||
|
guard let activationAttemptId = activationAttemptId, let lastErrorFilePath = FileManager.networkExtensionLastErrorFileURL?.path else { return }
|
||||||
|
let errorMessageData = "\(activationAttemptId)\n\(error)".data(using: .utf8)
|
||||||
|
FileManager.default.createFile(atPath: lastErrorFilePath, contents: errorMessageData, attributes: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func removeLastErrorFile() {
|
||||||
|
if let lastErrorFileURL = FileManager.networkExtensionLastErrorFileURL {
|
||||||
|
_ = FileManager.deleteFile(at: lastErrorFileURL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
50
WireguardNetworkExtension/FileManager+Extension.swift
Normal file
50
WireguardNetworkExtension/FileManager+Extension.swift
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import os.log
|
||||||
|
|
||||||
|
extension FileManager {
|
||||||
|
static var appGroupId: String? {
|
||||||
|
#if os(iOS)
|
||||||
|
let appGroupIdInfoDictionaryKey = "com.wireguard.ios.app_group_id"
|
||||||
|
#elseif os(macOS)
|
||||||
|
let appGroupIdInfoDictionaryKey = "com.wireguard.macos.app_group_id"
|
||||||
|
#else
|
||||||
|
#error("Unimplemented")
|
||||||
|
#endif
|
||||||
|
return Bundle.main.object(forInfoDictionaryKey: appGroupIdInfoDictionaryKey) as? String
|
||||||
|
}
|
||||||
|
private static var sharedFolderURL: URL? {
|
||||||
|
guard let appGroupId = FileManager.appGroupId else {
|
||||||
|
os_log("Cannot obtain app group ID from bundle", log: OSLog.default, type: .error)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
guard let sharedFolderURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupId) else {
|
||||||
|
wg_log(.error, message: "Cannot obtain shared folder URL")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return sharedFolderURL
|
||||||
|
}
|
||||||
|
|
||||||
|
static var logFileURL: URL? {
|
||||||
|
return sharedFolderURL?.appendingPathComponent("tunnel-log.bin")
|
||||||
|
}
|
||||||
|
|
||||||
|
static var networkExtensionLastErrorFileURL: URL? {
|
||||||
|
return sharedFolderURL?.appendingPathComponent("last-error.txt")
|
||||||
|
}
|
||||||
|
|
||||||
|
static var loginHelperTimestampURL: URL? {
|
||||||
|
return sharedFolderURL?.appendingPathComponent("login-helper-timestamp.bin")
|
||||||
|
}
|
||||||
|
|
||||||
|
static func deleteFile(at url: URL) -> Bool {
|
||||||
|
do {
|
||||||
|
try FileManager.default.removeItem(at: url)
|
||||||
|
} catch {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
13
WireguardNetworkExtension/Info.plist
Normal file
13
WireguardNetworkExtension/Info.plist
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?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>
|
||||||
|
<key>NSExtension</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSExtensionPointIdentifier</key>
|
||||||
|
<string>com.apple.networkextension.app-proxy</string>
|
||||||
|
<key>NSExtensionPrincipalClass</key>
|
||||||
|
<string>$(PRODUCT_MODULE_NAME).AppProxyProvider</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
114
WireguardNetworkExtension/Keychain.swift
Normal file
114
WireguardNetworkExtension/Keychain.swift
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import Security
|
||||||
|
|
||||||
|
class Keychain {
|
||||||
|
static func openReference(called ref: Data) -> String? {
|
||||||
|
var result: CFTypeRef?
|
||||||
|
let ret = SecItemCopyMatching([kSecValuePersistentRef: ref,
|
||||||
|
kSecReturnData: true] as CFDictionary,
|
||||||
|
&result)
|
||||||
|
if ret != errSecSuccess || result == nil {
|
||||||
|
wg_log(.error, message: "Unable to open config from keychain: \(ret)")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
guard let data = result as? Data else { return nil }
|
||||||
|
return String(data: data, encoding: String.Encoding.utf8)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func makeReference(containing value: String, called name: String, previouslyReferencedBy oldRef: Data? = nil) -> Data? {
|
||||||
|
var ret: OSStatus
|
||||||
|
guard var bundleIdentifier = Bundle.main.bundleIdentifier else {
|
||||||
|
wg_log(.error, staticMessage: "Unable to determine bundle identifier")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if bundleIdentifier.hasSuffix(".network-extension") {
|
||||||
|
bundleIdentifier.removeLast(".network-extension".count)
|
||||||
|
}
|
||||||
|
let itemLabel = "WireGuard Tunnel: \(name)"
|
||||||
|
var items: [CFString: Any] = [kSecClass: kSecClassGenericPassword,
|
||||||
|
kSecAttrLabel: itemLabel,
|
||||||
|
kSecAttrAccount: name + ": " + UUID().uuidString,
|
||||||
|
kSecAttrDescription: "wg-quick(8) config",
|
||||||
|
kSecAttrService: bundleIdentifier,
|
||||||
|
kSecValueData: value.data(using: .utf8) as Any,
|
||||||
|
kSecReturnPersistentRef: true]
|
||||||
|
|
||||||
|
#if os(iOS)
|
||||||
|
items[kSecAttrAccessGroup] = FileManager.appGroupId
|
||||||
|
items[kSecAttrAccessible] = kSecAttrAccessibleAfterFirstUnlock
|
||||||
|
#elseif os(macOS)
|
||||||
|
items[kSecAttrSynchronizable] = false
|
||||||
|
items[kSecAttrAccessible] = kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
|
||||||
|
|
||||||
|
guard let extensionPath = Bundle.main.builtInPlugInsURL?.appendingPathComponent("WireGuardNetworkExtension.appex", isDirectory: true).path else {
|
||||||
|
wg_log(.error, staticMessage: "Unable to determine app extension path")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var extensionApp: SecTrustedApplication?
|
||||||
|
var mainApp: SecTrustedApplication?
|
||||||
|
ret = SecTrustedApplicationCreateFromPath(extensionPath, &extensionApp)
|
||||||
|
if ret != kOSReturnSuccess || extensionApp == nil {
|
||||||
|
wg_log(.error, message: "Unable to create keychain extension trusted application object: \(ret)")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ret = SecTrustedApplicationCreateFromPath(nil, &mainApp)
|
||||||
|
if ret != errSecSuccess || mainApp == nil {
|
||||||
|
wg_log(.error, message: "Unable to create keychain local trusted application object: \(ret)")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var access: SecAccess?
|
||||||
|
ret = SecAccessCreate(itemLabel as CFString, [extensionApp!, mainApp!] as CFArray, &access)
|
||||||
|
if ret != errSecSuccess || access == nil {
|
||||||
|
wg_log(.error, message: "Unable to create keychain ACL object: \(ret)")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
items[kSecAttrAccess] = access!
|
||||||
|
#else
|
||||||
|
#error("Unimplemented")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
var ref: CFTypeRef?
|
||||||
|
ret = SecItemAdd(items as CFDictionary, &ref)
|
||||||
|
if ret != errSecSuccess || ref == nil {
|
||||||
|
wg_log(.error, message: "Unable to add config to keychain: \(ret)")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if let oldRef = oldRef {
|
||||||
|
deleteReference(called: oldRef)
|
||||||
|
}
|
||||||
|
return ref as? Data
|
||||||
|
}
|
||||||
|
|
||||||
|
static func deleteReference(called ref: Data) {
|
||||||
|
let ret = SecItemDelete([kSecValuePersistentRef: ref] as CFDictionary)
|
||||||
|
if ret != errSecSuccess {
|
||||||
|
wg_log(.error, message: "Unable to delete config from keychain: \(ret)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static func deleteReferences(except whitelist: Set<Data>) {
|
||||||
|
var result: CFTypeRef?
|
||||||
|
let ret = SecItemCopyMatching([kSecClass: kSecClassGenericPassword,
|
||||||
|
kSecAttrService: Bundle.main.bundleIdentifier as Any,
|
||||||
|
kSecMatchLimit: kSecMatchLimitAll,
|
||||||
|
kSecReturnPersistentRef: true] as CFDictionary,
|
||||||
|
&result)
|
||||||
|
if ret != errSecSuccess || result == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
guard let items = result as? [Data] else { return }
|
||||||
|
for item in items {
|
||||||
|
if !whitelist.contains(item) {
|
||||||
|
deleteReference(called: item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static func verifyReference(called ref: Data) -> Bool {
|
||||||
|
return SecItemCopyMatching([kSecValuePersistentRef: ref] as CFDictionary,
|
||||||
|
nil) != errSecItemNotFound
|
||||||
|
}
|
||||||
|
}
|
||||||
65
WireguardNetworkExtension/Logging/Logger.swift
Normal file
65
WireguardNetworkExtension/Logging/Logger.swift
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import os.log
|
||||||
|
|
||||||
|
public class Logger {
|
||||||
|
enum LoggerError: Error {
|
||||||
|
case openFailure
|
||||||
|
}
|
||||||
|
|
||||||
|
static var global: Logger?
|
||||||
|
|
||||||
|
var log: OpaquePointer
|
||||||
|
var tag: String
|
||||||
|
|
||||||
|
init(tagged tag: String, withFilePath filePath: String) throws {
|
||||||
|
guard let log = open_log(filePath) else { throw LoggerError.openFailure }
|
||||||
|
self.log = log
|
||||||
|
self.tag = tag
|
||||||
|
}
|
||||||
|
|
||||||
|
deinit {
|
||||||
|
close_log(self.log)
|
||||||
|
}
|
||||||
|
|
||||||
|
func log(message: String) {
|
||||||
|
write_msg_to_log(log, tag, message.trimmingCharacters(in: .newlines))
|
||||||
|
}
|
||||||
|
|
||||||
|
func writeLog(to targetFile: String) -> Bool {
|
||||||
|
return write_log_to_file(targetFile, self.log) == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
static func configureGlobal(tagged tag: String, withFilePath filePath: String?) {
|
||||||
|
if Logger.global != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
guard let filePath = filePath else {
|
||||||
|
os_log("Unable to determine log destination path. Log will not be saved to file.", log: OSLog.default, type: .error)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
guard let logger = try? Logger(tagged: tag, withFilePath: filePath) else {
|
||||||
|
os_log("Unable to open log file for writing. Log will not be saved to file.", log: OSLog.default, type: .error)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Logger.global = logger
|
||||||
|
var appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown version"
|
||||||
|
if let appBuild = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
|
||||||
|
appVersion += " (\(appBuild))"
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.global?.log(message: "App version: \(appVersion)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func wg_log(_ type: OSLogType, staticMessage msg: StaticString) {
|
||||||
|
os_log(msg, log: OSLog.default, type: type)
|
||||||
|
Logger.global?.log(message: "\(msg)")
|
||||||
|
}
|
||||||
|
|
||||||
|
func wg_log(_ type: OSLogType, message msg: String) {
|
||||||
|
os_log("%{public}s", log: OSLog.default, type: type, msg)
|
||||||
|
Logger.global?.log(message: msg)
|
||||||
|
}
|
||||||
173
WireguardNetworkExtension/Logging/ringlogger.c
Normal file
173
WireguardNetworkExtension/Logging/ringlogger.c
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
/* SPDX-License-Identifier: MIT
|
||||||
|
*
|
||||||
|
* Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdatomic.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include "ringlogger.h"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
MAX_LOG_LINE_LENGTH = 512,
|
||||||
|
MAX_LINES = 2048,
|
||||||
|
MAGIC = 0xabadbeefU
|
||||||
|
};
|
||||||
|
|
||||||
|
struct log_line {
|
||||||
|
atomic_uint_fast64_t time_ns;
|
||||||
|
char line[MAX_LOG_LINE_LENGTH];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct log {
|
||||||
|
atomic_uint_fast32_t next_index;
|
||||||
|
struct log_line lines[MAX_LINES];
|
||||||
|
uint32_t magic;
|
||||||
|
};
|
||||||
|
|
||||||
|
void write_msg_to_log(struct log *log, const char *tag, const char *msg)
|
||||||
|
{
|
||||||
|
uint32_t index;
|
||||||
|
struct log_line *line;
|
||||||
|
struct timespec ts;
|
||||||
|
|
||||||
|
// Race: This isn't synchronized with the fetch_add below, so items might be slightly out of order.
|
||||||
|
clock_gettime(CLOCK_REALTIME, &ts);
|
||||||
|
|
||||||
|
// Race: More than MAX_LINES writers and this will clash.
|
||||||
|
index = atomic_fetch_add(&log->next_index, 1);
|
||||||
|
line = &log->lines[index % MAX_LINES];
|
||||||
|
|
||||||
|
// Race: Before this line executes, we'll display old data after new data.
|
||||||
|
atomic_store(&line->time_ns, 0);
|
||||||
|
memset(line->line, 0, MAX_LOG_LINE_LENGTH);
|
||||||
|
|
||||||
|
snprintf(line->line, MAX_LOG_LINE_LENGTH, "[%s] %s", tag, msg);
|
||||||
|
atomic_store(&line->time_ns, ts.tv_sec * 1000000000ULL + ts.tv_nsec);
|
||||||
|
|
||||||
|
msync(&log->next_index, sizeof(log->next_index), MS_ASYNC);
|
||||||
|
msync(line, sizeof(*line), MS_ASYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
int write_log_to_file(const char *file_name, const struct log *input_log)
|
||||||
|
{
|
||||||
|
struct log *log;
|
||||||
|
uint32_t l, i;
|
||||||
|
FILE *file;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
log = malloc(sizeof(*log));
|
||||||
|
if (!log)
|
||||||
|
return -errno;
|
||||||
|
memcpy(log, input_log, sizeof(*log));
|
||||||
|
|
||||||
|
file = fopen(file_name, "w");
|
||||||
|
if (!file) {
|
||||||
|
free(log);
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (l = 0, i = log->next_index; l < MAX_LINES; ++l, ++i) {
|
||||||
|
const struct log_line *line = &log->lines[i % MAX_LINES];
|
||||||
|
time_t seconds = line->time_ns / 1000000000ULL;
|
||||||
|
uint32_t useconds = (line->time_ns % 1000000000ULL) / 1000ULL;
|
||||||
|
struct tm tm;
|
||||||
|
|
||||||
|
if (!line->time_ns)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!localtime_r(&seconds, &tm))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
if (fprintf(file, "%04d-%02d-%02d %02d:%02d:%02d.%06d: %s\n",
|
||||||
|
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||||
|
tm.tm_hour, tm.tm_min, tm.tm_sec, useconds,
|
||||||
|
line->line) < 0)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
|
err:
|
||||||
|
ret = -errno;
|
||||||
|
fclose(file);
|
||||||
|
free(log);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t view_lines_from_cursor(const struct log *input_log, uint32_t cursor, void *ctx, void(*cb)(const char *, uint64_t, void *))
|
||||||
|
{
|
||||||
|
struct log *log;
|
||||||
|
uint32_t l, i = cursor;
|
||||||
|
|
||||||
|
log = malloc(sizeof(*log));
|
||||||
|
if (!log)
|
||||||
|
return cursor;
|
||||||
|
memcpy(log, input_log, sizeof(*log));
|
||||||
|
|
||||||
|
if (i == -1)
|
||||||
|
i = log->next_index;
|
||||||
|
|
||||||
|
for (l = 0; l < MAX_LINES; ++l, ++i) {
|
||||||
|
const struct log_line *line = &log->lines[i % MAX_LINES];
|
||||||
|
|
||||||
|
if (cursor != -1 && i % MAX_LINES == log->next_index % MAX_LINES)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!line->time_ns) {
|
||||||
|
if (cursor == -1)
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cb(line->line, line->time_ns, ctx);
|
||||||
|
cursor = (i + 1) % MAX_LINES;
|
||||||
|
}
|
||||||
|
free(log);
|
||||||
|
return cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct log *open_log(const char *file_name)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
struct log *log;
|
||||||
|
|
||||||
|
fd = open(file_name, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
|
||||||
|
if (fd < 0)
|
||||||
|
return NULL;
|
||||||
|
if (ftruncate(fd, sizeof(*log)))
|
||||||
|
goto err;
|
||||||
|
log = mmap(NULL, sizeof(*log), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||||
|
if (log == MAP_FAILED)
|
||||||
|
goto err;
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
if (log->magic != MAGIC) {
|
||||||
|
memset(log, 0, sizeof(*log));
|
||||||
|
log->magic = MAGIC;
|
||||||
|
msync(log, sizeof(*log), MS_ASYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return log;
|
||||||
|
|
||||||
|
err:
|
||||||
|
close(fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void close_log(struct log *log)
|
||||||
|
{
|
||||||
|
munmap(log, sizeof(*log));
|
||||||
|
}
|
||||||
18
WireguardNetworkExtension/Logging/ringlogger.h
Normal file
18
WireguardNetworkExtension/Logging/ringlogger.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/* SPDX-License-Identifier: MIT
|
||||||
|
*
|
||||||
|
* Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef RINGLOGGER_H
|
||||||
|
#define RINGLOGGER_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
struct log;
|
||||||
|
void write_msg_to_log(struct log *log, const char *tag, const char *msg);
|
||||||
|
int write_log_to_file(const char *file_name, const struct log *input_log);
|
||||||
|
uint32_t view_lines_from_cursor(const struct log *input_log, uint32_t cursor, void *ctx, void(*)(const char *, uint64_t, void *));
|
||||||
|
struct log *open_log(const char *file_name);
|
||||||
|
void close_log(struct log *log);
|
||||||
|
|
||||||
|
#endif
|
||||||
63
WireguardNetworkExtension/Logging/test_ringlogger.c
Normal file
63
WireguardNetworkExtension/Logging/test_ringlogger.c
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
#include "ringlogger.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
static void forkwrite(void)
|
||||||
|
{
|
||||||
|
struct log *log = open_log("/tmp/test_log");
|
||||||
|
char c[512];
|
||||||
|
int i, base;
|
||||||
|
bool in_fork = !fork();
|
||||||
|
|
||||||
|
base = 10000 * in_fork;
|
||||||
|
for (i = 0; i < 1024; ++i) {
|
||||||
|
snprintf(c, 512, "bla bla bla %d", base + i);
|
||||||
|
write_msg_to_log(log, "HMM", c);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (in_fork)
|
||||||
|
_exit(0);
|
||||||
|
wait(NULL);
|
||||||
|
|
||||||
|
write_log_to_file("/dev/stdout", log);
|
||||||
|
close_log(log);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void writetext(const char *text)
|
||||||
|
{
|
||||||
|
struct log *log = open_log("/tmp/test_log");
|
||||||
|
write_msg_to_log(log, "TXT", text);
|
||||||
|
close_log(log);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void show_line(const char *line, uint64_t time_ns)
|
||||||
|
{
|
||||||
|
printf("%" PRIu64 ": %s\n", time_ns, line);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void follow(void)
|
||||||
|
{
|
||||||
|
uint32_t cursor = -1;
|
||||||
|
struct log *log = open_log("/tmp/test_log");
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
cursor = view_lines_from_cursor(log, cursor, show_line);
|
||||||
|
usleep(1000 * 300);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
if (!strcmp(argv[1], "fork"))
|
||||||
|
forkwrite();
|
||||||
|
else if (!strcmp(argv[1], "write"))
|
||||||
|
writetext(argv[2]);
|
||||||
|
else if (!strcmp(argv[1], "follow"))
|
||||||
|
follow();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
import NetworkExtension
|
||||||
|
|
||||||
|
enum PacketTunnelProviderError: String, Error {
|
||||||
|
case savedProtocolConfigurationIsInvalid
|
||||||
|
case dnsResolutionFailure
|
||||||
|
case couldNotStartBackend
|
||||||
|
case couldNotDetermineFileDescriptor
|
||||||
|
case couldNotSetNetworkSettings
|
||||||
|
}
|
||||||
|
|
||||||
|
extension NETunnelProviderProtocol {
|
||||||
|
convenience init?(tunnelConfiguration: TunnelConfiguration, previouslyFrom old: NEVPNProtocol? = nil) {
|
||||||
|
self.init()
|
||||||
|
|
||||||
|
guard let name = tunnelConfiguration.name else { return nil }
|
||||||
|
guard let appId = Bundle.main.bundleIdentifier else { return nil }
|
||||||
|
providerBundleIdentifier = "\(appId).network-extension"
|
||||||
|
passwordReference = Keychain.makeReference(containing: tunnelConfiguration.asWgQuickConfig(), called: name, previouslyReferencedBy: old?.passwordReference)
|
||||||
|
if passwordReference == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
#if os(macOS)
|
||||||
|
providerConfiguration = ["UID": getuid()]
|
||||||
|
#endif
|
||||||
|
|
||||||
|
let endpoints = tunnelConfiguration.peers.compactMap { $0.endpoint }
|
||||||
|
if endpoints.count == 1 {
|
||||||
|
serverAddress = endpoints[0].stringRepresentation
|
||||||
|
} else if endpoints.isEmpty {
|
||||||
|
serverAddress = "Unspecified"
|
||||||
|
} else {
|
||||||
|
serverAddress = "Multiple endpoints"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func asTunnelConfiguration(called name: String? = nil) -> TunnelConfiguration? {
|
||||||
|
if let passwordReference = passwordReference,
|
||||||
|
let config = Keychain.openReference(called: passwordReference) {
|
||||||
|
return try? TunnelConfiguration(fromWgQuickConfig: config, called: name)
|
||||||
|
}
|
||||||
|
if let oldConfig = providerConfiguration?["WgQuickConfig"] as? String {
|
||||||
|
return try? TunnelConfiguration(fromWgQuickConfig: oldConfig, called: name)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func destroyConfigurationReference() {
|
||||||
|
guard let ref = passwordReference else { return }
|
||||||
|
Keychain.deleteReference(called: ref)
|
||||||
|
}
|
||||||
|
|
||||||
|
func verifyConfigurationReference() -> Bool {
|
||||||
|
guard let ref = passwordReference else { return false }
|
||||||
|
return Keychain.verifyReference(called: ref)
|
||||||
|
}
|
||||||
|
|
||||||
|
@discardableResult
|
||||||
|
func migrateConfigurationIfNeeded(called name: String) -> Bool {
|
||||||
|
/* This is how we did things before we switched to putting items
|
||||||
|
* in the keychain. But it's still useful to keep the migration
|
||||||
|
* around so that .mobileconfig files are easier.
|
||||||
|
*/
|
||||||
|
if let oldConfig = providerConfiguration?["WgQuickConfig"] as? String {
|
||||||
|
#if os(macOS)
|
||||||
|
providerConfiguration = ["UID": getuid()]
|
||||||
|
#elseif os(iOS)
|
||||||
|
providerConfiguration = nil
|
||||||
|
#else
|
||||||
|
#error("Unimplemented")
|
||||||
|
#endif
|
||||||
|
guard passwordReference == nil else { return true }
|
||||||
|
wg_log(.info, message: "Migrating tunnel configuration '\(name)'")
|
||||||
|
passwordReference = Keychain.makeReference(containing: oldConfig, called: name)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
#if os(macOS)
|
||||||
|
if passwordReference != nil && providerConfiguration?["UID"] == nil && verifyConfigurationReference() {
|
||||||
|
providerConfiguration = ["UID": getuid()]
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
#elseif os(iOS)
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
/* Update the stored reference from the old iOS 14 one to the canonical iOS 15 one.
|
||||||
|
* The iOS 14 ones are 96 bits, while the iOS 15 ones are 160 bits. We do this so
|
||||||
|
* that we can have fast set exclusion in deleteReferences safely. */
|
||||||
|
if passwordReference != nil && passwordReference!.count == 12 {
|
||||||
|
var result: CFTypeRef?
|
||||||
|
let ret = SecItemCopyMatching([kSecValuePersistentRef: passwordReference!,
|
||||||
|
kSecReturnPersistentRef: true] as CFDictionary,
|
||||||
|
&result)
|
||||||
|
if ret != errSecSuccess || result == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
guard let newReference = result as? Data else { return false }
|
||||||
|
if !newReference.elementsEqual(passwordReference!) {
|
||||||
|
wg_log(.info, message: "Migrating iOS 14-style keychain reference to iOS 15-style keychain reference for '\(name)'")
|
||||||
|
passwordReference = newReference
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
32
WireguardNetworkExtension/Model/String+ArrayConversion.swift
Normal file
32
WireguardNetworkExtension/Model/String+ArrayConversion.swift
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
extension String {
|
||||||
|
|
||||||
|
func splitToArray(separator: Character = ",", trimmingCharacters: CharacterSet? = nil) -> [String] {
|
||||||
|
return split(separator: separator)
|
||||||
|
.map {
|
||||||
|
if let charSet = trimmingCharacters {
|
||||||
|
return $0.trimmingCharacters(in: charSet)
|
||||||
|
} else {
|
||||||
|
return String($0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
extension Optional where Wrapped == String {
|
||||||
|
|
||||||
|
func splitToArray(separator: Character = ",", trimmingCharacters: CharacterSet? = nil) -> [String] {
|
||||||
|
switch self {
|
||||||
|
case .none:
|
||||||
|
return []
|
||||||
|
case .some(let wrapped):
|
||||||
|
return wrapped.splitToArray(separator: separator, trimmingCharacters: trimmingCharacters)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,253 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import WireGuardKit
|
||||||
|
|
||||||
|
extension TunnelConfiguration {
|
||||||
|
|
||||||
|
enum ParserState {
|
||||||
|
case inInterfaceSection
|
||||||
|
case inPeerSection
|
||||||
|
case notInASection
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ParseError: Error {
|
||||||
|
case invalidLine(String.SubSequence)
|
||||||
|
case noInterface
|
||||||
|
case multipleInterfaces
|
||||||
|
case interfaceHasNoPrivateKey
|
||||||
|
case interfaceHasInvalidPrivateKey(String)
|
||||||
|
case interfaceHasInvalidListenPort(String)
|
||||||
|
case interfaceHasInvalidAddress(String)
|
||||||
|
case interfaceHasInvalidDNS(String)
|
||||||
|
case interfaceHasInvalidMTU(String)
|
||||||
|
case interfaceHasUnrecognizedKey(String)
|
||||||
|
case peerHasNoPublicKey
|
||||||
|
case peerHasInvalidPublicKey(String)
|
||||||
|
case peerHasInvalidPreSharedKey(String)
|
||||||
|
case peerHasInvalidAllowedIP(String)
|
||||||
|
case peerHasInvalidEndpoint(String)
|
||||||
|
case peerHasInvalidPersistentKeepAlive(String)
|
||||||
|
case peerHasInvalidTransferBytes(String)
|
||||||
|
case peerHasInvalidLastHandshakeTime(String)
|
||||||
|
case peerHasUnrecognizedKey(String)
|
||||||
|
case multiplePeersWithSamePublicKey
|
||||||
|
case multipleEntriesForKey(String)
|
||||||
|
}
|
||||||
|
|
||||||
|
convenience init(fromWgQuickConfig wgQuickConfig: String, called name: String? = nil) throws {
|
||||||
|
var interfaceConfiguration: InterfaceConfiguration?
|
||||||
|
var peerConfigurations = [PeerConfiguration]()
|
||||||
|
|
||||||
|
let lines = wgQuickConfig.split { $0.isNewline }
|
||||||
|
|
||||||
|
var parserState = ParserState.notInASection
|
||||||
|
var attributes = [String: String]()
|
||||||
|
|
||||||
|
for (lineIndex, line) in lines.enumerated() {
|
||||||
|
var trimmedLine: String
|
||||||
|
if let commentRange = line.range(of: "#") {
|
||||||
|
trimmedLine = String(line[..<commentRange.lowerBound])
|
||||||
|
} else {
|
||||||
|
trimmedLine = String(line)
|
||||||
|
}
|
||||||
|
|
||||||
|
trimmedLine = trimmedLine.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
let lowercasedLine = trimmedLine.lowercased()
|
||||||
|
|
||||||
|
if !trimmedLine.isEmpty {
|
||||||
|
if let equalsIndex = trimmedLine.firstIndex(of: "=") {
|
||||||
|
// Line contains an attribute
|
||||||
|
let keyWithCase = trimmedLine[..<equalsIndex].trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
let key = keyWithCase.lowercased()
|
||||||
|
let value = trimmedLine[trimmedLine.index(equalsIndex, offsetBy: 1)...].trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
let keysWithMultipleEntriesAllowed: Set<String> = ["address", "allowedips", "dns"]
|
||||||
|
if let presentValue = attributes[key] {
|
||||||
|
if keysWithMultipleEntriesAllowed.contains(key) {
|
||||||
|
attributes[key] = presentValue + "," + value
|
||||||
|
} else {
|
||||||
|
throw ParseError.multipleEntriesForKey(keyWithCase)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
attributes[key] = value
|
||||||
|
}
|
||||||
|
let interfaceSectionKeys: Set<String> = ["privatekey", "listenport", "address", "dns", "mtu"]
|
||||||
|
let peerSectionKeys: Set<String> = ["publickey", "presharedkey", "allowedips", "endpoint", "persistentkeepalive"]
|
||||||
|
if parserState == .inInterfaceSection {
|
||||||
|
guard interfaceSectionKeys.contains(key) else {
|
||||||
|
throw ParseError.interfaceHasUnrecognizedKey(keyWithCase)
|
||||||
|
}
|
||||||
|
} else if parserState == .inPeerSection {
|
||||||
|
guard peerSectionKeys.contains(key) else {
|
||||||
|
throw ParseError.peerHasUnrecognizedKey(keyWithCase)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if lowercasedLine != "[interface]" && lowercasedLine != "[peer]" {
|
||||||
|
throw ParseError.invalidLine(line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let isLastLine = lineIndex == lines.count - 1
|
||||||
|
|
||||||
|
if isLastLine || lowercasedLine == "[interface]" || lowercasedLine == "[peer]" {
|
||||||
|
// Previous section has ended; process the attributes collected so far
|
||||||
|
if parserState == .inInterfaceSection {
|
||||||
|
let interface = try TunnelConfiguration.collate(interfaceAttributes: attributes)
|
||||||
|
guard interfaceConfiguration == nil else { throw ParseError.multipleInterfaces }
|
||||||
|
interfaceConfiguration = interface
|
||||||
|
} else if parserState == .inPeerSection {
|
||||||
|
let peer = try TunnelConfiguration.collate(peerAttributes: attributes)
|
||||||
|
peerConfigurations.append(peer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if lowercasedLine == "[interface]" {
|
||||||
|
parserState = .inInterfaceSection
|
||||||
|
attributes.removeAll()
|
||||||
|
} else if lowercasedLine == "[peer]" {
|
||||||
|
parserState = .inPeerSection
|
||||||
|
attributes.removeAll()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let peerPublicKeysArray = peerConfigurations.map { $0.publicKey }
|
||||||
|
let peerPublicKeysSet = Set<PublicKey>(peerPublicKeysArray)
|
||||||
|
if peerPublicKeysArray.count != peerPublicKeysSet.count {
|
||||||
|
throw ParseError.multiplePeersWithSamePublicKey
|
||||||
|
}
|
||||||
|
|
||||||
|
if let interfaceConfiguration = interfaceConfiguration {
|
||||||
|
self.init(name: name, interface: interfaceConfiguration, peers: peerConfigurations)
|
||||||
|
} else {
|
||||||
|
throw ParseError.noInterface
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func asWgQuickConfig() -> String {
|
||||||
|
var output = "[Interface]\n"
|
||||||
|
output.append("PrivateKey = \(interface.privateKey.base64Key)\n")
|
||||||
|
if let listenPort = interface.listenPort {
|
||||||
|
output.append("ListenPort = \(listenPort)\n")
|
||||||
|
}
|
||||||
|
if !interface.addresses.isEmpty {
|
||||||
|
let addressString = interface.addresses.map { $0.stringRepresentation }.joined(separator: ", ")
|
||||||
|
output.append("Address = \(addressString)\n")
|
||||||
|
}
|
||||||
|
if !interface.dns.isEmpty || !interface.dnsSearch.isEmpty {
|
||||||
|
var dnsLine = interface.dns.map { $0.stringRepresentation }
|
||||||
|
dnsLine.append(contentsOf: interface.dnsSearch)
|
||||||
|
let dnsString = dnsLine.joined(separator: ", ")
|
||||||
|
output.append("DNS = \(dnsString)\n")
|
||||||
|
}
|
||||||
|
if let mtu = interface.mtu {
|
||||||
|
output.append("MTU = \(mtu)\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
for peer in peers {
|
||||||
|
output.append("\n[Peer]\n")
|
||||||
|
output.append("PublicKey = \(peer.publicKey.base64Key)\n")
|
||||||
|
if let preSharedKey = peer.preSharedKey?.base64Key {
|
||||||
|
output.append("PresharedKey = \(preSharedKey)\n")
|
||||||
|
}
|
||||||
|
if !peer.allowedIPs.isEmpty {
|
||||||
|
let allowedIPsString = peer.allowedIPs.map { $0.stringRepresentation }.joined(separator: ", ")
|
||||||
|
output.append("AllowedIPs = \(allowedIPsString)\n")
|
||||||
|
}
|
||||||
|
if let endpoint = peer.endpoint {
|
||||||
|
output.append("Endpoint = \(endpoint.stringRepresentation)\n")
|
||||||
|
}
|
||||||
|
if let persistentKeepAlive = peer.persistentKeepAlive {
|
||||||
|
output.append("PersistentKeepalive = \(persistentKeepAlive)\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return output
|
||||||
|
}
|
||||||
|
|
||||||
|
private static func collate(interfaceAttributes attributes: [String: String]) throws -> InterfaceConfiguration {
|
||||||
|
guard let privateKeyString = attributes["privatekey"] else {
|
||||||
|
throw ParseError.interfaceHasNoPrivateKey
|
||||||
|
}
|
||||||
|
guard let privateKey = PrivateKey(base64Key: privateKeyString) else {
|
||||||
|
throw ParseError.interfaceHasInvalidPrivateKey(privateKeyString)
|
||||||
|
}
|
||||||
|
var interface = InterfaceConfiguration(privateKey: privateKey)
|
||||||
|
if let listenPortString = attributes["listenport"] {
|
||||||
|
guard let listenPort = UInt16(listenPortString) else {
|
||||||
|
throw ParseError.interfaceHasInvalidListenPort(listenPortString)
|
||||||
|
}
|
||||||
|
interface.listenPort = listenPort
|
||||||
|
}
|
||||||
|
if let addressesString = attributes["address"] {
|
||||||
|
var addresses = [IPAddressRange]()
|
||||||
|
for addressString in addressesString.splitToArray(trimmingCharacters: .whitespacesAndNewlines) {
|
||||||
|
guard let address = IPAddressRange(from: addressString) else {
|
||||||
|
throw ParseError.interfaceHasInvalidAddress(addressString)
|
||||||
|
}
|
||||||
|
addresses.append(address)
|
||||||
|
}
|
||||||
|
interface.addresses = addresses
|
||||||
|
}
|
||||||
|
if let dnsString = attributes["dns"] {
|
||||||
|
var dnsServers = [DNSServer]()
|
||||||
|
var dnsSearch = [String]()
|
||||||
|
for dnsServerString in dnsString.splitToArray(trimmingCharacters: .whitespacesAndNewlines) {
|
||||||
|
if let dnsServer = DNSServer(from: dnsServerString) {
|
||||||
|
dnsServers.append(dnsServer)
|
||||||
|
} else {
|
||||||
|
dnsSearch.append(dnsServerString)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
interface.dns = dnsServers
|
||||||
|
interface.dnsSearch = dnsSearch
|
||||||
|
}
|
||||||
|
if let mtuString = attributes["mtu"] {
|
||||||
|
guard let mtu = UInt16(mtuString) else {
|
||||||
|
throw ParseError.interfaceHasInvalidMTU(mtuString)
|
||||||
|
}
|
||||||
|
interface.mtu = mtu
|
||||||
|
}
|
||||||
|
return interface
|
||||||
|
}
|
||||||
|
|
||||||
|
private static func collate(peerAttributes attributes: [String: String]) throws -> PeerConfiguration {
|
||||||
|
guard let publicKeyString = attributes["publickey"] else {
|
||||||
|
throw ParseError.peerHasNoPublicKey
|
||||||
|
}
|
||||||
|
guard let publicKey = PublicKey(base64Key: publicKeyString) else {
|
||||||
|
throw ParseError.peerHasInvalidPublicKey(publicKeyString)
|
||||||
|
}
|
||||||
|
var peer = PeerConfiguration(publicKey: publicKey)
|
||||||
|
if let preSharedKeyString = attributes["presharedkey"] {
|
||||||
|
guard let preSharedKey = PreSharedKey(base64Key: preSharedKeyString) else {
|
||||||
|
throw ParseError.peerHasInvalidPreSharedKey(preSharedKeyString)
|
||||||
|
}
|
||||||
|
peer.preSharedKey = preSharedKey
|
||||||
|
}
|
||||||
|
if let allowedIPsString = attributes["allowedips"] {
|
||||||
|
var allowedIPs = [IPAddressRange]()
|
||||||
|
for allowedIPString in allowedIPsString.splitToArray(trimmingCharacters: .whitespacesAndNewlines) {
|
||||||
|
guard let allowedIP = IPAddressRange(from: allowedIPString) else {
|
||||||
|
throw ParseError.peerHasInvalidAllowedIP(allowedIPString)
|
||||||
|
}
|
||||||
|
allowedIPs.append(allowedIP)
|
||||||
|
}
|
||||||
|
peer.allowedIPs = allowedIPs
|
||||||
|
}
|
||||||
|
if let endpointString = attributes["endpoint"] {
|
||||||
|
guard let endpoint = Endpoint(from: endpointString) else {
|
||||||
|
throw ParseError.peerHasInvalidEndpoint(endpointString)
|
||||||
|
}
|
||||||
|
peer.endpoint = endpoint
|
||||||
|
}
|
||||||
|
if let persistentKeepAliveString = attributes["persistentkeepalive"] {
|
||||||
|
guard let persistentKeepAlive = UInt16(persistentKeepAliveString) else {
|
||||||
|
throw ParseError.peerHasInvalidPersistentKeepAlive(persistentKeepAliveString)
|
||||||
|
}
|
||||||
|
peer.persistentKeepAlive = persistentKeepAlive
|
||||||
|
}
|
||||||
|
return peer
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
33
WireguardNetworkExtension/NotificationToken.swift
Normal file
33
WireguardNetworkExtension/NotificationToken.swift
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
// Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
/// This source file contains bits of code from:
|
||||||
|
/// https://oleb.net/blog/2018/01/notificationcenter-removeobserver/
|
||||||
|
|
||||||
|
/// Wraps the observer token received from
|
||||||
|
/// `NotificationCenter.addObserver(forName:object:queue:using:)`
|
||||||
|
/// and unregisters it in deinit.
|
||||||
|
final class NotificationToken {
|
||||||
|
let notificationCenter: NotificationCenter
|
||||||
|
let token: Any
|
||||||
|
|
||||||
|
init(notificationCenter: NotificationCenter = .default, token: Any) {
|
||||||
|
self.notificationCenter = notificationCenter
|
||||||
|
self.token = token
|
||||||
|
}
|
||||||
|
|
||||||
|
deinit {
|
||||||
|
notificationCenter.removeObserver(token)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension NotificationCenter {
|
||||||
|
/// Convenience wrapper for addObserver(forName:object:queue:using:)
|
||||||
|
/// that returns our custom `NotificationToken`.
|
||||||
|
func observe(name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NotificationToken {
|
||||||
|
let token = addObserver(forName: name, object: obj, queue: queue, using: block)
|
||||||
|
return NotificationToken(notificationCenter: self, token: token)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
//
|
||||||
|
// WireguardNetworkExtension-Bridging-Header.h.h
|
||||||
|
// AltStore
|
||||||
|
//
|
||||||
|
// Created by Joseph Mattiello on 11/12/22.
|
||||||
|
// Copyright © 2022 Riley Testut. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <WireGuardKitC/WireGuardKitC.h>
|
||||||
|
#include <WireGuardKitGo/wireguard.h>
|
||||||
|
//#include "ringlogger.h"
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?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>
|
||||||
|
<key>com.apple.security.application-groups</key>
|
||||||
|
<array>
|
||||||
|
<string>group.com.joemattiello.AltStore</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -27,17 +27,7 @@ public func set_usbmuxd_socket() {
|
|||||||
public func debug_app(app_id: String) throws -> Uhoh {
|
public func debug_app(app_id: String) throws -> Uhoh {
|
||||||
let ai = NSString(string: app_id)
|
let ai = NSString(string: app_id)
|
||||||
let ai_pointer = UnsafeMutablePointer<CChar>(mutating: ai.utf8String)
|
let ai_pointer = UnsafeMutablePointer<CChar>(mutating: ai.utf8String)
|
||||||
#if false // Retries
|
|
||||||
var res = minimuxer_debug_app(ai_pointer)
|
|
||||||
var attempts = 10
|
|
||||||
while (attempts != 0 && res != 0) {
|
|
||||||
print("(JIT) ATTEMPTS: \(attempts)")
|
|
||||||
res = minimuxer_debug_app(ai_pointer)
|
|
||||||
attempts -= 1
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
let res = minimuxer_debug_app(ai_pointer)
|
let res = minimuxer_debug_app(ai_pointer)
|
||||||
#endif
|
|
||||||
if res != 0 {
|
if res != 0 {
|
||||||
throw Uhoh.Bad(code: res)
|
throw Uhoh.Bad(code: res)
|
||||||
}
|
}
|
||||||
@@ -48,17 +38,7 @@ public func install_provisioning_profile(plist: Data) throws -> Uhoh {
|
|||||||
let pls = String(decoding: plist, as: UTF8.self)
|
let pls = String(decoding: plist, as: UTF8.self)
|
||||||
print(pls)
|
print(pls)
|
||||||
print(plist)
|
print(plist)
|
||||||
#if false // Retries
|
|
||||||
var res = minimuxer_install_provisioning_profile(x, UInt32(plist.count))
|
|
||||||
var attempts = 10
|
|
||||||
while (attempts != 0 && res != 0) {
|
|
||||||
print("(INSTALL) ATTEMPTS: \(attempts)")
|
|
||||||
res = minimuxer_install_provisioning_profile(x, UInt32(plist.count))
|
|
||||||
attempts -= 1
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
let x = plist.withUnsafeBytes { buf in UnsafeMutableRawPointer(mutating: buf) }
|
let x = plist.withUnsafeBytes { buf in UnsafeMutableRawPointer(mutating: buf) }
|
||||||
#endif
|
|
||||||
let res = minimuxer_install_provisioning_profile(x, UInt32(plist.count))
|
let res = minimuxer_install_provisioning_profile(x, UInt32(plist.count))
|
||||||
if res != 0 {
|
if res != 0 {
|
||||||
throw Uhoh.Bad(code: res)
|
throw Uhoh.Bad(code: res)
|
||||||
@@ -69,17 +49,7 @@ public func install_provisioning_profile(plist: Data) throws -> Uhoh {
|
|||||||
public func remove_provisioning_profile(id: String) throws -> Uhoh {
|
public func remove_provisioning_profile(id: String) throws -> Uhoh {
|
||||||
let id_ns = NSString(string: id)
|
let id_ns = NSString(string: id)
|
||||||
let id_pointer = UnsafeMutablePointer<CChar>(mutating: id_ns.utf8String)
|
let id_pointer = UnsafeMutablePointer<CChar>(mutating: id_ns.utf8String)
|
||||||
#if false // Retries
|
|
||||||
var res = minimuxer_remove_provisioning_profile(id_pointer)
|
|
||||||
var attempts = 10
|
|
||||||
while (attempts != 0 && res != 0) {
|
|
||||||
print("(REMOVE PROFILE) ATTEMPTS: \(attempts)")
|
|
||||||
res = minimuxer_remove_provisioning_profile(id_pointer)
|
|
||||||
attempts -= 1
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
let res = minimuxer_remove_provisioning_profile(id_pointer)
|
let res = minimuxer_remove_provisioning_profile(id_pointer)
|
||||||
#endif
|
|
||||||
if res != 0 {
|
if res != 0 {
|
||||||
throw Uhoh.Bad(code: res)
|
throw Uhoh.Bad(code: res)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user