Fix a just-deleted server being readded using old info (#2093)

The cache for server infos was inserting the old 'fallback' value when read after deletion, which caused it to be used if the server was re-added while the app was still in memory afterwards.
This commit is contained in:
Zac West
2022-02-26 17:49:34 -08:00
committed by GitHub
parent 326d9a2c04
commit f88fea30dc
2 changed files with 19 additions and 3 deletions

View File

@@ -93,8 +93,18 @@ private extension Identifier where ObjectType == Server {
private struct ServerCache {
var restrictCaching: Bool = false
var deletedServers: Set<Identifier<Server>> = .init()
var info: [Identifier<Server>: ServerInfo] = [:]
var server: [Identifier<Server>: Server] = [:]
var info: [Identifier<Server>: ServerInfo] = [:] {
didSet {
precondition(deletedServers.isDisjoint(with: info.keys))
}
}
var server: [Identifier<Server>: Server] = [:] {
didSet {
precondition(deletedServers.isDisjoint(with: server.keys))
}
}
var all: [Server]?
mutating func remove(identifier: Identifier<Server>) {
@@ -208,6 +218,7 @@ internal final class ServerManagerImpl: ServerManager {
let result = cache.mutate { cache -> Server in
cache.deletedServers.remove(identifier)
keychain.set(serverInfo: setValue, key: identifier.keychainKey, encoder: encoder)
cache.info[identifier] = setValue
cache.all = nil
return server(key: identifier.keychainKey, value: setValue, currentCache: &cache)
@@ -261,7 +272,9 @@ internal final class ServerManagerImpl: ServerManager {
return info
} else {
let info = keychain.getServerInfo(key: identifier.keychainKey, decoder: decoder) ?? fallback
cache.info[identifier] = info
if !cache.deletedServers.contains(identifier) {
cache.info[identifier] = info
}
return info
}
}

View File

@@ -132,6 +132,9 @@ class ServerManagerTests: XCTestCase {
}
try XCTAssertNil(keychain.getData("fake1"))
// grab it, which may also side-effect insert into cache, if buggy
_ = server1.info
expectingObserver {
// we just deleted it, so we re-add it to make sure _that_ works
let tempFake1 = with(info1) {