This commit is contained in:
Qiu Yuzhou
2018-09-24 23:54:04 +08:00
parent bc57db4502
commit 84229f5eaa
2 changed files with 29 additions and 10 deletions

View File

@ -44,21 +44,28 @@ class ServerProfile: NSObject, NSCopying {
} }
} }
func decodeUrl(url: URL) -> String? { func decodeUrl(url: URL) -> (String?,String?) {
let urlStr = url.absoluteString let urlStr = url.absoluteString
let index = urlStr.index(urlStr.startIndex, offsetBy: 5) let base64Begin = urlStr.index(urlStr.startIndex, offsetBy: 5)
let encodedStr = urlStr[index...] let base64End = urlStr.firstIndex(of: "#")
guard let data = Data(base64Encoded: padBase64(string: String(encodedStr))) else { let encodedStr = String(urlStr[base64Begin..<(base64End ?? urlStr.endIndex)])
return url.absoluteString guard let data = Data(base64Encoded: padBase64(string: encodedStr)) else {
return (url.absoluteString, nil)
} }
guard let decoded = String(data: data, encoding: String.Encoding.utf8) else { guard let decoded = String(data: data, encoding: String.Encoding.utf8) else {
return nil return (nil, nil)
} }
let s = decoded.trimmingCharacters(in: CharacterSet(charactersIn: "\n")) let s = decoded.trimmingCharacters(in: CharacterSet(charactersIn: "\n"))
return "ss://\(s)"
if let index = base64End {
let i = urlStr.index(index, offsetBy: 1)
let fragment = String(urlStr[i...])
return ("ss://\(s)", fragment)
}
return ("ss://\(s)", nil)
} }
let (_decodedUrl, _tag) = decodeUrl(url: url)
guard let decodedUrl = decodeUrl(url: url) else { guard let decodedUrl = _decodedUrl else {
return nil return nil
} }
guard var parsedUrl = URLComponents(string: decodedUrl) else { guard var parsedUrl = URLComponents(string: decodedUrl) else {
@ -79,6 +86,9 @@ class ServerProfile: NSObject, NSCopying {
if let password = parsedUrl.password { if let password = parsedUrl.password {
self.method = user.lowercased() self.method = user.lowercased()
self.password = password self.password = password
if let tag = _tag {
remark = tag
}
} else { } else {
// SIP002 URL have no password section // SIP002 URL have no password section
guard let data = Data(base64Encoded: padBase64(string: user)), guard let data = Data(base64Encoded: padBase64(string: user)),
@ -232,7 +242,7 @@ class ServerProfile: NSObject, NSCopying {
url.password = password url.password = password
url.port = Int(serverPort) url.port = Int(serverPort)
url.queryItems = [URLQueryItem(name: "Remark", value: remark)] url.fragment = remark
let parts = url.string?.replacingOccurrences( let parts = url.string?.replacingOccurrences(
of: "//", with: "", of: "//", with: "",

View File

@ -111,6 +111,15 @@ class ServerProfileTests: XCTestCase {
XCTAssertEqual(profile?.password, "password") XCTAssertEqual(profile?.password, "password")
XCTAssertEqual(profile?.remark, "Prism") XCTAssertEqual(profile?.remark, "Prism")
} }
func testInitWithLegacyBase64EncodedURLWithTag() {
let url = URL(string: "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4Cg#example-server")!
let profile = ServerProfile(url: url)
XCTAssertNotNil(profile)
XCTAssertEqual(profile?.remark, "example-server")
}
func testInitWithEmptyURL() { func testInitWithEmptyURL() {
let url = URL(string: "ss://")! let url = URL(string: "ss://")!