diff --git a/src/app/modules/startup/internal/state_factory.nim b/src/app/modules/startup/internal/state_factory.nim index 2529aaeda0..dceab0a659 100644 --- a/src/app/modules/startup/internal/state_factory.nim +++ b/src/app/modules/startup/internal/state_factory.nim @@ -13,7 +13,9 @@ logScope: topics = "startup-module-state-factory" # Forward declaration +# General section proc createState*(stateToBeCreated: StateType, flowType: FlowType, backState: State): State +# Resolve state section proc ensureReaderAndCardPresenceOnboarding*(state: State, keycardFlowType: string, keycardEvent: KeycardEvent, controller: Controller): State proc ensureReaderAndCardPresenceLogin*(state: State, keycardFlowType: string, keycardEvent: KeycardEvent, controller: Controller): State proc ensureReaderAndCardPresenceAndResolveNextOnboardingState*(state: State, keycardFlowType: string, keycardEvent: KeycardEvent, controller: Controller): State @@ -76,290 +78,6 @@ include profile_fetching_timeout_state include profile_fetching_announcement_state include recover_old_user_state -proc createState*(stateToBeCreated: StateType, flowType: FlowType, backState: State): State = - if stateToBeCreated == StateType.AllowNotifications: - return newNotificationState(flowType, backState) - if stateToBeCreated == StateType.Welcome: - return newWelcomeState(flowType, backState) - if stateToBeCreated == StateType.WelcomeNewStatusUser: - return newWelcomeStateNewUser(flowType, backState) - if stateToBeCreated == StateType.WelcomeOldStatusUser: - return newWelcomeStateOldUser(flowType, backState) - if stateToBeCreated == StateType.UserProfileCreate: - return newUserProfileCreateState(flowType, backState) - if stateToBeCreated == StateType.UserProfileCreateSameChatKey: - return newUserProfileCreateSameChatKeyState(flowType, backState) - if stateToBeCreated == StateType.UserProfileChatKey: - return newUserProfileChatKeyState(flowType, backState) - if stateToBeCreated == StateType.UserProfileCreatePassword: - return newUserProfileCreatePasswordState(flowType, backState) - if stateToBeCreated == StateType.UserProfileConfirmPassword: - return newUserProfileConfirmPasswordState(flowType, backState) - if stateToBeCreated == StateType.UserProfileImportSeedPhrase: - return newUserProfileImportSeedPhraseState(flowType, backState) - if stateToBeCreated == StateType.UserProfileEnterSeedPhrase: - return newUserProfileEnterSeedPhraseState(flowType, backState) - if stateToBeCreated == StateType.Biometrics: - return newBiometricsState(flowType, backState) - if stateToBeCreated == StateType.KeycardPluginReader: - return newKeycardPluginReaderState(flowType, backState) - if stateToBeCreated == StateType.KeycardInsertKeycard: - return newKeycardInsertKeycardState(flowType, backState) - if stateToBeCreated == StateType.KeycardInsertedKeycard: - return newKeycardInsertedKeycardState(flowType, backState) - if stateToBeCreated == StateType.KeycardReadingKeycard: - return newKeycardReadingKeycardState(flowType, backState) - if stateToBeCreated == StateType.KeycardRecognizedKeycard: - return newKeycardRecognizedKeycardState(flowType, backState) - if stateToBeCreated == StateType.KeycardCreatePin: - return newKeycardCreatePinState(flowType, backState) - if stateToBeCreated == StateType.KeycardRepeatPin: - return newKeycardRepeatPinState(flowType, backState) - if stateToBeCreated == StateType.KeycardPinSet: - return newKeycardPinSetState(flowType, backState) - if stateToBeCreated == StateType.KeycardEnterPin: - return newKeycardEnterPinState(flowType, backState) - if stateToBeCreated == StateType.KeycardWrongPin: - return newKeycardWrongPinState(flowType, backState) - if stateToBeCreated == StateType.KeycardEnterPuk: - return newKeycardEnterPukState(flowType, backState) - if stateToBeCreated == StateType.KeycardWrongKeycard: - return newKeycardWrongKeycardState(flowType, backState) - if stateToBeCreated == StateType.KeycardWrongPuk: - return newKeycardWrongPukState(flowType, backState) - if stateToBeCreated == StateType.KeycardDisplaySeedPhrase: - return newKeycardDisplaySeedPhraseState(flowType, backState) - if stateToBeCreated == StateType.KeycardEnterSeedPhraseWords: - return newKeycardEnterSeedPhraseWordsState(flowType, backState) - if stateToBeCreated == StateType.KeycardNotEmpty: - return newKeycardNotEmptyState(flowType, backState) - if stateToBeCreated == StateType.KeycardNotKeycard: - return newKeycardNotKeycardState(flowType, backState) - if stateToBeCreated == StateType.KeycardEmpty: - return newKeycardEmptyState(flowType, backState) - if stateToBeCreated == StateType.KeycardLocked: - return newKeycardLockedState(flowType, backState) - if stateToBeCreated == StateType.KeycardRecover: - return newKeycardRecoverState(flowType, backState) - if stateToBeCreated == StateType.KeycardMaxPairingSlotsReached: - return newKeycardMaxPairingSlotsReachedState(flowType, backState) - if stateToBeCreated == StateType.KeycardMaxPinRetriesReached: - return newKeycardMaxPinRetriesReachedState(flowType, backState) - if stateToBeCreated == StateType.KeycardMaxPukRetriesReached: - return newKeycardMaxPukRetriesReachedState(flowType, backState) - if stateToBeCreated == StateType.Login: - return newLoginState(flowType, backState) - if stateToBeCreated == StateType.LoginPlugin: - return newLoginPluginState(flowType, backState) - if stateToBeCreated == StateType.LoginKeycardInsertKeycard: - return newLoginKeycardInsertKeycardState(flowType, backState) - if stateToBeCreated == StateType.LoginKeycardInsertedKeycard: - return newLoginKeycardInsertedKeycardState(flowType, backState) - if stateToBeCreated == StateType.LoginKeycardReadingKeycard: - return newLoginKeycardReadingKeycardState(flowType, backState) - if stateToBeCreated == StateType.LoginKeycardRecognizedKeycard: - return newLoginKeycardRecognizedKeycardState(flowType, backState) - if stateToBeCreated == StateType.LoginKeycardEnterPin: - return newLoginKeycardEnterPinState(flowType, backState) - if stateToBeCreated == StateType.LoginKeycardEnterPassword: - return newLoginKeycardEnterPasswordState(flowType, backState) - if stateToBeCreated == StateType.LoginKeycardPinVerified: - return newLoginKeycardPinVerifiedState(flowType, backState) - if stateToBeCreated == StateType.LoginKeycardWrongKeycard: - return newLoginKeycardWrongKeycardState(flowType, backState) - if stateToBeCreated == StateType.LoginKeycardWrongPin: - return newLoginKeycardWrongPinState(flowType, backState) - if stateToBeCreated == StateType.LoginKeycardMaxPinRetriesReached: - return newLoginKeycardMaxPinRetriesReachedState(flowType, backState) - if stateToBeCreated == StateType.LoginKeycardMaxPukRetriesReached: - return newLoginKeycardMaxPukRetriesReachedState(flowType, backState) - if stateToBeCreated == StateType.LoginKeycardMaxPairingSlotsReached: - return newLoginKeycardMaxPairingSlotsReachedState(flowType, backState) - if stateToBeCreated == StateType.LoginKeycardEmpty: - return newLoginKeycardEmptyState(flowType, backState) - if stateToBeCreated == StateType.LoginNotKeycard: - return newLoginNotKeycardState(flowType, backState) - if stateToBeCreated == StateType.ProfileFetching: - return newProfileFetchingState(flowType, backState) - if stateToBeCreated == StateType.ProfileFetchingSuccess: - return newProfileFetchingSuccessState(flowType, backState) - if stateToBeCreated == StateType.ProfileFetchingTimeout: - return newProfileFetchingTimeoutState(flowType, backState) - if stateToBeCreated == StateType.ProfileFetchingAnnouncement: - return newProfileFetchingAnnouncementState(flowType, backState) - if stateToBeCreated == StateType.RecoverOldUser: - return newRecoverOldUserState(flowType, backState) - - - error "No implementation available for state ", state=stateToBeCreated - -proc ensureReaderAndCardPresenceOnboarding*(state: State, keycardFlowType: string, keycardEvent: KeycardEvent, controller: Controller): State = - if keycardFlowType == ResponseTypeValueKeycardFlowResult and - keycardEvent.error.len > 0 and - keycardEvent.error == ErrorConnection: - controller.resumeCurrentFlowLater() - if state.stateType == StateType.KeycardPluginReader: - return nil - return createState(StateType.KeycardPluginReader, state.flowType, state) - if keycardFlowType == ResponseTypeValueInsertCard and - keycardEvent.error.len > 0 and - keycardEvent.error == ErrorConnection: - if state.stateType == StateType.KeycardInsertKeycard: - return nil - return createState(StateType.KeycardInsertKeycard, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueCardInserted: - controller.setKeycardData(updatePredefinedKeycardData(controller.getKeycardData(), PredefinedKeycardData.WronglyInsertedCard, add = false)) - return createState(StateType.KeycardInsertedKeycard, state.flowType, state.getBackState) - -proc ensureReaderAndCardPresenceLogin*(state: State, keycardFlowType: string, keycardEvent: KeycardEvent, controller: Controller): State = - if keycardFlowType == ResponseTypeValueKeycardFlowResult and - keycardEvent.error.len > 0 and - keycardEvent.error == ErrorConnection: - controller.resumeCurrentFlowLater() - if state.stateType == StateType.LoginPlugin: - return nil - return createState(StateType.LoginPlugin, state.flowType, nil) - if keycardFlowType == ResponseTypeValueInsertCard and - keycardEvent.error.len > 0 and - keycardEvent.error == ErrorConnection: - if state.stateType == StateType.LoginKeycardInsertKeycard: - return nil - return createState(StateType.LoginKeycardInsertKeycard, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueCardInserted: - controller.setKeycardData(updatePredefinedKeycardData(controller.getKeycardData(), PredefinedKeycardData.WronglyInsertedCard, add = false)) - return createState(StateType.LoginKeycardInsertedKeycard, state.flowType, state.getBackState) - -proc ensureReaderAndCardPresenceAndResolveNextOnboardingState*(state: State, keycardFlowType: string, keycardEvent: KeycardEvent, controller: Controller): State = - let ensureState = ensureReaderAndCardPresenceOnboarding(state, keycardFlowType, keycardEvent, controller) - if not ensureState.isNil: - return ensureState - - if state.flowType == FlowType.FirstRunNewUserNewKeycardKeys: - if keycardFlowType == ResponseTypeValueEnterNewPIN and - keycardEvent.error.len > 0 and - keycardEvent.error == ErrorRequireInit: - return createState(StateType.KeycardRecognizedKeycard, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueEnterPIN and - keycardEvent.error.len == 0: - return createState(StateType.KeycardNotEmpty, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueEnterPUK and - keycardEvent.error.len == 0: - if keycardEvent.pinRetries == 0 and keycardEvent.pukRetries > 0: - return createState(StateType.KeycardLocked, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueSwapCard and - keycardEvent.error.len > 0: - if keycardEvent.error == ErrorNotAKeycard: - return createState(StateType.KeycardNotKeycard, state.flowType, state.getBackState) - if keycardEvent.error == RequestParamFreeSlots: - return createState(StateType.KeycardLocked, state.flowType, state.getBackState) - if keycardEvent.error == RequestParamPUKRetries: - return createState(StateType.KeycardLocked, state.flowType, state.getBackState) - if keycardEvent.error == ErrorHasKeys: - return createState(StateType.KeycardNotEmpty, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueEnterMnemonic and - keycardEvent.error.len > 0 and - keycardEvent.error == ErrorLoadingKeys: - controller.buildSeedPhrasesFromIndexes(keycardEvent.seedPhraseIndexes) - return createState(StateType.KeycardPinSet, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueKeycardFlowResult and - keycardEvent.keyUid.len > 0: - controller.setKeyUid(keycardEvent.keyUid) - return createState(StateType.UserProfileCreate, state.flowType, state) - - if state.flowType == FlowType.FirstRunNewUserImportSeedPhraseIntoKeycard: - if keycardFlowType == ResponseTypeValueEnterNewPIN and - keycardEvent.error.len > 0 and - keycardEvent.error == ErrorRequireInit: - if state.stateType == StateType.UserProfileEnterSeedPhrase: - return createState(StateType.KeycardCreatePin, state.flowType, state.getBackState) - return createState(StateType.KeycardRecognizedKeycard, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueEnterPIN and - keycardEvent.error.len == 0: - return createState(StateType.KeycardNotEmpty, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueSwapCard and - keycardEvent.error.len > 0: - if keycardEvent.error == ErrorNotAKeycard: - return createState(StateType.KeycardNotKeycard, state.flowType, state.getBackState) - if keycardEvent.error == RequestParamFreeSlots: - return createState(StateType.KeycardLocked, state.flowType, state.getBackState) - if keycardEvent.error == RequestParamPUKRetries: - return createState(StateType.KeycardLocked, state.flowType, state.getBackState) - if keycardEvent.error == ErrorHasKeys: - return createState(StateType.KeycardNotEmpty, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueKeycardFlowResult and - keycardEvent.keyUid.len > 0: - controller.setKeyUid(keycardEvent.keyUid) - return createState(StateType.KeycardPinSet, state.flowType, state.getBackState) - - if state.flowType == FlowType.FirstRunOldUserKeycardImport: - controller.setKeycardData(updatePredefinedKeycardData(controller.getKeycardData(), PredefinedKeycardData.MaxPUKReached, add = false)) - controller.setKeyUid(keycardEvent.keyUid) - if keycardFlowType == ResponseTypeValueEnterPIN and - keycardEvent.error.len == 0: - return createState(StateType.KeycardRecognizedKeycard, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueEnterPUK and - keycardEvent.error.len == 0: - if keycardEvent.pinRetries == 0 and keycardEvent.pukRetries > 0: - return createState(StateType.KeycardMaxPinRetriesReached, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueSwapCard and - keycardEvent.error.len > 0 and - keycardEvent.error == ErrorNoKeys: - return createState(StateType.KeycardEmpty, state.flowType, nil) - if keycardFlowType == ResponseTypeValueSwapCard and - keycardEvent.error.len > 0 and - keycardEvent.error == RequestParamPUKRetries: - controller.setKeycardData(updatePredefinedKeycardData(controller.getKeycardData(), PredefinedKeycardData.MaxPUKReached, add = true)) - return createState(StateType.KeycardMaxPukRetriesReached, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueSwapCard and - keycardEvent.error.len > 0 and - keycardEvent.error == RequestParamFreeSlots: - return createState(StateType.KeycardMaxPairingSlotsReached, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueEnterNewPIN and - keycardEvent.error.len > 0 and - keycardEvent.error == ErrorRequireInit: - return createState(StateType.KeycardCreatePin, state.flowType, nil) - - if state.flowType == FlowType.AppLogin: - if keycardFlowType == ResponseTypeValueSwapCard and - keycardEvent.error.len > 0 and - keycardEvent.error == RequestParamPUKRetries: - return createState(StateType.KeycardMaxPukRetriesReached, state.flowType, state.getBackState) - if keycardFlowType == ResponseTypeValueEnterNewPIN and - keycardEvent.error.len > 0 and - keycardEvent.error == ErrorRequireInit: - return createState(StateType.KeycardCreatePin, state.flowType, state.getBackState) - -proc ensureReaderAndCardPresenceAndResolveNextLoginState*(state: State, keycardFlowType: string, keycardEvent: KeycardEvent, controller: Controller): State = - let ensureState = ensureReaderAndCardPresenceLogin(state, keycardFlowType, keycardEvent, controller) - if not ensureState.isNil: - return ensureState - if state.flowType == FlowType.AppLogin: - if keycardFlowType == ResponseTypeValueKeycardFlowResult and - keycardEvent.error.len == 0: - controller.setKeycardEvent(keycardEvent) - return createState(StateType.LoginKeycardPinVerified, state.flowType, nil) - if keycardFlowType == ResponseTypeValueEnterPIN: - if keycardEvent.error.len == 0: - if not controller.keyUidMatch(keycardEvent.keyUid): - return createState(StateType.LoginKeycardWrongKeycard, state.flowType, nil) - return createState(StateType.LoginKeycardRecognizedKeycard, state.flowType, nil) - if keycardEvent.error.len > 0: - if keycardEvent.error == RequestParamPIN: - controller.setRemainingAttempts(keycardEvent.pinRetries) - if keycardEvent.pinRetries > 0: - return createState(StateType.LoginKeycardWrongPin, state.flowType, nil) - return createState(StateType.LoginKeycardMaxPinRetriesReached, state.flowType, nil) - if keycardFlowType == ResponseTypeValueEnterPUK and - keycardEvent.error.len == 0: - if keycardEvent.pinRetries == 0 and keycardEvent.pukRetries > 0: - return createState(StateType.LoginKeycardMaxPinRetriesReached, state.flowType, nil) - if keycardFlowType == ResponseTypeValueSwapCard and - keycardEvent.error.len > 0: - if keycardEvent.error == ErrorNoKeys: - return createState(StateType.LoginKeycardEmpty, state.flowType, nil) - if keycardEvent.error == ErrorNotAKeycard: - return createState(StateType.LoginNotKeycard, state.flowType, nil) - if keycardEvent.error == RequestParamPUKRetries: - return createState(StateType.LoginKeycardMaxPukRetriesReached, state.flowType, nil) - if keycardEvent.error == RequestParamFreeSlots: - return createState(StateType.LoginKeycardMaxPairingSlotsReached, state.flowType, nil) \ No newline at end of file +include state_factory_general_implementation +include state_factory_state_onboarding_implementation +include state_factory_state_login_implementation \ No newline at end of file diff --git a/src/app/modules/startup/internal/state_factory_general_implementation.nim b/src/app/modules/startup/internal/state_factory_general_implementation.nim new file mode 100644 index 0000000000..6b566acff4 --- /dev/null +++ b/src/app/modules/startup/internal/state_factory_general_implementation.nim @@ -0,0 +1,115 @@ +proc createState*(stateToBeCreated: StateType, flowType: FlowType, backState: State): State = + if stateToBeCreated == StateType.AllowNotifications: + return newNotificationState(flowType, backState) + if stateToBeCreated == StateType.Welcome: + return newWelcomeState(flowType, backState) + if stateToBeCreated == StateType.WelcomeNewStatusUser: + return newWelcomeStateNewUser(flowType, backState) + if stateToBeCreated == StateType.WelcomeOldStatusUser: + return newWelcomeStateOldUser(flowType, backState) + if stateToBeCreated == StateType.UserProfileCreate: + return newUserProfileCreateState(flowType, backState) + if stateToBeCreated == StateType.UserProfileCreateSameChatKey: + return newUserProfileCreateSameChatKeyState(flowType, backState) + if stateToBeCreated == StateType.UserProfileChatKey: + return newUserProfileChatKeyState(flowType, backState) + if stateToBeCreated == StateType.UserProfileCreatePassword: + return newUserProfileCreatePasswordState(flowType, backState) + if stateToBeCreated == StateType.UserProfileConfirmPassword: + return newUserProfileConfirmPasswordState(flowType, backState) + if stateToBeCreated == StateType.UserProfileImportSeedPhrase: + return newUserProfileImportSeedPhraseState(flowType, backState) + if stateToBeCreated == StateType.UserProfileEnterSeedPhrase: + return newUserProfileEnterSeedPhraseState(flowType, backState) + if stateToBeCreated == StateType.Biometrics: + return newBiometricsState(flowType, backState) + if stateToBeCreated == StateType.KeycardPluginReader: + return newKeycardPluginReaderState(flowType, backState) + if stateToBeCreated == StateType.KeycardInsertKeycard: + return newKeycardInsertKeycardState(flowType, backState) + if stateToBeCreated == StateType.KeycardInsertedKeycard: + return newKeycardInsertedKeycardState(flowType, backState) + if stateToBeCreated == StateType.KeycardReadingKeycard: + return newKeycardReadingKeycardState(flowType, backState) + if stateToBeCreated == StateType.KeycardRecognizedKeycard: + return newKeycardRecognizedKeycardState(flowType, backState) + if stateToBeCreated == StateType.KeycardCreatePin: + return newKeycardCreatePinState(flowType, backState) + if stateToBeCreated == StateType.KeycardRepeatPin: + return newKeycardRepeatPinState(flowType, backState) + if stateToBeCreated == StateType.KeycardPinSet: + return newKeycardPinSetState(flowType, backState) + if stateToBeCreated == StateType.KeycardEnterPin: + return newKeycardEnterPinState(flowType, backState) + if stateToBeCreated == StateType.KeycardWrongPin: + return newKeycardWrongPinState(flowType, backState) + if stateToBeCreated == StateType.KeycardEnterPuk: + return newKeycardEnterPukState(flowType, backState) + if stateToBeCreated == StateType.KeycardWrongKeycard: + return newKeycardWrongKeycardState(flowType, backState) + if stateToBeCreated == StateType.KeycardWrongPuk: + return newKeycardWrongPukState(flowType, backState) + if stateToBeCreated == StateType.KeycardDisplaySeedPhrase: + return newKeycardDisplaySeedPhraseState(flowType, backState) + if stateToBeCreated == StateType.KeycardEnterSeedPhraseWords: + return newKeycardEnterSeedPhraseWordsState(flowType, backState) + if stateToBeCreated == StateType.KeycardNotEmpty: + return newKeycardNotEmptyState(flowType, backState) + if stateToBeCreated == StateType.KeycardNotKeycard: + return newKeycardNotKeycardState(flowType, backState) + if stateToBeCreated == StateType.KeycardEmpty: + return newKeycardEmptyState(flowType, backState) + if stateToBeCreated == StateType.KeycardLocked: + return newKeycardLockedState(flowType, backState) + if stateToBeCreated == StateType.KeycardRecover: + return newKeycardRecoverState(flowType, backState) + if stateToBeCreated == StateType.KeycardMaxPairingSlotsReached: + return newKeycardMaxPairingSlotsReachedState(flowType, backState) + if stateToBeCreated == StateType.KeycardMaxPinRetriesReached: + return newKeycardMaxPinRetriesReachedState(flowType, backState) + if stateToBeCreated == StateType.KeycardMaxPukRetriesReached: + return newKeycardMaxPukRetriesReachedState(flowType, backState) + if stateToBeCreated == StateType.Login: + return newLoginState(flowType, backState) + if stateToBeCreated == StateType.LoginPlugin: + return newLoginPluginState(flowType, backState) + if stateToBeCreated == StateType.LoginKeycardInsertKeycard: + return newLoginKeycardInsertKeycardState(flowType, backState) + if stateToBeCreated == StateType.LoginKeycardInsertedKeycard: + return newLoginKeycardInsertedKeycardState(flowType, backState) + if stateToBeCreated == StateType.LoginKeycardReadingKeycard: + return newLoginKeycardReadingKeycardState(flowType, backState) + if stateToBeCreated == StateType.LoginKeycardRecognizedKeycard: + return newLoginKeycardRecognizedKeycardState(flowType, backState) + if stateToBeCreated == StateType.LoginKeycardEnterPin: + return newLoginKeycardEnterPinState(flowType, backState) + if stateToBeCreated == StateType.LoginKeycardEnterPassword: + return newLoginKeycardEnterPasswordState(flowType, backState) + if stateToBeCreated == StateType.LoginKeycardPinVerified: + return newLoginKeycardPinVerifiedState(flowType, backState) + if stateToBeCreated == StateType.LoginKeycardWrongKeycard: + return newLoginKeycardWrongKeycardState(flowType, backState) + if stateToBeCreated == StateType.LoginKeycardWrongPin: + return newLoginKeycardWrongPinState(flowType, backState) + if stateToBeCreated == StateType.LoginKeycardMaxPinRetriesReached: + return newLoginKeycardMaxPinRetriesReachedState(flowType, backState) + if stateToBeCreated == StateType.LoginKeycardMaxPukRetriesReached: + return newLoginKeycardMaxPukRetriesReachedState(flowType, backState) + if stateToBeCreated == StateType.LoginKeycardMaxPairingSlotsReached: + return newLoginKeycardMaxPairingSlotsReachedState(flowType, backState) + if stateToBeCreated == StateType.LoginKeycardEmpty: + return newLoginKeycardEmptyState(flowType, backState) + if stateToBeCreated == StateType.LoginNotKeycard: + return newLoginNotKeycardState(flowType, backState) + if stateToBeCreated == StateType.ProfileFetching: + return newProfileFetchingState(flowType, backState) + if stateToBeCreated == StateType.ProfileFetchingSuccess: + return newProfileFetchingSuccessState(flowType, backState) + if stateToBeCreated == StateType.ProfileFetchingTimeout: + return newProfileFetchingTimeoutState(flowType, backState) + if stateToBeCreated == StateType.ProfileFetchingAnnouncement: + return newProfileFetchingAnnouncementState(flowType, backState) + if stateToBeCreated == StateType.RecoverOldUser: + return newRecoverOldUserState(flowType, backState) + + error "No implementation available for state ", state=stateToBeCreated \ No newline at end of file diff --git a/src/app/modules/startup/internal/state_factory_state_login_implementation.nim b/src/app/modules/startup/internal/state_factory_state_login_implementation.nim new file mode 100644 index 0000000000..9399e28730 --- /dev/null +++ b/src/app/modules/startup/internal/state_factory_state_login_implementation.nim @@ -0,0 +1,52 @@ +proc ensureReaderAndCardPresenceLogin*(state: State, keycardFlowType: string, keycardEvent: KeycardEvent, controller: Controller): State = + if keycardFlowType == ResponseTypeValueKeycardFlowResult and + keycardEvent.error.len > 0 and + keycardEvent.error == ErrorConnection: + controller.resumeCurrentFlowLater() + if state.stateType == StateType.LoginPlugin: + return nil + return createState(StateType.LoginPlugin, state.flowType, nil) + if keycardFlowType == ResponseTypeValueInsertCard and + keycardEvent.error.len > 0 and + keycardEvent.error == ErrorConnection: + if state.stateType == StateType.LoginKeycardInsertKeycard: + return nil + return createState(StateType.LoginKeycardInsertKeycard, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueCardInserted: + controller.setKeycardData(updatePredefinedKeycardData(controller.getKeycardData(), PredefinedKeycardData.WronglyInsertedCard, add = false)) + return createState(StateType.LoginKeycardInsertedKeycard, state.flowType, state.getBackState) + +proc ensureReaderAndCardPresenceAndResolveNextLoginState*(state: State, keycardFlowType: string, keycardEvent: KeycardEvent, controller: Controller): State = + let ensureState = ensureReaderAndCardPresenceLogin(state, keycardFlowType, keycardEvent, controller) + if not ensureState.isNil: + return ensureState + if state.flowType == FlowType.AppLogin: + if keycardFlowType == ResponseTypeValueKeycardFlowResult and + keycardEvent.error.len == 0: + controller.setKeycardEvent(keycardEvent) + return createState(StateType.LoginKeycardPinVerified, state.flowType, nil) + if keycardFlowType == ResponseTypeValueEnterPIN: + if keycardEvent.error.len == 0: + if not controller.keyUidMatch(keycardEvent.keyUid): + return createState(StateType.LoginKeycardWrongKeycard, state.flowType, nil) + return createState(StateType.LoginKeycardRecognizedKeycard, state.flowType, nil) + if keycardEvent.error.len > 0: + if keycardEvent.error == RequestParamPIN: + controller.setRemainingAttempts(keycardEvent.pinRetries) + if keycardEvent.pinRetries > 0: + return createState(StateType.LoginKeycardWrongPin, state.flowType, nil) + return createState(StateType.LoginKeycardMaxPinRetriesReached, state.flowType, nil) + if keycardFlowType == ResponseTypeValueEnterPUK and + keycardEvent.error.len == 0: + if keycardEvent.pinRetries == 0 and keycardEvent.pukRetries > 0: + return createState(StateType.LoginKeycardMaxPinRetriesReached, state.flowType, nil) + if keycardFlowType == ResponseTypeValueSwapCard and + keycardEvent.error.len > 0: + if keycardEvent.error == ErrorNoKeys: + return createState(StateType.LoginKeycardEmpty, state.flowType, nil) + if keycardEvent.error == ErrorNotAKeycard: + return createState(StateType.LoginNotKeycard, state.flowType, nil) + if keycardEvent.error == RequestParamPUKRetries: + return createState(StateType.LoginKeycardMaxPukRetriesReached, state.flowType, nil) + if keycardEvent.error == RequestParamFreeSlots: + return createState(StateType.LoginKeycardMaxPairingSlotsReached, state.flowType, nil) \ No newline at end of file diff --git a/src/app/modules/startup/internal/state_factory_state_onboarding_implementation.nim b/src/app/modules/startup/internal/state_factory_state_onboarding_implementation.nim new file mode 100644 index 0000000000..d36d2cc79f --- /dev/null +++ b/src/app/modules/startup/internal/state_factory_state_onboarding_implementation.nim @@ -0,0 +1,117 @@ +proc ensureReaderAndCardPresenceOnboarding*(state: State, keycardFlowType: string, keycardEvent: KeycardEvent, controller: Controller): State = + if keycardFlowType == ResponseTypeValueKeycardFlowResult and + keycardEvent.error.len > 0 and + keycardEvent.error == ErrorConnection: + controller.resumeCurrentFlowLater() + if state.stateType == StateType.KeycardPluginReader: + return nil + return createState(StateType.KeycardPluginReader, state.flowType, state) + if keycardFlowType == ResponseTypeValueInsertCard and + keycardEvent.error.len > 0 and + keycardEvent.error == ErrorConnection: + if state.stateType == StateType.KeycardInsertKeycard: + return nil + return createState(StateType.KeycardInsertKeycard, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueCardInserted: + controller.setKeycardData(updatePredefinedKeycardData(controller.getKeycardData(), PredefinedKeycardData.WronglyInsertedCard, add = false)) + return createState(StateType.KeycardInsertedKeycard, state.flowType, state.getBackState) + +proc ensureReaderAndCardPresenceAndResolveNextOnboardingState*(state: State, keycardFlowType: string, keycardEvent: KeycardEvent, controller: Controller): State = + let ensureState = ensureReaderAndCardPresenceOnboarding(state, keycardFlowType, keycardEvent, controller) + if not ensureState.isNil: + return ensureState + + if state.flowType == FlowType.FirstRunNewUserNewKeycardKeys: + if keycardFlowType == ResponseTypeValueEnterNewPIN and + keycardEvent.error.len > 0 and + keycardEvent.error == ErrorRequireInit: + return createState(StateType.KeycardRecognizedKeycard, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueEnterPIN and + keycardEvent.error.len == 0: + return createState(StateType.KeycardNotEmpty, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueEnterPUK and + keycardEvent.error.len == 0: + if keycardEvent.pinRetries == 0 and keycardEvent.pukRetries > 0: + return createState(StateType.KeycardLocked, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueSwapCard and + keycardEvent.error.len > 0: + if keycardEvent.error == ErrorNotAKeycard: + return createState(StateType.KeycardNotKeycard, state.flowType, state.getBackState) + if keycardEvent.error == RequestParamFreeSlots: + return createState(StateType.KeycardLocked, state.flowType, state.getBackState) + if keycardEvent.error == RequestParamPUKRetries: + return createState(StateType.KeycardLocked, state.flowType, state.getBackState) + if keycardEvent.error == ErrorHasKeys: + return createState(StateType.KeycardNotEmpty, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueEnterMnemonic and + keycardEvent.error.len > 0 and + keycardEvent.error == ErrorLoadingKeys: + controller.buildSeedPhrasesFromIndexes(keycardEvent.seedPhraseIndexes) + return createState(StateType.KeycardPinSet, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueKeycardFlowResult and + keycardEvent.keyUid.len > 0: + controller.setKeyUid(keycardEvent.keyUid) + return createState(StateType.UserProfileCreate, state.flowType, state) + + if state.flowType == FlowType.FirstRunNewUserImportSeedPhraseIntoKeycard: + if keycardFlowType == ResponseTypeValueEnterNewPIN and + keycardEvent.error.len > 0 and + keycardEvent.error == ErrorRequireInit: + if state.stateType == StateType.UserProfileEnterSeedPhrase: + return createState(StateType.KeycardCreatePin, state.flowType, state.getBackState) + return createState(StateType.KeycardRecognizedKeycard, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueEnterPIN and + keycardEvent.error.len == 0: + return createState(StateType.KeycardNotEmpty, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueSwapCard and + keycardEvent.error.len > 0: + if keycardEvent.error == ErrorNotAKeycard: + return createState(StateType.KeycardNotKeycard, state.flowType, state.getBackState) + if keycardEvent.error == RequestParamFreeSlots: + return createState(StateType.KeycardLocked, state.flowType, state.getBackState) + if keycardEvent.error == RequestParamPUKRetries: + return createState(StateType.KeycardLocked, state.flowType, state.getBackState) + if keycardEvent.error == ErrorHasKeys: + return createState(StateType.KeycardNotEmpty, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueKeycardFlowResult and + keycardEvent.keyUid.len > 0: + controller.setKeyUid(keycardEvent.keyUid) + return createState(StateType.KeycardPinSet, state.flowType, state.getBackState) + + if state.flowType == FlowType.FirstRunOldUserKeycardImport: + controller.setKeycardData(updatePredefinedKeycardData(controller.getKeycardData(), PredefinedKeycardData.MaxPUKReached, add = false)) + controller.setKeyUid(keycardEvent.keyUid) + if keycardFlowType == ResponseTypeValueEnterPIN and + keycardEvent.error.len == 0: + return createState(StateType.KeycardRecognizedKeycard, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueEnterPUK and + keycardEvent.error.len == 0: + if keycardEvent.pinRetries == 0 and keycardEvent.pukRetries > 0: + return createState(StateType.KeycardMaxPinRetriesReached, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueSwapCard and + keycardEvent.error.len > 0 and + keycardEvent.error == ErrorNoKeys: + return createState(StateType.KeycardEmpty, state.flowType, nil) + if keycardFlowType == ResponseTypeValueSwapCard and + keycardEvent.error.len > 0 and + keycardEvent.error == RequestParamPUKRetries: + controller.setKeycardData(updatePredefinedKeycardData(controller.getKeycardData(), PredefinedKeycardData.MaxPUKReached, add = true)) + return createState(StateType.KeycardMaxPukRetriesReached, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueSwapCard and + keycardEvent.error.len > 0 and + keycardEvent.error == RequestParamFreeSlots: + return createState(StateType.KeycardMaxPairingSlotsReached, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueEnterNewPIN and + keycardEvent.error.len > 0 and + keycardEvent.error == ErrorRequireInit: + return createState(StateType.KeycardCreatePin, state.flowType, nil) + + if state.flowType == FlowType.AppLogin: + if keycardFlowType == ResponseTypeValueSwapCard and + keycardEvent.error.len > 0 and + keycardEvent.error == RequestParamPUKRetries: + return createState(StateType.KeycardMaxPukRetriesReached, state.flowType, state.getBackState) + if keycardFlowType == ResponseTypeValueEnterNewPIN and + keycardEvent.error.len > 0 and + keycardEvent.error == ErrorRequireInit: + return createState(StateType.KeycardCreatePin, state.flowType, state.getBackState) \ No newline at end of file