@oneblink/apps-react 11.0.0-beta.1 → 11.0.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/apps/auth-service.d.ts +15 -8
  2. package/dist/apps/auth-service.js +18 -8
  3. package/dist/apps/auth-service.js.map +1 -1
  4. package/dist/apps/index.d.ts +10 -0
  5. package/dist/apps/index.js +10 -0
  6. package/dist/apps/index.js.map +1 -1
  7. package/dist/apps/mfa-service.d.ts +29 -0
  8. package/dist/apps/mfa-service.js +30 -0
  9. package/dist/apps/mfa-service.js.map +1 -0
  10. package/dist/apps/services/AWSCognitoClient.d.ts +17 -11
  11. package/dist/apps/services/AWSCognitoClient.js +67 -38
  12. package/dist/apps/services/AWSCognitoClient.js.map +1 -1
  13. package/dist/apps/services/cognito.d.ts +5 -24
  14. package/dist/apps/services/cognito.js +3 -32
  15. package/dist/apps/services/cognito.js.map +1 -1
  16. package/dist/components/mfa/MfaAuthenticatorAppDialog.js +2 -2
  17. package/dist/components/mfa/MfaAuthenticatorAppDialog.js.map +1 -1
  18. package/dist/components/mfa/MfaMethodRow.d.ts +4 -1
  19. package/dist/components/mfa/MfaMethodRow.js +5 -5
  20. package/dist/components/mfa/MfaMethodRow.js.map +1 -1
  21. package/dist/components/mfa/MfaPhoneNumberDialog.js +10 -35
  22. package/dist/components/mfa/MfaPhoneNumberDialog.js.map +1 -1
  23. package/dist/components/mfa/MultiFactorAuthentication.d.ts +12 -10
  24. package/dist/components/mfa/MultiFactorAuthentication.js +21 -14
  25. package/dist/components/mfa/MultiFactorAuthentication.js.map +1 -1
  26. package/dist/form-elements/FormElementBarcodeScanner.js +66 -18
  27. package/dist/form-elements/FormElementBarcodeScanner.js.map +1 -1
  28. package/dist/hooks/useLogin.d.ts +16 -2
  29. package/dist/hooks/useLogin.js +53 -3
  30. package/dist/hooks/useLogin.js.map +1 -1
  31. package/dist/hooks/useMfa.d.ts +66 -31
  32. package/dist/hooks/useMfa.js +84 -61
  33. package/dist/hooks/useMfa.js.map +1 -1
  34. package/dist/hooks/useResendCoolDown.d.ts +5 -0
  35. package/dist/hooks/useResendCoolDown.js +27 -0
  36. package/dist/hooks/useResendCoolDown.js.map +1 -0
  37. package/dist/index.d.ts +2 -0
  38. package/dist/index.js +2 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/styles/barcode-scanner.scss +4 -0
  41. package/dist/styles.css +5 -0
  42. package/dist/styles.scss +1 -0
  43. package/dist/utils/joinArray.d.ts +1 -0
  44. package/dist/utils/joinArray.js +7 -0
  45. package/dist/utils/joinArray.js.map +1 -0
  46. package/dist/utils/mfa-requirement.d.ts +12 -0
  47. package/dist/utils/mfa-requirement.js +149 -0
  48. package/dist/utils/mfa-requirement.js.map +1 -0
  49. package/package.json +3 -3
@@ -0,0 +1,149 @@
1
+ import { joinArray } from './joinArray';
2
+ export function isMfaRequired(mfaRequirement) {
3
+ return (!!mfaRequirement && (mfaRequirement.sms || mfaRequirement.authenticatorApp));
4
+ }
5
+ const MFA_REQUIREMENT_METHOD_KEYS = Object.keys({
6
+ sms: false,
7
+ authenticatorApp: false,
8
+ });
9
+ export function mfaRequirementToSelectedMethods(mfaRequirement) {
10
+ var _a, _b;
11
+ const checkboxState = {
12
+ sms: (_a = mfaRequirement === null || mfaRequirement === void 0 ? void 0 : mfaRequirement.sms) !== null && _a !== void 0 ? _a : false,
13
+ authenticatorApp: (_b = mfaRequirement === null || mfaRequirement === void 0 ? void 0 : mfaRequirement.authenticatorApp) !== null && _b !== void 0 ? _b : false,
14
+ };
15
+ const methods = [];
16
+ if (checkboxState.authenticatorApp) {
17
+ methods.push('authenticatorApp');
18
+ }
19
+ if (checkboxState.sms) {
20
+ methods.push('sms');
21
+ }
22
+ return methods;
23
+ }
24
+ export function mfaSelectedMethodsToMfaRequirement(methods) {
25
+ return {
26
+ sms: methods.includes('sms'),
27
+ authenticatorApp: methods.includes('authenticatorApp'),
28
+ };
29
+ }
30
+ export function formatMfaRequirementLabel(mfaRequirement) {
31
+ if (!isMfaRequired(mfaRequirement)) {
32
+ return 'MFA Optional';
33
+ }
34
+ const selectedMethods = mfaRequirementToSelectedMethods(mfaRequirement);
35
+ if (selectedMethods.length === MFA_REQUIREMENT_METHOD_KEYS.length) {
36
+ return 'MFA Required';
37
+ }
38
+ const methodList = joinArray(selectedMethods.map(formatMfaRequirementMethodLabel), 'disjunction');
39
+ return `MFA Required (${methodList} only)`;
40
+ }
41
+ function formatMfaRequirementMethodLabel(method) {
42
+ switch (method) {
43
+ case 'sms':
44
+ return 'SMS';
45
+ case 'authenticatorApp':
46
+ return 'Authenticator App';
47
+ default: {
48
+ const n = method;
49
+ return n;
50
+ }
51
+ }
52
+ }
53
+ function mfaRequirementMethodToLoggedInMfaMethod(method) {
54
+ return method === 'sms' ? 'SMS_MFA' : 'SOFTWARE_TOKEN_MFA';
55
+ }
56
+ export function isMfaMethodUsedForLogin(mfaSettings, method) {
57
+ return (mfaSettings.loggedInWithMfaMethod ===
58
+ mfaRequirementMethodToLoggedInMfaMethod(method));
59
+ }
60
+ export function userMeetsMfaRequirement(mfaRequirement, mfaSettings) {
61
+ if (!isMfaRequired(mfaRequirement)) {
62
+ return true;
63
+ }
64
+ if ((mfaRequirement === null || mfaRequirement === void 0 ? void 0 : mfaRequirement.sms) && mfaSettings.loggedInWithMfaMethod === 'SMS_MFA') {
65
+ return true;
66
+ }
67
+ if ((mfaRequirement === null || mfaRequirement === void 0 ? void 0 : mfaRequirement.authenticatorApp) &&
68
+ mfaSettings.loggedInWithMfaMethod === 'SOFTWARE_TOKEN_MFA') {
69
+ return true;
70
+ }
71
+ return false;
72
+ }
73
+ function formatMfaMethodNotAcceptedMessage(method, mfaRequirement, accessScopeLabel = 'app') {
74
+ if (!mfaRequirement || !isMfaRequired(mfaRequirement)) {
75
+ return undefined;
76
+ }
77
+ if (mfaRequirement[method]) {
78
+ return undefined;
79
+ }
80
+ const requiredMethods = mfaRequirementToSelectedMethods(mfaRequirement);
81
+ const methodList = joinArray(requiredMethods.map(formatMfaRequirementMethodLabel), 'disjunction');
82
+ return `This MFA method is not sufficient for using this ${accessScopeLabel.toLowerCase()}. Your administrator requires ${methodList} multi factor authentication.`;
83
+ }
84
+ function isMfaMethodEnabled(mfaSettings, method) {
85
+ return method === 'sms'
86
+ ? mfaSettings.sms.enabled
87
+ : mfaSettings.authenticator.enabled;
88
+ }
89
+ function isMfaMethodPreferred(mfaSettings, method) {
90
+ return method === 'sms'
91
+ ? mfaSettings.sms.preferred
92
+ : mfaSettings.authenticator.preferred;
93
+ }
94
+ function hasPreferredEnabledRequiredMethod(mfaRequirement, mfaSettings) {
95
+ return mfaRequirementToSelectedMethods(mfaRequirement).some((method) => isMfaMethodEnabled(mfaSettings, method) &&
96
+ isMfaMethodPreferred(mfaSettings, method));
97
+ }
98
+ export function formatMfaSetupRequiredMessage(mfaRequirement, mfaSettings, accessScopeLabel = 'Account') {
99
+ if (!mfaRequirement ||
100
+ !isMfaRequired(mfaRequirement) ||
101
+ userMeetsMfaRequirement(mfaRequirement, mfaSettings)) {
102
+ return undefined;
103
+ }
104
+ const requiredMethods = mfaRequirementToSelectedMethods(mfaRequirement);
105
+ if (requiredMethods.length === 1) {
106
+ const method = requiredMethods[0];
107
+ const methodLabel = formatMfaRequirementMethodLabel(method);
108
+ if (!isMfaMethodEnabled(mfaSettings, method)) {
109
+ return `requires ${methodLabel} multi factor authentication to be configured before accessing this ${accessScopeLabel}.`;
110
+ }
111
+ if (!isMfaMethodPreferred(mfaSettings, method)) {
112
+ return `requires ${methodLabel} multi factor authentication. Please change your preferred MFA method to ${methodLabel} to access this ${accessScopeLabel}.`;
113
+ }
114
+ return `requires ${methodLabel} multi factor authentication. Now that ${methodLabel} is your preferred MFA method, you must log out and log back in to access this ${accessScopeLabel}.`;
115
+ }
116
+ const methodList = joinArray(requiredMethods.map(formatMfaRequirementMethodLabel), 'disjunction');
117
+ const hasAnyMfaEnabled = mfaSettings.authenticator.enabled || mfaSettings.sms.enabled;
118
+ if (!hasAnyMfaEnabled) {
119
+ return `requires ${methodList} multi factor authentication to be configured before accessing this ${accessScopeLabel}.`;
120
+ }
121
+ if (!hasPreferredEnabledRequiredMethod(mfaRequirement, mfaSettings)) {
122
+ return `requires ${methodList} multi factor authentication. Please change your preferred MFA method to one of the accepted methods to access this ${accessScopeLabel}.`;
123
+ }
124
+ return `requires ${methodList} multi factor authentication. Now that your preferred MFA method meets this requirement, you must log out and log back in to access this ${accessScopeLabel}.`;
125
+ }
126
+ export function formatMfaMethodRequirementMessage(method, mfaRequirement, mfaSettings, accessScopeLabel = 'app') {
127
+ if (!mfaRequirement || !isMfaRequired(mfaRequirement)) {
128
+ return undefined;
129
+ }
130
+ const scope = accessScopeLabel.toLowerCase();
131
+ if (!mfaRequirement[method]) {
132
+ return formatMfaMethodNotAcceptedMessage(method, mfaRequirement, accessScopeLabel);
133
+ }
134
+ if (userMeetsMfaRequirement(mfaRequirement, mfaSettings)) {
135
+ return;
136
+ }
137
+ const methodLabel = formatMfaRequirementMethodLabel(method);
138
+ const isMethodEnabled = isMfaMethodEnabled(mfaSettings, method);
139
+ const isMethodPreferred = isMfaMethodPreferred(mfaSettings, method);
140
+ const firstSentence = `Your administrator requires ${methodLabel} multi factor authentication.`;
141
+ if (!isMethodEnabled) {
142
+ return `${firstSentence} Setup ${methodLabel} to access this ${scope}`;
143
+ }
144
+ if (!isMethodPreferred) {
145
+ return `${firstSentence} Set ${methodLabel} as your preferred MFA method to access this ${scope}.`;
146
+ }
147
+ return `${firstSentence} Now that ${methodLabel} is your preferred MFA method, you must log out and log back in to access this ${scope}.`;
148
+ }
149
+ //# sourceMappingURL=mfa-requirement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mfa-requirement.js","sourceRoot":"","sources":["../../src/utils/mfa-requirement.ts"],"names":[],"mappings":"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","sourcesContent":["import { MiscTypes } from '@oneblink/types'\r\nimport type {\r\n LoggedInMfaMethod,\r\n MfaSettings,\r\n} from '../apps/services/AWSCognitoClient'\r\nimport { joinArray } from './joinArray'\r\n\r\nexport type { LoggedInMfaMethod, MfaSettings }\r\n\r\nexport function isMfaRequired(\r\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\r\n): boolean {\r\n return (\r\n !!mfaRequirement && (mfaRequirement.sms || mfaRequirement.authenticatorApp)\r\n )\r\n}\r\n\r\nexport type MfaRequirementMethod = keyof MiscTypes.MfaRequirement\r\n\r\nconst MFA_REQUIREMENT_METHOD_KEYS = Object.keys({\r\n sms: false,\r\n authenticatorApp: false,\r\n} satisfies MiscTypes.MfaRequirement) as MfaRequirementMethod[]\r\n\r\nexport function mfaRequirementToSelectedMethods(\r\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\r\n): MfaRequirementMethod[] {\r\n const checkboxState = {\r\n sms: mfaRequirement?.sms ?? false,\r\n authenticatorApp: mfaRequirement?.authenticatorApp ?? false,\r\n }\r\n const methods: MfaRequirementMethod[] = []\r\n\r\n if (checkboxState.authenticatorApp) {\r\n methods.push('authenticatorApp')\r\n }\r\n\r\n if (checkboxState.sms) {\r\n methods.push('sms')\r\n }\r\n\r\n return methods\r\n}\r\n\r\nexport function mfaSelectedMethodsToMfaRequirement(\r\n methods: MfaRequirementMethod[],\r\n): MiscTypes.MfaRequirement {\r\n return {\r\n sms: methods.includes('sms'),\r\n authenticatorApp: methods.includes('authenticatorApp'),\r\n }\r\n}\r\n\r\nexport function formatMfaRequirementLabel(\r\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\r\n): string {\r\n if (!isMfaRequired(mfaRequirement)) {\r\n return 'MFA Optional'\r\n }\r\n\r\n const selectedMethods = mfaRequirementToSelectedMethods(mfaRequirement)\r\n\r\n if (selectedMethods.length === MFA_REQUIREMENT_METHOD_KEYS.length) {\r\n return 'MFA Required'\r\n }\r\n\r\n const methodList = joinArray(\r\n selectedMethods.map(formatMfaRequirementMethodLabel),\r\n 'disjunction',\r\n )\r\n\r\n return `MFA Required (${methodList} only)`\r\n}\r\n\r\nfunction formatMfaRequirementMethodLabel(method: MfaRequirementMethod): string {\r\n switch (method) {\r\n case 'sms':\r\n return 'SMS'\r\n case 'authenticatorApp':\r\n return 'Authenticator App'\r\n default: {\r\n const n: never = method\r\n return n\r\n }\r\n }\r\n}\r\n\r\nfunction mfaRequirementMethodToLoggedInMfaMethod(\r\n method: MfaRequirementMethod,\r\n): Exclude<LoggedInMfaMethod, 'NO_MFA_ENABLED'> {\r\n return method === 'sms' ? 'SMS_MFA' : 'SOFTWARE_TOKEN_MFA'\r\n}\r\n\r\nexport function isMfaMethodUsedForLogin(\r\n mfaSettings: MfaSettings,\r\n method: MfaRequirementMethod,\r\n): boolean {\r\n return (\r\n mfaSettings.loggedInWithMfaMethod ===\r\n mfaRequirementMethodToLoggedInMfaMethod(method)\r\n )\r\n}\r\n\r\nexport function userMeetsMfaRequirement(\r\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\r\n mfaSettings: MfaSettings,\r\n): boolean {\r\n if (!isMfaRequired(mfaRequirement)) {\r\n return true\r\n }\r\n\r\n if (mfaRequirement?.sms && mfaSettings.loggedInWithMfaMethod === 'SMS_MFA') {\r\n return true\r\n }\r\n\r\n if (\r\n mfaRequirement?.authenticatorApp &&\r\n mfaSettings.loggedInWithMfaMethod === 'SOFTWARE_TOKEN_MFA'\r\n ) {\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\nfunction formatMfaMethodNotAcceptedMessage(\r\n method: MfaRequirementMethod,\r\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\r\n accessScopeLabel = 'app',\r\n): string | undefined {\r\n if (!mfaRequirement || !isMfaRequired(mfaRequirement)) {\r\n return undefined\r\n }\r\n\r\n if (mfaRequirement[method]) {\r\n return undefined\r\n }\r\n\r\n const requiredMethods = mfaRequirementToSelectedMethods(mfaRequirement)\r\n\r\n const methodList = joinArray(\r\n requiredMethods.map(formatMfaRequirementMethodLabel),\r\n 'disjunction',\r\n )\r\n\r\n return `This MFA method is not sufficient for using this ${accessScopeLabel.toLowerCase()}. Your administrator requires ${methodList} multi factor authentication.`\r\n}\r\n\r\nfunction isMfaMethodEnabled(\r\n mfaSettings: MfaSettings,\r\n method: MfaRequirementMethod,\r\n): boolean {\r\n return method === 'sms'\r\n ? mfaSettings.sms.enabled\r\n : mfaSettings.authenticator.enabled\r\n}\r\n\r\nfunction isMfaMethodPreferred(\r\n mfaSettings: MfaSettings,\r\n method: MfaRequirementMethod,\r\n): boolean {\r\n return method === 'sms'\r\n ? mfaSettings.sms.preferred\r\n : mfaSettings.authenticator.preferred\r\n}\r\n\r\nfunction hasPreferredEnabledRequiredMethod(\r\n mfaRequirement: MiscTypes.MfaRequirement,\r\n mfaSettings: MfaSettings,\r\n): boolean {\r\n return mfaRequirementToSelectedMethods(mfaRequirement).some(\r\n (method) =>\r\n isMfaMethodEnabled(mfaSettings, method) &&\r\n isMfaMethodPreferred(mfaSettings, method),\r\n )\r\n}\r\n\r\nexport function formatMfaSetupRequiredMessage(\r\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\r\n mfaSettings: MfaSettings,\r\n accessScopeLabel = 'Account',\r\n): string | undefined {\r\n if (\r\n !mfaRequirement ||\r\n !isMfaRequired(mfaRequirement) ||\r\n userMeetsMfaRequirement(mfaRequirement, mfaSettings)\r\n ) {\r\n return undefined\r\n }\r\n\r\n const requiredMethods = mfaRequirementToSelectedMethods(mfaRequirement)\r\n\r\n if (requiredMethods.length === 1) {\r\n const method = requiredMethods[0]\r\n const methodLabel = formatMfaRequirementMethodLabel(method)\r\n\r\n if (!isMfaMethodEnabled(mfaSettings, method)) {\r\n return `requires ${methodLabel} multi factor authentication to be configured before accessing this ${accessScopeLabel}.`\r\n }\r\n\r\n if (!isMfaMethodPreferred(mfaSettings, method)) {\r\n return `requires ${methodLabel} multi factor authentication. Please change your preferred MFA method to ${methodLabel} to access this ${accessScopeLabel}.`\r\n }\r\n\r\n return `requires ${methodLabel} multi factor authentication. Now that ${methodLabel} is your preferred MFA method, you must log out and log back in to access this ${accessScopeLabel}.`\r\n }\r\n\r\n const methodList = joinArray(\r\n requiredMethods.map(formatMfaRequirementMethodLabel),\r\n 'disjunction',\r\n )\r\n const hasAnyMfaEnabled =\r\n mfaSettings.authenticator.enabled || mfaSettings.sms.enabled\r\n\r\n if (!hasAnyMfaEnabled) {\r\n return `requires ${methodList} multi factor authentication to be configured before accessing this ${accessScopeLabel}.`\r\n }\r\n\r\n if (!hasPreferredEnabledRequiredMethod(mfaRequirement, mfaSettings)) {\r\n return `requires ${methodList} multi factor authentication. Please change your preferred MFA method to one of the accepted methods to access this ${accessScopeLabel}.`\r\n }\r\n\r\n return `requires ${methodList} multi factor authentication. Now that your preferred MFA method meets this requirement, you must log out and log back in to access this ${accessScopeLabel}.`\r\n}\r\n\r\nexport function formatMfaMethodRequirementMessage(\r\n method: MfaRequirementMethod,\r\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\r\n mfaSettings: MfaSettings,\r\n accessScopeLabel = 'app',\r\n): string | undefined {\r\n if (!mfaRequirement || !isMfaRequired(mfaRequirement)) {\r\n return undefined\r\n }\r\n\r\n const scope = accessScopeLabel.toLowerCase()\r\n\r\n if (!mfaRequirement[method]) {\r\n return formatMfaMethodNotAcceptedMessage(\r\n method,\r\n mfaRequirement,\r\n accessScopeLabel,\r\n )\r\n }\r\n\r\n if (userMeetsMfaRequirement(mfaRequirement, mfaSettings)) {\r\n return\r\n }\r\n\r\n const methodLabel = formatMfaRequirementMethodLabel(method)\r\n const isMethodEnabled = isMfaMethodEnabled(mfaSettings, method)\r\n const isMethodPreferred = isMfaMethodPreferred(mfaSettings, method)\r\n\r\n const firstSentence = `Your administrator requires ${methodLabel} multi factor authentication.`\r\n\r\n if (!isMethodEnabled) {\r\n return `${firstSentence} Setup ${methodLabel} to access this ${scope}`\r\n }\r\n\r\n if (!isMethodPreferred) {\r\n return `${firstSentence} Set ${methodLabel} as your preferred MFA method to access this ${scope}.`\r\n }\r\n\r\n return `${firstSentence} Now that ${methodLabel} is your preferred MFA method, you must log out and log back in to access this ${scope}.`\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oneblink/apps-react",
3
3
  "description": "Helper functions for OneBlink apps in ReactJS.",
4
- "version": "11.0.0-beta.1",
4
+ "version": "11.0.0-beta.11",
5
5
  "author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/oneblink/apps-react/issues"
@@ -12,8 +12,8 @@
12
12
  "@emotion/react": "^11.14.0",
13
13
  "@emotion/styled": "^11.14.1",
14
14
  "@nylas/react": "^3.1.2",
15
- "@oneblink/sdk-core": "^9.2.1-beta.1",
16
- "@oneblink/storage": "^7.1.1-beta.2",
15
+ "@oneblink/sdk-core": "^9.2.2-beta.1",
16
+ "@oneblink/storage": "^7.1.2-beta.2",
17
17
  "@react-google-maps/api": "^2.20.8",
18
18
  "@react-input/mask": "^2.0.4",
19
19
  "@sentry/browser": "^10.38.0",