Implement autologin token passthrough

This commit is contained in:
Ilya Laktyushin 2021-02-02 17:11:56 +04:00
parent 2485d6d997
commit ec5b5173e0

View File

@ -490,36 +490,73 @@ public func parseWallpaperUrl(_ url: String) -> WallpaperUrlParameter? {
return nil return nil
} }
private struct UrlHandlingConfiguration {
static var defaultValue: UrlHandlingConfiguration {
return UrlHandlingConfiguration(token: nil, domains: [])
}
public let token: String?
public let domains: [String]
fileprivate init(token: String?, domains: [String]) {
self.token = token
self.domains = domains
}
static func with(appConfiguration: AppConfiguration) -> UrlHandlingConfiguration {
if let data = appConfiguration.data, let token = data["autologin_token"] as? String, let domains = data["autologin_domains"] as? [String] {
return UrlHandlingConfiguration(token: token, domains: domains)
} else {
return .defaultValue
}
}
}
public func resolveUrlImpl(account: Account, url: String) -> Signal<ResolvedUrl, NoError> { public func resolveUrlImpl(account: Account, url: String) -> Signal<ResolvedUrl, NoError> {
let schemes = ["http://", "https://", ""] let schemes = ["http://", "https://", ""]
for basePath in baseTelegramMePaths {
for scheme in schemes { return account.postbox.transaction { transaction -> Signal<ResolvedUrl, NoError> in
let basePrefix = scheme + basePath + "/" let appConfiguration: AppConfiguration = transaction.getPreferencesEntry(key: PreferencesKeys.appConfiguration) as? AppConfiguration ?? AppConfiguration.defaultValue
if url.lowercased().hasPrefix(basePrefix) { let urlHandlingConfiguration = UrlHandlingConfiguration.with(appConfiguration: appConfiguration)
if let internalUrl = parseInternalUrl(query: String(url[basePrefix.endIndex...])) {
return resolveInternalUrl(account: account, url: internalUrl) var url = url
|> map { resolved -> ResolvedUrl in if let urlValue = URL(string: url), let host = urlValue.host, urlHandlingConfiguration.domains.contains(host), var components = URLComponents(string: url) {
if let resolved = resolved { components.scheme = "https"
return resolved var queryItems = components.queryItems ?? []
} else { queryItems.append(URLQueryItem(name: "autologin_token", value: urlHandlingConfiguration.token))
return .externalUrl(url) components.queryItems = queryItems
url = components.url?.absoluteString ?? url
}
for basePath in baseTelegramMePaths {
for scheme in schemes {
let basePrefix = scheme + basePath + "/"
if url.lowercased().hasPrefix(basePrefix) {
if let internalUrl = parseInternalUrl(query: String(url[basePrefix.endIndex...])) {
return resolveInternalUrl(account: account, url: internalUrl)
|> map { resolved -> ResolvedUrl in
if let resolved = resolved {
return resolved
} else {
return .externalUrl(url)
}
} }
} else {
return .single(.externalUrl(url))
} }
} else {
return .single(.externalUrl(url))
} }
} }
} }
} for basePath in baseTelegraPhPaths {
for basePath in baseTelegraPhPaths { for scheme in schemes {
for scheme in schemes { let basePrefix = scheme + basePath
let basePrefix = scheme + basePath if url.lowercased().hasPrefix(basePrefix) {
if url.lowercased().hasPrefix(basePrefix) { return resolveInstantViewUrl(account: account, url: url)
return resolveInstantViewUrl(account: account, url: url) }
} }
} }
} return .single(.externalUrl(url))
return .single(.externalUrl(url)) } |> switchToLatest
} }
public func resolveInstantViewUrl(account: Account, url: String) -> Signal<ResolvedUrl, NoError> { public func resolveInstantViewUrl(account: Account, url: String) -> Signal<ResolvedUrl, NoError> {