Fixes #903.
This commit is contained in:
@ -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: "",
|
||||||
|
@ -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://")!
|
||||||
|
Reference in New Issue
Block a user