Skip to content
This repository was archived by the owner on Dec 14, 2021. It is now read-only.

Commit a05728f

Browse files
authored
make sure credential provider works appropriately when not authenticated (#1031)
* make sure credential provider works appropriately when not authenticated * use map syntax
1 parent 44f9ff5 commit a05728f

File tree

4 files changed

+56
-5
lines changed

4 files changed

+56
-5
lines changed

CredentialProvider/Presenter/CredentialProviderPresenter.swift

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,14 @@ class CredentialProviderPresenter {
4848
self.credentialProviderStore = credentialProviderStore
4949

5050
self.accountStore.syncCredentials
51-
.filterNil()
52-
.bind { [weak self] (syncInfo) in
53-
self?.dispatcher.dispatch(action: DataStoreAction.updateCredentials(syncInfo: syncInfo))
51+
.map { syncInfo -> Action in
52+
if let credentials = syncInfo {
53+
return DataStoreAction.updateCredentials(syncInfo: credentials)
54+
} else {
55+
return DataStoreAction.reset
56+
}
5457
}
58+
.bind { self.dispatcher.dispatch(action: $0) }
5559
.disposed(by: self.disposeBag)
5660

5761
self.dispatcher.register
@@ -130,6 +134,14 @@ class CredentialProviderPresenter {
130134
}
131135
})
132136
.disposed(by: self.credentialProvisionBag)
137+
138+
self.dataStore.storageState
139+
.filter { $0 == .Unprepared }
140+
.asDriver(onErrorJustReturn: .Unprepared)
141+
.drive(onNext: { [weak self] _ in
142+
self?.view?.displayWelcome()
143+
})
144+
.disposed(by: self.credentialProvisionBag)
133145
}
134146
}
135147

CredentialProvider/Presenter/CredentialWelcomePresenter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class CredentialWelcomePresenter: BaseWelcomePresenter {
2222

2323
private var okButtonObserver: AnyObserver<Void> {
2424
return Binder(self) { target, _ in
25-
self.dispatcher.dispatch(action: CredentialStatusAction.extensionConfigured)
25+
self.dispatcher.dispatch(action: CredentialStatusAction.cancelled(error: .userCanceled))
2626
}.asObserver()
2727
}
2828

CredentialProvider/View/CredentialProviderView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class CredentialProviderView: ASCredentialProviderViewController {
2424
oldViewController.removeFromParent()
2525
}
2626
}
27-
27+
2828
override var preferredStatusBarStyle: UIStatusBarStyle {
2929
return self.currentViewController?.preferredStatusBarStyle ?? .lightContent
3030
}

lockbox-iosTests/CredentialProviderPresenterSpec.swift

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,16 @@ class CredentialProviderPresenterSpec: QuickSpec {
7171
}
7272

7373
class FakeDataStore: DataStore {
74+
let stateStub = ReplaySubject<LoginStoreState>.create(bufferSize: 1)
7475
let lockedStub = ReplaySubject<Bool>.create(bufferSize: 1)
7576
let getStub = PublishSubject<LoginRecord?>()
7677

7778
var getGuid: String?
7879

80+
override var storageState: Observable<LoginStoreState> {
81+
return self.stateStub.asObservable()
82+
}
83+
7984
override var locked: Observable<Bool> {
8085
return self.lockedStub.asObservable()
8186
}
@@ -112,6 +117,30 @@ class CredentialProviderPresenterSpec: QuickSpec {
112117
dataStore: self.dataStore)
113118
}
114119

120+
describe("passing along sync credentials") {
121+
describe("nil credentials") {
122+
beforeEach {
123+
self.accountStore._syncCredentials.onNext(nil)
124+
}
125+
126+
it("resets the datastore") {
127+
let action = self.dispatcher.actionArguments.popLast() as! DataStoreAction
128+
expect(action).to(equal(DataStoreAction.reset))
129+
}
130+
}
131+
132+
describe("populated credentials") {
133+
beforeEach {
134+
self.accountStore._syncCredentials.onNext(OfflineSyncCredential)
135+
}
136+
137+
it("passes them along to the datastore") {
138+
let action = self.dispatcher.actionArguments.popLast() as! DataStoreAction
139+
expect(action).to(equal(DataStoreAction.updateCredentials(syncInfo: OfflineSyncCredential)))
140+
}
141+
}
142+
}
143+
115144
describe("CredentialStatusAction") {
116145
describe("extensionConfigured") {
117146
beforeEach {
@@ -331,6 +360,16 @@ class CredentialProviderPresenterSpec: QuickSpec {
331360
self.subject.credentialList(for: [] as! [ASCredentialServiceIdentifier])
332361
}
333362

363+
describe("when the datastore is unprepared") {
364+
beforeEach {
365+
self.dataStore.stateStub.onNext(.Unprepared)
366+
}
367+
368+
it("routes to the welcome view") {
369+
expect(self.view.displayWelcomeCalled).to(beTrue())
370+
}
371+
}
372+
334373
describe("when the datastore is locked") {
335374
beforeEach {
336375
self.dataStore.lockedStub.onNext(true)

0 commit comments

Comments
 (0)