Files
ShadowsocksX-NG-R/ShadowsocksX-NG/Utils.swift
T
Rainux Luo 5e06b4b4f0 Support parse SS URL with query string
So we can encode Remark and OTA to query string
2017-01-09 18:16:35 +08:00

72 lines
1.9 KiB
Swift

//
// Utils.swift
// ShadowsocksX-NG
//
// Created by 邱宇舟 on 16/6/7.
// Copyright © 2016年 qiuyuzhou. All rights reserved.
//
import Foundation
extension String {
var localized: String {
return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
}
}
extension Data {
func sha1() -> String {
let data = self
var digest = [UInt8](repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH))
CC_SHA1((data as NSData).bytes, CC_LONG(data.count), &digest)
let hexBytes = digest.map { String(format: "%02hhx", $0) }
return hexBytes.joined(separator: "")
}
}
func ParseSSURL(_ url: URL?) -> [String: Any?]? {
func padBase64(string: String) -> String {
var length = string.characters.count
length = 4 - length % 4 + length
return string.padding(toLength: length, withPad: "=", startingAt: 0)
}
if url?.host == nil {
return nil
}
var plainUrl: URLComponents! = URLComponents(url: url!,
resolvingAgainstBaseURL: false)
let data = Data(base64Encoded: padBase64(string: url!.host!),
options: Data.Base64DecodingOptions())
if data != nil {
let decoded = String(data: data!, encoding: String.Encoding.utf8)
plainUrl = URLComponents(string: "ss://\(decoded!)")
if plainUrl == nil {
return nil
}
}
let remark = plainUrl.queryItems?
.filter({ $0.name == "Remark" }).first?.value
let otaStr = plainUrl.queryItems?
.filter({ $0.name == "OTA" }).first?.value
var ota: Bool? = nil
if otaStr != nil {
ota = NSString(string: otaStr!).boolValue
}
return ["ServerHost": plainUrl.host,
"ServerPort": UInt16(plainUrl.port!),
"Method": plainUrl.user,
"Password": plainUrl.password,
"Remark": remark,
"OTA": ota,
]
}