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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CoNETVPN1.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -891,7 +891,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.1.9;
MARKETING_VERSION = 1.2.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-framework",
Expand Down Expand Up @@ -943,7 +943,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.1.9;
MARKETING_VERSION = 1.2.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-framework",
Expand Down
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<key>Demo (Playground).xcscheme</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
<integer>26</integer>
</dict>
</dict>
</dict>
Expand Down
31 changes: 25 additions & 6 deletions VPN/PacketTunnelProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,25 @@ import NetworkExtension
import os.log
import vpn2socks

func nodeJSON (nodeJsonStr: String) -> [Node] {
let decoder = JSONDecoder()
do {
let nodes = try decoder.decode([Node].self, from: nodeJsonStr.data(using: .utf8)!)
return nodes
} catch {
return []
}

}

class PacketTunnelProvider: vpn2socks.PacketTunnelProvider {
private var socksServer: Server?
let port = 8888
var server: Server!
var server = Server(port: 8888)

override init() {
super.init()
let s = Server(port: 8888)
self.socksServer = s
do {
try s.start()
try self.socksServer?.start()
NSLog("PacketTunnelProvider SOCKS server started.")
} catch {
NSLog("PacketTunnelProvider Failed to start SOCKS server: \(error)")
Expand All @@ -29,7 +37,7 @@ class PacketTunnelProvider: vpn2socks.PacketTunnelProvider {

super.startTunnel(options: options) { error in
// 5. 在核心逻辑完成后,你可以执行后续的自定义操作
if let error = error {
if error != nil {
NSLog("PacketTunnelProvider Target: Core logic failed. Cleaning up.")
// 处理错误
} else {
Expand All @@ -42,14 +50,25 @@ class PacketTunnelProvider: vpn2socks.PacketTunnelProvider {
let entryNodesStr = options["entryNodes"] as? String ?? ""
let egressNodesStr = options["egressNodes"] as? String ?? ""
let privateKey = options["privateKey"] as? String ?? ""
//NSLog("PacketTunnelProvider SOCKS entryNodesStr\(entryNodesStr) egressNodesStr\(egressNodesStr)")

let entryNodes = nodeJSON(nodeJsonStr: entryNodesStr)
let egressNodes = nodeJSON(nodeJsonStr: egressNodesStr)

do {
try self.socksServer?.start()
Server.layerMinus.startInVPN(privateKey: privateKey,
entryNodes: entryNodes,
egressNodes: egressNodes,
port: 8888)
NSLog("PacketTunnelProvider SOCKS server started.")
} catch {
NSLog("Failed to start SOCKS server: \(error)")
}




// 最后,调用 completionHandler 通知系统
completionHandler(error)

Expand Down
260 changes: 3 additions & 257 deletions VPN/swift/LayerMinus.swift
Original file line number Diff line number Diff line change
Expand Up @@ -284,275 +284,19 @@ class LayerMinus {
// self.miningProcess = MiningProcess(layerMinus: self, post: port, message: "PacketTunnelProvider startInVPN")
// self.miningProcess.start()
}

func allnodeupdate () {

let st = String(format:"%03X", LayerMinus.currentScanNode)



getNode(nftNumber: st, completion: { result in

if !result {


NodeManager.allNodes = LayerMinus.allNodes
// 保存到 UserDefaults
NodeManager.saveNodes()

CountryManager.country = LayerMinus.country
CountryManager.saveCountries()


return self.testRegion()
}
self.scanAll_nodes()

})


}

func scanAll_nodes () {

let st = String(format:"%03X", LayerMinus.currentScanNode)
print("\(LayerMinus.currentScanNode)")
print("开始")
NodeManager.loadNodes()

CountryManager.loadCountries()
if NodeManager.allNodes.count > 100
{
print("拿到缓存的全部节点了 省的去请求")
LayerMinus.allNodes = NodeManager.allNodes
LayerMinus.country = CountryManager.country
print("测试1")
return self.testRegion()
}

getNode(nftNumber: st, completion: { result in

if !result {

NodeManager.allNodes = LayerMinus.allNodes
// 保存到 UserDefaults
NodeManager.saveNodes()

CountryManager.country = LayerMinus.country
CountryManager.saveCountries()


print("所有节点全部请求到了")
return self.testRegion()
}

LayerMinus.currentScanNode += 1
print("一个一个请求节点")
self.scanAll_nodes()
})
}



func scanAll_nodesapp () {

let st = String(format:"%03X", LayerMinus.currentScanNode)
print("\(LayerMinus.currentScanNode)")
print("开始")

getNode(nftNumber: st, completion: { result in

if !result {

NodeManager.allNodes = LayerMinus.allNodes
// 保存到 UserDefaults
NodeManager.saveNodes()

CountryManager.country = LayerMinus.country
CountryManager.saveCountries()


print("所有节点全部请求到了")
return self.testRegion()
}

LayerMinus.currentScanNode += 1
print("一个一个请求节点")
self.scanAll_nodesapp()
})
}


static func getRandomNodeWithRegion(country: String) -> Node {
let allNodes = LayerMinus.allNodes.filter { $0.country == country }
let randomIndex = Int.random(in: 0..<allNodes.count)
return allNodes[randomIndex]
}

func testRegion() {

var allNodes:[NodeRegion] = []
LayerMinus.country.forEach { country in
let node = LayerMinus.getRandomNodeWithRegion(country: country)
print("随机拿了一个节点开始请求,这里中国经常遇到失败的情况 所以要我对失败的情况做处理")
self.testNodeDelay(node: node, completion: { time in
allNodes.append(NodeRegion(node: node, time: time))

if allNodes.count == LayerMinus.country.count {
print("这里已经正常运行了,问题不大")
let sortedNodes = allNodes.sorted { $0.time < $1.time }
LayerMinus.nearbyCountryTestNodes = sortedNodes
LayerMinus.nearbyCountry = sortedNodes[0].node.country
self.makeEntryNodes()
self.setupEgressNodes(country: "US")
print("testRegion finished !")

let userInfo: [String: Any] = ["当前通知类型": "获取所有节点"]
NotificationCenter.default.post(name: .didUpdateConnectionNodes, object: nil, userInfo:userInfo)
let entryNodesIpAddress = self.entryNodes.map { $0.ip_addr }
let egressNodesIpAddress = self.egressNodes.map { $0.ip_addr }
print("开始挖矿 入口節點 【\(entryNodesIpAddress)】出口節點【\(egressNodesIpAddress)】")
// self.miningProcess.start()
}
else
{
print("这里可能是节点更新了,或者地区更新了 对应不上了 需要重新请求全部节点")
}
})
}

}

func setupEgressNodes (country: String) {
if !LayerMinus.country.contains(country) {
let userInfo: [String: Any] = ["当前通知类型": "网络连接失败"]
NotificationCenter.default.post(name: .didUpdateConnectionNodes, object: nil, userInfo:userInfo)
return print("setupEgressNodes has't \(country) in country array ERROR!")
}
self.egressNodes.removeAll()
repeat {
let node = LayerMinus.getRandomNodeWithRegion(country: country)
self.egressNodes.append(node)

} while self.egressNodes.count < self.maxEgressNodes
print("setupEgressNodes at \(country) success!")
let userInfo: [String: Any] = ["当前通知类型": "切换区域成功"]
NotificationCenter.default.post(name: .didUpdateConnectionNodes, object: nil, userInfo:userInfo)

var entryNodes = NSMutableArray()
var egressNodes = NSMutableArray()

for node in self.egressNodes {

entryNodes.add(node.ip_addr)
}
for node in self.entryNodes {

egressNodes.add(node.ip_addr)
}


let userDefaults = UserDefaults(suiteName: "conect")
userDefaults?.set(entryNodes, forKey: "entryNodes")
userDefaults?.set(egressNodes, forKey: "egressNodes")
//
// NodeManager.newsaveNodes(self.egressNodes, withKey: "egressNodesToVPN")
// NodeManager.newsaveNodes(self.entryNodes, withKey: "entryNodesToVPN")


userDefaults?.synchronize()
}

func makeEntryNodes () {
repeat {
let node = LayerMinus.getRandomNodeWithRegion(country: LayerMinus.nearbyCountry)
self.entryNodes.append(node)
} while self.entryNodes.count < LayerMinus.maxRegionNodes
}

func testNodeDelay(node: Node, completion: @escaping (Double) -> Void) {
let url = URL(string: "http://\(node.ip_addr)/")!
let request = URLRequest(url: url)

let before = Date()
let task = URLSession.shared.dataTask(with: request) { data, response, error in

if let error = error {
print("Request to \(node.ip_addr) failed with error: \(error)")
print("在中国请求失败了,需要做特殊处理")
let userInfo: [String: Any] = ["当前通知类型": "网络连接失败"]
NotificationCenter.default.post(name: .didUpdateConnectionNodes, object: nil, userInfo:userInfo)

}

guard let data else { return }
var _ = String(data: data, encoding: .utf8)!
let after = Date()
let timeInterval = after.timeIntervalSince(before)
print("testNodeDelay \(node.ip_addr) = \(timeInterval)")
completion(timeInterval)
}

task.resume()
}




func getNode(nftNumber: String, completion: @escaping (Bool) -> Void) {

var request = URLRequest(url: LayerMinus.rpcUrl)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let postString = "[{\"method\":\"eth_chainId\",\"params\":[],\"id\":1,\"jsonrpc\":\"2.0\"},{\"method\":\"eth_call\",\"params\":[{\"to\":\"0x9e213e8b155ef24b466efc09bcde706ed23c537a\",\"data\":\"0xc839a8f10000000000000000000000000000000000000000000000000000000000000\(nftNumber)\"},\"latest\"],\"id\":2,\"jsonrpc\":\"2.0\"}]"
request.httpBody = postString.data(using: .utf8)

DispatchQueue.main.async {
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print("错误输出 \(String(describing: error)) ")
return completion(false)
}
let _res = String(data: data, encoding: .utf8)!

if let callFun1 = self.javascriptContext.objectForKeyedSubscript("getResult") {
if let ret1 = callFun1.call(withArguments: [_res]) {
let res = ret1.isUndefined ? "" : ret1.toString()!
let _resData = Data(hex:res)
do {
let decodedData = try self.CONET_Guardian_NodeInfo_Contract.decodeReturnData("getNodeInfoById", data: _resData)
guard let ip_addr = decodedData["ipaddress"] as? String else {
return print("getNode ipaddress error")
}
guard let regionName = decodedData["regionName"] as? String else {
return print("getNode regionName error")
}
guard let pgp = decodedData["pgp"] as? String else {
return print("getNode pgp error")
}
if (pgp.isEmpty) {
return completion(false)
}

let armoredPublicKey = String(data: Data(base64Encoded: pgp) ?? Data(), encoding: .utf8)!
let _country = regionName.split(separator: ".")[1]
let country = String(_country)
LayerMinus.country.insert(country)
let node = Node(country: country, ip_addr: ip_addr, region: regionName, armoredPublicKey: armoredPublicKey, nftNumber: nftNumber)
LayerMinus.allNodes.append(node)
let userInfo: [String: Any] = ["当前通知类型": "节点数量","节点": "\(LayerMinus.allNodes.count)"]
NotificationCenter.default.post(name: .didUpdateConnectionNodes, object: nil, userInfo:userInfo)

completion(true)
} catch {
return completion(false)
}
}
}
}
task.resume()
}
}

static func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0]
Expand All @@ -565,6 +309,8 @@ extension FixedWidthInteger {
return data
}
}


extension Encodable {

func toJSONString() -> String {
Expand Down
Loading