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,8 +490,44 @@ 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://", ""]
return account.postbox.transaction { transaction -> Signal<ResolvedUrl, NoError> in
let appConfiguration: AppConfiguration = transaction.getPreferencesEntry(key: PreferencesKeys.appConfiguration) as? AppConfiguration ?? AppConfiguration.defaultValue
let urlHandlingConfiguration = UrlHandlingConfiguration.with(appConfiguration: appConfiguration)
var url = url
if let urlValue = URL(string: url), let host = urlValue.host, urlHandlingConfiguration.domains.contains(host), var components = URLComponents(string: url) {
components.scheme = "https"
var queryItems = components.queryItems ?? []
queryItems.append(URLQueryItem(name: "autologin_token", value: urlHandlingConfiguration.token))
components.queryItems = queryItems
url = components.url?.absoluteString ?? url
}
for basePath in baseTelegramMePaths { for basePath in baseTelegramMePaths {
for scheme in schemes { for scheme in schemes {
let basePrefix = scheme + basePath + "/" let basePrefix = scheme + basePath + "/"
@ -520,6 +556,7 @@ public func resolveUrlImpl(account: Account, url: String) -> Signal<ResolvedUrl,
} }
} }
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> {