Skip to content

Commit b7db350

Browse files
committed
Merge branch 'from-d8e15483d0abb6ee985b03c354039c859f1efdb6'
2 parents 0897e58 + 30ea2c2 commit b7db350

File tree

14 files changed

+324
-109
lines changed

14 files changed

+324
-109
lines changed

.DS_Store

0 Bytes
Binary file not shown.

CoNETVPN1.xcodeproj/project.pbxproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
BF572FEFDAA54A12D51B5FE9 /* Pods_CoNETVPN1.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DE531A7C6F806D913F3DA60 /* Pods_CoNETVPN1.framework */; };
5252
C2F19D452DF27FCCD2E439F5 /* Pods_VPN.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B065FACCEF28785DA81D7B43 /* Pods_VPN.framework */; };
5353
CAE69CDC58145A1A3DAC0297 /* Pods_CoNETVPN1_CoNETVPN1UITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0712EF27A6FE658454DDE0C5 /* Pods_CoNETVPN1_CoNETVPN1UITests.framework */; };
54+
D0064CEF2E5B8D74003FBD9D /* CountryManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0064CEE2E5B8D74003FBD9D /* CountryManager.swift */; };
5455
D04D4DF42E593DFD0083DD23 /* LayerMinusBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D4DD12E593C860083DD23 /* LayerMinusBridge.swift */; };
5556
D04D4E1B2E59908B0083DD23 /* LayerMinus.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D4E1A2E59908B0083DD23 /* LayerMinus.swift */; };
5657
D04D4E1D2E5990FF0083DD23 /* NodeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D4E1C2E5990FF0083DD23 /* NodeManager.swift */; };
@@ -62,7 +63,6 @@
6263
D0850B2E2E52CC4C00BC1BF4 /* vpn2socks in Frameworks */ = {isa = PBXBuildFile; productRef = D0850B2D2E52CC4C00BC1BF4 /* vpn2socks */; };
6364
D0850B302E52CCC900BC1BF4 /* vpn2socks in Frameworks */ = {isa = PBXBuildFile; productRef = D0850B2F2E52CCC900BC1BF4 /* vpn2socks */; };
6465
D0D33D5F2E298A9000E849BC /* LocalServerFirstSchemeHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D33D5E2E298A8E00E849BC /* LocalServerFirstSchemeHandler.swift */; };
65-
D0D33D612E298AB500E849BC /* CacheManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D33D602E298AB400E849BC /* CacheManager.swift */; };
6666
D0D33D632E298BCE00E849BC /* CodableCachedData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D33D622E298BCD00E849BC /* CodableCachedData.swift */; };
6767
D0E605702E56DA2300167745 /* vpn2socks in Frameworks */ = {isa = PBXBuildFile; productRef = D0E6056F2E56DA2300167745 /* vpn2socks */; };
6868
DC54A9FB02AA54E897847413 /* Pods_CoNETVPN1Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 64B0E3B87885C6C17DD36CB4 /* Pods_CoNETVPN1Tests.framework */; };
@@ -160,6 +160,7 @@
160160
AC447B9CF46665A6870A6FE6 /* Pods-CoNETVPN1-CoNETVPN1UITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoNETVPN1-CoNETVPN1UITests.release.xcconfig"; path = "Target Support Files/Pods-CoNETVPN1-CoNETVPN1UITests/Pods-CoNETVPN1-CoNETVPN1UITests.release.xcconfig"; sourceTree = "<group>"; };
161161
B065FACCEF28785DA81D7B43 /* Pods_VPN.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_VPN.framework; sourceTree = BUILT_PRODUCTS_DIR; };
162162
B863739A14ADB342BEEAA7B2 /* Pods-VPN.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VPN.release.xcconfig"; path = "Target Support Files/Pods-VPN/Pods-VPN.release.xcconfig"; sourceTree = "<group>"; };
163+
D0064CEE2E5B8D74003FBD9D /* CountryManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountryManager.swift; sourceTree = "<group>"; };
163164
D04D4DD12E593C860083DD23 /* LayerMinusBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayerMinusBridge.swift; sourceTree = "<group>"; };
164165
D04D4E1A2E59908B0083DD23 /* LayerMinus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayerMinus.swift; sourceTree = "<group>"; };
165166
D04D4E1C2E5990FF0083DD23 /* NodeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeManager.swift; sourceTree = "<group>"; };
@@ -168,7 +169,6 @@
168169
D06663FC2E28641B007D010D /* build3.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = build3.zip; sourceTree = "<group>"; };
169170
D0850B272E52C06600BC1BF4 /* vpn2socks */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = vpn2socks; sourceTree = "<group>"; };
170171
D0D33D5E2E298A8E00E849BC /* LocalServerFirstSchemeHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalServerFirstSchemeHandler.swift; sourceTree = "<group>"; };
171-
D0D33D602E298AB400E849BC /* CacheManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CacheManager.swift; sourceTree = "<group>"; };
172172
D0D33D622E298BCD00E849BC /* CodableCachedData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodableCachedData.swift; sourceTree = "<group>"; };
173173
E04572E9846C75F10876B175 /* Pods-CoNETVPN1.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoNETVPN1.debug.xcconfig"; path = "Target Support Files/Pods-CoNETVPN1/Pods-CoNETVPN1.debug.xcconfig"; sourceTree = "<group>"; };
174174
E6D9ED8BF5C4FFE74EBCA7F2 /* Pods-CoNETVPN1Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoNETVPN1Tests.release.xcconfig"; path = "Target Support Files/Pods-CoNETVPN1Tests/Pods-CoNETVPN1Tests.release.xcconfig"; sourceTree = "<group>"; };
@@ -253,6 +253,7 @@
253253
7606D70C2D2EC5A000224EC8 /* ServerConnection 2.swift */,
254254
D04D4DD12E593C860083DD23 /* LayerMinusBridge.swift */,
255255
D04D4E1A2E59908B0083DD23 /* LayerMinus.swift */,
256+
D0064CEE2E5B8D74003FBD9D /* CountryManager.swift */,
256257
D04D4E1C2E5990FF0083DD23 /* NodeManager.swift */,
257258
7606D70F2D2EC5A000224EC8 /* VPNManager.swift */,
258259
7606D7102D2EC5A000224EC8 /* WebViewManager.swift */,
@@ -286,7 +287,6 @@
286287
D06663F52E28443F007D010D /* LocalWebServer.swift */,
287288
765B0EC42CE476E1007ACC57 /* SceneDelegate.swift */,
288289
D0D33D5E2E298A8E00E849BC /* LocalServerFirstSchemeHandler.swift */,
289-
D0D33D602E298AB400E849BC /* CacheManager.swift */,
290290
D0D33D622E298BCD00E849BC /* CodableCachedData.swift */,
291291
765B0EC52CE476E1007ACC57 /* ViewController.swift */,
292292
7678A40B2DADED4900A7C16C /* Constants.swift */,
@@ -684,6 +684,7 @@
684684
7606D7172D2EC5A000224EC8 /* VPNManager.swift in Sources */,
685685
7606D71B2D2EC5A000224EC8 /* ServerConnection 2.swift in Sources */,
686686
D04D4E1B2E59908B0083DD23 /* LayerMinus.swift in Sources */,
687+
D0064CEF2E5B8D74003FBD9D /* CountryManager.swift in Sources */,
687688
D04D4E1D2E5990FF0083DD23 /* NodeManager.swift in Sources */,
688689
7606D71C2D2EC5A000224EC8 /* Server 2.swift in Sources */,
689690
7660ED4A2D13A861008B6D28 /* PacketTunnelProvider.swift in Sources */,
@@ -700,7 +701,6 @@
700701
7606D6F62D2EBC7700224EC8 /* Server.swift in Sources */,
701702
7606D6F72D2EBC7700224EC8 /* ValidatorPost.swift in Sources */,
702703
7606D6F82D2EBC7700224EC8 /* ServerBridge.swift in Sources */,
703-
D0D33D612E298AB500E849BC /* CacheManager.swift in Sources */,
704704
7606D7022D2EC1F600224EC8 /* NativeBridge 2.swift in Sources */,
705705
D06663F62E28443F007D010D /* LocalWebServer.swift in Sources */,
706706
7606D6F92D2EBC7700224EC8 /* LayerMinus.swift in Sources */,
@@ -797,7 +797,7 @@
797797
"@executable_path/Frameworks",
798798
"@executable_path/../../Frameworks",
799799
);
800-
MARKETING_VERSION = 1.1.6;
800+
MARKETING_VERSION = 1.2.0;
801801
OTHER_LDFLAGS = (
802802
"$(inherited)",
803803
"-framework",
@@ -840,7 +840,7 @@
840840
"@executable_path/Frameworks",
841841
"@executable_path/../../Frameworks",
842842
);
843-
MARKETING_VERSION = 1.1.6;
843+
MARKETING_VERSION = 1.2.0;
844844
OTHER_LDFLAGS = (
845845
"$(inherited)",
846846
"-framework",
16.2 KB
Binary file not shown.

CoNETVPN1.xcworkspace/xcuserdata/peter.xcuserdatad/xcschemes/xcschememanagement.plist

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@
44
<dict>
55
<key>SchemeUserState</key>
66
<dict>
7+
<key>Demo (Playground) 1.xcscheme</key>
8+
<dict>
9+
<key>orderHint</key>
10+
<integer>27</integer>
11+
</dict>
712
<key>Demo (Playground).xcscheme</key>
813
<dict>
914
<key>orderHint</key>
10-
<integer>2</integer>
15+
<integer>26</integer>
1116
</dict>
1217
</dict>
1318
</dict>

CoNETVPN1/LocalServerFirstSchemeHandler.swift

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import WebKit
99

1010
class LocalServerFirstSchemeHandler: NSObject, WKURLSchemeHandler {
1111

12-
private let cacheManager = CacheManager.shared
13-
1412
func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
1513
guard let requestURL = urlSchemeTask.request.url else {
1614
urlSchemeTask.didFailWithError(URLError(.badURL))
@@ -40,7 +38,6 @@ class LocalServerFirstSchemeHandler: NSObject, WKURLSchemeHandler {
4038
} else {
4139
// SERVER IS OFFLINE: Serve from cache
4240
print("🔴 Server is Offline. Attempting to serve from cache...")
43-
self.serveFromCache(for: finalURL, with: urlSchemeTask)
4441
}
4542
}
4643
}
@@ -88,22 +85,8 @@ class LocalServerFirstSchemeHandler: NSObject, WKURLSchemeHandler {
8885

8986
// Update the cache in the background
9087
print("🗄️ Caching response for \(url.absoluteString)")
91-
self?.cacheManager.cacheData(data, for: response)
92-
}
93-
task.resume()
94-
}
9588

96-
/// 3. Serves data directly from the cache.
97-
private func serveFromCache(for url: URL, with urlSchemeTask: WKURLSchemeTask) {
98-
if let cachedData = cacheManager.getCachedData(for: url) {
99-
print("✅ Cache HIT for \(url.absoluteString)")
100-
urlSchemeTask.didReceive(cachedData.response)
101-
urlSchemeTask.didReceive(cachedData.data)
102-
urlSchemeTask.didFinish()
103-
} else {
104-
print("🚫 Cache MISS for \(url.absoluteString). No fallback available.")
105-
// The server is offline AND there's no cache. The request fails.
106-
urlSchemeTask.didFailWithError(URLError(.cannotConnectToHost))
10789
}
90+
task.resume()
10891
}
10992
}

VPN/Info.plist

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,7 @@
3535
<string>utility</string>
3636
</dict>
3737
</dict>
38-
39-
<!-- Background Modes for Network Extension -->
40-
<key>UIBackgroundModes</key>
41-
<array>
42-
<string>network-authentication</string>
43-
<string>voip</string>
44-
</array>
38+
4539

4640
<!-- Required Capabilities -->
4741
<key>UIRequiredDeviceCapabilities</key>

VPN/PacketTunnelProvider.swift

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// Created by peter xie on 2021-10-18.
55
//
66

7+
78
import NetworkExtension
89
import os.log
910
import vpn2socks
@@ -26,10 +27,13 @@ class PacketTunnelProvider: vpn2socks.PacketTunnelProvider {
2627
override init() {
2728
super.init()
2829
do {
30+
31+
// try self.socksServer?.start(privateKey: privateKey, entryNodes: entryNodes, egressNodes: egressNodes)
32+
2933
try self.socksServer?.start()
3034
NSLog("PacketTunnelProvider SOCKS server started.")
3135
} catch {
32-
NSLog("PacketTunnelProvider Failed to start SOCKS server: \(error)")
36+
NSLog("Failed to start SOCKS server: \(error)")
3337
}
3438
}
3539

@@ -50,17 +54,16 @@ class PacketTunnelProvider: vpn2socks.PacketTunnelProvider {
5054
let entryNodesStr = options["entryNodes"] as? String ?? ""
5155
let egressNodesStr = options["egressNodes"] as? String ?? ""
5256
let privateKey = options["privateKey"] as? String ?? ""
53-
//NSLog("PacketTunnelProvider SOCKS entryNodesStr\(entryNodesStr) egressNodesStr\(egressNodesStr)")
54-
57+
5558
let entryNodes = nodeJSON(nodeJsonStr: entryNodesStr)
5659
let egressNodes = nodeJSON(nodeJsonStr: egressNodesStr)
5760

5861
do {
62+
// try self.socksServer?.start(privateKey: privateKey, entryNodes: entryNodes, egressNodes: egressNodes)
5963
try self.socksServer?.start()
60-
Server.layerMinus.startInVPN(privateKey: privateKey,
61-
entryNodes: entryNodes,
62-
egressNodes: egressNodes,
63-
port: 8888)
64+
65+
self.socksServer?.layerMinusInit(privateKey: privateKey, entryNodes: entryNodes, egressNodes: egressNodes)
66+
6467
NSLog("PacketTunnelProvider SOCKS server started.")
6568
} catch {
6669
NSLog("Failed to start SOCKS server: \(error)")
@@ -105,3 +108,6 @@ class PacketTunnelProvider: vpn2socks.PacketTunnelProvider {
105108
NSLog("🔔 PacketTunnelProvider.wake called")
106109
}
107110
}
111+
extension Notification.Name {
112+
static let didUpdateConnectionNodes = Notification.Name("didUpdateConnectionNodes")
113+
}

VPN/swift/LayerMinus.swift

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import web3swift
1717
import ObjectivePGP
1818
import JavaScriptCore
1919

20+
21+
2022
func getIPAddress() -> String? {
2123
var address: String?
2224

@@ -59,6 +61,13 @@ func getIPAddress() -> String? {
5961
}
6062

6163
class LayerMinus {
64+
65+
@inline(__always)
66+
67+
private func log(_ msg: String) {
68+
NSLog("[LayerMinus] #%@", msg)
69+
}
70+
6271
static let maxRegionNodes = 5
6372
var maxEgressNodes = 1
6473
static let rpc = "https://rpc.conet.network"
@@ -74,7 +83,7 @@ class LayerMinus {
7483
var privateKey: Data!
7584
let keyring = Keyring()
7685
let pgpKey = KeyGenerator().generate(for: "user@conet.network", passphrase: "")
77-
86+
7887
static var currentScanNode = 100
7988
static var country = Set<String>()
8089
var entryNodes: [Node] = []
@@ -173,7 +182,7 @@ class LayerMinus {
173182
return ""
174183
}
175184

176-
init (port: Int) {
185+
init () {
177186

178187
self.keystoreManager = KeystoreManager([self.tempKeystore!])
179188
let account = self.keystoreManager.addresses![0]
@@ -187,8 +196,10 @@ class LayerMinus {
187196

188197
UserDefaults.standard.set(self.privateKey, forKey: "privateKey")
189198
UserDefaults.standard.synchronize()
199+
200+
log ("LayerMinus success!")
190201
} catch {
191-
print ("LayerMinus Error getting private key!")
202+
log ("LayerMinus Error getting private key!")
192203
return
193204
}
194205
Task{
@@ -208,18 +219,14 @@ class LayerMinus {
208219
return ret
209220
}
210221

211-
func getRandomEntryNodes () -> Node {
212-
if entryNodes.isEmpty {
213-
return Node(country: "", ip_addr: "", region: "", armoredPublicKey: "", nftNumber: "")
214-
}
222+
func getRandomEntryNodes () -> Node? {
223+
guard !self.entryNodes.isEmpty else { return nil }
215224
let randomIndex = Int.random(in: 0..<self.entryNodes.count)
216-
return entryNodes[randomIndex]
225+
return self.entryNodes[randomIndex]
217226
}
218227

219-
func getRandomEgressNodes() -> Node {
220-
if self.egressNodes.isEmpty {
221-
return Node(country: "", ip_addr: "", region: "", armoredPublicKey: "", nftNumber: "")
222-
}
228+
func getRandomEgressNodes() -> Node? {
229+
guard !self.egressNodes.isEmpty else { return nil }
223230
let randomIndex = Int.random(in: 0..<self.egressNodes.count)
224231
return self.egressNodes[randomIndex]
225232
}
@@ -323,3 +330,13 @@ extension Encodable {
323330
func instantiate<T: Decodable>(jsonString: String) -> T? {
324331
return try? JSONDecoder().decode(T.self, from: jsonString.data(using: .utf8)!)
325332
}
333+
334+
extension Node {
335+
var isEmpty: Bool {
336+
return country.isEmpty &&
337+
ip_addr.isEmpty &&
338+
region.isEmpty &&
339+
armoredPublicKey.isEmpty &&
340+
nftNumber.isEmpty
341+
}
342+
}

VPN/swift/LayerMinusBridge.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@ public final class LayerMinusBridge {
1919
private let queue: DispatchQueue
2020
private var upstream: NWConnection?
2121
private var closed = false
22-
private let LayerMinus: LayerMinus
23-
init(
22+
23+
24+
25+
init(
26+
2427
id: UInt64,
2528
client: NWConnection,
2629
targetHost: String,
@@ -36,7 +39,6 @@ public final class LayerMinusBridge {
3639
self.verbose = verbose
3740
self.onClosed = onClosed
3841
self.queue = DispatchQueue(label: "LayerMinusBridge.\(id)", qos: .userInitiated)
39-
self.LayerMinus = LayerMinus
4042
// 简单的生命周期日志
4143
log("🟢 CREATED LayerMinusBridge #\(id) for \(targetHost):\(targetPort)")
4244
}
@@ -50,7 +52,7 @@ public final class LayerMinusBridge {
5052

5153
@inline(__always)
5254
private func log(_ msg: String) {
53-
NSLog("[LayerMinusBridge \(id)] %@", msg)
55+
//NSLog("[LayerMinusBridge \(id)] %@", msg)
5456
}
5557

5658
public func start(withFirstBody firstBodyBase64: String) {
@@ -77,8 +79,12 @@ public final class LayerMinusBridge {
7779

7880
// 开始连接上游并转发数据
7981
self.connectUpstreamAndRun(firstBody: firstBody)
82+
8083
}
8184
}
85+
86+
87+
8288

8389
public func cancel(reason: String) {
8490
guard !closed else { return }

0 commit comments

Comments
 (0)