From 35ce609c773087b6970897705904e9f1b66f7656 Mon Sep 17 00:00:00 2001 From: Peter Iakovlev Date: Sat, 8 Dec 2018 18:09:14 +0400 Subject: [PATCH] Possible logout fix --- TelegramCore/Account.swift | 58 ++++++++++++++++++++++-------- TelegramCore/LoggingSettings.swift | 2 +- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/TelegramCore/Account.swift b/TelegramCore/Account.swift index d35c3ac8a7..1a2011884a 100644 --- a/TelegramCore/Account.swift +++ b/TelegramCore/Account.swift @@ -102,6 +102,47 @@ public func ==(lhs: AuthorizedAccountState.State, rhs: AuthorizedAccountState.St lhs.seq == rhs.seq } +private let accountRecordToActiveKeychainId = Atomic<[AccountRecordId: Int]>(value: [:]) + +private func makeExclusiveKeychain(id: AccountRecordId, postbox: Postbox) -> Keychain { + var keychainId = 0 + let _ = accountRecordToActiveKeychainId.modify { dict in + var dict = dict + if let value = dict[id] { + dict[id] = value + 1 + keychainId = value + 1 + } else { + keychainId = 0 + dict[id] = 0 + } + return dict + } + return Keychain(get: { key in + let enabled = accountRecordToActiveKeychainId.with { dict -> Bool in + return dict[id] == keychainId + } + if enabled { + return postbox.keychainEntryForKey(key) + } else { + return nil + } + }, set: { (key, data) in + let enabled = accountRecordToActiveKeychainId.with { dict -> Bool in + return dict[id] == keychainId + } + if enabled { + postbox.setKeychainEntryForKey(key, value: data) + } + }, remove: { key in + let enabled = accountRecordToActiveKeychainId.with { dict -> Bool in + return dict[id] == keychainId + } + if enabled { + postbox.removeKeychainEntryForKey(key) + } + }) +} + public class UnauthorizedAccount { public let networkArguments: NetworkInitializationArguments public let id: AccountRecordId @@ -141,14 +182,7 @@ public class UnauthorizedAccount { if masterDatacenterId == Int32(self.network.mtProto.datacenterId) { return .single(self) } else { - let postbox = self.postbox - let keychain = Keychain(get: { key in - return postbox.keychainEntryForKey(key) - }, set: { (key, data) in - postbox.setKeychainEntryForKey(key, value: data) - }, remove: { key in - postbox.removeKeychainEntryForKey(key) - }) + let keychain = makeExclusiveKeychain(id: self.id, postbox: self.postbox) return self.postbox.transaction { transaction -> (LocalizationSettings?, ProxySettings?, NetworkSettings?) in return (transaction.getPreferencesEntry(key: PreferencesKeys.localizationSettings) as? LocalizationSettings, transaction.getPreferencesEntry(key: PreferencesKeys.proxySettings) as? ProxySettings, transaction.getPreferencesEntry(key: PreferencesKeys.networkSettings) as? NetworkSettings) @@ -222,13 +256,7 @@ public func accountWithId(networkArguments: NetworkInitializationArguments, id: |> mapToSignal { (localizationSettings, proxySettings, networkSettings) -> Signal in let accountState = view.state - let keychain = Keychain(get: { key in - return postbox.keychainEntryForKey(key) - }, set: { (key, data) in - postbox.setKeychainEntryForKey(key, value: data) - }, remove: { key in - postbox.removeKeychainEntryForKey(key) - }) + let keychain = makeExclusiveKeychain(id: id, postbox: postbox) if let accountState = accountState { switch accountState { diff --git a/TelegramCore/LoggingSettings.swift b/TelegramCore/LoggingSettings.swift index d1960f5421..3fb299c27c 100644 --- a/TelegramCore/LoggingSettings.swift +++ b/TelegramCore/LoggingSettings.swift @@ -15,7 +15,7 @@ public final class LoggingSettings: AccountSharedData, Equatable { public let redactSensitiveData: Bool #if DEBUG - public static var defaultSettings = LoggingSettings(logToFile: false, logToConsole: false, redactSensitiveData: true) + public static var defaultSettings = LoggingSettings(logToFile: true, logToConsole: true, redactSensitiveData: true) #else public static var defaultSettings = LoggingSettings(logToFile: false, logToConsole: false, redactSensitiveData: true) #endif