diff --git a/WordPress/Classes/Models/Blog+SelfHosted.swift b/WordPress/Classes/Models/Blog+SelfHosted.swift index a26c16aae480..7f3ac5be4c22 100644 --- a/WordPress/Classes/Models/Blog+SelfHosted.swift +++ b/WordPress/Classes/Models/Blog+SelfHosted.swift @@ -55,6 +55,18 @@ extension Blog { try keychainImplementation.getPassword(for: self.getUsername(), serviceName: self.getUrlString()) } + /// Delete Application Token + /// + func deleteApplicationToken(using keychainImplementation: KeychainAccessible = KeychainUtils()) throws { + try? keychainImplementation.setPassword(for: self.getUsername(), to: nil, serviceName: self.getUrlString()) + } + + @available(swift, obsoleted: 1.0) + @objc(deleteApplicationToken) + func objc_deleteApplicationToken() { + _ = try? deleteApplicationToken() + } + /// Store Application Tokens /// func setApplicationToken( diff --git a/WordPress/Classes/Models/Blog.m b/WordPress/Classes/Models/Blog.m index 890f0484b376..68ffd1c95745 100644 --- a/WordPress/Classes/Models/Blog.m +++ b/WordPress/Classes/Models/Blog.m @@ -106,8 +106,23 @@ - (void)prepareForDeletion self.password = nil; } + if (self.account == nil) { + [self deleteApplicationToken]; + } + [_xmlrpcApi invalidateAndCancelTasks]; [_selfHostedSiteRestApi invalidateAndCancelTasks]; + + // Remove the self-hosted site cookies from the shared cookie storage. + if (self.account == nil && self.url != nil) { + NSURL *siteURL = [NSURL URLWithString:self.url]; + if (siteURL != nil) { + NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; + for (NSHTTPCookie *cookie in [cookieJar cookiesForURL:siteURL]) { + [cookieJar deleteCookie:cookie]; + } + } + } } - (void)didTurnIntoFault diff --git a/WordPress/Classes/Utility/KeychainUtils.swift b/WordPress/Classes/Utility/KeychainUtils.swift index 07b4716e50cb..ee71c72dc7c3 100644 --- a/WordPress/Classes/Utility/KeychainUtils.swift +++ b/WordPress/Classes/Utility/KeychainUtils.swift @@ -41,12 +41,16 @@ extension KeychainUtils: KeychainAccessible { try self.keychainUtils.getPasswordForUsername(username, andServiceName: serviceName) } - func setPassword(for username: String, to newValue: String, serviceName: String) throws { - try keychainUtils.storeUsername(username, andPassword: newValue, forServiceName: serviceName, updateExisting: true) + func setPassword(for username: String, to newValue: String?, serviceName: String) throws { + if let newValue { + try keychainUtils.storeUsername(username, andPassword: newValue, forServiceName: serviceName, updateExisting: true) + } else { + try keychainUtils.deleteItem(forUsername: username, andServiceName: serviceName) + } } } protocol KeychainAccessible { func getPassword(for username: String, serviceName: String) throws -> String - func setPassword(for username: String, to newValue: String, serviceName: String) throws + func setPassword(for username: String, to newValue: String?, serviceName: String) throws } diff --git a/WordPress/WordPressTest/TestKeychain.swift b/WordPress/WordPressTest/TestKeychain.swift index 319795894b31..486507413433 100644 --- a/WordPress/WordPressTest/TestKeychain.swift +++ b/WordPress/WordPressTest/TestKeychain.swift @@ -21,7 +21,11 @@ class TestKeychain: KeychainAccessible { return keychainItem.password } - func setPassword(for username: String, to newValue: String, serviceName: String) throws { - keychain[serviceName] = KeychainItem(username: username, password: newValue) + func setPassword(for username: String, to newValue: String?, serviceName: String) throws { + if let newValue { + keychain[serviceName] = KeychainItem(username: username, password: newValue) + } else { + keychain[serviceName] = nil + } } }