Skip to content

Commit 3e9ff89

Browse files
author
Stephan Leroux
committed
Bug 1252637 - Added clearing of existing authentication info along with profile clearing on app installation
1 parent b9d3b8d commit 3e9ff89

File tree

5 files changed

+43
-27
lines changed

5 files changed

+43
-27
lines changed

Client.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,7 @@
527527
E65C5BE01BEA522600D28BEF /* UIImage+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = E65C5BDD1BEA522600D28BEF /* UIImage+Snapshot.m */; };
528528
E65C5BE41BEA525800D28BEF /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E65C5BE21BEA525800D28BEF /* Info.plist */; };
529529
E65D895A1C8753CE0006EA35 /* SystemUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E65D89591C8753CE0006EA35 /* SystemUtils.swift */; };
530+
E65D89811C8778940006EA35 /* AuthenticationKeychainInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E65D89801C8778940006EA35 /* AuthenticationKeychainInfo.swift */; };
530531
E660BDD91BB06521009AC090 /* TabsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = E660BDD81BB06521009AC090 /* TabsButton.swift */; };
531532
E660BE061BB0666D009AC090 /* InnerStrokedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E660BE051BB0666D009AC090 /* InnerStrokedView.swift */; };
532533
E663D5781BB341C4001EF30E /* ToggleButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = E663D5771BB341C4001EF30E /* ToggleButton.swift */; };
@@ -540,7 +541,6 @@
540541
E6927ECF1C7B722300D03F75 /* ErrorToastRefTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6927ECE1C7B722300D03F75 /* ErrorToastRefTests.swift */; };
541542
E692E3291C46E62D009D1240 /* AuthenticationSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E692E3281C46E62D009D1240 /* AuthenticationSettingsViewController.swift */; };
542543
E692E3371C46E86A009D1240 /* AppSettingsOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E692E3361C46E86A009D1240 /* AppSettingsOptions.swift */; };
543-
E694AAF01C77AFEC00415F4B /* AuthenticationKeychainInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E694AAEF1C77AFEC00415F4B /* AuthenticationKeychainInfo.swift */; };
544544
E695D8651C037E9F00D3FCCE /* FSUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = E695D8631C037E9F00D3FCCE /* FSUtils.h */; };
545545
E695D8661C037E9F00D3FCCE /* FSUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = E695D8641C037E9F00D3FCCE /* FSUtils.m */; };
546546
E695D8681C03804F00D3FCCE /* FSUtilsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E695D8671C03804F00D3FCCE /* FSUtilsTests.swift */; };
@@ -1518,6 +1518,7 @@
15181518
E65C5BE21BEA525800D28BEF /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
15191519
E65C5BE31BEA525800D28BEF /* NativeRefTests-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NativeRefTests-Bridging-Header.h"; sourceTree = "<group>"; };
15201520
E65D89591C8753CE0006EA35 /* SystemUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SystemUtils.swift; sourceTree = "<group>"; };
1521+
E65D89801C8778940006EA35 /* AuthenticationKeychainInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthenticationKeychainInfo.swift; sourceTree = "<group>"; };
15211522
E660BDD81BB06521009AC090 /* TabsButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TabsButton.swift; sourceTree = "<group>"; };
15221523
E660BE051BB0666D009AC090 /* InnerStrokedView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InnerStrokedView.swift; sourceTree = "<group>"; };
15231524
E6639F171BF11E17002D0853 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
@@ -1533,7 +1534,6 @@
15331534
E6927ECE1C7B722300D03F75 /* ErrorToastRefTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ErrorToastRefTests.swift; sourceTree = "<group>"; };
15341535
E692E3281C46E62D009D1240 /* AuthenticationSettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthenticationSettingsViewController.swift; sourceTree = "<group>"; };
15351536
E692E3361C46E86A009D1240 /* AppSettingsOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppSettingsOptions.swift; sourceTree = "<group>"; };
1536-
E694AAEF1C77AFEC00415F4B /* AuthenticationKeychainInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthenticationKeychainInfo.swift; sourceTree = "<group>"; };
15371537
E695D8631C037E9F00D3FCCE /* FSUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FSUtils.h; sourceTree = "<group>"; };
15381538
E695D8641C037E9F00D3FCCE /* FSUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FSUtils.m; sourceTree = "<group>"; };
15391539
E695D8671C03804F00D3FCCE /* FSUtilsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSUtilsTests.swift; sourceTree = "<group>"; };
@@ -2471,6 +2471,7 @@
24712471
6BE4ACF81B0657180092AEBE /* Accessibility.swift */,
24722472
0BAC7A7F1AC4B135006018CB /* AppConstants.swift */,
24732473
28E8BE7E1B792A89002CC733 /* AppInfo.swift */,
2474+
E65D89801C8778940006EA35 /* AuthenticationKeychainInfo.swift */,
24742475
E4E7EB451C4A85D80094275D /* SupportUtils.swift */,
24752476
E66464ED1C10D98000AF05CE /* AssertionUtils.swift */,
24762477
2FCAE2401ABB531100877008 /* Bytes.swift */,
@@ -2695,7 +2696,6 @@
26952696
E692E3271C46E62D009D1240 /* AuthenticationManager */ = {
26962697
isa = PBXGroup;
26972698
children = (
2698-
E694AAEF1C77AFEC00415F4B /* AuthenticationKeychainInfo.swift */,
26992699
E69E06C81C76198000D0F926 /* AuthenticationManagerConstants.swift */,
27002700
E692E3281C46E62D009D1240 /* AuthenticationSettingsViewController.swift */,
27012701
E640E8691C73A47C00C5F072 /* PasscodeViews.swift */,
@@ -4005,6 +4005,7 @@
40054005
D339C2831AD354B400C087BD /* Loader.swift in Sources */,
40064006
288501FB1AC0F63800E7F670 /* NSScannerExtensions.swift in Sources */,
40074007
E6F9659E1B2F63A20034B023 /* NSStringExtensions.swift in Sources */,
4008+
E65D89811C8778940006EA35 /* AuthenticationKeychainInfo.swift in Sources */,
40084009
6BE4ACF91B0657180092AEBE /* Accessibility.swift in Sources */,
40094010
288A2DAA1AB8B3700023ABC3 /* Box.swift in Sources */,
40104011
281B2C081ADF4F29002917DC /* DeferredUtils.swift in Sources */,
@@ -4376,7 +4377,6 @@
43764377
28EADE5D1AFC3A78007FB2FB /* UIImageViewExtensions.swift in Sources */,
43774378
D3968F251A38FE8500CEFD3B /* TabManager.swift in Sources */,
43784379
2816F0001B33E05400522243 /* UIConstants.swift in Sources */,
4379-
E694AAF01C77AFEC00415F4B /* AuthenticationKeychainInfo.swift in Sources */,
43804380
7B59FC471C68E9B600F58EF5 /* SWUtilityButtonTapGestureRecognizer.m in Sources */,
43814381
D39949F51C22461A00E2A03C /* RequestDesktopSiteActivity.swift in Sources */,
43824382
D3A9949D1A3686BD008AD1AC /* Browser.swift in Sources */,

Client/Frontend/AuthenticationManager/AuthenticationManagerConstants.swift

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import Foundation
66
import Shared
77

8-
// Passcode intervals with rawValue in seconds.
9-
enum PasscodeInterval: Int {
8+
// Strings for the passcode intervals.
9+
extension PasscodeInterval {
1010
var settingTitle: String {
1111
switch self {
1212
case .Immediately: return AuthenticationStrings.immediately
@@ -17,13 +17,6 @@ enum PasscodeInterval: Int {
1717
case .OneHour: return AuthenticationStrings.oneHour
1818
}
1919
}
20-
21-
case Immediately = 0
22-
case OneMinute = 60
23-
case FiveMinutes = 300
24-
case TenMinutes = 600
25-
case FifteenMinutes = 900
26-
case OneHour = 3600
2720
}
2821

2922
// Strings used in multiple areas within the Authentication Manager

ClientTests/ProfileTest.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import Foundation
77
import Shared
88
import Storage
9+
import SwiftKeychainWrapper
910

1011
import XCTest
1112

@@ -16,4 +17,12 @@ class ProfileTest: XCTestCase {
1617
func withTestProfile(callback: (profile: Profile) -> Void) {
1718
callback(profile: MockProfile())
1819
}
20+
21+
func testNewProfileClearsExistingAuthenticationInfo() {
22+
let authInfo = AuthenticationKeychainInfo(passcode: "1234")
23+
KeychainWrapper.setAuthenticationInfo(authInfo)
24+
XCTAssertNotNil(KeychainWrapper.authenticationInfo())
25+
let _ = BrowserProfile(localName: "my_profile")
26+
XCTAssertNil(KeychainWrapper.authenticationInfo())
27+
}
1928
}

Providers/Profile.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ public class BrowserProfile: Profile {
219219
log.info("New profile. Removing old account metadata.")
220220
self.removeAccountMetadata()
221221
self.syncManager.onNewProfile()
222+
self.removeExistingAuthenticationInfo()
222223
prefs.clearAll()
223224
}
224225

@@ -468,6 +469,10 @@ public class BrowserProfile: Profile {
468469
KeychainWrapper.removeObjectForKey(self.name + ".account")
469470
}
470471

472+
func removeExistingAuthenticationInfo() {
473+
KeychainWrapper.setAuthenticationInfo(nil)
474+
}
475+
471476
func removeAccount() {
472477
let old = self.account
473478
removeAccountMetadata()
Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,23 @@
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

55
import Foundation
6-
import Shared
76
import SwiftKeychainWrapper
87

98
public let KeychainKeyAuthenticationInfo = "authenticationInfo"
109
public let AllowedPasscodeFailedAttempts = 3
1110

11+
// Passcode intervals with rawValue in seconds.
12+
public enum PasscodeInterval: Int {
13+
case Immediately = 0
14+
case OneMinute = 60
15+
case FiveMinutes = 300
16+
case TenMinutes = 600
17+
case FifteenMinutes = 900
18+
case OneHour = 3600
19+
}
20+
1221
// MARK: - Helper methods for accessing Authentication information from the Keychain
13-
extension KeychainWrapper {
22+
public extension KeychainWrapper {
1423
class func authenticationInfo() -> AuthenticationKeychainInfo? {
1524
return KeychainWrapper.objectForKey(KeychainKeyAuthenticationInfo) as? AuthenticationKeychainInfo
1625
}
@@ -24,23 +33,23 @@ extension KeychainWrapper {
2433
}
2534
}
2635

27-
class AuthenticationKeychainInfo: NSObject, NSCoding {
28-
private(set) var lastPasscodeValidationInterval: NSTimeInterval?
29-
private(set) var passcode: String?
30-
private(set) var requiredPasscodeInterval: PasscodeInterval?
31-
private(set) var lockOutInterval: NSTimeInterval?
32-
private(set) var failedAttempts: Int
36+
public class AuthenticationKeychainInfo: NSObject, NSCoding {
37+
private(set) public var lastPasscodeValidationInterval: NSTimeInterval?
38+
private(set) public var passcode: String?
39+
private(set) public var requiredPasscodeInterval: PasscodeInterval?
40+
private(set) public var lockOutInterval: NSTimeInterval?
41+
private(set) public var failedAttempts: Int
3342

3443
// Timeout period before user can retry entering passcodes
35-
var lockTimeInterval: NSTimeInterval = 15 * 60
44+
public var lockTimeInterval: NSTimeInterval = 15 * 60
3645

37-
init(passcode: String) {
46+
public init(passcode: String) {
3847
self.passcode = passcode
3948
self.requiredPasscodeInterval = .Immediately
4049
self.failedAttempts = 0
4150
}
4251

43-
func encodeWithCoder(aCoder: NSCoder) {
52+
public func encodeWithCoder(aCoder: NSCoder) {
4453
if let lastPasscodeValidationInterval = lastPasscodeValidationInterval {
4554
let interval = NSNumber(double: lastPasscodeValidationInterval)
4655
aCoder.encodeObject(interval, forKey: "lastPasscodeValidationInterval")
@@ -56,7 +65,7 @@ class AuthenticationKeychainInfo: NSObject, NSCoding {
5665
aCoder.encodeInteger(failedAttempts, forKey: "failedAttempts")
5766
}
5867

59-
required init?(coder aDecoder: NSCoder) {
68+
public required init?(coder aDecoder: NSCoder) {
6069
self.lastPasscodeValidationInterval = (aDecoder.decodeObjectForKey("lastPasscodeValidationInterval") as? NSNumber)?.doubleValue
6170
self.lockOutInterval = (aDecoder.decodeObjectForKey("lockOutInterval") as? NSNumber)?.doubleValue
6271
self.passcode = aDecoder.decodeObjectForKey("passcode") as? String
@@ -68,7 +77,7 @@ class AuthenticationKeychainInfo: NSObject, NSCoding {
6877
}
6978

7079
// MARK: - API
71-
extension AuthenticationKeychainInfo {
80+
public extension AuthenticationKeychainInfo {
7281
private func resetLockoutState() {
7382
self.failedAttempts = 0
7483
self.lockOutInterval = nil
@@ -126,4 +135,4 @@ extension AuthenticationKeychainInfo {
126135
return SystemUtils.systemUptime() - lastValidationInterval > Double(requireInterval.rawValue) ||
127136
SystemUtils.systemUptime() < lastValidationInterval
128137
}
129-
}
138+
}

0 commit comments

Comments
 (0)