mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-07-04 10:30:42 +00:00
70 lines
2.1 KiB
Swift
70 lines
2.1 KiB
Swift
import Foundation
|
|
|
|
private let whitelistedHosts: Set<String> = Set([
|
|
"t.me",
|
|
"telegram.me"
|
|
])
|
|
|
|
public func isConcealedUrlWhitelisted(_ url: URL) -> Bool {
|
|
if let host = url.host, whitelistedHosts.contains(host) {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
public func parseUrl(url: String, wasConcealed: Bool) -> (string: String, concealed: Bool) {
|
|
var parsedUrlValue: URL?
|
|
if url.hasPrefix("tel:") {
|
|
return (url, false)
|
|
} else if let parsed = URL(string: url) {
|
|
parsedUrlValue = parsed
|
|
} else if let parsed = URL(string: "https://" + url) {
|
|
parsedUrlValue = parsed
|
|
} else if let encoded = url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let parsed = URL(string: encoded) {
|
|
parsedUrlValue = parsed
|
|
}
|
|
let host = parsedUrlValue?.host ?? url
|
|
|
|
let rawHost = (host as NSString).removingPercentEncoding ?? host
|
|
var latin = CharacterSet()
|
|
latin.insert(charactersIn: "A"..."Z")
|
|
latin.insert(charactersIn: "a"..."z")
|
|
latin.insert(charactersIn: "0"..."9")
|
|
var punctuation = CharacterSet()
|
|
punctuation.insert(charactersIn: ".-/+_")
|
|
var hasLatin = false
|
|
var hasNonLatin = false
|
|
for c in rawHost {
|
|
if c.unicodeScalars.allSatisfy(punctuation.contains) {
|
|
} else if c.unicodeScalars.allSatisfy(latin.contains) {
|
|
hasLatin = true
|
|
} else {
|
|
hasNonLatin = true
|
|
}
|
|
}
|
|
var concealed = wasConcealed
|
|
if hasLatin && hasNonLatin {
|
|
concealed = true
|
|
}
|
|
|
|
var rawDisplayUrl: String
|
|
if hasNonLatin {
|
|
rawDisplayUrl = url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? url
|
|
} else {
|
|
rawDisplayUrl = url
|
|
}
|
|
|
|
if let parsedUrlValue = parsedUrlValue, isConcealedUrlWhitelisted(parsedUrlValue) {
|
|
concealed = false
|
|
}
|
|
|
|
let whitelistedSchemes: [String] = [
|
|
"tel",
|
|
]
|
|
if let parsedUrlValue = parsedUrlValue, let scheme = parsedUrlValue.scheme, whitelistedSchemes.contains(scheme) {
|
|
concealed = false
|
|
}
|
|
|
|
return (rawDisplayUrl, concealed)
|
|
}
|