ClashX.Meta/ClashX/Models/ProxyServerModel.swift

74 lines
2.2 KiB
Swift

//
// ProxyServerModel.swift
// ClashX
//
// Created by CYC on 2018/8/5.
// Copyright © 2018 west2online. All rights reserved.
//
import Cocoa
class ProxyServerModel: NSObject, Codable {
@objc dynamic var serverHost:String = ""
@objc dynamic var serverPort:String = ""
@objc dynamic var password:String = ""
@objc dynamic var method:String = "RC4-MD5"
@objc dynamic var remark:String = "Proxy"
func isValid() -> Bool {
func validateIpAddress(_ ipToValidate: String) -> Bool {
var sin = sockaddr_in()
var sin6 = sockaddr_in6()
if ipToValidate.withCString({ cstring in inet_pton(AF_INET6, cstring, &sin6.sin6_addr) }) == 1 {
// IPv6 peer.
return true
}
else if ipToValidate.withCString({ cstring in inet_pton(AF_INET, cstring, &sin.sin_addr) }) == 1 {
// IPv4 peer.
return true
}
return false;
}
func validateDomainName(_ value: String) -> Bool {
let validHostnameRegex = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$"
if (value.range(of: validHostnameRegex, options: .regularExpression) != nil) {
return true
} else {
return false
}
}
func validatePort(_ value: String) -> Bool {
if let port = Int(value) {
return port > 0 && port <= 65535
}
return false
}
if !(validateIpAddress(serverHost) ||
validateDomainName(serverHost) ||
validatePort(serverPort)){
return false
}
if password.isEmpty {
return false
}
return true
}
override func copy() -> Any {
guard let data = try? JSONEncoder().encode(self) else {return ProxyServerModel()}
let copy = try? JSONDecoder().decode(ProxyServerModel.self, from: data)
return copy ?? ProxyServerModel()
}
}