synapse-react-client 3.1.26 → 3.1.28
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.
- package/dist/assets/icons/FrontHand.d.ts +3 -0
- package/dist/assets/icons/FrontHand.js +14 -0
- package/dist/assets/icons/FrontHand.js.map +1 -0
- package/dist/assets/icons/twofactor-graphic.svg +77 -0
- package/dist/containers/IconSvg.d.ts +2 -2
- package/dist/containers/IconSvg.js +2 -0
- package/dist/containers/IconSvg.js.map +1 -1
- package/dist/containers/TextField.d.ts +3 -1
- package/dist/containers/TextField.js +10 -4
- package/dist/containers/TextField.js.map +1 -1
- package/dist/containers/UserSearchBoxV2.js +1 -1
- package/dist/containers/UserSearchBoxV2.js.map +1 -1
- package/dist/containers/auth/LoginPage.js +15 -11
- package/dist/containers/auth/LoginPage.js.map +1 -1
- package/dist/containers/auth/RecoveryCodeGrid.d.ts +7 -0
- package/dist/containers/auth/RecoveryCodeGrid.js +32 -0
- package/dist/containers/auth/RecoveryCodeGrid.js.map +1 -0
- package/dist/containers/auth/RegenerateBackupCodesWarning.d.ts +7 -0
- package/dist/containers/auth/RegenerateBackupCodesWarning.js +26 -0
- package/dist/containers/auth/RegenerateBackupCodesWarning.js.map +1 -0
- package/dist/containers/auth/StandaloneLoginForm.js +1 -0
- package/dist/containers/auth/StandaloneLoginForm.js.map +1 -1
- package/dist/containers/auth/TwoFactorAuthSettingsPanel.d.ts +6 -0
- package/dist/containers/auth/TwoFactorAuthSettingsPanel.js +48 -0
- package/dist/containers/auth/TwoFactorAuthSettingsPanel.js.map +1 -0
- package/dist/containers/auth/TwoFactorBackupCodes.d.ts +6 -0
- package/dist/containers/auth/TwoFactorBackupCodes.js +89 -0
- package/dist/containers/auth/TwoFactorBackupCodes.js.map +1 -0
- package/dist/containers/auth/TwoFactorEnrollmentForm.d.ts +17 -0
- package/dist/containers/auth/TwoFactorEnrollmentForm.js +143 -0
- package/dist/containers/auth/TwoFactorEnrollmentForm.js.map +1 -0
- package/dist/containers/auth/TwoFactorSecretDialog.d.ts +8 -0
- package/dist/containers/auth/TwoFactorSecretDialog.js +34 -0
- package/dist/containers/auth/TwoFactorSecretDialog.js.map +1 -0
- package/dist/containers/dataaccess/AccessHistoryDashboard.js +7 -3
- package/dist/containers/dataaccess/AccessHistoryDashboard.js.map +1 -1
- package/dist/containers/dataaccess/ReviewerDashboard.js +1 -1
- package/dist/containers/dataaccess/ReviewerDashboard.js.map +1 -1
- package/dist/containers/oauth/CreateOAuthClient.js +34 -21
- package/dist/containers/oauth/CreateOAuthClient.js.map +1 -1
- package/dist/containers/widgets/themes-plot/BarPlot.js +1 -0
- package/dist/containers/widgets/themes-plot/BarPlot.js.map +1 -1
- package/dist/style/components/_synapse-nav-drawer.scss +2 -1
- package/dist/umd/synapse-react-client.development.css +15 -6
- package/dist/umd/synapse-react-client.development.css.map +2 -2
- package/dist/umd/synapse-react-client.development.js +24702 -14623
- package/dist/umd/synapse-react-client.development.js.map +4 -4
- package/dist/umd/synapse-react-client.production.min.css +9 -5
- package/dist/umd/synapse-react-client.production.min.js +236 -169
- package/dist/umd.index.d.ts +6 -0
- package/dist/umd.index.js +6 -0
- package/dist/umd.index.js.map +1 -1
- package/dist/utils/SynapseClient.d.ts +38 -1
- package/dist/utils/SynapseClient.js +58 -5
- package/dist/utils/SynapseClient.js.map +1 -1
- package/dist/utils/hooks/SynapseAPI/KeyFactory.d.ts +1 -0
- package/dist/utils/hooks/SynapseAPI/KeyFactory.js +3 -0
- package/dist/utils/hooks/SynapseAPI/KeyFactory.js.map +1 -1
- package/dist/utils/hooks/SynapseAPI/auth/useTwoFactorEnrollment.d.ts +7 -0
- package/dist/utils/hooks/SynapseAPI/auth/useTwoFactorEnrollment.js +74 -0
- package/dist/utils/hooks/SynapseAPI/auth/useTwoFactorEnrollment.js.map +1 -0
- package/dist/utils/hooks/useLogin.js +4 -0
- package/dist/utils/hooks/useLogin.js.map +1 -1
- package/dist/utils/hooks/useMediaPrintOnly.d.ts +11 -0
- package/dist/utils/hooks/useMediaPrintOnly.js +26 -0
- package/dist/utils/hooks/useMediaPrintOnly.js.map +1 -0
- package/dist/utils/synapseTypes/OAuthClient.d.ts +7 -0
- package/dist/utils/synapseTypes/OAuthClient.js.map +1 -1
- package/dist/utils/synapseTypes/TotpSecret.d.ts +20 -0
- package/dist/utils/synapseTypes/TotpSecret.js +3 -0
- package/dist/utils/synapseTypes/TotpSecret.js.map +1 -0
- package/dist/utils/synapseTypes/TwoFactorAuthRecoveryCodes.d.ts +8 -0
- package/dist/utils/synapseTypes/TwoFactorAuthRecoveryCodes.js +3 -0
- package/dist/utils/synapseTypes/TwoFactorAuthRecoveryCodes.js.map +1 -0
- package/dist/utils/theme/DefaultTheme.js +14 -0
- package/dist/utils/theme/DefaultTheme.js.map +1 -1
- package/dist/utils/theme/ThemeTypes.d.ts +1 -1
- package/dist/utils/theme/palette/Palettes.d.ts +3 -1
- package/dist/utils/theme/palette/Palettes.js +16 -15
- package/dist/utils/theme/palette/Palettes.js.map +1 -1
- package/dist/utils/theme/typography/Typography.d.ts +2 -0
- package/dist/utils/theme/typography/Typography.js +10 -2
- package/dist/utils/theme/typography/Typography.js.map +1 -1
- package/package.json +8 -6
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var material_1 = require("@mui/material");
|
|
5
|
+
var react_1 = tslib_1.__importDefault(require("react"));
|
|
6
|
+
var IconSvg_1 = tslib_1.__importDefault(require("../IconSvg"));
|
|
7
|
+
var TwoFactorEnrollmentForm_1 = require("./TwoFactorEnrollmentForm");
|
|
8
|
+
var useTwoFactorEnrollment_1 = require("../../utils/hooks/SynapseAPI/auth/useTwoFactorEnrollment");
|
|
9
|
+
var ConditionalWrapper_1 = tslib_1.__importDefault(require("../utils/ConditionalWrapper"));
|
|
10
|
+
var ToastMessage_1 = require("../ToastMessage");
|
|
11
|
+
function TwoFactorAuthSettingsPanel(props) {
|
|
12
|
+
var onRegenerateBackupCodes = props.onRegenerateBackupCodes, onBeginTwoFactorEnrollment = props.onBeginTwoFactorEnrollment;
|
|
13
|
+
var _a = (0, useTwoFactorEnrollment_1.useGetTwoFactorEnrollmentStatus)(), status = _a.data, isLoadingStatus = _a.isLoading;
|
|
14
|
+
var isActivated = (status === null || status === void 0 ? void 0 : status.status) === 'ENABLED';
|
|
15
|
+
var _b = (0, useTwoFactorEnrollment_1.useDisableTwoFactorAuth)({
|
|
16
|
+
onSuccess: function () {
|
|
17
|
+
(0, ToastMessage_1.displayToast)('2FA removed from this account', 'info');
|
|
18
|
+
},
|
|
19
|
+
}), disable2FA = _b.mutate, isLoadingMutation = _b.isLoading;
|
|
20
|
+
var isLoading = isLoadingStatus || isLoadingMutation;
|
|
21
|
+
return (react_1.default.createElement(material_1.Box, null,
|
|
22
|
+
react_1.default.createElement(material_1.Typography, { variant: 'headline2' }, "Two-factor Authentication (2FA)"),
|
|
23
|
+
react_1.default.createElement(ConditionalWrapper_1.default, { condition: isLoading, wrapper: material_1.Skeleton },
|
|
24
|
+
react_1.default.createElement(material_1.Typography, { variant: 'body1', color: isActivated ? 'success.main' : 'error.main', sx: { my: 2, display: 'flex', alignItems: 'center' } },
|
|
25
|
+
react_1.default.createElement(IconSvg_1.default, { icon: isActivated ? 'check' : 'cross', sx: { mr: 1, height: '24px' } }),
|
|
26
|
+
isLoading ? 'Loading...' : isActivated ? 'Active' : 'Inactive')),
|
|
27
|
+
react_1.default.createElement(material_1.Typography, { variant: 'body1Italic', sx: { my: 1 } }, "Required to satisfy certain data access requirements, and recommended for overall account security."),
|
|
28
|
+
react_1.default.createElement(material_1.Typography, { variant: 'body1', sx: { my: 2 } }, "Synapse uses a time-based system, which you can set up using an app like Google Authenticator, Duo Mobile, Microsoft Authenticator, or Authy. Certain data may require 2FA to be turned on for your account in order to request access."),
|
|
29
|
+
react_1.default.createElement(material_1.Stack, { direction: 'row', gap: 1 },
|
|
30
|
+
react_1.default.createElement(ConditionalWrapper_1.default, { condition: isLoadingStatus, wrapper: material_1.Skeleton },
|
|
31
|
+
react_1.default.createElement(material_1.Button, { variant: 'outlined', disabled: isLoading, onClick: function () {
|
|
32
|
+
if (!isActivated) {
|
|
33
|
+
onBeginTwoFactorEnrollment();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
disable2FA();
|
|
37
|
+
}
|
|
38
|
+
} },
|
|
39
|
+
isActivated ? 'Deactivate' : 'Activate',
|
|
40
|
+
" 2FA")),
|
|
41
|
+
(status === null || status === void 0 ? void 0 : status.status) !== 'DISABLED' && (react_1.default.createElement(ConditionalWrapper_1.default, { condition: isLoadingStatus, wrapper: material_1.Skeleton },
|
|
42
|
+
react_1.default.createElement(material_1.Button, { variant: 'text', disabled: isLoading, onClick: function () {
|
|
43
|
+
onRegenerateBackupCodes();
|
|
44
|
+
} }, "Regenerate Backup Codes"))),
|
|
45
|
+
react_1.default.createElement(material_1.Button, { variant: 'text', onClick: function () { return window.open(TwoFactorEnrollmentForm_1.TWO_FACTOR_DOCS_LINK, '_blank'); } }, "More Information"))));
|
|
46
|
+
}
|
|
47
|
+
exports.default = TwoFactorAuthSettingsPanel;
|
|
48
|
+
//# sourceMappingURL=TwoFactorAuthSettingsPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TwoFactorAuthSettingsPanel.js","sourceRoot":"","sources":["../../../src/lib/containers/auth/TwoFactorAuthSettingsPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var react_1 = tslib_1.__importStar(require("react"));
|
|
5
|
+
var material_1 = require("@mui/material");
|
|
6
|
+
var LeftRightPanel_1 = require("../../components/styled/LeftRightPanel");
|
|
7
|
+
var IconSvg_1 = tslib_1.__importDefault(require("../IconSvg"));
|
|
8
|
+
var react_query_1 = require("react-query");
|
|
9
|
+
var SynapseClient_1 = require("../../utils/SynapseClient");
|
|
10
|
+
var SynapseContext_1 = require("../../utils/SynapseContext");
|
|
11
|
+
var ToastMessage_1 = require("../ToastMessage");
|
|
12
|
+
var RegenerateBackupCodesWarning_1 = require("./RegenerateBackupCodesWarning");
|
|
13
|
+
var RecoveryCodeGrid_1 = require("./RecoveryCodeGrid");
|
|
14
|
+
var useMediaPrintOnly_1 = require("../../utils/hooks/useMediaPrintOnly");
|
|
15
|
+
function TwoFactorBackupCodes(props) {
|
|
16
|
+
var showReplaceOldCodesWarning = props.showReplaceOldCodesWarning, onClose = props.onClose;
|
|
17
|
+
var theme = (0, material_1.useTheme)();
|
|
18
|
+
var _a = (0, react_1.useState)(!showReplaceOldCodesWarning), hasConfirmedRegeneration = _a[0], setHasConfirmedRegeneration = _a[1];
|
|
19
|
+
var accessToken = (0, SynapseContext_1.useSynapseContext)().accessToken;
|
|
20
|
+
var _b = (0, react_query_1.useMutation)({
|
|
21
|
+
mutationFn: function () { return (0, SynapseClient_1.createRecoveryCodes)(accessToken); },
|
|
22
|
+
onMutate: function () {
|
|
23
|
+
setHasConfirmedRegeneration(true);
|
|
24
|
+
},
|
|
25
|
+
}), generateCodes = _b.mutate, recoveryCodes = _b.data, error = _b.error;
|
|
26
|
+
// Generate codes on mount if no warning is shown
|
|
27
|
+
(0, react_1.useEffect)(function () {
|
|
28
|
+
if (!showReplaceOldCodesWarning) {
|
|
29
|
+
generateCodes();
|
|
30
|
+
}
|
|
31
|
+
// Run on mount only
|
|
32
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
33
|
+
}, []);
|
|
34
|
+
var _c = (0, useMediaPrintOnly_1.useMediaPrintOnly)(), visibleOnPrintClassName = _c.visibleOnPrintClassName, hiddenOnPrintClassName = _c.hiddenOnPrintClassName;
|
|
35
|
+
var copyCodesToClipboard = react_1.default.useCallback(function () {
|
|
36
|
+
var codes = ((recoveryCodes === null || recoveryCodes === void 0 ? void 0 : recoveryCodes.codes) || []).join('\n');
|
|
37
|
+
navigator.clipboard.writeText(codes).then(function () {
|
|
38
|
+
(0, ToastMessage_1.displayToast)('Recovery codes copied to clipboard', 'success');
|
|
39
|
+
});
|
|
40
|
+
}, [recoveryCodes]);
|
|
41
|
+
if (showReplaceOldCodesWarning && !hasConfirmedRegeneration) {
|
|
42
|
+
return (react_1.default.createElement(LeftRightPanel_1.StyledOuterContainer, { sx: { display: 'flex', flexDirection: 'column' } },
|
|
43
|
+
react_1.default.createElement(RegenerateBackupCodesWarning_1.RegenerateBackupCodesWarning, { onConfirm: generateCodes, onCancel: onClose })));
|
|
44
|
+
}
|
|
45
|
+
return (react_1.default.createElement(LeftRightPanel_1.LeftRightPanel, { className: visibleOnPrintClassName, leftContent: react_1.default.createElement(material_1.Box, { sx: {
|
|
46
|
+
py: 10,
|
|
47
|
+
px: 8,
|
|
48
|
+
height: '100%',
|
|
49
|
+
position: 'relative',
|
|
50
|
+
} },
|
|
51
|
+
react_1.default.createElement(material_1.IconButton, { type: "button", onClick: onClose, className: hiddenOnPrintClassName, sx: {
|
|
52
|
+
position: 'absolute',
|
|
53
|
+
top: theme.spacing(2),
|
|
54
|
+
left: theme.spacing(2),
|
|
55
|
+
} },
|
|
56
|
+
react_1.default.createElement(IconSvg_1.default, { icon: "arrowBack", wrap: false, sx: { height: '24px', width: '24px' } })),
|
|
57
|
+
react_1.default.createElement(material_1.Typography, { variant: "headline1", sx: { mt: 7 } }, "Backup codes"),
|
|
58
|
+
showReplaceOldCodesWarning && (react_1.default.createElement(material_1.Alert, { severity: "warning", className: hiddenOnPrintClassName, sx: {
|
|
59
|
+
my: 2,
|
|
60
|
+
}, icon: false },
|
|
61
|
+
react_1.default.createElement("strong", null, "These new codes have replaced your old codes."),
|
|
62
|
+
' ',
|
|
63
|
+
"Please save these codes and use them from now on.")),
|
|
64
|
+
react_1.default.createElement(RecoveryCodeGrid_1.RecoveryCodeGrid, { recoveryCodes: recoveryCodes }),
|
|
65
|
+
error && (react_1.default.createElement(material_1.Alert, { severity: 'error', sx: { my: 2 }, icon: false }, error.message)),
|
|
66
|
+
react_1.default.createElement(material_1.Box, { className: hiddenOnPrintClassName, sx: {
|
|
67
|
+
display: 'grid',
|
|
68
|
+
gridTemplateColumns: '1fr 1fr',
|
|
69
|
+
gap: '10px',
|
|
70
|
+
mb: '10px',
|
|
71
|
+
} },
|
|
72
|
+
react_1.default.createElement(material_1.Button, { variant: 'outlined', onClick: copyCodesToClipboard, disabled: !recoveryCodes }, "Copy to Clipboard"),
|
|
73
|
+
react_1.default.createElement(material_1.Button, { variant: 'outlined', disabled: !recoveryCodes, onClick: window.print }, "Print Codes")),
|
|
74
|
+
react_1.default.createElement(material_1.Button, { variant: 'contained', className: hiddenOnPrintClassName, fullWidth: true, disabled: !recoveryCodes, onClick: onClose }, "Done")), rightContent: react_1.default.createElement(material_1.Box, { sx: {
|
|
75
|
+
py: 10,
|
|
76
|
+
height: '100%',
|
|
77
|
+
background: "url(https://s3.amazonaws.com/static.synapse.org/images/twofactor-graphic.svg) no-repeat right bottom",
|
|
78
|
+
backgroundSize: '100%',
|
|
79
|
+
} },
|
|
80
|
+
react_1.default.createElement(material_1.Box, { sx: {
|
|
81
|
+
mt: 7,
|
|
82
|
+
px: 9,
|
|
83
|
+
} },
|
|
84
|
+
react_1.default.createElement(material_1.Typography, { variant: "headline1", sx: { mb: 2.5 } }, "Save these codes"),
|
|
85
|
+
react_1.default.createElement(material_1.Typography, { variant: "body1", sx: { my: 2 } }, "You can use these 10 backup codes to access your account if you ever lose access to your authentication device."),
|
|
86
|
+
react_1.default.createElement(material_1.Typography, { variant: "body1", sx: { my: 2 } }, "Each code can only be used once."))) }));
|
|
87
|
+
}
|
|
88
|
+
exports.default = TwoFactorBackupCodes;
|
|
89
|
+
//# sourceMappingURL=TwoFactorBackupCodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TwoFactorBackupCodes.js","sourceRoot":"","sources":["../../../src/lib/containers/auth/TwoFactorBackupCodes.tsx"],"names":[],"mappings":";;;AAAA,qDAAkD;AAClD,0CAOsB;AACtB,yEAG+C;AAC/C,+DAAgC;AAChC,2CAAyC;AACzC,2DAA+D;AAC/D,6DAA8D;AAC9D,gDAA8C;AAC9C,+EAA6E;AAC7E,uDAAqD;AAGrD,yEAAuE;AASvE,SAAwB,oBAAoB,CAAC,KAAgC;IACnE,IAAA,0BAA0B,GAAc,KAAK,2BAAnB,EAAE,OAAO,GAAK,KAAK,QAAV,CAAU;IACrD,IAAM,KAAK,GAAG,IAAA,mBAAQ,GAAE,CAAA;IAClB,IAAA,KAA0D,IAAA,gBAAQ,EACtE,CAAC,0BAA0B,CAC5B,EAFM,wBAAwB,QAAA,EAAE,2BAA2B,QAE3D,CAAA;IAEO,IAAA,WAAW,GAAK,IAAA,kCAAiB,GAAE,YAAxB,CAAwB;IAErC,IAAA,KAIF,IAAA,yBAAW,EAAiD;QAC9D,UAAU,EAAE,cAAM,OAAA,IAAA,mCAAmB,EAAC,WAAW,CAAC,EAAhC,CAAgC;QAClD,QAAQ,EAAE;YACR,2BAA2B,CAAC,IAAI,CAAC,CAAA;QACnC,CAAC;KACF,CAAC,EARQ,aAAa,YAAA,EACf,aAAa,UAAA,EACnB,KAAK,WAML,CAAA;IAEF,iDAAiD;IACjD,IAAA,iBAAS,EAAC;QACR,IAAI,CAAC,0BAA0B,EAAE;YAC/B,aAAa,EAAE,CAAA;SAChB;QACD,oBAAoB;QACpB,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAA;IAEA,IAAA,KACJ,IAAA,qCAAiB,GAAE,EADb,uBAAuB,6BAAA,EAAE,sBAAsB,4BAClC,CAAA;IAErB,IAAM,oBAAoB,GAAG,eAAK,CAAC,WAAW,CAAC;QAC7C,IAAM,KAAK,GAAG,CAAC,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,KAAK,KAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrD,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;YACxC,IAAA,2BAAY,EAAC,oCAAoC,EAAE,SAAS,CAAC,CAAA;QAC/D,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IAEnB,IAAI,0BAA0B,IAAI,CAAC,wBAAwB,EAAE;QAC3D,OAAO,CACL,8BAAC,qCAAoB,IAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE;YACpE,8BAAC,2DAA4B,IAC3B,SAAS,EAAE,aAAa,EACxB,QAAQ,EAAE,OAAO,GACjB,CACmB,CACxB,CAAA;KACF;IAED,OAAO,CACL,8BAAC,+BAAc,IACb,SAAS,EAAE,uBAAuB,EAClC,WAAW,EACT,8BAAC,cAAG,IACF,EAAE,EAAE;gBACF,EAAE,EAAE,EAAE;gBACN,EAAE,EAAE,CAAC;gBACL,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,UAAU;aACrB;YAED,8BAAC,qBAAU,IACT,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,sBAAsB,EACjC,EAAE,EAAE;oBACF,QAAQ,EAAE,UAAU;oBACpB,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;oBACrB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;iBACvB;gBAED,8BAAC,iBAAO,IACN,IAAI,EAAC,WAAW,EAChB,IAAI,EAAE,KAAK,EACX,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GACrC,CACS;YACb,8BAAC,qBAAU,IAAC,OAAO,EAAC,WAAW,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,mBAEhC;YACZ,0BAA0B,IAAI,CAC7B,8BAAC,gBAAK,IACJ,QAAQ,EAAC,SAAS,EAClB,SAAS,EAAE,sBAAsB,EACjC,EAAE,EAAE;oBACF,EAAE,EAAE,CAAC;iBACN,EACD,IAAI,EAAE,KAAK;gBAEX,8FAA8D;gBAAC,GAAG;oEAE5D,CACT;YACD,8BAAC,mCAAgB,IAAC,aAAa,EAAE,aAAa,GAAI;YACjD,KAAK,IAAI,CACR,8BAAC,gBAAK,IAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,IACjD,KAAK,CAAC,OAAO,CACR,CACT;YACD,8BAAC,cAAG,IACF,SAAS,EAAE,sBAAsB,EACjC,EAAE,EAAE;oBACF,OAAO,EAAE,MAAM;oBACf,mBAAmB,EAAE,SAAS;oBAC9B,GAAG,EAAE,MAAM;oBACX,EAAE,EAAE,MAAM;iBACX;gBAED,8BAAC,iBAAM,IACL,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,CAAC,aAAa,wBAGjB;gBACT,8BAAC,iBAAM,IACL,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,CAAC,aAAa,EACxB,OAAO,EAAE,MAAM,CAAC,KAAK,kBAGd,CACL;YACN,8BAAC,iBAAM,IACL,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,sBAAsB,EACjC,SAAS,QACT,QAAQ,EAAE,CAAC,aAAa,EACxB,OAAO,EAAE,OAAO,WAGT,CACL,EAER,YAAY,EACV,8BAAC,cAAG,IACF,EAAE,EAAE;gBACF,EAAE,EAAE,EAAE;gBACN,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,sGAAsG;gBAClH,cAAc,EAAE,MAAM;aACvB;YAED,8BAAC,cAAG,IACF,EAAE,EAAE;oBACF,EAAE,EAAE,CAAC;oBACL,EAAE,EAAE,CAAC;iBACN;gBAED,8BAAC,qBAAU,IAAC,OAAO,EAAC,WAAW,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,uBAElC;gBACb,8BAAC,qBAAU,IAAC,OAAO,EAAC,OAAO,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,sHAG5B;gBACb,8BAAC,qBAAU,IAAC,OAAO,EAAC,OAAO,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,uCAE5B,CACT,CACF,GAER,CACH,CAAA;AACH,CAAC;AArKD,uCAqKC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { TotpSecret } from '../../utils/synapseTypes/TotpSecret';
|
|
3
|
+
/**
|
|
4
|
+
* Returns a URL that can be used to generate a QR code that 2FA authenticator apps can interpret
|
|
5
|
+
* @param secret
|
|
6
|
+
* @param subject
|
|
7
|
+
*/
|
|
8
|
+
declare function toOtpAuthUrl(secret: TotpSecret, subject: string): string;
|
|
9
|
+
export declare const TWO_FACTOR_DOCS_LINK = "";
|
|
10
|
+
export type TwoFactorEnrollmentFormProps = {
|
|
11
|
+
onTwoFactorEnrollmentSuccess: () => void;
|
|
12
|
+
};
|
|
13
|
+
export default function TwoFactorEnrollmentForm(props: TwoFactorEnrollmentFormProps): JSX.Element;
|
|
14
|
+
export declare const EXPORTED_FOR_UNIT_TESTING: {
|
|
15
|
+
toOtpAuthUrl: typeof toOtpAuthUrl;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EXPORTED_FOR_UNIT_TESTING = exports.TWO_FACTOR_DOCS_LINK = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var react_1 = tslib_1.__importStar(require("react"));
|
|
6
|
+
var material_1 = require("@mui/material");
|
|
7
|
+
var LeftRightPanel_1 = require("../../components/styled/LeftRightPanel");
|
|
8
|
+
var SynapseAPI_1 = require("../../utils/hooks/SynapseAPI");
|
|
9
|
+
var qrcode_1 = require("qrcode");
|
|
10
|
+
var TextField_1 = tslib_1.__importDefault(require("../TextField"));
|
|
11
|
+
var LoadingScreen_1 = require("../LoadingScreen");
|
|
12
|
+
var FullWidthAlert_1 = tslib_1.__importDefault(require("../FullWidthAlert"));
|
|
13
|
+
var useTwoFactorEnrollment_1 = require("../../utils/hooks/SynapseAPI/auth/useTwoFactorEnrollment");
|
|
14
|
+
var TwoFactorSecretDialog_1 = tslib_1.__importDefault(require("./TwoFactorSecretDialog"));
|
|
15
|
+
/**
|
|
16
|
+
* Returns a URL that can be used to generate a QR code that 2FA authenticator apps can interpret
|
|
17
|
+
* @param secret
|
|
18
|
+
* @param subject
|
|
19
|
+
*/
|
|
20
|
+
function toOtpAuthUrl(secret, subject) {
|
|
21
|
+
return "otpauth://totp/Synapse:".concat(subject, "?secret=").concat(secret.secret, "&issuer=Sage%20Bionetworks&algorithm=").concat(secret.alg, "&digits=").concat(secret.digits, "&period=").concat(secret.period);
|
|
22
|
+
}
|
|
23
|
+
var Section = (0, material_1.styled)(function (props) { return (react_1.default.createElement(material_1.Box, tslib_1.__assign({ sx: tslib_1.__assign({ my: 3 }, props.sx) }, props))); }, {
|
|
24
|
+
label: 'Section',
|
|
25
|
+
})(function () { return ({}); });
|
|
26
|
+
var SectionInnerGrid = (0, material_1.styled)(function (props) { return react_1.default.createElement(material_1.Box, tslib_1.__assign({}, props)); }, {
|
|
27
|
+
label: 'SectionInnerGrid',
|
|
28
|
+
})(function (_a) {
|
|
29
|
+
var theme = _a.theme;
|
|
30
|
+
return ({
|
|
31
|
+
display: 'grid',
|
|
32
|
+
gridTemplateColumns: 'auto 200px',
|
|
33
|
+
columnGap: theme.spacing(5),
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
// TODO https://sagebionetworks.jira.com/browse/DOCS-115
|
|
37
|
+
exports.TWO_FACTOR_DOCS_LINK = '';
|
|
38
|
+
function TwoFactorEnrollmentForm(props) {
|
|
39
|
+
var _a;
|
|
40
|
+
var onTwoFactorEnrollmentSuccess = props.onTwoFactorEnrollmentSuccess;
|
|
41
|
+
var _b = (0, react_1.useState)(''), totp = _b[0], setTotp = _b[1];
|
|
42
|
+
var _c = (0, react_1.useState)(false), hasQrCode = _c[0], setHasQrCode = _c[1];
|
|
43
|
+
var _d = (0, react_1.useState)(false), showSecretInModal = _d[0], setShowSecretInModal = _d[1];
|
|
44
|
+
var currentUserEmail = (0, SynapseAPI_1.useGetNotificationEmail)().data;
|
|
45
|
+
var qrCodeCanvasElement = (0, react_1.useRef)(null);
|
|
46
|
+
var _e = (0, useTwoFactorEnrollment_1.useStartTwoFactorEnrollment)(), start2FAEnrollment = _e.mutate, totpSecret = _e.data;
|
|
47
|
+
var _f = (0, useTwoFactorEnrollment_1.useFinishTwoFactorEnrollment)({
|
|
48
|
+
onSuccess: onTwoFactorEnrollmentSuccess,
|
|
49
|
+
}), finishEnrollment = _f.mutate, isFinishingEnrollment = _f.isLoading, error = _f.error;
|
|
50
|
+
/* When the component mounts, begin enrollment by fetching the data for the QR code. */
|
|
51
|
+
(0, react_1.useEffect)(function () {
|
|
52
|
+
start2FAEnrollment();
|
|
53
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
54
|
+
}, []);
|
|
55
|
+
(0, react_1.useEffect)(function () {
|
|
56
|
+
function createQrCode() {
|
|
57
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
58
|
+
return tslib_1.__generator(this, function (_a) {
|
|
59
|
+
switch (_a.label) {
|
|
60
|
+
case 0:
|
|
61
|
+
if (!(totpSecret && currentUserEmail && qrCodeCanvasElement.current)) return [3 /*break*/, 2];
|
|
62
|
+
return [4 /*yield*/, (0, qrcode_1.toCanvas)(qrCodeCanvasElement.current, toOtpAuthUrl(totpSecret, currentUserEmail.email), { version: 10, margin: 0, scale: 3.5 })];
|
|
63
|
+
case 1:
|
|
64
|
+
_a.sent();
|
|
65
|
+
setHasQrCode(true);
|
|
66
|
+
_a.label = 2;
|
|
67
|
+
case 2: return [2 /*return*/];
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
createQrCode();
|
|
73
|
+
}, [totpSecret, currentUserEmail]);
|
|
74
|
+
return (react_1.default.createElement(LeftRightPanel_1.StyledOuterContainer, null,
|
|
75
|
+
react_1.default.createElement(material_1.Paper, { sx: {
|
|
76
|
+
width: '800px',
|
|
77
|
+
py: 6.5,
|
|
78
|
+
px: 8,
|
|
79
|
+
mx: 'auto',
|
|
80
|
+
} },
|
|
81
|
+
react_1.default.createElement(Section, null,
|
|
82
|
+
react_1.default.createElement(material_1.Typography, { variant: "headline2", sx: { mb: 3 } }, "Activate Two-factor Authentication"),
|
|
83
|
+
react_1.default.createElement(material_1.Typography, { variant: "body1" },
|
|
84
|
+
"After setting up 2FA, you\u2019ll use an authenticator app as part of your login process, in addition to your existing password. If you log in using your Google",
|
|
85
|
+
' ',
|
|
86
|
+
false && 'or NIH RAS',
|
|
87
|
+
" account, you may need to use 2FA as part of",
|
|
88
|
+
"that process as well.",
|
|
89
|
+
exports.TWO_FACTOR_DOCS_LINK.length > 0 && (
|
|
90
|
+
// Remove conditionality when docs are ready
|
|
91
|
+
react_1.default.createElement(react_1.default.Fragment, null,
|
|
92
|
+
' ',
|
|
93
|
+
react_1.default.createElement(material_1.Link, { href: exports.TWO_FACTOR_DOCS_LINK }, "Learn more about 2FA"),
|
|
94
|
+
".")))),
|
|
95
|
+
react_1.default.createElement(Section, null,
|
|
96
|
+
react_1.default.createElement(SectionInnerGrid, null,
|
|
97
|
+
react_1.default.createElement(material_1.Box, null,
|
|
98
|
+
react_1.default.createElement(material_1.Typography, { variant: "body1", sx: { fontWeight: 700 } }, "Step 1. Get one of these apps"),
|
|
99
|
+
react_1.default.createElement(material_1.Typography, { variant: "body1" }, "Download and install one of these authentication apps to set up 2FA on your mobile device, tablet, or desktop. If you have one of these apps already installed, you can skip this step.")),
|
|
100
|
+
react_1.default.createElement(material_1.Stack, { justifyContent: 'space-between', sx: { flexShrink: 0 } },
|
|
101
|
+
react_1.default.createElement(material_1.Link, { href: 'https://authy.com/download/' }, "Authy"),
|
|
102
|
+
react_1.default.createElement(material_1.Link, { href: 'https://duo.com/product/multi-factor-authentication-mfa/duo-mobile-app' }, "DUO Mobile"),
|
|
103
|
+
react_1.default.createElement(material_1.Link, { href: 'https://googleauthenticator.net/' }, "Google Authenticator"),
|
|
104
|
+
react_1.default.createElement(material_1.Link, { href: 'https://www.microsoft.com/en-us/security/mobile-authenticator-app' }, "Microsoft Authenticator")))),
|
|
105
|
+
react_1.default.createElement(material_1.Divider, null),
|
|
106
|
+
react_1.default.createElement(Section, null,
|
|
107
|
+
react_1.default.createElement(SectionInnerGrid, null,
|
|
108
|
+
react_1.default.createElement(material_1.Box, null,
|
|
109
|
+
react_1.default.createElement(material_1.Typography, { variant: "body1", sx: { fontWeight: 700 } }, "Step 2. Scan the QR Code"),
|
|
110
|
+
react_1.default.createElement(material_1.Typography, { component: "ol", variant: "body1", sx: { pl: 2, my: 1 } },
|
|
111
|
+
react_1.default.createElement("li", null, "Open your authenticator app"),
|
|
112
|
+
react_1.default.createElement("li", null, "Tap the \"+\" button"),
|
|
113
|
+
react_1.default.createElement("li", null, "Use your camera to scan the image to the right")),
|
|
114
|
+
react_1.default.createElement(material_1.Link, { onClick: function () {
|
|
115
|
+
setShowSecretInModal(true);
|
|
116
|
+
} }, "Can't use your camera?"),
|
|
117
|
+
react_1.default.createElement(TwoFactorSecretDialog_1.default, { secret: (_a = totpSecret === null || totpSecret === void 0 ? void 0 : totpSecret.secret) !== null && _a !== void 0 ? _a : '', open: showSecretInModal, onClose: function () { return setShowSecretInModal(false); } })),
|
|
118
|
+
react_1.default.createElement(material_1.Box, { display: 'flex', justifyContent: 'center', alignItems: 'middle', height: 'auto' },
|
|
119
|
+
!hasQrCode && react_1.default.createElement(LoadingScreen_1.SynapseSpinner, { size: 50 }),
|
|
120
|
+
react_1.default.createElement("canvas", { style: { display: hasQrCode ? undefined : 'none' }, ref: qrCodeCanvasElement })))),
|
|
121
|
+
react_1.default.createElement(material_1.Divider, null),
|
|
122
|
+
react_1.default.createElement(Section, null,
|
|
123
|
+
react_1.default.createElement(SectionInnerGrid, null,
|
|
124
|
+
react_1.default.createElement(material_1.Box, null,
|
|
125
|
+
react_1.default.createElement(material_1.Typography, { variant: "body1", sx: { fontWeight: 700 } }, "Step 3. Enter the Verification Code"),
|
|
126
|
+
react_1.default.createElement(material_1.Typography, { variant: "body1" }, "After scanning in the QR code in step 2, your app will provide a 6-digit code. Enter it in in the field to the right.")),
|
|
127
|
+
react_1.default.createElement("form", { onSubmit: function (e) {
|
|
128
|
+
e.preventDefault();
|
|
129
|
+
finishEnrollment({
|
|
130
|
+
secretId: totpSecret.secretId,
|
|
131
|
+
totp: totp,
|
|
132
|
+
});
|
|
133
|
+
} },
|
|
134
|
+
react_1.default.createElement(material_1.Stack, { direction: 'row', gap: 2, height: '48px' },
|
|
135
|
+
react_1.default.createElement(TextField_1.default, { noWrapInFormControl: true, inputProps: { maxLength: totpSecret === null || totpSecret === void 0 ? void 0 : totpSecret.digits }, value: totp, onChange: function (e) {
|
|
136
|
+
setTotp(e.target.value);
|
|
137
|
+
} }),
|
|
138
|
+
react_1.default.createElement(material_1.Button, { type: 'submit', variant: 'contained', sx: { flexShrink: 0 }, disabled: isFinishingEnrollment || totp.length != (totpSecret === null || totpSecret === void 0 ? void 0 : totpSecret.digits) }, "Activate"))))),
|
|
139
|
+
error && (react_1.default.createElement(FullWidthAlert_1.default, { variant: 'danger', isGlobal: false, description: error.reason })))));
|
|
140
|
+
}
|
|
141
|
+
exports.default = TwoFactorEnrollmentForm;
|
|
142
|
+
exports.EXPORTED_FOR_UNIT_TESTING = { toOtpAuthUrl: toOtpAuthUrl };
|
|
143
|
+
//# sourceMappingURL=TwoFactorEnrollmentForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TwoFactorEnrollmentForm.js","sourceRoot":"","sources":["../../../src/lib/containers/auth/TwoFactorEnrollmentForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var material_1 = require("@mui/material");
|
|
5
|
+
var IconSvg_1 = tslib_1.__importDefault(require("../IconSvg"));
|
|
6
|
+
var react_1 = tslib_1.__importDefault(require("react"));
|
|
7
|
+
var Typography_1 = require("../../utils/theme/typography/Typography");
|
|
8
|
+
function TwoFactorSecretDialog(props) {
|
|
9
|
+
var secret = props.secret, open = props.open, onClose = props.onClose;
|
|
10
|
+
return (react_1.default.createElement(material_1.Dialog, { open: open, onClose: onClose },
|
|
11
|
+
react_1.default.createElement(material_1.DialogTitle, null,
|
|
12
|
+
react_1.default.createElement(material_1.Stack, { direction: "row", alignItems: 'center', gap: '5px' },
|
|
13
|
+
"Use this code to set up 2FA ",
|
|
14
|
+
react_1.default.createElement(material_1.Box, { sx: { flexGrow: 1 } }),
|
|
15
|
+
react_1.default.createElement(material_1.IconButton, { "aria-label": 'Close', onClick: onClose },
|
|
16
|
+
react_1.default.createElement(IconSvg_1.default, { icon: 'close', wrap: false, sx: { color: 'grey.700' } })))),
|
|
17
|
+
react_1.default.createElement(material_1.DialogContent, null,
|
|
18
|
+
react_1.default.createElement(material_1.Typography, { variant: 'body1' }, "Your authenticator app will ask for a code to activate two-factor authentication. Use the code below:"),
|
|
19
|
+
react_1.default.createElement(material_1.Box, { sx: function (theme) { return ({
|
|
20
|
+
my: 2,
|
|
21
|
+
p: 2,
|
|
22
|
+
width: '100%',
|
|
23
|
+
textAlign: 'center',
|
|
24
|
+
background: theme.palette.grey[200],
|
|
25
|
+
fontFamily: Typography_1.monospaceFontFamily,
|
|
26
|
+
letterSpacing: '2px',
|
|
27
|
+
fontSize: '16px',
|
|
28
|
+
}); } }, secret),
|
|
29
|
+
react_1.default.createElement(material_1.Typography, { variant: 'body1' }, "After setup, you don\u2019t need to save this code.")),
|
|
30
|
+
react_1.default.createElement(material_1.DialogActions, null,
|
|
31
|
+
react_1.default.createElement(material_1.Button, { variant: 'contained', onClick: onClose }, "Done"))));
|
|
32
|
+
}
|
|
33
|
+
exports.default = TwoFactorSecretDialog;
|
|
34
|
+
//# sourceMappingURL=TwoFactorSecretDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TwoFactorSecretDialog.js","sourceRoot":"","sources":["../../../src/lib/containers/auth/TwoFactorSecretDialog.tsx"],"names":[],"mappings":";;;AAAA,0CAUsB;AACtB,+DAAgC;AAChC,wDAAyB;AACzB,sEAA6E;AAQ7E,SAAwB,qBAAqB,CAC3C,KAAiC;IAEzB,IAAA,MAAM,GAAoB,KAAK,OAAzB,EAAE,IAAI,GAAc,KAAK,KAAnB,EAAE,OAAO,GAAK,KAAK,QAAV,CAAU;IACvC,OAAO,CACL,8BAAC,iBAAM,IAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;QAClC,8BAAC,sBAAW;YACV,8BAAC,gBAAK,IAAC,SAAS,EAAC,KAAK,EAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK;;gBACzB,8BAAC,cAAG,IAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAI;gBACxD,8BAAC,qBAAU,kBAAa,OAAO,EAAE,OAAO,EAAE,OAAO;oBAC/C,8BAAC,iBAAO,IAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAI,CACvD,CACP,CACI;QACd,8BAAC,wBAAa;YACZ,8BAAC,qBAAU,IAAC,OAAO,EAAE,OAAO,4GAGf;YACb,8BAAC,cAAG,IACF,EAAE,EAAE,UAAA,KAAK,IAAI,OAAA,CAAC;oBACZ,EAAE,EAAE,CAAC;oBACL,CAAC,EAAE,CAAC;oBACJ,KAAK,EAAE,MAAM;oBACb,SAAS,EAAE,QAAQ;oBACnB,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;oBACnC,UAAU,EAAE,gCAAmB;oBAC/B,aAAa,EAAE,KAAK;oBACpB,QAAQ,EAAE,MAAM;iBACjB,CAAC,EATW,CASX,IAED,MAAM,CACH;YACN,8BAAC,qBAAU,IAAC,OAAO,EAAE,OAAO,0DAEf,CACC;QAChB,8BAAC,wBAAa;YACZ,8BAAC,iBAAM,IAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,WAErC,CACK,CACT,CACV,CAAA;AACH,CAAC;AA5CD,wCA4CC"}
|
|
@@ -14,6 +14,7 @@ var AccessRequestSubmissionTable_1 = require("../AccessRequestSubmissionTable");
|
|
|
14
14
|
var UserOrTeamBadge_1 = tslib_1.__importDefault(require("../UserOrTeamBadge"));
|
|
15
15
|
var UserSearchBoxV2_1 = tslib_1.__importDefault(require("../UserSearchBoxV2"));
|
|
16
16
|
var AccessRequirementSearchBox_1 = tslib_1.__importDefault(require("./AccessRequirementSearchBox"));
|
|
17
|
+
var SynapseAPI_1 = require("../../utils/hooks/SynapseAPI");
|
|
17
18
|
var UserHistoryDashboard = function () {
|
|
18
19
|
var _a = (0, react_1.useState)(), accessRequirementId = _a[0], setAccessRequirementId = _a[1];
|
|
19
20
|
var _b = (0, react_1.useState)(''), accessorId = _b[0], setAccessorId = _b[1];
|
|
@@ -27,6 +28,8 @@ var UserHistoryDashboard = function () {
|
|
|
27
28
|
accessorId: accessorId,
|
|
28
29
|
accessRequirementId: accessRequirementId,
|
|
29
30
|
}), submissionTableProps = _d[0], setSubmissionTableProps = _d[1];
|
|
31
|
+
var userBundle = (0, SynapseAPI_1.useGetCurrentUserBundle)().data;
|
|
32
|
+
var hasActPermissions = userBundle === null || userBundle === void 0 ? void 0 : userBundle.isACTMember;
|
|
30
33
|
var location = (0, react_router_dom_1.useLocation)();
|
|
31
34
|
var history = (0, react_router_dom_1.useHistory)();
|
|
32
35
|
var INPUT_CHANGE_DEBOUNCE_DELAY_MS = 500;
|
|
@@ -73,7 +76,7 @@ var UserHistoryDashboard = function () {
|
|
|
73
76
|
var NoSearchResultComponent = function () {
|
|
74
77
|
return (react_1.default.createElement("div", { className: "text-center" },
|
|
75
78
|
react_1.default.createElement("img", { className: "SearchPlaceholderImage", alt: "Begin searching", src: "https://s3.amazonaws.com/static.synapse.org/images/search-happy.svg" }),
|
|
76
|
-
react_1.default.createElement(material_1.Typography, { variant: "body1Italic" }, "
|
|
79
|
+
react_1.default.createElement(material_1.Typography, { variant: "body1Italic" }, "Select a user using the search field above to view their data access history")));
|
|
77
80
|
};
|
|
78
81
|
return (react_1.default.createElement("div", { className: "UserHistoryDashboard bootstrap-4-backport" },
|
|
79
82
|
react_1.default.createElement("div", { className: "InputPanel" },
|
|
@@ -88,8 +91,9 @@ var UserHistoryDashboard = function () {
|
|
|
88
91
|
"Submissions including ",
|
|
89
92
|
react_1.default.createElement(UserOrTeamBadge_1.default, { principalId: accessorId })),
|
|
90
93
|
react_1.default.createElement(AccessRequestSubmissionTable_1.AccessRequestSubmissionTable, tslib_1.__assign({}, submissionTableProps)),
|
|
91
|
-
react_1.default.createElement(
|
|
92
|
-
|
|
94
|
+
hasActPermissions && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
95
|
+
react_1.default.createElement(material_1.Typography, { variant: "headline3" }, "Status in Access Requirements"),
|
|
96
|
+
react_1.default.createElement(AccessApprovalsTable_1.AccessApprovalsTable, tslib_1.__assign({}, approvalTableProps)))))) : (react_1.default.createElement(NoSearchResultComponent, null))));
|
|
93
97
|
};
|
|
94
98
|
exports.UserHistoryDashboard = UserHistoryDashboard;
|
|
95
99
|
//# sourceMappingURL=AccessHistoryDashboard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessHistoryDashboard.js","sourceRoot":"","sources":["../../../src/lib/containers/dataaccess/AccessHistoryDashboard.tsx"],"names":[],"mappings":";;;;AAAA,uCAAkC;AAClC,qDAA+D;AAC/D,mDAA2C;AAC3C,qDAA0D;AAC1D,2EAAyE;AACzE,yDAAsD;AACtD,0CAA0C;AAC1C,gEAGgC;AAChC,gFAGwC;AACxC,+EAAgD;AAChD,+EAAgD;AAChD,oGAAqE;
|
|
1
|
+
{"version":3,"file":"AccessHistoryDashboard.js","sourceRoot":"","sources":["../../../src/lib/containers/dataaccess/AccessHistoryDashboard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -42,7 +42,7 @@ function ReviewerDashboard(props) {
|
|
|
42
42
|
react_1.default.createElement("div", { className: "Tabs", role: "tablist" },
|
|
43
43
|
hasActPermissions && (react_1.default.createElement(LinkTab, { href: "/AccessRequirements", icon: "accessClosed" }, "Access Requirements")),
|
|
44
44
|
hasReviewerPermissions && (react_1.default.createElement(LinkTab, { href: "/Submissions", icon: "discussion" }, "Submissions")),
|
|
45
|
-
|
|
45
|
+
hasReviewerPermissions && (react_1.default.createElement(LinkTab, { href: "/UserAccessHistory", icon: "history" }, "User Access History"))),
|
|
46
46
|
react_1.default.createElement("div", { className: "TabContentContainer" },
|
|
47
47
|
react_1.default.createElement(ErrorBanner_1.SynapseErrorBoundary, null,
|
|
48
48
|
react_1.default.createElement(react_router_dom_1.Switch, null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReviewerDashboard.js","sourceRoot":"","sources":["../../../src/lib/containers/dataaccess/ReviewerDashboard.tsx"],"names":[],"mappings":";;;;AAAA,qDAA0C;AAC1C,qDASyB;AACzB,iFAAyF;AACzF,0CAA0C;AAC1C,oDAA2D;AAC3D,+DAA0C;AAC1C,kDAAiD;AACjD,mEAA+D;AAC/D,2EAAyE;AACzE,yEAA2E;AAC3E,4EAA6C;AAE7C,SAAS,OAAO,CAAC,KAIhB;IACS,IAAA,IAAI,GAAqB,KAAK,KAA1B,EAAE,QAAQ,GAAW,KAAK,SAAhB,EAAE,IAAI,GAAK,KAAK,KAAV,CAAU;IACtC,OAAO,CACL,8BAAC,0BAAO,IAAC,SAAS,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,EAAE,EAAE,IAAI;QAC1C,8BAAC,iBAAO,IACN,IAAI,EAAE,IAAI,EACV,EAAE,EAAE;gBACF,YAAY,EAAE,QAAQ;aACvB,GACD;QACF,8BAAC,qBAAU,IAAC,OAAO,EAAC,YAAY,IAAE,QAAQ,CAAc,CAChD,CACX,CAAA;AACH,CAAC;AASD,SAAgB,iBAAiB,CAAC,KAA6B;IAE3D,IAAA,KAEE,KAAK,eAF0C,EAAjD,cAAc,mBAAG,gCAAgC,KAAA,EACjD,KACE,KAAK,gBADgB,EAAvB,eAAe,mBAAG,KAAK,KAAA,CAChB;IAEH,IAAA,KAAkC,IAAA,uCAAuB,GAAE,EAAnD,UAAU,UAAA,EAAE,SAAS,eAA8B,CAAA;IAEjE,IAAM,iBAAiB,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,WAAW,CAAA;IACjD,IAAM,sBAAsB,GAC1B,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,WAAW,MAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,YAAY,CAAA,CAAA;IAErD,IAAM,MAAM,GAAG,IAAA,mBAAW,EACxB,UAAC,KAA6C;QAC5C,IAAI,eAAe,EAAE;YACnB,OAAO,8BAAC,+BAAY,uBAAK,KAAK,EAAI,CAAA;SACnC;aAAM;YACL,OAAO,8BAAC,gCAAa,uBAAK,KAAK,EAAI,CAAA;SACpC;IACH,CAAC,EACD,CAAC,eAAe,CAAC,CAClB,CAAA;IAED,IAAI,SAAS,EAAE;QACb,OAAO,8BAAC,8BAAc,IAAC,IAAI,EAAE,EAAE,GAAI,CAAA;KACpC;IAED,OAAO,CACL,8BAAC,MAAM,IAAC,QAAQ,EAAE,cAAc;QAC9B,uCAAK,SAAS,EAAC,mBAAmB;YAChC,uCAAK,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,SAAS;gBACjC,iBAAiB,IAAI,CACpB,8BAAC,OAAO,IAAC,IAAI,EAAC,qBAAqB,EAAC,IAAI,EAAC,cAAc,0BAE7C,CACX;gBACA,sBAAsB,IAAI,CACzB,8BAAC,OAAO,IAAC,IAAI,EAAC,cAAc,EAAC,IAAI,EAAC,YAAY,kBAEpC,CACX;gBACA,
|
|
1
|
+
{"version":3,"file":"ReviewerDashboard.js","sourceRoot":"","sources":["../../../src/lib/containers/dataaccess/ReviewerDashboard.tsx"],"names":[],"mappings":";;;;AAAA,qDAA0C;AAC1C,qDASyB;AACzB,iFAAyF;AACzF,0CAA0C;AAC1C,oDAA2D;AAC3D,+DAA0C;AAC1C,kDAAiD;AACjD,mEAA+D;AAC/D,2EAAyE;AACzE,yEAA2E;AAC3E,4EAA6C;AAE7C,SAAS,OAAO,CAAC,KAIhB;IACS,IAAA,IAAI,GAAqB,KAAK,KAA1B,EAAE,QAAQ,GAAW,KAAK,SAAhB,EAAE,IAAI,GAAK,KAAK,KAAV,CAAU;IACtC,OAAO,CACL,8BAAC,0BAAO,IAAC,SAAS,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,EAAE,EAAE,IAAI;QAC1C,8BAAC,iBAAO,IACN,IAAI,EAAE,IAAI,EACV,EAAE,EAAE;gBACF,YAAY,EAAE,QAAQ;aACvB,GACD;QACF,8BAAC,qBAAU,IAAC,OAAO,EAAC,YAAY,IAAE,QAAQ,CAAc,CAChD,CACX,CAAA;AACH,CAAC;AASD,SAAgB,iBAAiB,CAAC,KAA6B;IAE3D,IAAA,KAEE,KAAK,eAF0C,EAAjD,cAAc,mBAAG,gCAAgC,KAAA,EACjD,KACE,KAAK,gBADgB,EAAvB,eAAe,mBAAG,KAAK,KAAA,CAChB;IAEH,IAAA,KAAkC,IAAA,uCAAuB,GAAE,EAAnD,UAAU,UAAA,EAAE,SAAS,eAA8B,CAAA;IAEjE,IAAM,iBAAiB,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,WAAW,CAAA;IACjD,IAAM,sBAAsB,GAC1B,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,WAAW,MAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,YAAY,CAAA,CAAA;IAErD,IAAM,MAAM,GAAG,IAAA,mBAAW,EACxB,UAAC,KAA6C;QAC5C,IAAI,eAAe,EAAE;YACnB,OAAO,8BAAC,+BAAY,uBAAK,KAAK,EAAI,CAAA;SACnC;aAAM;YACL,OAAO,8BAAC,gCAAa,uBAAK,KAAK,EAAI,CAAA;SACpC;IACH,CAAC,EACD,CAAC,eAAe,CAAC,CAClB,CAAA;IAED,IAAI,SAAS,EAAE;QACb,OAAO,8BAAC,8BAAc,IAAC,IAAI,EAAE,EAAE,GAAI,CAAA;KACpC;IAED,OAAO,CACL,8BAAC,MAAM,IAAC,QAAQ,EAAE,cAAc;QAC9B,uCAAK,SAAS,EAAC,mBAAmB;YAChC,uCAAK,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,SAAS;gBACjC,iBAAiB,IAAI,CACpB,8BAAC,OAAO,IAAC,IAAI,EAAC,qBAAqB,EAAC,IAAI,EAAC,cAAc,0BAE7C,CACX;gBACA,sBAAsB,IAAI,CACzB,8BAAC,OAAO,IAAC,IAAI,EAAC,cAAc,EAAC,IAAI,EAAC,YAAY,kBAEpC,CACX;gBACA,sBAAsB,IAAI,CACzB,8BAAC,OAAO,IAAC,IAAI,EAAC,oBAAoB,EAAC,IAAI,EAAC,SAAS,0BAEvC,CACX,CACG;YACN,uCAAK,SAAS,EAAC,qBAAqB;gBAClC,8BAAC,kCAAoB;oBACnB,8BAAC,yBAAM;wBACJ,iBAAiB,IAAI,CACpB,8BAAC,wBAAK,IAAC,IAAI,EAAC,qBAAqB;4BAC/B,8BAAC,uDAA0B,OAAG,CACxB,CACT;wBACA,sBAAsB,IAAI;4BACzB,8BAAC,wBAAK,IAAC,KAAK,QAAC,IAAI,EAAC,cAAc,EAAC,GAAG,EAAC,cAAc;gCACjD,8BAAC,yDAA6B,OAAG,CAC3B;4BAER,8BAAC,wBAAK,IAAC,IAAI,EAAC,kBAAkB,EAAC,GAAG,EAAC,kBAAkB;gCACnD,8BAAC,2BAA2B,OAAG,CACzB;yBACT;wBAEC,8BAAC,wBAAK,IAAC,KAAK,QAAC,IAAI,EAAC,oBAAoB;4BACpC,8BAAC,6CAAoB,OAAG,CAClB,CAEH,CACY,CACnB,CACF,CACC,CACV,CAAA;AACH,CAAC;AA3ED,8CA2EC;AAED,SAAS,2BAA2B;IAC1B,IAAA,EAAE,GAAK,IAAA,4BAAS,GAAkB,GAAhC,CAAgC;IAC1C,OAAO,8BAAC,wBAAc,IAAC,YAAY,EAAE,EAAE,GAAI,CAAA;AAC7C,CAAC;AAED,kBAAe,iBAAiB,CAAA"}
|
|
@@ -13,6 +13,9 @@ var WarningModal_1 = require("../synapse_form_wrapper/WarningModal");
|
|
|
13
13
|
var icons_material_1 = require("@mui/icons-material");
|
|
14
14
|
var material_2 = require("@mui/material");
|
|
15
15
|
var LoadingScreen_1 = require("../LoadingScreen");
|
|
16
|
+
var utils_1 = require("../../utils");
|
|
17
|
+
var hooks_1 = require("../../utils/hooks");
|
|
18
|
+
var INPUT_CHANGE_DEBOUNCE_DELAY_MS = 500;
|
|
16
19
|
var CreateOAuthModal = function (_a) {
|
|
17
20
|
var _b = _a.isShowingModal, isShowingModal = _b === void 0 ? false : _b, isEdit = _a.isEdit, onClose = _a.onClose, client = _a.client, setIsShowingConfirmModal = _a.setIsShowingConfirmModal, isShowingConfirmModal = _a.isShowingConfirmModal, setIsShowingModal = _a.setIsShowingModal;
|
|
18
21
|
var accessToken = (0, SynapseContext_1.useSynapseContext)().accessToken;
|
|
@@ -29,6 +32,29 @@ var CreateOAuthModal = function (_a) {
|
|
|
29
32
|
var warningHeader = 'Are you absolutely sure?';
|
|
30
33
|
var warningBody = 'Editing this detail will render your client invalid and will require you to resubmit verification. This action cannot be undone.';
|
|
31
34
|
var uriHelpMessage = 'Click Add URI to add more Redirect URIs';
|
|
35
|
+
// Return the OAuth Client definition based on the current client-side UI state
|
|
36
|
+
var oAuthClient = (0, react_1.useMemo)(function () {
|
|
37
|
+
var _a;
|
|
38
|
+
return {
|
|
39
|
+
client_id: client === null || client === void 0 ? void 0 : client.client_id,
|
|
40
|
+
client_name: clientName,
|
|
41
|
+
redirect_uris: (_a = redirectUris === null || redirectUris === void 0 ? void 0 : redirectUris.map(function (str) { return str.uri; })) !== null && _a !== void 0 ? _a : [''],
|
|
42
|
+
policy_uri: policyUri,
|
|
43
|
+
client_uri: clientUri,
|
|
44
|
+
sector_identifier_uri: sectorUri !== null && sectorUri !== void 0 ? sectorUri : '',
|
|
45
|
+
tos_uri: tosUri,
|
|
46
|
+
etag: client === null || client === void 0 ? void 0 : client.etag,
|
|
47
|
+
};
|
|
48
|
+
}, [
|
|
49
|
+
client === null || client === void 0 ? void 0 : client.client_id,
|
|
50
|
+
client === null || client === void 0 ? void 0 : client.etag,
|
|
51
|
+
clientName,
|
|
52
|
+
clientUri,
|
|
53
|
+
policyUri,
|
|
54
|
+
redirectUris,
|
|
55
|
+
sectorUri,
|
|
56
|
+
tosUri,
|
|
57
|
+
]);
|
|
32
58
|
(0, react_1.useEffect)(function () {
|
|
33
59
|
var _a, _b, _c, _d, _e, _f;
|
|
34
60
|
setClientName((_a = client === null || client === void 0 ? void 0 : client.client_name) !== null && _a !== void 0 ? _a : '');
|
|
@@ -38,16 +64,14 @@ var CreateOAuthModal = function (_a) {
|
|
|
38
64
|
setSectorUri((_e = client === null || client === void 0 ? void 0 : client.sector_identifier_uri) !== null && _e !== void 0 ? _e : undefined);
|
|
39
65
|
setTosUri((_f = client === null || client === void 0 ? void 0 : client.tos_uri) !== null && _f !== void 0 ? _f : '');
|
|
40
66
|
}, [isShowingModal, client]);
|
|
41
|
-
(0,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
: setWarnTrigger(false);
|
|
50
|
-
}, [redirectUris, sectorUri, client]);
|
|
67
|
+
(0, hooks_1.useDebouncedEffect)(function () {
|
|
68
|
+
if (accessToken) {
|
|
69
|
+
// SWC-6365: use the pre-check service to determine if we need to show a warning on edit
|
|
70
|
+
utils_1.SynapseClient.isOAuthClientReverificationRequired(oAuthClient, accessToken).then(function (precheckResult) {
|
|
71
|
+
setWarnTrigger(precheckResult.reverificationRequired);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}, [accessToken, oAuthClient], INPUT_CHANGE_DEBOUNCE_DELAY_MS);
|
|
51
75
|
var hide = function () {
|
|
52
76
|
setClientName('');
|
|
53
77
|
setRedirectUris([{ uri: '' }]);
|
|
@@ -92,19 +116,8 @@ var CreateOAuthModal = function (_a) {
|
|
|
92
116
|
},
|
|
93
117
|
}).mutate;
|
|
94
118
|
var onCreateClient = function () {
|
|
95
|
-
var _a;
|
|
96
119
|
try {
|
|
97
120
|
if (accessToken) {
|
|
98
|
-
var oAuthClient = {
|
|
99
|
-
client_id: client === null || client === void 0 ? void 0 : client.client_id,
|
|
100
|
-
client_name: clientName,
|
|
101
|
-
redirect_uris: (_a = redirectUris === null || redirectUris === void 0 ? void 0 : redirectUris.map(function (str) { return str.uri; })) !== null && _a !== void 0 ? _a : [''],
|
|
102
|
-
policy_uri: policyUri,
|
|
103
|
-
client_uri: clientUri,
|
|
104
|
-
sector_identifier_uri: sectorUri !== null && sectorUri !== void 0 ? sectorUri : '',
|
|
105
|
-
tos_uri: tosUri,
|
|
106
|
-
etag: client === null || client === void 0 ? void 0 : client.etag,
|
|
107
|
-
};
|
|
108
121
|
setUpdatedClient(oAuthClient);
|
|
109
122
|
if (warnTrigger === true) {
|
|
110
123
|
setIsShowingConfirmModal(true);
|