{"version":3,"file":"mfa.mjs","sources":["../../../../../../../../../web/src/ui/b2b/reducer/mfa.ts"],"sourcesContent":["import { CountryCode, StringLiteralFromEnum } from '@stytch/core';\nimport {\n  AuthFlowType,\n  B2BAuthenticateResponseWithMFA,\n  B2BMFAProducts,\n  B2BSMSSendResponse,\n  B2BTOTPCreateResponse,\n  StytchProjectConfigurationInput,\n} from '@stytch/core/public';\n\nimport { isTruthy } from '../../../utils/isTruthy';\nimport { Optional } from '../../../utils/Optional';\nimport { getEnabledMethods } from '../getEnabledMethods';\nimport { DEFAULT_MFA_STATE, MfaState } from '../MfaState';\nimport { AppScreens } from '../types/AppScreens';\nimport { AppState } from '../types/AppState';\nimport { ErrorType } from '../types/ErrorType';\nimport { pushHistory, replaceHistory } from './navigation';\n\ntype PrimaryAuthenticateSuccessAction = {\n  type: 'primary_authenticate_success';\n  response: B2BAuthenticateResponseWithMFA<StytchProjectConfigurationInput>;\n  includedMfaMethods: readonly StringLiteralFromEnum<B2BMFAProducts>[] | undefined;\n  resetTokenType?: string;\n};\n\ntype TotpAuthenticateAction = {\n  type: 'totp/authenticate_success';\n};\n\ntype TotpCreateAction = {\n  type: 'totp/create_success';\n  response: B2BTOTPCreateResponse;\n  memberId: string;\n  organizationId: string;\n};\n\ntype TotpShowCodeAction = {\n  type: 'totp/show_code';\n  method?: 'qr' | 'manual';\n};\n\ntype RecoveryCodeAuthenticateAction = {\n  type: 'recovery_code/authenticate_success';\n};\n\ntype RecoveryCodeSaveAcknowledgeAction = { type: 'recovery_code/save_acknowledge' };\n\ntype SmsOtpAuthenticateAction = {\n  type: 'sms_otp/authenticate_success';\n};\n\ntype SmsOtpSendAction =\n  | { type: 'sms_otp/send' }\n  | ({\n      type: 'sms_otp/send_success';\n      response: B2BSMSSendResponse;\n    } & Optional<{\n      phoneNumber: string;\n      countryCode: CountryCode;\n      formattedPhoneNumber: string;\n    }>)\n  | { type: 'sms_otp/send_error'; error: unknown }\n  | { type: 'sms_otp/format_destination'; formattedPhoneNumber: string };\n\nexport type MfaAction =\n  | PrimaryAuthenticateSuccessAction\n  | RecoveryCodeAuthenticateAction\n  | RecoveryCodeSaveAcknowledgeAction\n  | SmsOtpAuthenticateAction\n  | SmsOtpSendAction\n  | TotpAuthenticateAction\n  | TotpCreateAction\n  | TotpShowCodeAction;\n\nconst DEFAULT_SMS_OTP_EXPIRATION_MS = 1000 * 60 * 2; // 2 minutes\n\nfunction apiMfaMethodToProduct(method: 'sms_otp' | 'totp'): B2BMFAProducts;\nfunction apiMfaMethodToProduct(method: string): B2BMFAProducts | undefined;\nfunction apiMfaMethodToProduct(method: string): B2BMFAProducts | undefined {\n  switch (method) {\n    case 'totp':\n      return B2BMFAProducts.totp;\n    case 'sms_otp':\n      return B2BMFAProducts.smsOtp;\n    default:\n      return undefined;\n  }\n}\n\nfunction getNextEnrollmentScreen(enabledMethods: Set<'smsOtp' | 'totp'>) {\n  // If there is only one possible method, use it\n  if (enabledMethods.size === 1) {\n    if (enabledMethods.has(B2BMFAProducts.totp)) {\n      return AppScreens.TOTPEnrollmentQRCode;\n    }\n    if (enabledMethods.has(B2BMFAProducts.smsOtp)) {\n      return AppScreens.SMSOTPEnrollment;\n    }\n  }\n\n  return AppScreens.MFAEnrollmentSelection;\n}\n\nconst getSmsOtpCodeExpiration = () => new Date(Date.now() + DEFAULT_SMS_OTP_EXPIRATION_MS);\n\nexport const B2B_MFA_METHODS = [B2BMFAProducts.totp, B2BMFAProducts.smsOtp] as const;\n\nexport const mfaReducer = (state: AppState, action: MfaAction): AppState => {\n  switch (action.type) {\n    case 'primary_authenticate_success': {\n      const memberAuthenticated = !!action.response.member_session;\n      const postAuthScreen =\n        action.resetTokenType === 'multi_tenant_magic_links' ? AppScreens.PasswordResetForm : AppScreens.LoggedIn;\n\n      // 1. If the member is fully authenticated, there's no need to continue\n      if (memberAuthenticated) {\n        return replaceHistory(postAuthScreen, {\n          ...state,\n          mfa: DEFAULT_MFA_STATE,\n          primary: {},\n        });\n      }\n\n      // 2. Additional primary auth may be required\n      if (action.response.primary_required) {\n        const primaryAuthMethods = action.response.primary_required.allowed_auth_methods;\n        const { email_address: email, email_address_verified: emailVerified } = action.response.member;\n\n        const newBaseState = {\n          ...state,\n          flowState: {\n            type: AuthFlowType.Organization,\n            organization: action.response.organization,\n          },\n          formState: {\n            ...state.formState,\n            passwordState: { email },\n          },\n          primary: {\n            primaryAuthMethods,\n            email,\n            emailVerified,\n          },\n        };\n\n        if (primaryAuthMethods?.length === 0) {\n          return replaceHistory(AppScreens.Error, {\n            ...newBaseState,\n            error: { type: ErrorType.CannotJoinOrgDueToAuthPolicy, canGoBack: false },\n          });\n        }\n\n        return replaceHistory(AppScreens.Main, newBaseState);\n      }\n\n      // 3. Start MFA\n      const memberEnrolledInSmsOtp = action.response.member.mfa_phone_number_verified;\n      const memberEnrolledInTotp = !!action.response.member.totp_registration_id;\n\n      const primaryInfo: MfaState['primaryInfo'] = {\n        enrolledMfaMethods: (\n          [memberEnrolledInTotp && B2BMFAProducts.totp, memberEnrolledInSmsOtp && B2BMFAProducts.smsOtp] as const\n        ).filter(isTruthy),\n        memberId: action.response.member_id,\n        memberPhoneNumber: action.response.member.mfa_phone_number,\n        organizationId: action.response.organization.organization_id,\n        organizationMfaOptionsSupported:\n          action.response.organization.mfa_methods === 'RESTRICTED'\n            ? (action.response.organization.allowed_mfa_methods?.map(apiMfaMethodToProduct).filter(isTruthy) ?? [])\n            : [],\n        postAuthScreen,\n      };\n\n      const organizationSupportsMethod = (method: B2BMFAProducts) =>\n        primaryInfo.organizationMfaOptionsSupported.length === 0 ||\n        primaryInfo.organizationMfaOptionsSupported.includes(method);\n\n      const getDefaultMethod = () => {\n        const defaultMethod = apiMfaMethodToProduct(action.response.member.default_mfa_method);\n\n        if (\n          defaultMethod &&\n          organizationSupportsMethod(defaultMethod) &&\n          primaryInfo.enrolledMfaMethods.includes(defaultMethod)\n        ) {\n          return defaultMethod;\n        }\n\n        return undefined;\n      };\n\n      // 3A. Use the member's preferred method, or any suitable fallback if the\n      // preferred method is not available for whatever reason. However, if an\n      // SMS was automatically sent, we should proceed directly to SMS OTP\n      // entry (even if the member's phone number is not yet verified).\n      const smsImplicitlySent = action.response.mfa_required?.secondary_auth_initiated === 'sms_otp';\n      const entryMethod = smsImplicitlySent\n        ? B2BMFAProducts.smsOtp\n        : (getDefaultMethod() ?? primaryInfo.enrolledMfaMethods.find(organizationSupportsMethod));\n      if (entryMethod) {\n        const mfaState: MfaState = {\n          ...DEFAULT_MFA_STATE,\n          primaryInfo,\n        } as const;\n\n        switch (entryMethod) {\n          case B2BMFAProducts.totp: {\n            return replaceHistory(AppScreens.TOTPEntry, {\n              ...state,\n              mfa: mfaState,\n              primary: {},\n            });\n          }\n\n          case B2BMFAProducts.smsOtp: {\n            const nextState = {\n              ...state,\n              mfa: {\n                ...mfaState,\n                smsOtp: {\n                  ...mfaState.smsOtp,\n                  // Setting codeExpiration tells SMSOTPEntry that the SMS has already been sent\n                  codeExpiration: smsImplicitlySent ? getSmsOtpCodeExpiration() : null,\n                },\n              },\n              primary: {},\n            };\n\n            if (memberEnrolledInSmsOtp) {\n              return replaceHistory(AppScreens.SMSOTPEntry, nextState);\n            } else {\n              // If the user is not enrolled in SMS OTP (i.e. phone number not verified)\n              // we need to allow the user to go back to enrollment to change it, so we need to\n              // add it to history\n              return {\n                ...nextState,\n                screen: AppScreens.SMSOTPEntry,\n                screenHistory: [AppScreens.SMSOTPEnrollment],\n              };\n            }\n          }\n        }\n      }\n\n      // 3B. If the member is not enrolled in MFA, we need to enroll them. Note that\n      // it's possible the member is actually enrolled, but using a method we\n      // don't recognize. Unfortunately, we can't distinguish between these\n      // cases; we'll offer to enroll the user, but enrollment will likely fail\n      // if the member can't complete MFA first.\n\n      const enabledMethods = getEnabledMethods({\n        allMethods: B2B_MFA_METHODS,\n        orgSupportedMethods: primaryInfo.organizationMfaOptionsSupported,\n        uiIncludedMethods: action.includedMfaMethods,\n      });\n\n      return replaceHistory(getNextEnrollmentScreen(enabledMethods), {\n        ...state,\n        mfa: {\n          ...DEFAULT_MFA_STATE,\n          primaryInfo,\n          isEnrolling: true,\n        },\n        primary: {},\n      });\n    }\n\n    case 'sms_otp/send':\n      return {\n        ...state,\n        mfa: {\n          ...state.mfa,\n          smsOtp: {\n            ...state.mfa.smsOtp,\n            isSending: true,\n            sendError: null,\n          },\n        },\n      };\n\n    case 'sms_otp/send_success':\n      return pushHistory(AppScreens.SMSOTPEntry, {\n        ...state,\n        mfa: {\n          ...state.mfa,\n          smsOtp: {\n            ...state.mfa.smsOtp,\n            isSending: false,\n            sendError: null,\n            codeExpiration: getSmsOtpCodeExpiration(),\n            formattedDestination: action.formattedPhoneNumber ?? state.mfa.smsOtp.formattedDestination,\n            enrolledNumber: action.phoneNumber\n              ? {\n                  phoneNumber: action.phoneNumber,\n                  countryCode: action.countryCode,\n                }\n              : null,\n          },\n        },\n      });\n\n    case 'sms_otp/send_error':\n      return {\n        ...state,\n        mfa: {\n          ...state.mfa,\n          smsOtp: {\n            ...state.mfa.smsOtp,\n            isSending: false,\n            sendError: action.error,\n            // If there was no code (expiration), set an expiration to an\n            // arbitrary point in the past. This reveals the \"resend code\"\n            // button so the user can try again.\n            codeExpiration: state.mfa.smsOtp.codeExpiration ?? new Date(Date.now() - 1000),\n          },\n        },\n      };\n\n    case 'sms_otp/format_destination':\n      return {\n        ...state,\n        mfa: {\n          ...state.mfa,\n          smsOtp: {\n            ...state.mfa.smsOtp,\n            formattedDestination: action.formattedPhoneNumber,\n          },\n        },\n      };\n\n    case 'sms_otp/authenticate_success':\n    case 'recovery_code/authenticate_success':\n    case 'recovery_code/save_acknowledge':\n      return replaceHistory(state.mfa.primaryInfo?.postAuthScreen ?? AppScreens.LoggedIn, {\n        ...state,\n        mfa: DEFAULT_MFA_STATE,\n      });\n\n    case 'totp/authenticate_success': {\n      const nextScreen = state.mfa.isEnrolling\n        ? AppScreens.RecoveryCodeSave\n        : (state.mfa.primaryInfo?.postAuthScreen ?? AppScreens.LoggedIn);\n      return replaceHistory(nextScreen, {\n        ...state,\n        mfa: state.mfa.isEnrolling ? state.mfa : DEFAULT_MFA_STATE,\n      });\n    }\n\n    case 'totp/create_success':\n      if (\n        !state.mfa.isEnrolling ||\n        state.mfa.primaryInfo?.memberId !== action.memberId ||\n        state.mfa.primaryInfo?.organizationId !== action.organizationId\n      ) {\n        return state;\n      }\n\n      return {\n        ...state,\n        mfa: {\n          ...state.mfa,\n          totp: {\n            ...state.mfa.totp,\n            enrollment: {\n              secret: action.response.secret,\n              qrCode: action.response.qr_code,\n              recoveryCodes: action.response.recovery_codes,\n              method: state.mfa.totp.enrollment?.method ?? 'qr',\n            },\n          },\n        },\n      };\n\n    case 'totp/show_code': {\n      if (!state.mfa.isEnrolling || !state.mfa.totp.enrollment) {\n        return state;\n      }\n\n      const method = action.method ?? state.mfa.totp.enrollment.method ?? 'qr';\n      const nextScreen = method === 'manual' ? AppScreens.TOTPEnrollmentManual : AppScreens.TOTPEnrollmentQRCode;\n\n      return pushHistory(nextScreen, {\n        ...state,\n        mfa: {\n          ...state.mfa,\n          totp: {\n            ...state.mfa.totp,\n            enrollment: {\n              ...state.mfa.totp.enrollment,\n              method,\n            },\n          },\n        },\n      });\n    }\n\n    default:\n      return state;\n  }\n};\n"],"names":["DEFAULT_SMS_OTP_EXPIRATION_MS","apiMfaMethodToProduct","method","B2BMFAProducts","totp","smsOtp","undefined","getNextEnrollmentScreen","enabledMethods","size","has","AppScreens","TOTPEnrollmentQRCode","SMSOTPEnrollment","MFAEnrollmentSelection","getSmsOtpCodeExpiration","Date","now","B2B_MFA_METHODS","mfaReducer","state","action","type","memberAuthenticated","response","member_session","postAuthScreen","resetTokenType","PasswordResetForm","LoggedIn","replaceHistory","mfa","DEFAULT_MFA_STATE","primary","primary_required","primaryAuthMethods","allowed_auth_methods","email_address","email","email_address_verified","emailVerified","member","newBaseState","flowState","AuthFlowType","Organization","organization","formState","passwordState","length","Error","error","ErrorType","CannotJoinOrgDueToAuthPolicy","canGoBack","Main","memberEnrolledInSmsOtp","mfa_phone_number_verified","memberEnrolledInTotp","totp_registration_id","primaryInfo","enrolledMfaMethods","filter","isTruthy","memberId","member_id","memberPhoneNumber","mfa_phone_number","organizationId","organization_id","organizationMfaOptionsSupported","mfa_methods","allowed_mfa_methods","map","organizationSupportsMethod","includes","getDefaultMethod","defaultMethod","default_mfa_method","smsImplicitlySent","mfa_required","secondary_auth_initiated","entryMethod","find","mfaState","TOTPEntry","nextState","codeExpiration","SMSOTPEntry","screen","screenHistory","getEnabledMethods","allMethods","orgSupportedMethods","uiIncludedMethods","includedMfaMethods","isEnrolling","isSending","sendError","pushHistory","formattedDestination","formattedPhoneNumber","enrolledNumber","phoneNumber","countryCode","nextScreen","RecoveryCodeSave","enrollment","secret","qrCode","qr_code","recoveryCodes","recovery_codes","TOTPEnrollmentManual"],"mappings":"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"}