Skip to content

Commit 47c0216

Browse files
committed
Move Validator class & Mode enum to Utils.swift.
1 parent b617e83 commit 47c0216

File tree

2 files changed

+125
-130
lines changed

2 files changed

+125
-130
lines changed

ShadowsocksX-NG/HTTPUserProxy.swift

Lines changed: 6 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ class HTTPUserProxy{
1313
static let shard = HTTPUserProxy()
1414

1515
let adapter = APIAdapter()
16-
let v = Validator()
1716

1817
let server = GCDWebServer()
1918
let api_port:UInt = 9528
@@ -111,7 +110,7 @@ class HTTPUserProxy{
111110
if var server = ((request as? GCDWebServerURLEncodedFormRequest)?.arguments) as? [String: Any] {
112111
if (server["ServerPort"] != nil) {
113112
server["ServerPort"] = UInt16(server["ServerPort"] as! String)
114-
if (Validator.integrity(server) && Validator.existAttributes(server)) { // validate
113+
if (Validator.profile(server)) { // validate
115114
self.adapter.addServer(server: server)
116115
return GCDWebServerResponse();
117116
}
@@ -173,7 +172,7 @@ class HTTPUserProxy{
173172
func addHandler_setMode() {
174173
server.addHandler(forMethod: "PUT", path: "/mode", request: GCDWebServerURLEncodedFormRequest.self, processBlock: {request in
175174
if let mode_str = (request as? GCDWebServerURLEncodedFormRequest)?.arguments["Mode"] as? String{
176-
if let mode = APIAdapter.Mode(rawValue: mode_str) {
175+
if let mode = ProxyType(rawValue: mode_str) {
177176
self.adapter.setMode(mode: mode);
178177

179178
return GCDWebServerResponse()
@@ -185,8 +184,6 @@ class HTTPUserProxy{
185184
}
186185

187186
class APIAdapter {
188-
enum Mode:String {case auto="auto", global="global", manual="manual"};
189-
190187
let SerMgr = ServerProfileManager.instance
191188
let defaults = UserDefaults.standard
192189
let appdeleget = NSApplication.shared.delegate as! AppDelegate
@@ -281,21 +278,21 @@ class APIAdapter {
281278
self.appdeleget.updateServersMenu()
282279
}
283280

284-
func getMode()->Mode {
281+
func getMode()->ProxyType {
285282
let mode_str = self.defaults.string(forKey: "ShadowsocksRunningMode");
286283
switch mode_str {
287-
case "auto": return .auto
284+
case "auto": return .pac
288285
case "global": return .global;
289286
case "manual": return .manual
290287
default:fatalError()
291288
}
292289
}
293290

294-
func setMode(mode:Mode) {
291+
func setMode(mode:ProxyType) {
295292
let defaults = UserDefaults.standard
296293

297294
switch mode{
298-
case .auto:defaults.setValue("auto", forKey: "ShadowsocksRunningMode")
295+
case .pac:defaults.setValue("auto", forKey: "ShadowsocksRunningMode")
299296
case .global:defaults.setValue("global", forKey: "ShadowsocksRunningMode")
300297
case .manual:defaults.setValue("manual", forKey: "ShadowsocksRunningMode")
301298
}
@@ -304,120 +301,3 @@ class APIAdapter {
304301
self.appdeleget.applyConfig()
305302
}
306303
}
307-
308-
class Validator {
309-
static func integrity(_ data: Dictionary<String, Any>) -> Bool {
310-
if (data["ServerHost"] == nil || data["ServerPort"] as? NSNumber == nil
311-
|| data["Method"] == nil || data["Password"] == nil) {
312-
return false;
313-
}
314-
return true;
315-
}
316-
317-
static func existAttributes(_ server:Dictionary<String, Any>) -> Bool {
318-
var result = true;
319-
320-
if (server["ServerHost"] != nil) {
321-
result = result && serverHost(server["ServerHost"] as! String);
322-
}
323-
if (server["ServerPort"] != nil) {
324-
result = result && serverPort(server["ServerPort"] as! uint16);
325-
}
326-
if (server["Method"] != nil) {
327-
result = result && method(server["Method"] as! String);
328-
}
329-
if (server["Password"] != nil) {
330-
result = result && password(server["Password"] as! String);
331-
}
332-
if (server["Remark"] != nil) {
333-
result = result && remark(server["Remark"] as! String);
334-
}
335-
if (server["Plugin"] != nil) {
336-
result = result && plugin(server["Plugin"] as! String);
337-
}
338-
if (server["PluginOptions"] != nil) {
339-
result = result && pluginOptions(server["PluginOptions"] as! String);
340-
}
341-
342-
return result;
343-
}
344-
345-
static func serverHost(_ str:String) -> Bool {
346-
return validateIpAddress(str) || validateDomainName(str);
347-
}
348-
349-
static func serverPort(_ str:uint16) -> Bool {
350-
return true;
351-
}
352-
353-
static func method(_ str:String) -> Bool {
354-
// Copy from PreferencesWindowController.swift
355-
// Better to make valid methods enumeration type.
356-
return [
357-
"aes-128-gcm",
358-
"aes-192-gcm",
359-
"aes-256-gcm",
360-
"aes-128-cfb",
361-
"aes-192-cfb",
362-
"aes-256-cfb",
363-
"aes-128-ctr",
364-
"aes-192-ctr",
365-
"aes-256-ctr",
366-
"camellia-128-cfb",
367-
"camellia-192-cfb",
368-
"camellia-256-cfb",
369-
"bf-cfb",
370-
"chacha20-ietf-poly1305",
371-
"xchacha20-ietf-poly1305",
372-
"salsa20",
373-
"chacha20",
374-
"chacha20-ietf",
375-
"rc4-md5",
376-
].contains(str);
377-
}
378-
379-
static func password(_ str:String) -> Bool {
380-
return true;
381-
}
382-
383-
static func remark(_ str:String) -> Bool {
384-
return true;
385-
}
386-
387-
static func plugin(_ str:String) -> Bool {
388-
return true;
389-
}
390-
391-
static func pluginOptions(_ str:String) -> Bool {
392-
return true;
393-
}
394-
395-
// Copy from ServerProfile.swift
396-
private static func validateIpAddress(_ ipToValidate: String) -> Bool {
397-
398-
var sin = sockaddr_in()
399-
var sin6 = sockaddr_in6()
400-
401-
if ipToValidate.withCString({ cstring in inet_pton(AF_INET6, cstring, &sin6.sin6_addr) }) == 1 {
402-
// IPv6 peer.
403-
return true
404-
}
405-
else if ipToValidate.withCString({ cstring in inet_pton(AF_INET, cstring, &sin.sin_addr) }) == 1 {
406-
// IPv4 peer.
407-
return true
408-
}
409-
410-
return false;
411-
}
412-
413-
// Copy from ServerProfile.swift
414-
private static func validateDomainName(_ value: String) -> Bool {
415-
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])$"
416-
417-
if (value.range(of: validHostnameRegex, options: .regularExpression) != nil) {
418-
return true
419-
} else {
420-
return false
421-
}
422-
}
423-
}

ShadowsocksX-NG/Utils.swift

Lines changed: 119 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,126 @@ extension Data {
2424
}
2525
}
2626

27-
enum ProxyType {
28-
case pac
29-
case global
30-
}
27+
enum ProxyType:String {case pac="auto", global="global", manual="manual"};
3128

3229
struct Globals {
3330
static var proxyType = ProxyType.pac
3431
}
32+
33+
class Validator {
34+
// Check if a ServerProfile can be constructed from input dictionary
35+
static func profile(_ data: Dictionary<String, Any>) -> Bool {
36+
if (data["ServerHost"] == nil || data["ServerPort"] as? NSNumber == nil
37+
|| data["Method"] == nil || data["Password"] == nil) {
38+
return false;
39+
}
40+
return existAttributes(data);
41+
}
42+
43+
static func existAttributes(_ server:Dictionary<String, Any>) -> Bool {
44+
var result = true;
45+
46+
if (server["ServerHost"] != nil) {
47+
result = result && serverHost(server["ServerHost"] as! String);
48+
}
49+
if (server["ServerPort"] != nil) {
50+
result = result && serverPort(server["ServerPort"] as! uint16);
51+
}
52+
if (server["Method"] != nil) {
53+
result = result && method(server["Method"] as! String);
54+
}
55+
if (server["Password"] != nil) {
56+
result = result && password(server["Password"] as! String);
57+
}
58+
if (server["Remark"] != nil) {
59+
result = result && remark(server["Remark"] as! String);
60+
}
61+
if (server["Plugin"] != nil) {
62+
result = result && plugin(server["Plugin"] as! String);
63+
}
64+
if (server["PluginOptions"] != nil) {
65+
result = result && pluginOptions(server["PluginOptions"] as! String);
66+
}
67+
68+
return result;
69+
}
70+
71+
static func serverHost(_ str:String) -> Bool {
72+
return validateIpAddress(str) || validateDomainName(str);
73+
}
74+
75+
static func serverPort(_ str:uint16) -> Bool {
76+
return true;
77+
}
78+
79+
static func method(_ str:String) -> Bool {
80+
// Copy from PreferencesWindowController.swift
81+
// Better to make valid methods enumeration type.
82+
return [
83+
"aes-128-gcm",
84+
"aes-192-gcm",
85+
"aes-256-gcm",
86+
"aes-128-cfb",
87+
"aes-192-cfb",
88+
"aes-256-cfb",
89+
"aes-128-ctr",
90+
"aes-192-ctr",
91+
"aes-256-ctr",
92+
"camellia-128-cfb",
93+
"camellia-192-cfb",
94+
"camellia-256-cfb",
95+
"bf-cfb",
96+
"chacha20-ietf-poly1305",
97+
"xchacha20-ietf-poly1305",
98+
"salsa20",
99+
"chacha20",
100+
"chacha20-ietf",
101+
"rc4-md5",
102+
].contains(str);
103+
}
104+
105+
static func password(_ str:String) -> Bool {
106+
return str != "";
107+
}
108+
109+
static func remark(_ str:String) -> Bool {
110+
return true;
111+
}
112+
113+
static func plugin(_ str:String) -> Bool {
114+
return true;
115+
}
116+
117+
static func pluginOptions(_ str:String) -> Bool {
118+
return true;
119+
}
120+
121+
// Copy from ServerProfile.swift
122+
private static func validateIpAddress(_ ipToValidate: String) -> Bool {
123+
124+
var sin = sockaddr_in()
125+
var sin6 = sockaddr_in6()
126+
127+
if ipToValidate.withCString({ cstring in inet_pton(AF_INET6, cstring, &sin6.sin6_addr) }) == 1 {
128+
// IPv6 peer.
129+
return true
130+
}
131+
else if ipToValidate.withCString({ cstring in inet_pton(AF_INET, cstring, &sin.sin_addr) }) == 1 {
132+
// IPv4 peer.
133+
return true
134+
}
135+
136+
return false;
137+
}
138+
139+
// Copy from ServerProfile.swift
140+
private static func validateDomainName(_ value: String) -> Bool {
141+
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])$"
142+
143+
if (value.range(of: validHostnameRegex, options: .regularExpression) != nil) {
144+
return true
145+
} else {
146+
return false
147+
}
148+
}
149+
}

0 commit comments

Comments
 (0)