diff --git a/packages/generic/client/src/pages/Admin/ProblemReports/ProblemReportsTable/ProblemReportsTable.tsx b/packages/generic/client/src/pages/Admin/ProblemReports/ProblemReportsTable/ProblemReportsTable.tsx
index b51b43aec..10ac6961e 100644
--- a/packages/generic/client/src/pages/Admin/ProblemReports/ProblemReportsTable/ProblemReportsTable.tsx
+++ b/packages/generic/client/src/pages/Admin/ProblemReports/ProblemReportsTable/ProblemReportsTable.tsx
@@ -11,6 +11,7 @@ import { localStorage } from '../../../../services/localStorage';
import { sendMail } from '../../../../services/sendMail';
import { wordings } from '../../../../wordings';
import { routes } from '../../../routes';
+import { useCtxUser } from '../../../../contexts/user.context';
import { annotationDiffDocumentInfoType, AnnotationsDiffDrawer } from '../../TreatedDocuments/AnnotationsDiffDrawer';
export { ProblemReportsTable };
@@ -33,7 +34,12 @@ function ProblemReportsTable(props: {
const styles = buildStyles(theme);
const problemReportsFields = buildProblemReportsFields();
- const userRole = localStorage.userHandler.getRole();
+
+ const { user, loading } = useCtxUser();
+ if (loading) {
+ return
Loading...
;
+ }
+ const userRole = user?.role;
const adminView = localStorage.adminViewHandler.get();
return (
@@ -135,7 +141,7 @@ function ProblemReportsTable(props: {
}
function buildOptionItems(problemReportWithDetails: apiRouteOutType<'get', 'problemReportsWithDetails'>[number]) {
- const userRole = localStorage.userHandler.getRole();
+ const userRole = user?.role;
const validateDocumentOptionItem = {
kind: 'text' as const,
diff --git a/packages/generic/client/src/pages/Admin/TreatedDocuments/TreatedDocumentsTable.tsx b/packages/generic/client/src/pages/Admin/TreatedDocuments/TreatedDocumentsTable.tsx
index 8ef0495b4..704defe29 100644
--- a/packages/generic/client/src/pages/Admin/TreatedDocuments/TreatedDocumentsTable.tsx
+++ b/packages/generic/client/src/pages/Admin/TreatedDocuments/TreatedDocumentsTable.tsx
@@ -8,6 +8,7 @@ import { localStorage, treatedDocumentOrderByProperties } from '../../../service
import { AnnotationsDiffDrawer, annotationDiffDocumentInfoType } from './AnnotationsDiffDrawer';
import { useAlert } from '../../../services/alert';
import { routes } from '../../routes';
+import { useCtxUser } from '../../../contexts/user.context';
export { TreatedDocumentsTable };
@@ -32,6 +33,8 @@ function TreatedDocumentsTable(props: {
const orderDirection = localStorage.treatedDocumentsStateHandler.getOrderDirection();
const styles = buildStyles();
+ const { user } = useCtxUser();
+
return (
{!!documentIdToReset && (
@@ -91,7 +94,7 @@ function TreatedDocumentsTable(props: {
}
function buildOptionItems(treatmentWithDetails: apiRouteOutType<'get', 'treatedDocuments'>[number]) {
- const userRole = localStorage.userHandler.getRole();
+ const userRole = user?.role;
const adminView = localStorage.adminViewHandler.get();
const openDocumentOption = {
diff --git a/packages/generic/client/src/pages/Admin/UntreatedDocuments/UntreatedDocumentsTable.tsx b/packages/generic/client/src/pages/Admin/UntreatedDocuments/UntreatedDocumentsTable.tsx
index ec25a7a41..a64742d07 100644
--- a/packages/generic/client/src/pages/Admin/UntreatedDocuments/UntreatedDocumentsTable.tsx
+++ b/packages/generic/client/src/pages/Admin/UntreatedDocuments/UntreatedDocumentsTable.tsx
@@ -15,6 +15,7 @@ import { useAlert } from '../../../services/alert';
import { localStorage, untreatedDocumentOrderByProperties } from '../../../services/localStorage';
import { wordings } from '../../../wordings';
import { routes } from '../../routes';
+import { useCtxUser } from '../../../contexts/user.context';
export { UntreatedDocumentsTable };
@@ -35,6 +36,11 @@ function UntreatedDocumentsTable(props: {
const styles = buildStyles(theme);
const fields = buildUntreatedDocumentsFields();
+ const { user, loading } = useCtxUser();
+ if (loading) {
+ return
Loading...
;
+ }
+
return (
{!!documentIdToUpdateStatus && (
@@ -65,7 +71,7 @@ function UntreatedDocumentsTable(props: {
}
function buildOptionItems(untreatedDocument: apiRouteOutType<'get', 'untreatedDocuments'>[number]) {
- const userRole = localStorage.userHandler.getRole();
+ const userRole = user?.role;
const adminView = localStorage.adminViewHandler.get();
const openAnonymizedDocumentOptionItem = {
@@ -132,7 +138,7 @@ function UntreatedDocumentsTable(props: {
async function onConfirmUpdateDocumentStatus(documentIdToUpdateStatus: documentType['_id']) {
setDocumentIdToUpdateStatus(undefined);
- const userId = localStorage.userHandler.getId();
+ const userId = (user?._id as unknown) as userType['_id'];
if (!userId) {
displayAlert({ text: wordings.business.errors.noUserIdFound, variant: 'alert', autoHide: true });
return;
diff --git a/packages/generic/client/src/pages/Admin/WorkingUsers/AddUserDrawer/AddUserButton.tsx b/packages/generic/client/src/pages/Admin/WorkingUsers/AddUserDrawer/AddUserButton.tsx
deleted file mode 100644
index ad65fa8bc..000000000
--- a/packages/generic/client/src/pages/Admin/WorkingUsers/AddUserDrawer/AddUserButton.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import React, { useState } from 'react';
-import { ButtonWithIcon } from 'pelta-design-system';
-import { wordings } from '../../../../wordings';
-import { AddWorkingUserDrawer } from './AddUserDrawer';
-
-export { AddWorkingUserButton };
-
-function AddWorkingUserButton(props: { refetch: () => void }) {
- const [isDrawerOpen, setIsDrawerOpen] = useState(false);
-
- return (
- <>
-
setIsDrawerOpen(true)}
- text={wordings.workingUsersPage.createWorkingUserDrawer.title}
- iconName="addPerson"
- />
-
- setIsDrawerOpen(false)} refetch={props.refetch} />
- >
- );
-}
diff --git a/packages/generic/client/src/pages/Admin/WorkingUsers/AddUserDrawer/AddUserDrawer.tsx b/packages/generic/client/src/pages/Admin/WorkingUsers/AddUserDrawer/AddUserDrawer.tsx
deleted file mode 100644
index c638c8aac..000000000
--- a/packages/generic/client/src/pages/Admin/WorkingUsers/AddUserDrawer/AddUserDrawer.tsx
+++ /dev/null
@@ -1,197 +0,0 @@
-import React, { useState } from 'react';
-import { userModule, userType } from '@label/core';
-import { apiCaller } from '../../../../api';
-import {
- customThemeType,
- useCustomTheme,
- ButtonWithIcon,
- Drawer,
- LabelledDropdown,
- RichTextInput,
-} from 'pelta-design-system';
-import { wordings } from '../../../../wordings';
-import { WorkingUserCreatedPopUp } from './UserCreatedPopUp';
-import { processNames } from '../../../../utils/';
-
-export { AddWorkingUserDrawer };
-
-const FIELD_WIDTH = 400;
-
-const DRAWER_WIDTH = 600;
-
-type formErrorType = {
- firstName?: boolean;
- lastName?: boolean;
- email?: boolean;
- role?: boolean;
-};
-
-type formValuesType = {
- firstName: string | undefined;
- lastName: string | undefined;
- email: string | undefined;
- role: userType['role'] | undefined;
-};
-
-const INITIAL_FORM_VALUES = {
- firstName: undefined,
- lastName: undefined,
- email: undefined,
- role: undefined,
-};
-
-function AddWorkingUserDrawer(props: { isOpen: boolean; onClose: () => void; refetch: () => void }) {
- const [formValues, setFormValues] = useState(INITIAL_FORM_VALUES);
- const [temporaryPassword, setTemporaryPassword] = useState();
- const [formErrors, setFormErrors] = useState({});
- const [isLoading, setIsLoading] = useState(false);
- const theme = useCustomTheme();
- const styles = buildStyles(theme);
-
- return (
- <>
- {!!temporaryPassword && }
-
-
-
-
- updateField('firstName', firstName)}
- placeholder={wordings.workingUsersPage.createWorkingUserDrawer.fields.firstName}
- style={styles.field}
- />
-
-
- updateField('lastName', lastName)}
- placeholder={wordings.workingUsersPage.createWorkingUserDrawer.fields.lastName}
- style={styles.field}
- />
-
-
- updateField('email', email)}
- placeholder={wordings.workingUsersPage.createWorkingUserDrawer.fields.email}
- style={styles.field}
- />
-
-
-
- label={wordings.workingUsersPage.createWorkingUserDrawer.fields.role}
- error={!!formErrors.role}
- items={userModule.models.user.content.role.content.map((role) => ({
- text: wordings.business.userRoles[role],
- value: role,
- }))}
- onChange={(role: userType['role']) => updateField('role', role)}
- width={FIELD_WIDTH}
- />
-
-
-
-
-
-
-
- >
- );
-
- function onClose() {
- setTemporaryPassword(undefined);
- setFormErrors({});
- setFormValues(INITIAL_FORM_VALUES);
- }
-
- function updateField(field: T, value: formValuesType[T]) {
- setFormValues({ ...formValues, [field]: value });
- if (formErrors[field]) {
- setFormErrors({ ...formErrors, [field]: undefined });
- }
- }
-
- async function addWorkingUser() {
- const { firstName, lastName, email, role } = formValues;
- if (!firstName || !lastName || !email || !role) {
- updateFormErrors();
- return;
- }
- setIsLoading(true);
- try {
- const { data: temporaryPassword } = await apiCaller.post<'createUser'>('createUser', {
- email,
- name: processNames(firstName, lastName),
- role,
- });
- props.refetch();
- props.onClose();
- setTemporaryPassword(temporaryPassword);
- } catch (error) {
- console.warn(error);
- } finally {
- setIsLoading(false);
- }
- }
-
- function updateFormErrors() {
- setFormErrors({
- firstName: !formValues.firstName,
- lastName: !formValues.lastName,
- email: !formValues.email,
- role: !formValues.role,
- });
- }
-}
-
-function buildStyles(theme: customThemeType) {
- return {
- drawer: {
- display: 'flex',
- flexDirection: 'column' as const,
- alignItems: 'center',
- justifyContent: 'space-between',
- width: DRAWER_WIDTH,
- padding: theme.spacing * 6,
- },
- header: {
- display: 'flex',
- justifyContent: 'space-between',
- paddingBottom: theme.spacing * 5,
- borderBottom: 'solid 1px',
- borderBottomColor: theme.colors.separator,
- width: '100%',
- },
- formContainer: {
- paddingTop: theme.spacing * 6,
- width: '100%',
- display: 'flex',
- flexDirection: 'column',
- },
- fieldContainer: {
- marginBottom: theme.spacing * 5,
- },
- field: {
- width: FIELD_WIDTH,
- },
- submitButtonContainer: {
- alignSelf: 'flex-end',
- },
- } as const;
-}
diff --git a/packages/generic/client/src/pages/Admin/WorkingUsers/AddUserDrawer/UserCreatedPopUp.tsx b/packages/generic/client/src/pages/Admin/WorkingUsers/AddUserDrawer/UserCreatedPopUp.tsx
deleted file mode 100644
index 3158b0715..000000000
--- a/packages/generic/client/src/pages/Admin/WorkingUsers/AddUserDrawer/UserCreatedPopUp.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import React from 'react';
-import { customThemeType, useCustomTheme, ButtonWithIcon, PopUp, Text } from 'pelta-design-system';
-import { wordings } from '../../../../wordings';
-
-export { WorkingUserCreatedPopUp };
-
-function WorkingUserCreatedPopUp(props: { password: string; onClose: () => void }) {
- const theme = useCustomTheme();
- const styles = buildStyles(theme);
-
- return (
-
-
-
- {wordings.workingUsersPage.createWorkingUserDrawer.createdWorkingUserPopup.createdWorkingUserConfirmation}
-
-
- {wordings.workingUsersPage.createWorkingUserDrawer.createdWorkingUserPopup.passwordIndication}
-
-
- {props.password}
-
-
-
-
-
- );
-}
-
-function buildStyles(theme: customThemeType) {
- return {
- textContainer: { marginBottom: theme.spacing * 9 },
- passwordContainer: {
- display: 'flex',
- alignItems: 'center',
- justifyContent: 'center',
- marginBottom: theme.spacing * 8,
- },
- buttonContainer: {
- display: 'flex',
- justifyContent: 'flex-end',
- },
- };
-}
diff --git a/packages/generic/client/src/pages/Admin/WorkingUsers/AddUserDrawer/index.ts b/packages/generic/client/src/pages/Admin/WorkingUsers/AddUserDrawer/index.ts
deleted file mode 100644
index 16a70a5b8..000000000
--- a/packages/generic/client/src/pages/Admin/WorkingUsers/AddUserDrawer/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { AddWorkingUserDrawer } from './AddUserDrawer';
diff --git a/packages/generic/client/src/pages/Admin/WorkingUsers/PasswordResetSuccessPopup.tsx b/packages/generic/client/src/pages/Admin/WorkingUsers/PasswordResetSuccessPopup.tsx
deleted file mode 100644
index 005b5259f..000000000
--- a/packages/generic/client/src/pages/Admin/WorkingUsers/PasswordResetSuccessPopup.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import React from 'react';
-import { customThemeType, useCustomTheme, ButtonWithIcon, PopUp, Text } from 'pelta-design-system';
-import { wordings } from '../../../wordings';
-
-export { PasswordResetSuccessPopup };
-
-function PasswordResetSuccessPopup(props: { password: string; onClose: () => void }) {
- const theme = useCustomTheme();
- const styles = buildStyles(theme);
-
- return (
-
-
- {wordings.workingUsersPage.table.passwordResetSuccessPopup.passwordResetConfirmation}
-
- {wordings.workingUsersPage.table.passwordResetSuccessPopup.passwordIndication}
-
-
- {props.password}
-
-
-
-
-
- );
-}
-
-function buildStyles(theme: customThemeType) {
- return {
- textContainer: { marginBottom: theme.spacing * 9 },
- passwordContainer: {
- display: 'flex',
- alignItems: 'center',
- justifyContent: 'center',
- marginBottom: theme.spacing * 8,
- },
- buttonContainer: {
- display: 'flex',
- justifyContent: 'flex-end',
- },
- };
-}
diff --git a/packages/generic/client/src/pages/Admin/WorkingUsers/WorkingUsers.tsx b/packages/generic/client/src/pages/Admin/WorkingUsers/WorkingUsers.tsx
deleted file mode 100644
index 08e77025b..000000000
--- a/packages/generic/client/src/pages/Admin/WorkingUsers/WorkingUsers.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import React from 'react';
-import { apiRouteOutType } from '@label/core';
-import { customThemeType, useCustomTheme, tableRowFieldType } from 'pelta-design-system';
-import { heights, widths } from '../../../styles';
-import { wordings } from '../../../wordings';
-import { AddWorkingUserButton } from './AddUserDrawer/AddUserButton';
-import { WorkingUsersTable } from './WorkingUsersTable';
-
-export { WorkingUsers };
-
-function WorkingUsers(props: { workingUsers: apiRouteOutType<'get', 'workingUsers'>; refetch: () => void }) {
- const theme = useCustomTheme();
- const styles = buildStyles(theme);
- const userFields = buildUserFields();
- return (
-
- );
-
- function buildUserFields() {
- const usersFields: Array[number]>> = [
- {
- id: 'name',
- title: wordings.workingUsersPage.table.columnTitles.name,
- canBeSorted: true,
- extractor: (workingUser) => workingUser.name,
- width: 10,
- },
- {
- id: 'email',
- title: wordings.workingUsersPage.table.columnTitles.email,
- canBeSorted: true,
- extractor: (workingUser) => workingUser.email,
- width: 10,
- },
- {
- id: 'role',
- title: wordings.workingUsersPage.table.columnTitles.role,
- canBeSorted: true,
- extractor: (workingUser) => wordings.business.userRoles[workingUser.role],
- width: 10,
- },
- ];
- return usersFields;
- }
-
- function buildStyles(theme: customThemeType) {
- return {
- tableHeaderContainer: {
- height: heights.adminTreatmentsTableHeader,
- },
- tableHeader: {
- paddingTop: theme.spacing * 4,
- display: 'flex',
- justifyContent: 'flex-end',
- },
- tableContentContainer: {
- height: heights.adminTreatmentsTable,
- overflowY: 'auto',
- },
- table: {
- width: widths.adminContent,
- paddingLeft: theme.spacing * 3,
- paddingRight: theme.spacing * 2,
- },
- } as const;
- }
-}
diff --git a/packages/generic/client/src/pages/Admin/WorkingUsers/WorkingUsersTable.tsx b/packages/generic/client/src/pages/Admin/WorkingUsers/WorkingUsersTable.tsx
deleted file mode 100644
index 8cd77d563..000000000
--- a/packages/generic/client/src/pages/Admin/WorkingUsers/WorkingUsersTable.tsx
+++ /dev/null
@@ -1,115 +0,0 @@
-import React, { useState } from 'react';
-import { apiRouteOutType, userType } from '@label/core';
-import { ConfirmationPopup, Table, tableRowFieldType } from 'pelta-design-system';
-import { wordings } from '../../../wordings';
-import { apiCaller } from '../../../api';
-import { PasswordResetSuccessPopup } from './PasswordResetSuccessPopup';
-
-export { WorkingUsersTable };
-
-function WorkingUsersTable(props: {
- fields: Array[number]>>;
- refetch: () => void;
- workingUsers: apiRouteOutType<'get', 'workingUsers'>;
-}) {
- const [newPassword, setNewPassword] = useState();
- const [resetPasswordUserId, setResetPasswordUserId] = useState();
- const [deleteUserId, setDeleteUserId] = useState();
- const styles = buildStyles();
-
- return (
-
- {!!newPassword &&
setNewPassword(undefined)} />}
- {!!resetPasswordUserId && (
- setResetPasswordUserId(undefined)}
- onConfirm={buildOnConfirmResetPassword(resetPasswordUserId)}
- text={wordings.workingUsersPage.table.passwordResetConfirmationPopup.text}
- />
- )}
- {!!deleteUserId && (
- setDeleteUserId(undefined)}
- onConfirm={buildOnConfirmDeleteUser(deleteUserId)}
- text={wordings.workingUsersPage.table.deleteUserConfirmationPopup.text}
- />
- )}
-
-
- );
-
- function isRowMinored(workingUser: apiRouteOutType<'get', 'workingUsers'>[number]) {
- return !workingUser.isActivated;
- }
-
- function buildOnConfirmResetPassword(resetPasswordUserId: userType['_id']) {
- return () => {
- resetPasswordForUserId(resetPasswordUserId);
- setResetPasswordUserId(undefined);
- };
- }
-
- function buildOnConfirmDeleteUser(deleteUserId: userType['_id']) {
- return async () => {
- await apiCaller.post<'setDeletionDateForUser'>('setDeletionDateForUser', { userId: deleteUserId });
- setDeleteUserId(undefined);
- props.refetch();
- };
- }
-
- async function resetPasswordForUserId(userId: userType['_id']) {
- const { data: newPassword } = await apiCaller.post<'resetPassword'>('resetPassword', {
- userId,
- });
- setNewPassword(newPassword);
- }
-
- function buildOptionItems(workingUser: apiRouteOutType<'get', 'workingUsers'>[number]) {
- const toggleIsActivatedOptionItem = buildToggleIsActivatedOptionItem(workingUser);
- return [
- {
- kind: 'text' as const,
- text: wordings.workingUsersPage.table.optionItems.resetPassword,
- onClick: async () => setResetPasswordUserId(workingUser._id),
- iconName: 'key' as const,
- },
- toggleIsActivatedOptionItem,
- {
- kind: 'text' as const,
- text: wordings.workingUsersPage.table.optionItems.delete,
- onClick: () => {
- setDeleteUserId(workingUser._id);
- },
- iconName: 'delete' as const,
- },
- ];
- }
-
- function buildToggleIsActivatedOptionItem(user: apiRouteOutType<'get', 'workingUsers'>[number]) {
- const iconName: 'lock' | 'unlock' = user.isActivated ? 'lock' : 'unlock';
- const onClick = async () => {
- await apiCaller.post<'setIsActivatedForUser'>('setIsActivatedForUser', {
- isActivated: !user.isActivated,
- userId: user._id,
- });
- props.refetch();
- };
- const text = user.isActivated
- ? wordings.workingUsersPage.table.optionItems.deactivate
- : wordings.workingUsersPage.table.optionItems.activate;
- return { kind: 'text' as const, iconName, text, onClick };
- }
-
- function buildStyles() {
- return {
- container: {
- height: '100%',
- },
- };
- }
-}
diff --git a/packages/generic/client/src/pages/Admin/WorkingUsers/index.ts b/packages/generic/client/src/pages/Admin/WorkingUsers/index.ts
deleted file mode 100644
index 16e24a5ea..000000000
--- a/packages/generic/client/src/pages/Admin/WorkingUsers/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { WorkingUsers } from './WorkingUsers';
diff --git a/packages/generic/client/src/pages/DataFetcher.tsx b/packages/generic/client/src/pages/DataFetcher.tsx
index 6624113b9..f1c08386b 100644
--- a/packages/generic/client/src/pages/DataFetcher.tsx
+++ b/packages/generic/client/src/pages/DataFetcher.tsx
@@ -1,7 +1,6 @@
import React, { ReactElement } from 'react';
import { Route, Redirect } from 'react-router-dom';
import { handleFetchedData } from '../api';
-import { localStorage } from '../services/localStorage';
import { ErrorPage } from './ErrorPage';
import { LoadingPage } from './LoadingPage';
@@ -23,8 +22,6 @@ function DataFetcher(props: {
case 'error':
switch (fetchedData.error) {
case 'authentication':
- localStorage.bearerTokenHandler.remove();
- localStorage.userHandler.remove();
return buildLoginRedirectionPage();
case 'unknown':
return buildErrorPage();
diff --git a/packages/generic/client/src/pages/ErrorPage/ErrorPage.tsx b/packages/generic/client/src/pages/ErrorPage/ErrorPage.tsx
index 8f9ab7e4e..a16ca04c7 100644
--- a/packages/generic/client/src/pages/ErrorPage/ErrorPage.tsx
+++ b/packages/generic/client/src/pages/ErrorPage/ErrorPage.tsx
@@ -1,10 +1,10 @@
import React from 'react';
import { useHistory } from 'react-router';
import { customThemeType, useCustomTheme, ButtonWithIcon, Icon, Text } from 'pelta-design-system';
-import { localStorage } from '../../services/localStorage';
import { wordings } from '../../wordings';
-import { routes } from '../routes';
import format from 'string-template';
+import { urlHandler } from '../../utils';
+import { localStorage } from '../../services/localStorage';
export { ErrorPage };
@@ -40,10 +40,8 @@ function ErrorPage(props: { route?: string; errorCode?: number }) {
);
function logout() {
- localStorage.bearerTokenHandler.remove();
- localStorage.userHandler.remove();
localStorage.adminViewHandler.remove();
- history.push(routes.LOGIN.getPath());
+ window.location.replace(urlHandler.getSsoLogoutUrl());
}
function reload() {
diff --git a/packages/generic/client/src/pages/Login/Login.tsx b/packages/generic/client/src/pages/Login/Login.tsx
index d205b60af..54be3db7d 100644
--- a/packages/generic/client/src/pages/Login/Login.tsx
+++ b/packages/generic/client/src/pages/Login/Login.tsx
@@ -1,11 +1,8 @@
-import { idModule } from '@label/core';
-import React, { FunctionComponent } from 'react';
+import React, { FunctionComponent, useEffect } from 'react';
import { useHistory } from 'react-router-dom';
-import { customThemeType, useCustomTheme, LoginForm } from 'pelta-design-system';
-import { apiCaller } from '../../api';
+import { customThemeType, useCustomTheme } from 'pelta-design-system';
import { Logo } from '../../components';
-import { localStorage } from '../../services/localStorage';
-import { routes } from '../routes';
+import { urlHandler } from '../../utils';
export { Login };
@@ -13,26 +10,20 @@ const Login: FunctionComponent = () => {
const history = useHistory();
const theme = useCustomTheme();
const styles = buildStyles(theme);
+ useEffect(() => {
+ // URL backend qui déclenche la redirection SAML (à mettre en variable d'env)
+ window.location.href = urlHandler.getSsoLoginUrl();
+ }, [history]);
return (
+ Redirection vers SSO...
-
);
- async function handleSubmit({ email, password }: { email: string; password: string }) {
- const {
- data: { _id, email: userEmail, name, role, token, passwordTimeValidityStatus },
- } = await apiCaller.post<'login'>('login', { email, password });
- localStorage.bearerTokenHandler.set(token);
- localStorage.userHandler.set({ _id: idModule.lib.buildId(_id), email: userEmail, name, role });
- localStorage.userHandler.setPasswordTimeValidityStatus(passwordTimeValidityStatus);
- history.push(routes.DEFAULT.getPath());
- }
-
function buildStyles(theme: customThemeType) {
return {
mainContainer: {
diff --git a/packages/generic/client/src/pages/ResetPassword/ResetPassword.tsx b/packages/generic/client/src/pages/ResetPassword/ResetPassword.tsx
deleted file mode 100644
index 76e8c8c83..000000000
--- a/packages/generic/client/src/pages/ResetPassword/ResetPassword.tsx
+++ /dev/null
@@ -1,65 +0,0 @@
-import React, { useState } from 'react';
-import { useHistory } from 'react-router';
-import { customThemeType, useCustomTheme, ConfirmationPopup } from 'pelta-design-system';
-import { ResetPasswordForm } from '../../components';
-import { localStorage } from '../../services/localStorage';
-import { wordings } from '../../wordings';
-import { routes } from '../routes';
-
-export { ResetPassword };
-
-const FORM_WIDTH = 400;
-
-function ResetPassword() {
- const theme = useCustomTheme();
- const history = useHistory();
- const styles = buildStyles(theme);
- const [isInformationPopupOpen, setIsInformationPopupOpen] = useState(true);
-
- return (
-
- {isInformationPopupOpen && (
-
setIsInformationPopupOpen(false)}
- />
- )}
-
-
-
-
- );
-
- function logout() {
- localStorage.userHandler.remove();
- localStorage.bearerTokenHandler.remove();
- history.push(routes.DEFAULT.getPath());
- }
-
- function onUpdatePassword() {
- history.push(routes.DEFAULT.getPath());
- }
-}
-
-function buildStyles(theme: customThemeType) {
- return {
- container: {
- flexDirection: 'column',
- display: 'flex',
- justifyContent: 'center',
- alignItems: 'center',
- height: '100vh',
- width: '100vw',
- },
- formContainer: {
- display: 'flex',
- flexDirection: 'column',
- minWidth: FORM_WIDTH,
- padding: theme.spacing * 6,
- paddingBottom: theme.spacing * 3,
- borderRadius: theme.shape.borderRadius.m,
- boxShadow: theme.boxShadow.major.out,
- },
- } as const;
-}
diff --git a/packages/generic/client/src/pages/ResetPassword/index.ts b/packages/generic/client/src/pages/ResetPassword/index.ts
deleted file mode 100644
index 966b77748..000000000
--- a/packages/generic/client/src/pages/ResetPassword/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { ResetPassword } from './ResetPassword';
diff --git a/packages/generic/client/src/pages/router.tsx b/packages/generic/client/src/pages/router.tsx
index 002927999..9145f8334 100644
--- a/packages/generic/client/src/pages/router.tsx
+++ b/packages/generic/client/src/pages/router.tsx
@@ -4,7 +4,6 @@ import { localStorage } from '../services/localStorage';
import { wordings } from '../wordings';
import { AdminPage } from './Admin/AdminPage';
import { AdminInfosDataFetcher } from './Admin/AdminInfosDataFetcher';
-import { WorkingUsers } from './Admin/WorkingUsers';
import { DocumentInspector } from './Admin/DocumentInspector';
import { TreatedDocuments } from './Admin/TreatedDocuments';
import { ProblemReports } from './Admin/ProblemReports';
@@ -13,26 +12,24 @@ import { UntreatedDocuments } from './Admin/UntreatedDocuments';
import { AnonymizedDocument } from './AnonymizedDocument';
import { Home } from './Home';
import { Login } from './Login';
-import { ResetPassword } from './ResetPassword';
import { PublishableDocuments } from './PublishableDocuments';
import { SettingsDataFetcher } from './SettingsDataFetcher';
import { Statistics } from './Admin/Statistics';
import { defaultRoutes, routes } from './routes';
import { ToBeConfirmedDocuments } from './Admin/ToBeConfirmedDocuments';
import { Summary } from './Admin/Summary';
+import { CurrentUser, useCtxUser } from '../contexts/user.context';
export { Router };
function Router() {
+ const { user } = useCtxUser();
return (
-
-
-
{({ settings }) => }
@@ -44,7 +41,7 @@ function Router() {
({ problemReport }) => !problemReport.hasBeenRead,
).length;
const toBeConfirmedDocumentsCount = adminInfos.toBeConfirmedDocuments.length;
- const userRole = localStorage.adminViewHandler.get() || localStorage.userHandler.getRole();
+ const userRole = localStorage.adminViewHandler.get() || user?.role;
if (userRole !== 'admin' && userRole !== 'scrutator') {
return <>>;
}
@@ -77,18 +74,6 @@ function Router() {
/>
- {userRole === 'admin' && (
-
-
-
-
-
- )}
@@ -186,44 +172,54 @@ function Router() {
);
}
-const AuthenticatedRoute: FunctionComponent = ({ children, ...rest }: RouteProps) => (
-
- isAuthenticated() ? (
- children
- ) : (
+const AuthenticatedRoute: FunctionComponent = ({ children, ...rest }: RouteProps) => {
+ const { user, loading } = useCtxUser();
+ if (loading) {
+ return Loading...
;
+ }
+ return (
+
+ user ? (
+ children
+ ) : (
+
+ )
+ }
+ />
+ );
+};
+
+const HomeRoute: FunctionComponent = ({ ...props }: RouteProps) => {
+ const { user, loading } = useCtxUser();
+
+ if (loading) {
+ return Loading...
;
+ }
+ return (
+ (
- )
- }
- />
-);
-
-const HomeRoute: FunctionComponent = ({ ...props }: RouteProps) => (
- (
-
- )}
- />
-);
+ )}
+ />
+ );
+};
-function getRedirectionRoute() {
- const passwordTimeValidityStatus = localStorage.userHandler.getPasswordTimeValidityStatus();
- if (passwordTimeValidityStatus === 'outdated') {
- return routes.RESET_PASSWORD.getPath();
- }
- const userRole = localStorage.userHandler.getRole();
+function getRedirectionRoute(user: CurrentUser | null) {
+ const userRole = user?.role;
if (!userRole) {
return routes.LOGIN.getPath();
@@ -236,27 +232,29 @@ function getRedirectionRoute() {
}
}
- return defaultRoutes[userRole];
+ return defaultRoutes[userRole as 'annotator' | 'scrutator' | 'admin'];
}
-const UnauthenticatedRoute: FunctionComponent = ({ children, ...rest }: RouteProps) => (
-
- !isAuthenticated() ? (
- children
- ) : (
-
- )
- }
- />
-);
-
-function isAuthenticated() {
- return !!localStorage.bearerTokenHandler.get() && !!localStorage.userHandler.getRole();
-}
+const UnauthenticatedRoute: FunctionComponent = ({ children, ...rest }: RouteProps) => {
+ const { user, loading } = useCtxUser();
+ if (loading) {
+ return Loading...
;
+ }
+ return (
+
+ !user ? (
+ children
+ ) : (
+
+ )
+ }
+ />
+ );
+};
diff --git a/packages/generic/client/src/pages/routes.ts b/packages/generic/client/src/pages/routes.ts
index 55921084d..d91336a06 100644
--- a/packages/generic/client/src/pages/routes.ts
+++ b/packages/generic/client/src/pages/routes.ts
@@ -3,7 +3,6 @@ export { defaultRoutes, routes };
const routes = {
ADMIN: { getPath: () => '/label/admin' },
ADMIN_MAIN: { getPath: () => '/label/admin/main/' },
- WORKING_USERS: { getPath: () => '/label/admin/main/working-users' },
ANNOTATION: { getPath: () => '/label/annotation' },
ANONYMIZED_DOCUMENT: {
getPath: (documentId?: string) => `/label/anonymized-document/${documentId || ':documentId'}`,
@@ -13,7 +12,6 @@ const routes = {
LOGIN: { getPath: () => '/label/login' },
PROBLEM_REPORTS: { getPath: () => '/label/admin/main/problem-reports' },
PRE_ASSIGN_DOCUMENTS: { getPath: () => '/label/admin/main/pre-assign-documents' },
- RESET_PASSWORD: { getPath: () => '/label/reset-password' },
PUBLISHABLE_DOCUMENTS: { getPath: () => '/label/publishable-documents' },
STATISTICS: { getPath: () => '/label/admin/main/statistics' },
SUMMARY: { getPath: () => '/label/admin/main/summary' },
diff --git a/packages/generic/client/src/services/localStorage/bearerTokenHandler.ts b/packages/generic/client/src/services/localStorage/bearerTokenHandler.ts
deleted file mode 100644
index 67390ef68..000000000
--- a/packages/generic/client/src/services/localStorage/bearerTokenHandler.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-const BEARER_TOKEN_STORAGE_KEY = 'BEARER_TOKEN';
-
-export { bearerTokenHandler };
-
-const bearerTokenHandler = {
- set,
- remove,
- get,
-};
-
-function set(bearerToken: string) {
- localStorage.setItem(BEARER_TOKEN_STORAGE_KEY, bearerToken);
-}
-
-function remove() {
- localStorage.removeItem(BEARER_TOKEN_STORAGE_KEY);
-}
-
-function get() {
- return localStorage.getItem(BEARER_TOKEN_STORAGE_KEY);
-}
diff --git a/packages/generic/client/src/services/localStorage/localStorage.ts b/packages/generic/client/src/services/localStorage/localStorage.ts
index 9ca5b67fe..6774fb5a7 100644
--- a/packages/generic/client/src/services/localStorage/localStorage.ts
+++ b/packages/generic/client/src/services/localStorage/localStorage.ts
@@ -1,4 +1,3 @@
-import { bearerTokenHandler } from './bearerTokenHandler';
import { adminViewHandler, adminViews } from './adminViewHandler';
import { displayModeHandler } from './displayModeHandler';
import {
@@ -20,7 +19,6 @@ import {
toBeConfirmedDocumentOrderByProperties,
toBeConfirmedDocumentsStateHandler,
} from './documentStateHandler/toBeConfirmedDocumentsStateHandler';
-import { userHandler } from './userHandler';
export {
adminViews,
@@ -35,11 +33,9 @@ export type { treatedDocumentFilterType, untreatedDocumentFilterType, toBeConfir
const localStorage = {
adminViewHandler,
- bearerTokenHandler,
displayModeHandler,
publishableDocumentsStateHandler,
treatedDocumentsStateHandler,
untreatedDocumentsStateHandler,
toBeConfirmedDocumentsStateHandler,
- userHandler,
};
diff --git a/packages/generic/client/src/services/localStorage/userHandler.ts b/packages/generic/client/src/services/localStorage/userHandler.ts
deleted file mode 100644
index fe85593b8..000000000
--- a/packages/generic/client/src/services/localStorage/userHandler.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-import { passwordTimeValidityStatusType, userType } from '@label/core';
-import { localStorageHandler } from './localStorageHandler';
-import { localStorageMappers } from './localStorageMappers';
-
-export { userHandler };
-
-const USER_ID_STORAGE_KEY = 'USER_ID';
-const USER_EMAIL_STORAGE_KEY = 'USER_EMAIL';
-const USER_NAME_STORAGE_KEY = 'USER_NAME';
-const USER_ROLE_STORAGE_KEY = 'USER_ROLE';
-const USER_PASSWORD_TIME_VALIDITY_STATUS_STORAGE_KEY = 'USER_PASSWORD_TIME_VALIDITY_STATUS';
-
-const userHandler = {
- set,
- setPasswordTimeValidityStatus,
- remove,
- getId,
- getEmail,
- getName,
- getRole,
- getPasswordTimeValidityStatus,
-};
-
-function set({ _id, email, name, role }: Pick) {
- localStorageHandler.set({ key: USER_ID_STORAGE_KEY, value: _id, mapper: localStorageMappers.id });
- localStorageHandler.set({ key: USER_EMAIL_STORAGE_KEY, value: email, mapper: localStorageMappers.string });
- localStorageHandler.set({ key: USER_NAME_STORAGE_KEY, value: name, mapper: localStorageMappers.string });
- localStorageHandler.set({ key: USER_ROLE_STORAGE_KEY, value: role, mapper: localStorageMappers.string });
-}
-
-function setPasswordTimeValidityStatus(passwordTimeValidityStatus: passwordTimeValidityStatusType) {
- localStorageHandler.set({
- key: USER_PASSWORD_TIME_VALIDITY_STATUS_STORAGE_KEY,
- value: passwordTimeValidityStatus,
- mapper: localStorageMappers.string,
- });
-}
-
-function remove() {
- localStorageHandler.set({ key: USER_ID_STORAGE_KEY, value: undefined, mapper: localStorageMappers.id });
- localStorageHandler.set({ key: USER_EMAIL_STORAGE_KEY, value: undefined, mapper: localStorageMappers.string });
- localStorageHandler.set({ key: USER_NAME_STORAGE_KEY, value: undefined, mapper: localStorageMappers.string });
- localStorageHandler.set({ key: USER_ROLE_STORAGE_KEY, value: undefined, mapper: localStorageMappers.string });
- localStorageHandler.set({
- key: USER_PASSWORD_TIME_VALIDITY_STATUS_STORAGE_KEY,
- value: undefined,
- mapper: localStorageMappers.string,
- });
-}
-
-function getId() {
- return localStorageHandler.get({ key: USER_ID_STORAGE_KEY, mapper: localStorageMappers.id });
-}
-
-function getEmail() {
- return localStorageHandler.get({ key: USER_EMAIL_STORAGE_KEY, mapper: localStorageMappers.string });
-}
-
-function getName() {
- return localStorageHandler.get({ key: USER_NAME_STORAGE_KEY, mapper: localStorageMappers.string });
-}
-
-function getRole() {
- return localStorageHandler.get({ key: USER_ROLE_STORAGE_KEY, mapper: localStorageMappers.string }) as
- | userType['role']
- | undefined;
-}
-
-function getPasswordTimeValidityStatus() {
- return localStorageHandler.get({
- key: USER_PASSWORD_TIME_VALIDITY_STATUS_STORAGE_KEY,
- mapper: localStorageMappers.string,
- }) as passwordTimeValidityStatusType | undefined;
-}
diff --git a/packages/generic/client/src/utils/urlHandler.ts b/packages/generic/client/src/utils/urlHandler.ts
index 40857fb74..2321e298a 100644
--- a/packages/generic/client/src/utils/urlHandler.ts
+++ b/packages/generic/client/src/utils/urlHandler.ts
@@ -10,4 +10,12 @@ const urlHandler = {
return serverPort ? `${clientProtocol}//${clientHostname}:${serverPort}` : `${clientProtocol}//${clientHostname}`;
},
+
+ getSsoLoginUrl() {
+ return `${this.getApiUrl()}/label/api/sso/login`;
+ },
+
+ getSsoLogoutUrl() {
+ return `${this.getApiUrl()}/label/api/sso/logout`;
+ },
};
diff --git a/packages/generic/client/src/wordings/fr.ts b/packages/generic/client/src/wordings/fr.ts
index c6deb2bc1..aefe4fa04 100644
--- a/packages/generic/client/src/wordings/fr.ts
+++ b/packages/generic/client/src/wordings/fr.ts
@@ -1,55 +1,6 @@
export { fr };
const fr = {
- workingUsersPage: {
- header: {
- title: 'Administration',
- subtitle: 'Gestion des agents',
- },
- createWorkingUserDrawer: {
- title: 'Créer un agent',
- fields: {
- firstName: 'Prénom',
- lastName: 'Nom',
- email: 'Email',
- role: 'Sélectionnez un rôle',
- },
- submit: "Créer l'agent",
- createdWorkingUserPopup: {
- createdWorkingUserConfirmation: "L'agent a bien été créé.",
- passwordIndication:
- 'Veuillez noter et lui transmettre le mot de passe temporaire suivant. Ce mot de passe doit être changé dès la première connexion afin d’assurer la sécurité du système.',
- button: "C'est noté",
- },
- },
- table: {
- columnTitles: {
- name: 'Nom',
- email: 'E-mail',
- role: 'Habilitation',
- },
- optionItems: {
- activate: 'Activer',
- deactivate: 'Désactiver',
- delete: 'Supprimer...',
- resetPassword: 'Réinitialiser le mot de passe',
- },
- deleteUserConfirmationPopup: {
- text:
- 'Cette action supprimera cet utilisateur. Ses statistiques seront cependant toujours présentes en base de données. Cette action est irréversible, souhaitez-vous continuer ?',
- },
- passwordResetSuccessPopup: {
- passwordResetConfirmation: 'Le mot de passe a bien été réinitialisé',
- passwordIndication:
- 'Veuillez noter et lui transmettre son nouveau mot de passe ci-après. Ce mot de passe doit être changé dès la première connexion afin d’assurer la sécurité du système.',
- button: "C'est noté",
- },
- passwordResetConfirmationPopup: {
- text:
- "Cette action supprimera l'ancien mot de passe et vous affichera un nouveau mot de passe que vous devrez transmettre à l'agent.",
- },
- },
- },
business: {
account: 'Compte',
adminViews: {
@@ -61,8 +12,6 @@ const fr = {
scrutator: 'Vue scrutateur',
},
},
- changePassword: 'Modifier le mot de passe',
- confirmPassword: 'Confirmer le nouveau mot de passe',
decisionNumberPlaceholder: 'Rechercher...',
decisionNumberHint: 'Numéro de décision à rechercher',
documentReviewFilterStatus: {
@@ -175,11 +124,6 @@ const fr = {
},
},
problemReportType: { bug: 'Bug', annotationProblem: "Problème lié à l'annotation", suggestion: 'Suggestion' },
- newPassword: 'Nouveau mot de passe',
- newPasswordsDontMatch: 'Les nouveaux mots de passe ne correspondent pas',
- newPasswordInstructions:
- 'Le mot de passe doit contenir au moins 8 caractères dont 2 minuscules, 2 majuscules, 2 chiffres et 2 caractères spéciaux',
- previousPassword: 'Ancien mot de passe',
update: 'Mettre à jour',
userRoles: {
admin: 'Administrateur',
@@ -187,7 +131,6 @@ const fr = {
publicator: 'Publicateur',
scrutator: 'Scrutateur',
},
- wrongPassword: 'Le mot de passe est erroné',
},
homePage: {
anonymisedView: 'Vue anonymisée',
@@ -254,14 +197,6 @@ const fr = {
},
validate: 'Valider',
},
- loginPage: {
- login: 'Connexion',
- email: 'E-mail',
- forgottenPassword: "En cas d'oubli de votre mot de passe, veuillez contacter votre administrateur.",
- password: 'Mot de passe',
- pleaseTryAgain: 'Veuillez réessayer.',
- wrongEmailOrPassword: "L'email et/ou le mot de passe sont erronés.",
- },
errorPage: {
title: 'Une erreur est survenue...',
errorCode: 'Erreur {code}',
@@ -291,7 +226,6 @@ const fr = {
refresh: 'Rafraîchir',
moreOptions: "Plus d'options",
or: 'ou',
- passwordChangedConfirmation: { text: 'Votre mot de passe a été modifié.', button: 'OK' },
settingsDrawer: {
displayMode: "Type d'affichage",
darkMode: 'Mode sombre',
@@ -348,10 +282,6 @@ const fr = {
submit: 'Créer la pré-assignation',
},
},
- resetPasswordPage: {
- popup:
- "Votre mot de passe n'a pas été mis à jour depuis plus de 6 mois. Pour des raisons de sécurité, il vous est demandé d'en renseigner un nouveau respectant les règles du PSSI.",
- },
publishableDocumentsPage: {
title: 'Arrêts P',
confirmationDocumentAlert: "Pour information : Il y a {count} décision(s) en confirmation de lecture aujourd'hui.",
diff --git a/packages/generic/core/src/api/apiSchema.ts b/packages/generic/core/src/api/apiSchema.ts
index 7f9fd455e..6ffd75faa 100644
--- a/packages/generic/core/src/api/apiSchema.ts
+++ b/packages/generic/core/src/api/apiSchema.ts
@@ -576,7 +576,6 @@ const apiSchema = {
content: {
_id: userModule.models.user.content._id,
email: userModule.models.user.content.email,
- isActivated: userModule.models.user.content.isActivated,
name: userModule.models.user.content.name,
role: userModule.models.user.content.role,
},
@@ -611,16 +610,6 @@ const apiSchema = {
},
out: documentModule.fetchedModel,
},
- changePassword: {
- in: {
- previousPassword: buildModel({ kind: 'primitive', content: 'string' } as const),
- newPassword: buildModel({ kind: 'primitive', content: 'string' } as const),
- },
- out: buildModel({
- kind: 'constant',
- content: ['notValidNewPassword', 'passwordUpdated', 'wrongPassword'] as const,
- } as const),
- },
createUser: {
in: {
name: buildModel({
@@ -671,29 +660,6 @@ const apiSchema = {
content: 'void',
} as const),
},
- login: {
- in: {
- email: buildModel({
- kind: 'primitive',
- content: 'string',
- } as const),
- password: buildModel({
- kind: 'primitive',
- content: 'string',
- } as const),
- },
- out: buildModel({
- kind: 'object',
- content: {
- _id: userModule.models.user.content._id,
- email: userModule.models.user.content.email,
- name: userModule.models.user.content.name,
- role: userModule.models.user.content.role,
- token: { kind: 'primitive', content: 'string' },
- passwordTimeValidityStatus: userModule.models.passwordTimeValidityStatus,
- },
- } as const),
- },
problemReport: {
in: {
documentId: buildModel({
@@ -723,18 +689,6 @@ const apiSchema = {
content: 'void',
} as const),
},
- resetPassword: {
- in: {
- userId: buildModel({
- kind: 'custom',
- content: 'id',
- } as const),
- },
- out: buildModel({
- kind: 'primitive',
- content: 'string',
- } as const),
- },
resetTreatmentLastUpdateDate: {
in: {
assignationId: buildModel({
@@ -747,31 +701,6 @@ const apiSchema = {
content: 'void',
} as const),
},
- setDeletionDateForUser: {
- in: {
- userId: buildModel({
- kind: 'custom',
- content: 'id',
- } as const),
- },
- out: buildModel({
- kind: 'primitive',
- content: 'void',
- } as const),
- },
- setIsActivatedForUser: {
- in: {
- userId: buildModel({
- kind: 'custom',
- content: 'id',
- } as const),
- isActivated: userModule.models.user.content.isActivated,
- },
- out: buildModel({
- kind: 'primitive',
- content: 'void',
- } as const),
- },
updateAssignationDocumentStatus: {
in: {
assignationId: buildModel({
diff --git a/packages/generic/core/src/modules/index.ts b/packages/generic/core/src/modules/index.ts
index e77ee63a9..c18405dd2 100644
--- a/packages/generic/core/src/modules/index.ts
+++ b/packages/generic/core/src/modules/index.ts
@@ -20,7 +20,8 @@ import {
} from './settings';
import { statisticModule, statisticType } from './statistic';
import { treatmentType, treatmentModule, treatmentInfoType } from './treatment';
-import { userModule, userType, passwordTimeValidityStatusType } from './user';
+import { userModule, userType } from './user';
+
export {
annotationModule,
annotationReportModule,
@@ -62,7 +63,6 @@ export type {
categoryIconNameType,
userType,
replacementTermType,
- passwordTimeValidityStatusType,
treatmentType,
treatmentInfoType,
};
diff --git a/packages/generic/core/src/modules/user/generator/userGenerator.ts b/packages/generic/core/src/modules/user/generator/userGenerator.ts
index 44aa7612a..eeb227ab7 100644
--- a/packages/generic/core/src/modules/user/generator/userGenerator.ts
+++ b/packages/generic/core/src/modules/user/generator/userGenerator.ts
@@ -5,14 +5,10 @@ import { userType } from '../userType';
export { userGenerator };
const userGenerator: generatorType = {
- generate: ({ deletionDate, email, hashedPassword, _id, isActivated, name, passwordLastUpdateDate, role } = {}) => ({
- email: email ? email : 'EMAIL',
- deletionDate: deletionDate || undefined,
- hashedPassword: hashedPassword ? hashedPassword : 'HASHED_PASSWORD',
+ generate: ({ email, _id, name, role } = {}) => ({
+ email: email || 'EMAIL',
_id: _id ? idModule.lib.buildId(_id) : idModule.lib.buildId(),
- isActivated: isActivated !== undefined ? isActivated : true,
- name: name ? name : 'NAME',
- passwordLastUpdateDate: passwordLastUpdateDate ? passwordLastUpdateDate : new Date().getTime(),
- role: role ? role : 'annotator',
+ name: name || 'NAME',
+ role: role || 'annotator',
}),
};
diff --git a/packages/generic/core/src/modules/user/index.ts b/packages/generic/core/src/modules/user/index.ts
index e7a925985..e9227d179 100644
--- a/packages/generic/core/src/modules/user/index.ts
+++ b/packages/generic/core/src/modules/user/index.ts
@@ -1,13 +1,13 @@
import { userGenerator } from './generator';
import { userLib } from './lib';
-import { userModel, userType, passwordTimeValidityStatusType, passwordTimeValidityStatusModel } from './userType';
+import { userModel, userType } from './userType';
export { userModule };
-export type { userType, passwordTimeValidityStatusType };
+export type { userType };
const userModule = {
- models: { user: userModel, passwordTimeValidityStatus: passwordTimeValidityStatusModel },
+ models: { user: userModel },
generator: userGenerator,
lib: userLib,
};
diff --git a/packages/generic/core/src/modules/user/lib/buildUser.ts b/packages/generic/core/src/modules/user/lib/buildUser.ts
index 4b8063526..4a7517943 100644
--- a/packages/generic/core/src/modules/user/lib/buildUser.ts
+++ b/packages/generic/core/src/modules/user/lib/buildUser.ts
@@ -1,24 +1,21 @@
import { idModule } from '../../id';
import { userType } from '../userType';
-import { authenticator } from './authenticator';
export { buildUser };
async function buildUser({
email,
name,
- password,
role,
}: {
email: string;
name: string;
- password: string;
role: userType['role'];
}): Promise {
- const baseUser = await authenticator.buildBaseUser({ email, name, password });
return {
- ...baseUser,
_id: idModule.lib.buildId(),
+ email,
+ name,
role,
};
}
diff --git a/packages/generic/core/src/modules/user/lib/index.ts b/packages/generic/core/src/modules/user/lib/index.ts
index b3af134a9..72e0cb0dd 100644
--- a/packages/generic/core/src/modules/user/lib/index.ts
+++ b/packages/generic/core/src/modules/user/lib/index.ts
@@ -6,11 +6,8 @@ const userLib = {
assertAuthorization: authenticator.assertAuthorization,
assertPermissions,
buildUser,
- computeHashedPassword: authenticator.computeHashedPassword,
extractUserIdFromAuthorizationHeader: authenticator.extractUserIdFromAuthorizationHeader,
formatEmail: authenticator.formatEmail,
- getTokenForUser: authenticator.getTokenForUser,
- passwordHandler: authenticator.passwordHandler,
};
export { userLib };
diff --git a/packages/generic/core/src/modules/user/userType.ts b/packages/generic/core/src/modules/user/userType.ts
index 56988c567..7b3a8200c 100644
--- a/packages/generic/core/src/modules/user/userType.ts
+++ b/packages/generic/core/src/modules/user/userType.ts
@@ -1,27 +1,16 @@
-import { passwordTimeValidityStatus } from 'sder-core';
import { idType } from '../id';
import { buildModel, buildType } from '../modelType';
-export { userModel, passwordTimeValidityStatusModel };
+export { userModel };
-export type { userType, passwordTimeValidityStatusType };
+export type { userType };
const userModel = buildModel({
kind: 'object',
content: {
_id: { kind: 'custom', content: 'id' },
- deletionDate: {
- kind: 'or',
- content: [
- { kind: 'primitive', content: 'number' },
- { kind: 'primitive', content: 'undefined' },
- ],
- },
email: { kind: 'primitive', content: 'string' },
- hashedPassword: { kind: 'primitive', content: 'string' },
- isActivated: { kind: 'primitive', content: 'boolean' },
name: { kind: 'primitive', content: 'string' },
- passwordLastUpdateDate: { kind: 'primitive', content: 'number' },
role: {
kind: 'constant',
content: ['admin', 'annotator', 'publicator', 'scrutator'] as const,
@@ -29,7 +18,4 @@ const userModel = buildModel({
},
} as const);
-const passwordTimeValidityStatusModel = buildModel({ kind: 'constant', content: passwordTimeValidityStatus });
-
type userType = buildType;
-type passwordTimeValidityStatusType = buildType;
diff --git a/packages/generic/sso/.eslintrc.json b/packages/generic/sso/.eslintrc.json
new file mode 100644
index 000000000..fc8016b6b
--- /dev/null
+++ b/packages/generic/sso/.eslintrc.json
@@ -0,0 +1,35 @@
+{
+ "extends": [
+ "plugin:react/recommended", // Uses the recommended rules from @eslint-plugin-react
+ "plugin:@typescript-eslint/recommended", // Uses the recommended rules from @typescript-eslint/eslint-plugin
+ "prettier/@typescript-eslint", // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier
+ "plugin:prettier/recommended" // Enables eslint-plugin-prettier and eslint-config-prettier. This will display prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array.
+ ],
+ "parser": "@typescript-eslint/parser", // Specifies the ESLint parser
+ "parserOptions": {
+ "ecmaFeatures": {
+ "jsx": true // Allows for the parsing of JSX
+ },
+ "project": "tsconfig.json",
+ "ecmaVersion": 2020, // Allows for the parsing of modern ECMAScript features
+ "sourceType": "module" // Allows for the use of imports
+ },
+ "rules": {
+ // Place to specify ESLint rules. Can be used to overwrite rules specified from the extended configs
+ // e.g. "@typescript-eslint/explicit-function-return-type": "off",
+ "no-console": ["error", { "allow": ["warn", "error"] }],
+ "react/jsx-key": "off",
+ "react/display-name": "off",
+ "@typescript-eslint/no-empty-function": "off",
+ "@typescript-eslint/no-unused-vars": 2,
+ "@typescript-eslint/no-unsafe-assignment": 2,
+ "@typescript-eslint/no-unsafe-call": 2,
+ "@typescript-eslint/no-unsafe-member-access": 2,
+ "@typescript-eslint/no-unsafe-return": 2
+ },
+ "settings": {
+ "react": {
+ "version": "detect" // Tells eslint-plugin-react to automatically detect the version of React to use
+ }
+ }
+}
diff --git a/packages/generic/sso/.prettierrc.js b/packages/generic/sso/.prettierrc.js
new file mode 100644
index 000000000..73313fa59
--- /dev/null
+++ b/packages/generic/sso/.prettierrc.js
@@ -0,0 +1,7 @@
+module.exports = {
+ printWidth: 120,
+ semi: true,
+ singleQuote: true,
+ tabWidth: 2,
+ trailingComma: 'all',
+};
diff --git a/packages/generic/sso/README.fr.md b/packages/generic/sso/README.fr.md
new file mode 100644
index 000000000..e084573e3
--- /dev/null
+++ b/packages/generic/sso/README.fr.md
@@ -0,0 +1,291 @@
+# Module SSO
+Ce service implémente l'authentification unique (SSO) via **SAML 2** en de basant sur le framework **NestJS** et la bibliothèque `samlify`.
+Il gère l'authentification avec un fournisseur d'identité (IdP) tel que **Keycloak**, **Pages Blanches** ou tout autre fournisseur compatible SAML.
+Le service utilise la librairie **SAMLify** pour s'interfacer avec le SSO et faciliter la gestion des requêtes et des réponses SAML.
+
+
+## Workflow
+
+
+
+Le diagramme ci-dessous illustre l'interaction entre l'application Label et le SSO Pages Blanches pour l'authentification.
+
+
+
+1. Lorsqu'un utilisateur accède à LABEL, le frontend interroge le backend pour vérifier son authentification. Si l'utilisateur n'est pas authentifié, le backend redirige vers le fournisseur d'identité (IdP) avec les paramètres nécessaires.
+
+
+2. L'utilisateur se connecte sur la page SSO et, après authentification, le fournisseur d'identité génère et envoie une assertion SAML au backend de LABEL via l'URL de l'ACS.
+
+
+3. Le backend valide l'assertion SAML pour garantir l'intégrité des données et la conformité de la signature numérique.
+
+
+4. Après validation, l'accès aux ressources sécurisées est accordé, permettant à l'utilisateur de poursuivre sa session authentifiée.
+
+
+
+## Prérequis
+
+- **Node.js** (version 16 ou plus récente)
+- **NestJS**
+- **SAMLify** : Bibliothèque pour gérer les interactions avec SAML 2.
+- Un **Identity Provider (IdP)** compatible SAML 2.0 (par ex. Keycloak, Pages Blanches)
+- Le fichier `sso_idp_metadata.xml` contient la configuration de l'Identity Provider.
+- Le fichier `.env` contient les variables d'environnement nécessaires au fonctionnement du module.
+
+## Technologies
+
+- **NestJS** : Framework pour construire des applications Node.js performantes.
+- **TypeScript** : Langage de programmation pour un typage statique.
+- **Jest** : Framework de tests pour JavaScript.
+- **Prettier** : Outil de formatage de code.
+- **ESLint** : Outil de linting pour identifier et reporter les motifs dans le code JavaScript.
+
+## Dépendances
+### Le module SSO utilise les dépendances suivantes :
+- `@nestjs/common`
+- `@nestjs/core`
+- `@nestjs/config`
+- `@authenio/samlify-node-xmllint`
+- `@nestjs/platform-express`
+- `body-parser`
+- `dotenv`
+- `reflect-metadata`
+- `samlify`
+
+### Pré-requis
+
+- Installer [nvm](https://github.com/nvm-sh/nvm) afin d'avoir la version utilisée pour cette application et lancer la commande :
+
+```bash
+nvm install
+```
+
+### Installation
+
+Pour installer les packages nécessaires au bon fonctionnement de l'application, ouvrir un terminal et executer la commande suivante :
+
+```bash
+npm install
+```
+
+## Configuration
+### Configurer les variables d'environnement:
+
+ Les variables d'environnement nécessaires au fonctionnement du SSO doivent être configurées dans le fichier [docker.env.example](../../../docker.env.example) / [.env.example](../../../.env.example), situé à la racine du projet principal. Ce fichier doit ensuite être renommé en docker.env ou .env, selon le besoin, adapter les variables d'environnement si besoin
+
+# Configuration du Service Provider (SP)
+ Les instructions spécifiques à la configuration du fournisseur d'identité (IdP) et du fournisseur de services (SP) sont détaillées dans le document suivant : `MANU_SSO_Configuration_IDP_SAML_VM_Test_V1.1.odt`
+
+- SSO_SP_ENTITY_ID: Identifiant unique du SP (ie: SP-LABEL)
+- SSO_SP_ASSERTION_CONSUMER_SERVICE_LOCATION: URL où le SP reçoit les assertions SAML après authentification
+- SSO_SP_PRIVATE_KEY: Clé privée du Service Provider utilisée pour signer et déchiffrer les messages SAML échangés avec l'Identity Provider
+
+### Génération d'une Clé Privée et d'un Certificat Auto-Signé pour SAML
+
+Cette partie décrit les étapes nécessaires pour générer une clé privée et un certificat auto-signé à l'aide d'OpenSSL, qui peuvent être utilisés pour configurer un Service Provider (SP) dans un environnement SAML.
+
+**Veuillez noter que l'utilisation de certificats auto-signés est généralement destinée aux environnements de développement ou de test. En production, il est fortement recommandé d'utiliser un certificat émis par une autorité de certification (CA) de confiance pour garantir la sécurité et la validité des communications.**
+
+#### Prérequis
+
+- **OpenSSL**: Assurez-vous qu'OpenSSL est installé sur votre système. Vous pouvez le télécharger et l'installer à partir du site officiel ou utiliser un gestionnaire de paquets.
+
+#### Étapes de Génération
+
+1. **Installer OpenSSL**:
+
+```sh
+ sudo apt-get update
+ sudo apt-get install openssl
+```
+2. **Générer une Clé Privée**
+```sh
+ openssl genrsa -out privatekey.pem 2048
+```
+3. **Générer un Certificat Auto-Signé**
+
+Utilisez la clé privée pour créer un certificat auto-signé
+```sh
+ openssl req -new -x509 -key privatekey.pem -out certificate.pem
+```
+Intégrez la clé privée ainsi que le certificat auto-signé dans la configuration de votre application. Par exemple, cela peut être réalisé dans votre fichier de configuration SAML
+```typescript
+const spProps = {
+ entityID: process.env.SSO_SP_ENTITY_ID,
+ assertionConsumerService: [
+ {
+ Binding: samlify.Constants.namespace.binding.post,
+ Location: process.env.SSO_SP_ASSERTION_CONSUMER_SERVICE_LOCATION,
+ },
+ ],
+ privateKey: fs.readFileSync('path/to/privatekey.pem', 'utf8'),
+ signingCert: fs.readFileSync('path/to/certificate.pem', 'utf8'),
+ authnRequestsSigned: true,
+ wantAssertionsSigned: true,
+};
+```
+
+# Configuration de l'Identity Provider (IdP)
+- SSO_IDP_METADATA: Fichier XML contenant les métadonnées du IdP (Entity ID, certificats, endpoints).
+- SSO_IDP_SINGLE_SIGN_ON_SERVICE_LOCATION: URL du SSO où le Service Provider redirige les utilisateurs pour l'authentification.
+- SSO_IDP_SINGLE_LOGOUT_SERVICE_LOCATION: URL permettant la déconnexion des utilisateurs
+
+
+## Scripts
+- Voici une liste des scripts disponibles dans `package.json` :
+
+| Commande | Description |
+|--------------------|-----------------------------------------------------------------------------------------------|
+| `build` | Clean et compile l'application NestJS. |
+| `compile` | Compile l'application NestJS. |
+| `format` | Vérifie le formatage du code avec Prettier. |
+| `lint` | Vérifie le code TypeScript avec ESLint. |
+| `test` | Exécute les tests unitaires et d'intégration. |
+| `test:watch` | Exécute les tests en mode interactif avec surveillance des changements. |
+| `test:coverage` | Exécute les tests avec génération de rapports de couverture. |
+| `fix` | Corrige les erreurs de formatage avec ESLint et Prettier. |
+
+## Tests
+- Pour exécuter les tests, utilisez la commande suivante :
+
+```bash
+npm run test
+```
+
+- Pour exécuter les tests en mode interactif :
+
+```bash
+ npm run test:watch
+ ```
+
+- Pour exécuter les tests avec un rapport de couverture :
+
+```bash
+ npm run test:cov
+ ```
+
+## Fonctionnalités
+
+### Génération des métadonnées
+
+
+
+>La méthode ***generateMetadata()*** permet de générer et de récupérer les métadonnées du Service Provider (SP).
+
+
+### Création d'une URL de demande de connexion
+
+
+>La méthode ***createLoginRequestUrl()*** génère une URL pour initier la procédure de connexion via SAML 2.
+
+
+### Analyse et traitement de la réponse SAML 2
+
+
+>La méthode ***parseResponse()*** permet d'analyser et de traiter la réponse SAML reçue du IdP après une tentative de connexion.
+
+
+### Création d'une URL de demande de déconnexion
+
+
+>La méthode ***createLogoutRequestUrl(user)*** permet de créer une URL de déconnexion basée sur les informations d'utilisateur (nameID).
+
+
+## Utilisation
+L'exemple ci-dessous illustre l'utilisation du module SSO dans une application NestJs.
+
+
+### Gestion de la session
+Exemple d'implémentation de la gestion des sessions utilisateurs avec express-session.
+
+#### Installation
+```sh
+npm install express-session
+```
+
+#### Configuration de la session
+Dans votre application NestJS, procédez à la configuration d'express-session dans le fichier principal (par exemple, main.ts) comme suit :
+```typescript
+import { NestFactory } from '@nestjs/core';
+import { AppModule } from './app.module';
+import * as session from 'express-session';
+
+async function bootstrap() {
+ const app = await NestFactory.create(AppModule);
+
+ app.use(session({
+ secret: 'votre_secret', // Remplacez par un secret fort
+ resave: false,
+ saveUninitialized: false,
+ cookie: { secure: false }, // Mettez à true en production si vous utilisez HTTPS
+ }));
+
+ await app.listen(3000);
+}
+bootstrap();
+
+```
+
+#### Initialisation du service
+Intégrez SamlService en l'injectant dans votre contrôleur ou service NestJS afin de l'utiliser de manière optimale.
+```typescript
+import { SamlService } from './saml.service';
+
+@Controller('auth')
+export class AuthController {
+ constructor(private readonly samlService: SamlService) {}
+
+ @Get('login')
+ async login(@Res() res: Response) {
+ const loginUrl = await this.samlService.createLoginRequestUrl();
+ return res.redirect(loginUrl);
+ }
+
+ @Post('sso/acs')
+ async handleSSO(@Req() req: Request) {
+ const response = await this.samlService.parseResponse(req);
+ req.session.user = response; // Enregistrer l'utilisateur dans la session
+ return response; // Traiter la réponse selon votre logique
+ }
+
+ @Get('logout')
+ async logout(@Req() req: Request, @Res() res: Response) {
+ const logoutUrl = await this.samlService.createLogoutRequestUrl(req.session.user);
+ req.session.destroy(); // Détruire la session
+ return res.redirect(logoutUrl);
+ }
+}
+```
+
+1. **Méthode de Connexion**
+
+ Endpoint : ***GET /auth/login***
+
+ Cette méthode initie le processus de connexion en redirigeant l'utilisateur vers l'URL de demande de connexion SAML.
+
+>##### Fonctionnement
+>Lorsqu'un utilisateur accède à l'endpoint /auth/login, la méthode login est appelée.
+La méthode utilise le service SAML (SamlService) pour générer une URL de demande de connexion.
+L'utilisateur est ensuite redirigé vers cette URL pour procéder à l'authentification.
+
+2. **Méthode de Gestion des Réponses SSO**
+ Endpoint : ***POST /auth/sso/acs***
+
+ Cette méthode gère les réponses du SSO après que l'utilisateur se soit authentifié.
+
+>#### Fonctionnement
+>Lorsque l'utilisateur est authentifié, le SSO redirige vers l'endpoint /auth/sso/acs avec une réponse SAML.
+La méthode handleSSO est appelée, qui utilise le service SAML pour analyser la réponse.
+Les informations de l'utilisateur sont extraites de la réponse et stockées dans la session.
+
+3. **Méthode de Déconnexion**
+ Endpoint : ***GET /auth/logout***
+
+ Cette méthode permet de déconnecter l'utilisateur et de gérer le processus de déconnexion avec le SSO.
+
+>#### Fonctionnement
+>Lorsque l'utilisateur souhaite se déconnecter, il accède à l'endpoint /auth/logout.
+La méthode logout est appelée, qui génère une URL de demande de déconnexion SAML.
+La session de l'utilisateur est détruite, et l'utilisateur est redirigé vers l'URL de déconnexion pour finaliser le processus.
diff --git a/packages/generic/sso/README.md b/packages/generic/sso/README.md
new file mode 100644
index 000000000..717d33fc7
--- /dev/null
+++ b/packages/generic/sso/README.md
@@ -0,0 +1,294 @@
+
+**EN** | [FR](README.fr.md)
+
+# SSO Module
+
+This service implements Single Sign-On (SSO) using **SAML 2**, built on the **NestJS** framework and the `samlify` library.
+It facilitates authentication with Identity Providers (IdP) such as **Keycloak**, **Pages Blanches**, or any other SAML-compatible provider.
+The service utilizes the **SAMLify** library to interface with SSO, simplifying the management of SAML requests and responses.
+
+## Workflow
+
+The diagram below illustrates the interaction between the Label application and the Pages Blanches SSO for authentication.
+
+
+
+1. When a user initiates access to LABEL, the frontend communicates with the backend to check the user’s authentication status. If the user is not authenticated, the backend initiates a redirect to the identity provider (IdP), passing the necessary authentication parameters.
+
+
+2. The user is then prompted to log in via the SSO page. Upon successful authentication, the identity provider generates a SAML assertion and sends it to LABEL's backend via the Assertion Consumer Service (ACS) URL.
+
+
+3. The backend processes and validates the SAML assertion to ensure data integrity and verify the authenticity of the digital signature
+
+
+4. After validation, access to secured resources is granted, allowing the user to continue their authenticated session.
+
+
+
+## Prerequisites
+
+- **Node.js** (version 16 or higher)
+- **NestJS**
+- **SAMLify**: Library for managing interactions with SAML 2.
+- A **SAML 2.0 compatible Identity Provider (IdP)** (e.g., Keycloak, Pages Blanches).
+- The `sso_idp_metadata.xml` file containing the Identity Provider configuration.
+- The `.env` file that holds the necessary environment variables for the module.
+
+## Technologies
+
+- **NestJS**: A framework for building efficient Node.js applications.
+- **TypeScript**: A programming language that adds static typing.
+- **Jest**: A testing framework for JavaScript.
+- **Prettier**: A code formatting tool.
+- **ESLint**: A linting tool for identifying and reporting patterns in JavaScript code.
+
+## Dependencies
+
+The SSO module requires the following dependencies:
+- `@nestjs/common`
+- `@nestjs/core`
+- `@nestjs/config`
+- `@authenio/samlify-node-xmllint`
+- `@nestjs/platform-express`
+- `body-parser`
+- `dotenv`
+- `reflect-metadata`
+- `samlify`
+
+### Installation Prerequisites
+
+1. Install [nvm](https://github.com/nvm-sh/nvm) to manage Node.js versions.
+2. Run the following command to install the required Node.js version:
+
+ ```bash
+ nvm install
+
+### Installation
+
+To install the necessary packages for the application, open a terminal and execute the following command:
+
+```bash
+npm install
+```
+
+## Configuration
+### Environment Variables
+Configure the environment variables required for the SSO module in the [docker.env.example](../../../docker.env.example) / [.env.example](../../../.env.example) file located at the root of the main project. Rename this file to docker.env or .env as necessary, and adjust the environment variables as needed.
+
+
+# Service Provider (SP) Configuration
+Specific instructions for configuring the Identity Provider (IdP) and the Service Provider (SP) can be found in the following document: `MANU_SSO_Configuration_IDP_SAML_VM_Test_V1.1.odt`
+
+- SSO_SP_ENTITY_ID: Unique identifier for the SP (e.g., SP-LABEL).
+- SSO_SP_ASSERTION_CONSUMER_SERVICE_LOCATION: URL where the SP receives SAML assertions after authentication.
+- SSO_SP_PRIVATE_KEY: Private key of the Service Provider used for signing and decrypting SAML messages exchanged with the Identity Provider.
+
+### Generating a Private Key and Self-Signed Certificate for SAML
+
+This section details the steps needed to generate a private key and a self-signed certificate using OpenSSL, which can be used to set up a Service Provider (SP) in a SAML environment.
+
+**Self-signed certificates are typically suitable for development or testing environments. For production use, it is highly recommended to obtain a certificate from a trusted Certificate Authority (CA) to ensure secure and trusted communication.**
+
+#### Prérequis
+
+- **OpenSSL**: Verify that OpenSSL is installed on your system. It can be downloaded from the official website or installed via a package manager.
+
+#### Étapes de Génération
+
+1. **Installer OpenSSL**:
+
+```sh
+ sudo apt-get update
+ sudo apt-get install openssl
+```
+2. **Generate a Private Key**
+```sh
+ openssl genrsa -out privatekey.pem 2048
+```
+3. **Generate a Self-Signed Certificate**
+
+Use the private key to create a self-signed certificate
+```sh
+ openssl req -new -x509 -key privatekey.pem -out certificate.pem
+```
+Integrate the private key and the self-signed certificate into your application configuration. For example, in your SAML configuration file
+```typescript
+const spProps = {
+ entityID: process.env.SSO_SP_ENTITY_ID,
+ assertionConsumerService: [
+ {
+ Binding: samlify.Constants.namespace.binding.post,
+ Location: process.env.SSO_SP_ASSERTION_CONSUMER_SERVICE_LOCATION,
+ },
+ ],
+ privateKey: fs.readFileSync('path/to/privatekey.pem', 'utf8'),
+ signingCert: fs.readFileSync('path/to/certificate.pem', 'utf8'),
+ authnRequestsSigned: true,
+ wantAssertionsSigned: true,
+};
+```
+
+## Identity Provider (IdP) Configuration
+- SSO_IDP_METADATA: XML file containing the IdP metadata (Entity ID, certificates, endpoints).
+- SSO_IDP_SINGLE_SIGN_ON_SERVICE_LOCATION: URL where the Service Provider redirects users for authentication.
+- SSO_IDP_SINGLE_LOGOUT_SERVICE_LOCATION: URL for user logout.
+
+
+## Scripts
+- The following scripts are available in `package.json` :
+
+| Commande | Description |
+|--------------------|---------------------------------------------------------------------------------|
+| `build` | Cleans and compiles the NestJS application. |
+| `compile` | Compiles the NestJS application. |
+| `format` | Checks the code formatting with Prettier. |
+| `lint` | Checks TypeScript code with ESLint. |
+| `test` | Runs unit and integration tests. |
+| `test:watch` | Executes tests in interactive mode with change monitoring. |
+| `test:coverage` | Runs tests while generating a coverage report. |
+| `fix` | Corrects formatting errors with ESLint and Prettier. |
+
+## Testing
+- To run the tests, use the following command:
+
+```bash
+npm run test
+```
+
+- To run the tests in interactive mode, execute:
+
+```bash
+ npm run test:watch
+ ```
+
+- To run the tests with coverage reporting, execute:
+
+```bash
+ npm run test:cov
+ ```
+
+## Features
+
+### Metadata Generation
+
+
+
+>The ***generateMetadata()*** method allows for the generation and retrieval of the Service Provider (SP) metadata.
+
+
+### Creating a Login Request URL
+
+
+>The ***createLoginRequestUrl()*** method generates a URL to initiate the login process via SAML 2..
+
+
+### Parsing and Handling SAML 2 Responses
+
+
+>The ***parseResponse()*** method parses and processes the SAML response received from the IdP after a login attempt.
+
+
+### Creating a Logout Request URL
+
+
+>The ***createLogoutRequestUrl(user)*** method generates a logout URL based on user information (nameID).
+
+
+## Usage
+The following example illustrates the use of the SSO module within a NestJS application.
+
+
+### Session Management
+Example implementation of user session management with express-session.
+
+#### Installation
+```sh
+npm install express-session
+```
+
+#### Configuring the Session
+In your NestJS application, configure express-session in the main file (e.g., main.ts) as follows::
+```typescript
+import { NestFactory } from '@nestjs/core';
+import { AppModule } from './app.module';
+import * as session from 'express-session';
+
+async function bootstrap() {
+ const app = await NestFactory.create(AppModule);
+
+ app.use(session({
+ secret: 'votre_secret', // Replace with a strong secret.
+ resave: false,
+ saveUninitialized: false,
+ cookie: { secure: false }, // Set to true in production if you are using HTTPS.
+ }));
+
+ await app.listen(3000);
+}
+bootstrap();
+
+```
+
+#### Initialisation du service
+Integrate SamlService by injecting it into your NestJS controller or service for optimal usage.
+```typescript
+import { SamlService } from './saml.service';
+
+@Controller('auth')
+export class AuthController {
+ constructor(private readonly samlService: SamlService) {}
+
+ @Get('login')
+ async login(@Res() res: Response) {
+ const loginUrl = await this.samlService.createLoginRequestUrl();
+ return res.redirect(loginUrl);
+ }
+
+ @Post('sso/acs')
+ async handleSSO(@Req() req: Request) {
+ const response = await this.samlService.parseResponse(req);
+ req.session.user = response; // Register the user in the session.
+ return response; // Process the response according to your logic.
+ }
+
+ @Get('logout')
+ async logout(@Req() req: Request, @Res() res: Response) {
+ const logoutUrl = await this.samlService.createLogoutRequestUrl(req.session.user);
+ req.session.destroy(); // Destroy the session.
+ return res.redirect(logoutUrl);
+ }
+
+}
+```
+
+1. **Login method**
+
+ Endpoint : ***GET /auth/login***
+
+ This method initiates the login process by redirecting the user to the SAML login request URL
+
+>##### Mechanism
+>When a user accesses the endpoint /auth/login, the login method is called.
+The method uses the SAML service (SamlService) to generate a login request URL.
+The user is then redirected to this URL to proceed with authentication.
+
+2. **SSO Response Handling Method**
+ Endpoint : ***POST /auth/sso/acs***
+
+ This method handles SSO responses after the user has authenticated.
+
+>#### Mechanism
+>When the user is authenticated, the SSO redirects to the endpoint /auth/sso/acs with a SAML response.
+The handleSSO method is called, which uses the SAML service to parse the response.
+The user's information is extracted from the response and stored in the session.
+
+3. **Logout Method**
+ Endpoint : ***GET /auth/logout***
+
+ This method allows the user to log out and manages the logout process with the SSO.
+
+>#### Mechanism
+>When the user wishes to log out, they access the endpoint /auth/logout.
+The logout method is called, which generates a SAML logout request URL.
+The user's session is destroyed, and the user is redirected to the logout URL to finalize the process.
diff --git a/packages/generic/sso/babel.config.json b/packages/generic/sso/babel.config.json
new file mode 100644
index 000000000..a1292bd52
--- /dev/null
+++ b/packages/generic/sso/babel.config.json
@@ -0,0 +1,21 @@
+{
+ "presets": [
+ [
+ "@babel/preset-env",
+ {
+ "targets": {
+ "node": "current"
+ }
+ }
+ ],
+ "@babel/preset-typescript"
+ ],
+ "plugins": [
+ [
+ "@babel/plugin-proposal-decorators",
+ {
+ "legacy": true
+ }
+ ]
+ ]
+}
diff --git a/packages/generic/sso/docs/images/LABEL_auth_workflow.png b/packages/generic/sso/docs/images/LABEL_auth_workflow.png
new file mode 100644
index 000000000..413a74cf0
Binary files /dev/null and b/packages/generic/sso/docs/images/LABEL_auth_workflow.png differ
diff --git a/packages/generic/sso/jest.config.json b/packages/generic/sso/jest.config.json
new file mode 100644
index 000000000..4438bafb9
--- /dev/null
+++ b/packages/generic/sso/jest.config.json
@@ -0,0 +1,18 @@
+{
+ "moduleFileExtensions": [
+ "js",
+ "json",
+ "ts"
+ ],
+ "rootDir": "src",
+ "testRegex": ".*\\.spec\\.ts$",
+ "transform": {
+ "^.+\\.(t|j)s$": "ts-jest"
+ },
+ "collectCoverageFrom": [
+ "**/*.(t|j)s"
+ ],
+ "coverageDirectory": "../coverage",
+ "testEnvironment": "node",
+ "setupFiles": []
+}
\ No newline at end of file
diff --git a/packages/generic/sso/package.json b/packages/generic/sso/package.json
new file mode 100644
index 000000000..4e9aa2fbd
--- /dev/null
+++ b/packages/generic/sso/package.json
@@ -0,0 +1,66 @@
+{
+ "name": "@label/sso",
+ "version": "1.0.0",
+ "description": "Module d'interface d'authentification SSO",
+ "author": "@open-groupe",
+ "license": "ISC",
+ "main": "dist/index",
+ "types": "dist/index",
+ "repository": {
+ "type": "git",
+ "url": "ssh://git@git.boost.open.global:443/cour_de_cassation/cassation_lab/label.git"
+ },
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "test": "RUN_MODE=TEST jest --passWithNoTests",
+ "test:watch": "RUN_MODE=TEST jest --passWithNoTests --watch",
+ "test:coverage": "RUN_MODE=TEST jest --passWithNoTests --coverage",
+ "build": "yarn clean && yarn compile",
+ "clean": "rimraf -rf ./dist",
+ "clean:all": "rimraf -rf ./dist && rimraf -rf ./node_modules",
+ "compile": "tsc -p tsconfig.json",
+ "fix": "eslint 'src/**/*.{js,ts,tsx}' --quiet --fix",
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
+ "lint": "eslint 'src/**/*.{js,ts,tsx}' --quiet"
+ },
+ "eslintConfig": {
+ "extends": "react-app"
+ },
+ "dependencies": {
+ "@authenio/samlify-node-xmllint": "^1.0.1",
+ "@nestjs/common": "^8.4.7",
+ "@nestjs/config": "^0.5.0",
+ "@nestjs/core": "8.4.7",
+ "@nestjs/platform-express": "7.6.18",
+ "body-parser": "^1.19.0",
+ "dotenv": "^16.4.5",
+ "reflect-metadata": "^0.2.1",
+ "samlify": "2.6.0"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.11.6",
+ "@babel/core": "^7.11.6",
+ "@babel/polyfill": "^7.11.5",
+ "@babel/preset-env": "^7.11.5",
+ "@babel/preset-typescript": "^7.10.4",
+ "@babel/plugin-proposal-decorators": "^7.10.5",
+ "@nestjs/testing": "^8.4.7",
+ "@types/body-parser": "^1.19.0",
+ "@types/jest": "^26.0.13",
+ "@types/supertest": "^2.0.8",
+ "@typescript-eslint/eslint-plugin": "^4.4.1",
+ "@typescript-eslint/parser": "^4.4.1",
+ "core-js": "^3.6.5",
+ "eslint": "7.7.0",
+ "eslint-config-prettier": "^6.12.0",
+ "eslint-plugin-prettier": "^3.1.4",
+ "jest": "24.9.0",
+ "prettier": "^2.1.2",
+ "rimraf": "^3.0.2",
+ "supertest": "^4.0.2",
+ "ts-jest": "^29.2.5",
+ "typescript": "~4.0.0"
+ }
+}
diff --git a/packages/generic/sso/src/api/saml/saml.service.spec.ts b/packages/generic/sso/src/api/saml/saml.service.spec.ts
new file mode 100644
index 000000000..965b16515
--- /dev/null
+++ b/packages/generic/sso/src/api/saml/saml.service.spec.ts
@@ -0,0 +1,164 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { SamlService } from './saml.service';
+import * as fs from 'fs';
+import * as samlify from 'samlify';
+import * as validator from '@authenio/samlify-node-xmllint';
+
+jest.mock('fs');
+jest.mock('samlify', () => {
+ const mockExtractor = {
+ loginResponseFields: jest.fn().mockReturnValue([]),
+ extract: jest.fn().mockReturnValue({
+ // Simuler la réponse extraite ici
+ samlContent: 'mock-saml-content',
+ fields: [],
+ attributes: { nom: 'Xx', prenom: 'Alain', role: ['ANNOTATEUR'], email: 'mail.573@justice.fr', name: 'Xx Alain' },
+ }),
+ };
+
+ return {
+ // Autres méthodes de samlify
+ ServiceProvider: jest.fn().mockReturnValue({
+ getMetadata: jest.fn().mockReturnValue(''),
+ createLoginRequest: jest.fn().mockResolvedValue('http://login-url'),
+ parseLoginResponse: jest.fn().mockResolvedValue({
+ samlContent: 'parsed-response',
+ }),
+ createLogoutRequest: jest.fn().mockResolvedValue('http://logout-url'),
+ }),
+ IdentityProvider: jest.fn().mockReturnValue({}),
+ Extractor: mockExtractor,
+ Constants: {
+ namespace: {
+ binding: {
+ post: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
+ redirect: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
+ },
+ },
+ },
+ setSchemaValidator: jest.fn().mockReturnValue({
+ validate: () => jest.fn().mockResolvedValue(true),
+ }),
+ };
+});
+
+jest.mock('@authenio/samlify-node-xmllint', () => ({
+ validate: jest.fn(() => true),
+}));
+
+/* eslint-disable @typescript-eslint/no-unsafe-assignment */
+/* eslint-disable @typescript-eslint/no-unsafe-member-access */
+/* eslint-disable @typescript-eslint/no-unsafe-call */
+
+describe('SamlService', () => {
+ let service: SamlService;
+
+ beforeEach(async () => {
+ (fs.readFileSync as jest.Mock).mockReturnValue('');
+
+ const module: TestingModule = await Test.createTestingModule({
+ providers: [SamlService],
+ }).compile();
+
+ service = module.get(SamlService);
+ });
+
+ it('should be defined', () => {
+ expect(service).toBeDefined();
+ });
+
+ it('should generate metadata', () => {
+ const metadata = service.generateMetadata();
+ expect(metadata).toEqual('');
+ expect(samlify.ServiceProvider).toHaveBeenCalled();
+ expect(validator.validate()).toBe(true);
+ });
+
+ it('should create login request URL', async () => {
+ const loginUrl = await service.createLoginRequestUrl();
+ expect(loginUrl).toEqual('http://login-url');
+
+ expect(samlify.ServiceProvider({}).createLoginRequest).toHaveBeenCalled();
+ });
+
+ describe('parseResponse', () => {
+ it('should throw an error if SAMLResponse is missing', async () => {
+ const request = {};
+ await expect(service.parseResponse(request)).rejects.toThrow('Missing SAMLResponse in request body');
+ });
+
+ it('should decode the SAMLResponse correctly', async () => {
+ const base64Response = Buffer.from('').toString('base64');
+ const request = { body: { SAMLResponse: base64Response } };
+
+ const samlContent = await service.parseResponse(request);
+
+ expect(samlContent.samlContent).toBe('');
+ });
+
+ it('should extract fields correctly', async () => {
+ const base64Response = Buffer.from('').toString('base64');
+ const request = { body: { SAMLResponse: base64Response } };
+
+ const mockExtract = {
+ attributes: {
+ role: ['app:role1', 'other:role2'],
+ },
+ };
+ (samlify.Extractor.extract as jest.Mock).mockReturnValue(mockExtract);
+
+ process.env.SSO_ATTRIBUT_ROLE = 'role';
+ process.env.SSO_APP_NAME = 'app';
+
+ const result = await service.parseResponse(request);
+
+ expect(result.extract).toEqual(mockExtract);
+ expect(result.extract.attributes.role).toEqual(['role1']);
+ });
+
+ it('should handle roles correctly when role is a string', async () => {
+ const base64Response = Buffer.from('').toString('base64');
+ const request = { body: { SAMLResponse: base64Response } };
+
+ const mockExtract = {
+ attributes: {
+ role: 'app:role1',
+ },
+ };
+ (samlify.Extractor.extract as jest.Mock).mockReturnValue(mockExtract);
+
+ process.env.SSO_ATTRIBUT_ROLE = 'role';
+ process.env.SSO_APP_NAME = 'app';
+
+ const result = await service.parseResponse(request);
+
+ expect(result.extract.attributes.role).toEqual(['role1']); // Vérifie que le rôle est bien traité
+ });
+
+ it('should not modify roles if appName is empty', async () => {
+ const base64Response = Buffer.from('').toString('base64');
+ const request = { body: { SAMLResponse: base64Response } };
+
+ const mockExtract = {
+ attributes: {
+ role: ['app:role1', 'other:role2'],
+ },
+ };
+ (samlify.Extractor.extract as jest.Mock).mockReturnValue(mockExtract);
+
+ process.env.SSO_ATTRIBUT_ROLE = 'role';
+ process.env.SSO_APP_NAME = '';
+
+ const result = await service.parseResponse(request);
+
+ expect(result.extract.attributes.role.length).toEqual(2);
+ });
+ });
+
+ it('should create logout request URL', async () => {
+ const mockUser = { nameID: 'test.user@label.fr', sessionIndex: undefined };
+ const logoutUrl = await service.createLogoutRequestUrl(mockUser);
+ expect(logoutUrl).toEqual('http://logout-url');
+ expect(samlify.ServiceProvider({}).createLogoutRequest).toHaveBeenCalledTimes(1);
+ });
+});
diff --git a/packages/generic/sso/src/api/saml/saml.service.ts b/packages/generic/sso/src/api/saml/saml.service.ts
new file mode 100644
index 000000000..15632639d
--- /dev/null
+++ b/packages/generic/sso/src/api/saml/saml.service.ts
@@ -0,0 +1,148 @@
+import { Injectable } from '@nestjs/common';
+import * as samlify from 'samlify';
+import * as fs from 'fs';
+import * as validator from '@authenio/samlify-node-xmllint';
+
+samlify.setSchemaValidator(validator);
+/* eslint-disable @typescript-eslint/no-unsafe-assignment */
+/* eslint-disable @typescript-eslint/no-unsafe-member-access */
+/* eslint-disable @typescript-eslint/no-unsafe-call */
+/* eslint-disable @typescript-eslint/no-unsafe-return */
+@Injectable()
+export class SamlService {
+ private sp;
+ private idp;
+
+ constructor() {
+ // Initialiser le Service Provider (SP)
+ const spProps = {
+ entityID: process.env.SSO_SP_ENTITY_ID,
+ assertionConsumerService: [
+ {
+ Binding: samlify.Constants.namespace.binding.post,
+ Location: process.env.SSO_SP_ASSERTION_CONSUMER_SERVICE_LOCATION,
+ },
+ ],
+ authnRequestsSigned: true,
+ wantAssertionsSigned: true,
+ isAssertionEncrypted: true,
+
+ privateKey: fs.readFileSync(String(process.env.SSO_SP_PRIVATE_KEY), 'utf8'),
+ encPrivateKey: fs.readFileSync(String(process.env.SSO_SP_PRIVATE_KEY), 'utf8'),
+ signingCert: fs.readFileSync(String(process.env.SSO_CERTIFICAT), 'utf8'),
+ signatureConfig: {
+ prefix: 'ds',
+ location: {
+ reference: '/EntityDescriptor',
+ action: 'append',
+ },
+ signatureAlgorithm: 'http://www.w3.org/2000/09/xmldsig#',
+ digestAlgorithm: 'http://www.w3.org/2000/09/xmldsig#',
+ },
+ } as any;
+
+ this.sp = samlify.ServiceProvider(spProps);
+ // Initialiser l'Identity Provider (IdP)
+ const idpProps = {
+ metadata: fs.readFileSync(String(process.env.SSO_IDP_METADATA), 'utf8'),
+ encCert: fs.readFileSync(String(process.env.SSO_CERTIFICAT), 'utf8'),
+ signingCert: fs.readFileSync(String(process.env.SSO_CERTIFICAT), 'utf8'),
+ wantAuthnRequestsSigned: true,
+ singleSignOnService: [
+ {
+ Binding: samlify.Constants.namespace.binding.redirect,
+ Location: process.env.SSO_IDP_SINGLE_SIGN_ON_SERVICE_LOCATION,
+ },
+ ],
+ singleLogoutService: [
+ {
+ Binding: samlify.Constants.namespace.binding.redirect,
+ Location: process.env.SSO_IDP_SINGLE_LOGOUT_SERVICE_LOCATION,
+ },
+ ],
+ wantLogoutRequestSigned: true,
+ } as any;
+ this.idp = samlify.IdentityProvider(idpProps);
+ }
+
+ generateMetadata(): string {
+ return this.sp.getMetadata();
+ }
+
+ createLoginRequestUrl(): {
+ context: string;
+ id: string;
+ } {
+ return this.sp.createLoginRequest(this.idp, 'redirect');
+ }
+
+ async parseResponse(request?: { body?: { SAMLResponse: string } }) {
+ const samlResponse = request?.body?.SAMLResponse;
+ if (!samlResponse) throw new Error('Missing SAMLResponse in request body');
+
+ const samlContent = Buffer.from(samlResponse, 'base64').toString();
+
+ const extractFields = [
+ ...samlify.Extractor.loginResponseFields(samlContent),
+ {
+ key: 'nameID',
+ localPath: ['Response', 'Assertion', 'Subject', 'NameID'],
+ attributes: [],
+ shortcut: samlContent as unknown,
+ },
+ {
+ key: 'sessionIndex',
+ localPath: ['Response', 'Assertion', 'AuthnStatement'],
+ attributes: ['SessionIndex'],
+ shortcut: samlContent as unknown,
+ },
+ {
+ key: 'attributes',
+ localPath: ['Response', 'Assertion', 'AttributeStatement', 'Attribute'],
+ index: ['Name'],
+ attributePath: ['AttributeValue'],
+ attributes: [],
+ shortcut: samlContent as unknown,
+ },
+ ];
+
+ const extract: {
+ nameID?: string;
+ sessionIndex?: string;
+ attributes?: Record;
+ } = samlify.Extractor.extract(samlContent, extractFields) as {
+ nameID?: string;
+ sessionIndex?: string;
+ attributes?: Record;
+ };
+
+ const roleKey = process.env.SSO_ATTRIBUTE_ROLE || 'role';
+ const appName = process.env.SSO_APP_NAME || '';
+
+ if (extract.attributes) {
+ const roleKeyValue = extract.attributes[roleKey];
+
+ const normalizedRoles = Array.isArray(roleKeyValue) ? roleKeyValue : roleKeyValue ? [roleKeyValue] : [];
+
+ extract.attributes[roleKey] = normalizedRoles
+ .filter((role) => role.includes(appName))
+ .map((role) => role.replace(`${appName}:`, ''));
+ }
+
+ return {
+ samlContent,
+ extract,
+ };
+ }
+
+ async createLogoutRequestUrl(user: { nameID: string; sessionIndex: string }) {
+ return this.sp.createLogoutRequest(this.idp, 'redirect', {
+ logoutNameID: user.nameID,
+ id: user.sessionIndex,
+ nameIDFormat: process.env.SSO_NAME_ID_FORMAT,
+ sessionIndex: user.sessionIndex,
+ signRequest: true,
+ signatureAlgorithm: process.env.SSO_SIGNATURE_ALGORITHM,
+ });
+ }
+}
diff --git a/packages/generic/sso/src/index.ts b/packages/generic/sso/src/index.ts
new file mode 100644
index 000000000..36336d050
--- /dev/null
+++ b/packages/generic/sso/src/index.ts
@@ -0,0 +1 @@
+export * from './api/saml/saml.service';
diff --git a/packages/generic/sso/tsconfig.json b/packages/generic/sso/tsconfig.json
new file mode 100644
index 000000000..5680259f7
--- /dev/null
+++ b/packages/generic/sso/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "declaration": true,
+ "removeComments": true,
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "allowSyntheticDefaultImports": true,
+ "target": "ES2020",
+ "sourceMap": true,
+ "outDir": "./dist",
+ "baseUrl": "./",
+ "incremental": true,
+ "skipLibCheck": true
+ }
+}
\ No newline at end of file
diff --git a/sso_files/certificate.pem b/sso_files/certificate.pem
new file mode 100644
index 000000000..6bb6844e2
--- /dev/null
+++ b/sso_files/certificate.pem
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDazCCAlOgAwIBAgIUGROx096mS1jemzv+M6W7N/KrhJowDQYJKoZIhvcNAQEL
+BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
+GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDEwMDcxMTE0NDFaFw0yNDEx
+MDYxMTE0NDFaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
+HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQC9bs3r/g6KZ7PlsPYSEt4O84pFZpMHGGnGdPVULNgT
+2mSacPYEYc3G+qfrGjZ673Yk9mfRe2CnvQaKD4SoDlXGEwrSus1j/fNqzdu6XsVv
+hQSzjX8gwWb9DaRxpI+wHMqSqP4vcKP8u/R7Zgjb5NnHxZ5tE3GNH+MsuoKeo5ev
+ck8eb9k0jbh4BNmwsRXu9rwB9at1N4AMCl1NTcBRGYs6HDeRJF9LsDMhOo3pDHR4
+Wi6i/DkAp6GqmMf0IFvWLpjQNZNdJBszP+S/cc3L8X3aZtx1sAmGDI75y5Y06wRV
+29C5CJnGb3MtS8jZDqEof9m8vrtw11p2nn4IOzrF089HAgMBAAGjUzBRMB0GA1Ud
+DgQWBBRj8buUgMEU/NS2o9e7gvn9H+Yb4zAfBgNVHSMEGDAWgBRj8buUgMEU/NS2
+o9e7gvn9H+Yb4zAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBu
+gXRYq77BrFe9Q0d4Jxwc/1Mrw4sa8O4Bk+tMaxkdO2/X7/PMXxJKqSeDqtLfnc4v
+2BZWSuYpDP4zuUmXbLo9irME05RaObvPXsjjeUIwBpY0u10RlgufTxZlhpq4spIn
+qtyOQw6WcgRjVLlfqzNUJE6ancUM326qnAnX344+iBUiD495vLQ41MKRJrmJV6G2
+7xZHsDbZCEQ/6V+otz1fh69FFcvXI37ufipb54PWO0oWSot5/b+iok22e7Qac/51
+ZDGUoisvww3FjPkt9325EzXlZbe4TC7ouZnkVyy7R7it8dSmH7or+UmdwRUkqrNx
+lTghkmPqil3zLWUOV0at
+-----END CERTIFICATE-----
diff --git a/sso_files/descriptor.txt b/sso_files/descriptor.txt
new file mode 100644
index 000000000..c1540fe17
--- /dev/null
+++ b/sso_files/descriptor.txt
@@ -0,0 +1 @@
+dXjGiBQM-RFDe5r-73YijXUff7SQPhMLMCuqeI-xKVwMIICnTCCAYUCBgGUvbGhrTANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdtb2NrU1NPMB4XDTI1MDEzMTE4NDcwMloXDTM1MDEzMTE4NDg0MlowEjEQMA4GA1UEAwwHbW9ja1NTTzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPYd012W2ajvV+DjHGU9H5TWDHJJ5MiQDHud/uhVDPRlPGOXCFv4JMs55KXd4tjlFJHIpTrOSZrQ6KXTf5fHukP+jwFHNmWbNCWq/pZn/JwfxfSZK9BdYu6VQIaD9tWUpO7ClI8V7tgX6+QLfNkRBkxpCm2A6c/dwVMWmBORlUJFOos+1+wBAD6iCowHQYV7f4l/A1EeXqLEyvn/b+6+DgFIjhXIo+01Op4qRyl1v+J+L3AWUKhmWrzpz8o6uUZxCvfNYWQGrhocz47v24bNusYPQNyu+PsAcLj7QjG1egS8TJkSMgokIYNNkEEEQa9syvWDZJzy2/3F92TBnNHijf8CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA3pOUWm83H3Xy8h3/km6q94LGZ9dmJ6p3FT3rBzm9MIQN+q+eCkehPXdQuzMMlHgvlCX1jfax4MnhXGgFwdL9D0gFfT+KzgGS8Cv0Gzg88m7e5wD11wBhJ5j9gw4K/dtLfjgHZAdJPGX7kxaZHeIZMr1KyqeXjn+AqIhV8+Xk199ZOlNb454VSNBj+4uUxptm0z4p3WkJ33mehq+aRQe2P+XQ36MIJC+cIEyumqClz6UHR9miPKap3AXOS+5wkZeTI3WWqAxedmJ2Gp+QLtH++gxBh7/ENoY/y5eTKPiEEfJ6+ucIpqcaYjODLiMB9DpI9C+TzKZ7H0UGZD9KXvE0wg==urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
\ No newline at end of file
diff --git a/sso_files/metadata_idp.xml b/sso_files/metadata_idp.xml
new file mode 100644
index 000000000..e287813a3
--- /dev/null
+++ b/sso_files/metadata_idp.xml
@@ -0,0 +1,89 @@
+
+
+
+
+nujwbKvmA_vsAlZfUh1FNTxFUzKiiUswe2c9Xrin314
+
+ MIICmzCCAYMCBgGUvMgDBzANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjUwMTMxMTQzMTUyWhcNMzUwMTMxMTQzMzMyWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMVXixE+OVEgPn2VmNpk/u1uQDVE25y66SpiIJp9UQwlg3zxQr0XdYZ0kF404KqiONhJuMuw6ixZg5ZCqWdNnT9Nn8X+Kpn4ICzE/kkNtpuuhdLcBCwu6YPJebAXMez+Hvucx7n4kauNpt5qHYGvmWK+Hvy2T+HBuXMWn0ez+u55jVx5m8suzp9i3afzG5U5Mn4kGR2QK0/p9+InGjJBAtWPFnib9LlHA2venV1r6N0kYEDibVKBkKYWSTmaYVAIHvsms9f5dBKWAPKCdaXq4+sUYJEym1/o82+640aiWYlZNTF2nSzE+0aSgyeK1ZU+6Yg2Doo31UFzUyqZ5C9kWhAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFSi9zKIw4oYd2B57G23nk1hyqUFmYqVSvcMggqYzs+GlafGWOaJebE+op+iwSAyvEhWXYVqnXRAelxZmH6CqBWJlvxWXlOkX0osc4muDbDsiE+KceDx9dDaQlpz1fSUa6lUTTgkksbqn7SrJ7+2VxH9eaY1fS2U6FNnfgttNb3zXBIJMTNaMJuFdkPDnR92/JZMdoppuOKZ7WahGjB/YMXPIQaCSLa+deMA/5iCDUbSbmAeHtG4bf2jljy0/gQT9AwcbrhMk9Sc/G9HEnE1DoFD/ezJIhN/T/YeTuY7HKo0Ow9eje2ytjANWbnO0cawiMUfywU6EaIBPCU53X3vNlE=
+
+
+
+
+
+
+
+ MIICmzCCAYMCBgGUvMgDBzANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjUwMTMxMTQzMTUyWhcNMzUwMTMxMTQzMzMyWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMVXixE+OVEgPn2VmNpk/u1uQDVE25y66SpiIJp9UQwlg3zxQr0XdYZ0kF404KqiONhJuMuw6ixZg5ZCqWdNnT9Nn8X+Kpn4ICzE/kkNtpuuhdLcBCwu6YPJebAXMez+Hvucx7n4kauNpt5qHYGvmWK+Hvy2T+HBuXMWn0ez+u55jVx5m8suzp9i3afzG5U5Mn4kGR2QK0/p9+InGjJBAtWPFnib9LlHA2venV1r6N0kYEDibVKBkKYWSTmaYVAIHvsms9f5dBKWAPKCdaXq4+sUYJEym1/o82+640aiWYlZNTF2nSzE+0aSgyeK1ZU+6Yg2Doo31UFzUyqZ5C9kWhAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFSi9zKIw4oYd2B57G23nk1hyqUFmYqVSvcMggqYzs+GlafGWOaJebE+op+iwSAyvEhWXYVqnXRAelxZmH6CqBWJlvxWXlOkX0osc4muDbDsiE+KceDx9dDaQlpz1fSUa6lUTTgkksbqn7SrJ7+2VxH9eaY1fS2U6FNnfgttNb3zXBIJMTNaMJuFdkPDnR92/JZMdoppuOKZ7WahGjB/YMXPIQaCSLa+deMA/5iCDUbSbmAeHtG4bf2jljy0/gQT9AwcbrhMk9Sc/G9HEnE1DoFD/ezJIhN/T/YeTuY7HKo0Ow9eje2ytjANWbnO0cawiMUfywU6EaIBPCU53X3vNlE=
+
+
+
+
+
+
+
+
+
+
+
+
+
+urn:oasis:names:tc:SAML:2.0:nameid-format:persistent
+urn:oasis:names:tc:SAML:2.0:nameid-format:transient
+urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
+urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
+
+
+
+
+
+ MIICmzCCAYMCBgGUvMgDBzANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjUwMTMxMTQzMTUyWhcNMzUwMTMxMTQzMzMyWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMVXixE+OVEgPn2VmNpk/u1uQDVE25y66SpiIJp9UQwlg3zxQr0XdYZ0kF404KqiONhJuMuw6ixZg5ZCqWdNnT9Nn8X+Kpn4ICzE/kkNtpuuhdLcBCwu6YPJebAXMez+Hvucx7n4kauNpt5qHYGvmWK+Hvy2T+HBuXMWn0ez+u55jVx5m8suzp9i3afzG5U5Mn4kGR2QK0/p9+InGjJBAtWPFnib9LlHA2venV1r6N0kYEDibVKBkKYWSTmaYVAIHvsms9f5dBKWAPKCdaXq4+sUYJEym1/o82+640aiWYlZNTF2nSzE+0aSgyeK1ZU+6Yg2Doo31UFzUyqZ5C9kWhAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFSi9zKIw4oYd2B57G23nk1hyqUFmYqVSvcMggqYzs+GlafGWOaJebE+op+iwSAyvEhWXYVqnXRAelxZmH6CqBWJlvxWXlOkX0osc4muDbDsiE+KceDx9dDaQlpz1fSUa6lUTTgkksbqn7SrJ7+2VxH9eaY1fS2U6FNnfgttNb3zXBIJMTNaMJuFdkPDnR92/JZMdoppuOKZ7WahGjB/YMXPIQaCSLa+deMA/5iCDUbSbmAeHtG4bf2jljy0/gQT9AwcbrhMk9Sc/G9HEnE1DoFD/ezJIhN/T/YeTuY7HKo0Ow9eje2ytjANWbnO0cawiMUfywU6EaIBPCU53X3vNlE=
+
+
+
+
+
+
+
+ MIICmzCCAYMCBgGUvMgDBzANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjUwMTMxMTQzMTUyWhcNMzUwMTMxMTQzMzMyWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMVXixE+OVEgPn2VmNpk/u1uQDVE25y66SpiIJp9UQwlg3zxQr0XdYZ0kF404KqiONhJuMuw6ixZg5ZCqWdNnT9Nn8X+Kpn4ICzE/kkNtpuuhdLcBCwu6YPJebAXMez+Hvucx7n4kauNpt5qHYGvmWK+Hvy2T+HBuXMWn0ez+u55jVx5m8suzp9i3afzG5U5Mn4kGR2QK0/p9+InGjJBAtWPFnib9LlHA2venV1r6N0kYEDibVKBkKYWSTmaYVAIHvsms9f5dBKWAPKCdaXq4+sUYJEym1/o82+640aiWYlZNTF2nSzE+0aSgyeK1ZU+6Yg2Doo31UFzUyqZ5C9kWhAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFSi9zKIw4oYd2B57G23nk1hyqUFmYqVSvcMggqYzs+GlafGWOaJebE+op+iwSAyvEhWXYVqnXRAelxZmH6CqBWJlvxWXlOkX0osc4muDbDsiE+KceDx9dDaQlpz1fSUa6lUTTgkksbqn7SrJ7+2VxH9eaY1fS2U6FNnfgttNb3zXBIJMTNaMJuFdkPDnR92/JZMdoppuOKZ7WahGjB/YMXPIQaCSLa+deMA/5iCDUbSbmAeHtG4bf2jljy0/gQT9AwcbrhMk9Sc/G9HEnE1DoFD/ezJIhN/T/YeTuY7HKo0Ow9eje2ytjANWbnO0cawiMUfywU6EaIBPCU53X3vNlE=
+
+
+
+
+
+
+
+
+
+
+urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
+urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName
+urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName
+urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos
+urn:oasis:names:tc:SAML:2.0:nameid-format:entity
+urn:oasis:names:tc:SAML:2.0:nameid-format:transient
+
+
+
+
+
+ MIICmzCCAYMCBgGUvMgDBzANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjUwMTMxMTQzMTUyWhcNMzUwMTMxMTQzMzMyWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMVXixE+OVEgPn2VmNpk/u1uQDVE25y66SpiIJp9UQwlg3zxQr0XdYZ0kF404KqiONhJuMuw6ixZg5ZCqWdNnT9Nn8X+Kpn4ICzE/kkNtpuuhdLcBCwu6YPJebAXMez+Hvucx7n4kauNpt5qHYGvmWK+Hvy2T+HBuXMWn0ez+u55jVx5m8suzp9i3afzG5U5Mn4kGR2QK0/p9+InGjJBAtWPFnib9LlHA2venV1r6N0kYEDibVKBkKYWSTmaYVAIHvsms9f5dBKWAPKCdaXq4+sUYJEym1/o82+640aiWYlZNTF2nSzE+0aSgyeK1ZU+6Yg2Doo31UFzUyqZ5C9kWhAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFSi9zKIw4oYd2B57G23nk1hyqUFmYqVSvcMggqYzs+GlafGWOaJebE+op+iwSAyvEhWXYVqnXRAelxZmH6CqBWJlvxWXlOkX0osc4muDbDsiE+KceDx9dDaQlpz1fSUa6lUTTgkksbqn7SrJ7+2VxH9eaY1fS2U6FNnfgttNb3zXBIJMTNaMJuFdkPDnR92/JZMdoppuOKZ7WahGjB/YMXPIQaCSLa+deMA/5iCDUbSbmAeHtG4bf2jljy0/gQT9AwcbrhMk9Sc/G9HEnE1DoFD/ezJIhN/T/YeTuY7HKo0Ow9eje2ytjANWbnO0cawiMUfywU6EaIBPCU53X3vNlE=
+
+
+
+
+
+
+
+ MIICmzCCAYMCBgGUvMgDBzANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjUwMTMxMTQzMTUyWhcNMzUwMTMxMTQzMzMyWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMVXixE+OVEgPn2VmNpk/u1uQDVE25y66SpiIJp9UQwlg3zxQr0XdYZ0kF404KqiONhJuMuw6ixZg5ZCqWdNnT9Nn8X+Kpn4ICzE/kkNtpuuhdLcBCwu6YPJebAXMez+Hvucx7n4kauNpt5qHYGvmWK+Hvy2T+HBuXMWn0ez+u55jVx5m8suzp9i3afzG5U5Mn4kGR2QK0/p9+InGjJBAtWPFnib9LlHA2venV1r6N0kYEDibVKBkKYWSTmaYVAIHvsms9f5dBKWAPKCdaXq4+sUYJEym1/o82+640aiWYlZNTF2nSzE+0aSgyeK1ZU+6Yg2Doo31UFzUyqZ5C9kWhAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFSi9zKIw4oYd2B57G23nk1hyqUFmYqVSvcMggqYzs+GlafGWOaJebE+op+iwSAyvEhWXYVqnXRAelxZmH6CqBWJlvxWXlOkX0osc4muDbDsiE+KceDx9dDaQlpz1fSUa6lUTTgkksbqn7SrJ7+2VxH9eaY1fS2U6FNnfgttNb3zXBIJMTNaMJuFdkPDnR92/JZMdoppuOKZ7WahGjB/YMXPIQaCSLa+deMA/5iCDUbSbmAeHtG4bf2jljy0/gQT9AwcbrhMk9Sc/G9HEnE1DoFD/ezJIhN/T/YeTuY7HKo0Ow9eje2ytjANWbnO0cawiMUfywU6EaIBPCU53X3vNlE=
+
+
+
+
+
+urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
+urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName
+urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName
+urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos
+urn:oasis:names:tc:SAML:2.0:nameid-format:entity
+urn:oasis:names:tc:SAML:2.0:nameid-format:transient
+
+
diff --git a/sso_files/privatekey.pem b/sso_files/privatekey.pem
new file mode 100644
index 000000000..1ab4e2df9
--- /dev/null
+++ b/sso_files/privatekey.pem
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAvW7N6/4Oimez5bD2EhLeDvOKRWaTBxhpxnT1VCzYE9pkmnD2
+BGHNxvqn6xo2eu92JPZn0Xtgp70Gig+EqA5VxhMK0rrNY/3zas3bul7Fb4UEs41/
+IMFm/Q2kcaSPsBzKkqj+L3Cj/Lv0e2YI2+TZx8WebRNxjR/jLLqCnqOXr3JPHm/Z
+NI24eATZsLEV7va8AfWrdTeADApdTU3AURmLOhw3kSRfS7AzITqN6Qx0eFouovw5
+AKehqpjH9CBb1i6Y0DWTXSQbMz/kv3HNy/F92mbcdbAJhgyO+cuWNOsEVdvQuQiZ
+xm9zLUvI2Q6hKH/ZvL67cNdadp5+CDs6xdPPRwIDAQABAoIBAAQvdo1IR7n3IJpq
+loU/tXhPGTb/VTBK8ctYujLp6rxFjwN6i3T9VDaZQyyGn72HnOykJRcTysbp/kL+
+pMexyWNe+FY/mlojOkWZ1sj/Xw1fuwLclXp7y3K74m5AXIxflno3EaaqrnTfEj/H
+uVpibA1l6GIwk8mycqqCVHB83NUbf7g7I1fUfhfY24/LxaxkTZIFPBKiLV/CLTL8
+2czfpd1NwOLRMLgpLdMxx03DP4uaZfq7UNCBgDXnghWbGzZuzpZrKYNOpPYeNASh
+HMg4g1mvJCbcYpF5Q+u+4h/cgTDYNmSyX39ctkYxeOJotmH8M5eogBr1oCoBYroG
+TDMu9cECgYEA4Ror48HEbV2onQ44mnioZkraYKwhBsxuM8jyQJPShxuGK6PCgXua
+sQYooIVIR0RCwWZQ4hw2dwATVXRhB7nA3Eh2XwWCh5FedWDHIe5DvzYC0+aJJKTE
+AyrD2WsJMux6unZMo8qMkQSe7zkCFftWpRzvVKWzrKzyQ3zo/vnqdW0CgYEA129A
+f4gH5IBhSqmpBKBjNBEhSWT6L1v6DFET7ytXgR9cYLAykTLBAKAXJKGME/Kv5fci
+7vfVdbuLG1GR7JcfDw3NXDcSranOq6/K88NIsYY/pH4Vq0UGiBgU1+IrLdBhOMB6
+KJgi8p4cv3r+QpEfu7iLjci2OHXzhlEms8FzywMCgYEAxAKREzsH+x+iElhuy3uj
+T6eAbsuT2qKql2c0Iy1VFhbOhzOKzEtAUUOGnvhQDtaOtm+MoMdmWcr0CuZTE3IZ
+UPe8M1PN7JSVxunlnFMoJNk4LyJAa2sZz5QuhCTjFre6yqD2bW2TZze52Z8vhMqe
+ERqYAIJlaUgTkNa04EnociUCgYAQr5k7R3n1BMyET+e7aADHA5ykZqHKEUGouo7k
+s2KvqZIqGvuPq3KvbbbdK3YCBYYCNcYK5D8wQzpe/05iGMJbFCKXxdw4fzJ2scLy
+Zmm29kLvpqRfA5Wh7NuQbQATKFSfZKkRg9cRG5X2brxKw5rFm2GTtbwHW3tlJ9vr
+iExDqQKBgHnZUVLIU8u53L+wGe0hCf+RxS/kMXpe6gymvHPms2D2L9NYlWBee+7k
+QjPaBRMTxJivRfARDEgbYSatBVvXXq0njvdNpIIFjDGwr1ve18aD876yB6FIWY/V
+TeEKzppbu6I4Eyzyhg312AABxqEoiT8CI3R7e8KsM4D0vGaCdXRg
+-----END RSA PRIVATE KEY-----
diff --git a/sso_files/sp-keycloack-metadata.txt b/sso_files/sp-keycloack-metadata.txt
new file mode 100644
index 000000000..cc239d0be
--- /dev/null
+++ b/sso_files/sp-keycloack-metadata.txt
@@ -0,0 +1 @@
+nujwbKvmA_vsAlZfUh1FNTxFUzKiiUswe2c9Xrin314MIICmzCCAYMCBgGUvMgDBzANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjUwMTMxMTQzMTUyWhcNMzUwMTMxMTQzMzMyWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMVXixE+OVEgPn2VmNpk/u1uQDVE25y66SpiIJp9UQwlg3zxQr0XdYZ0kF404KqiONhJuMuw6ixZg5ZCqWdNnT9Nn8X+Kpn4ICzE/kkNtpuuhdLcBCwu6YPJebAXMez+Hvucx7n4kauNpt5qHYGvmWK+Hvy2T+HBuXMWn0ez+u55jVx5m8suzp9i3afzG5U5Mn4kGR2QK0/p9+InGjJBAtWPFnib9LlHA2venV1r6N0kYEDibVKBkKYWSTmaYVAIHvsms9f5dBKWAPKCdaXq4+sUYJEym1/o82+640aiWYlZNTF2nSzE+0aSgyeK1ZU+6Yg2Doo31UFzUyqZ5C9kWhAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFSi9zKIw4oYd2B57G23nk1hyqUFmYqVSvcMggqYzs+GlafGWOaJebE+op+iwSAyvEhWXYVqnXRAelxZmH6CqBWJlvxWXlOkX0osc4muDbDsiE+KceDx9dDaQlpz1fSUa6lUTTgkksbqn7SrJ7+2VxH9eaY1fS2U6FNnfgttNb3zXBIJMTNaMJuFdkPDnR92/JZMdoppuOKZ7WahGjB/YMXPIQaCSLa+deMA/5iCDUbSbmAeHtG4bf2jljy0/gQT9AwcbrhMk9Sc/G9HEnE1DoFD/ezJIhN/T/YeTuY7HKo0Ow9eje2ytjANWbnO0cawiMUfywU6EaIBPCU53X3vNlE=urn:oasis:names:tc:SAML:2.0:nameid-format:persistent
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index 6d648e1ba..aceef0d7f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,24 @@
# yarn lockfile v1
+"@authenio/samlify-node-xmllint@^1.0.1":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@authenio/samlify-node-xmllint/-/samlify-node-xmllint-1.0.2.tgz#2175cdc123257c569739b4ba3765b994a81a83dd"
+ integrity sha512-+NJroTmkuGWQLiHp5X+CL0DMO36cot8aw9A8d6luFFpylfNVHlKFjFfrp4YW7C3Zgvh7biIRmQE1Pnq/1jOG/Q==
+ dependencies:
+ node-xmllint "^1.0.0"
+
+"@authenio/xml-encryption@^0.11.3":
+ version "0.11.3"
+ resolved "https://registry.yarnpkg.com/@authenio/xml-encryption/-/xml-encryption-0.11.3.tgz#35379a8a87bbed3f34907a0359e8e1c30ce24bdd"
+ integrity sha512-zFLGBw/iNmLq5Udg+OJfsuERsTjcfvWtP6ZzL55EVwGu3bYsxuq1ARRNfNLHCXv4cNP49o8nLwpgA6VmXzRp/w==
+ dependencies:
+ async "^2.1.5"
+ ejs "^2.5.6"
+ node-forge "^0.7.4"
+ xmldom "~0.1.15"
+ xpath "0.0.27"
+
"@babel/cli@^7.11.6":
version "7.11.6"
resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.11.6.tgz#1fcbe61c2a6900c3539c06ee58901141f3558482"
@@ -46,6 +64,14 @@
dependencies:
"@babel/highlight" "^7.16.7"
+"@babel/code-frame@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7"
+ integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==
+ dependencies:
+ "@babel/highlight" "^7.25.7"
+ picocolors "^1.0.0"
+
"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c"
@@ -60,6 +86,11 @@
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e"
integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==
+"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.8.tgz#0376e83df5ab0eb0da18885c0140041f0747a402"
+ integrity sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==
+
"@babel/core@7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e"
@@ -152,6 +183,16 @@
jsesc "^2.5.1"
source-map "^0.5.0"
+"@babel/generator@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.7.tgz#de86acbeb975a3e11ee92dd52223e6b03b479c56"
+ integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==
+ dependencies:
+ "@babel/types" "^7.25.7"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^3.0.2"
+
"@babel/helper-annotate-as-pure@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3"
@@ -173,6 +214,13 @@
dependencies:
"@babel/types" "^7.22.5"
+"@babel/helper-annotate-as-pure@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz#63f02dbfa1f7cb75a9bdb832f300582f30bb8972"
+ integrity sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==
+ dependencies:
+ "@babel/types" "^7.25.7"
+
"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3"
@@ -210,6 +258,17 @@
browserslist "^4.17.5"
semver "^6.3.0"
+"@babel/helper-compilation-targets@^7.22.6":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz#11260ac3322dda0ef53edfae6e97b961449f5fa4"
+ integrity sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==
+ dependencies:
+ "@babel/compat-data" "^7.25.7"
+ "@babel/helper-validator-option" "^7.25.7"
+ browserslist "^4.24.0"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5":
version "7.10.5"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d"
@@ -235,6 +294,19 @@
"@babel/helper-replace-supers" "^7.16.5"
"@babel/helper-split-export-declaration" "^7.16.0"
+"@babel/helper-create-class-features-plugin@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz#5d65074c76cae75607421c00d6bd517fe1892d6b"
+ integrity sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-member-expression-to-functions" "^7.25.7"
+ "@babel/helper-optimise-call-expression" "^7.25.7"
+ "@babel/helper-replace-supers" "^7.25.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+ semver "^6.3.1"
+
"@babel/helper-create-regexp-features-plugin@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8"
@@ -275,6 +347,17 @@
resolve "^1.14.2"
semver "^6.1.2"
+"@babel/helper-define-polyfill-provider@^0.6.2":
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d"
+ integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.22.6"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ debug "^4.1.1"
+ lodash.debounce "^4.0.8"
+ resolve "^1.14.2"
+
"@babel/helper-environment-visitor@^7.16.5":
version "7.16.5"
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz#f6a7f38b3c6d8b07c88faea083c46c09ef5451b8"
@@ -386,6 +469,14 @@
dependencies:
"@babel/types" "^7.16.0"
+"@babel/helper-member-expression-to-functions@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz#541a33b071f0355a63a0fa4bdf9ac360116b8574"
+ integrity sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==
+ dependencies:
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
"@babel/helper-module-imports@^7.0.0":
version "7.16.7"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437"
@@ -414,6 +505,14 @@
dependencies:
"@babel/types" "^7.22.15"
+"@babel/helper-module-imports@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz#dba00d9523539152906ba49263e36d7261040472"
+ integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==
+ dependencies:
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359"
@@ -455,6 +554,13 @@
dependencies:
"@babel/types" "^7.16.0"
+"@babel/helper-optimise-call-expression@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz#1de1b99688e987af723eed44fa7fc0ee7b97d77a"
+ integrity sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==
+ dependencies:
+ "@babel/types" "^7.25.7"
+
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375"
@@ -470,6 +576,11 @@
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295"
integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==
+"@babel/helper-plugin-utils@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz#8ec5b21812d992e1ef88a9b068260537b6f0e36c"
+ integrity sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==
+
"@babel/helper-regex@^7.10.4":
version "7.10.5"
resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0"
@@ -517,6 +628,15 @@
"@babel/traverse" "^7.16.5"
"@babel/types" "^7.16.0"
+"@babel/helper-replace-supers@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz#38cfda3b6e990879c71d08d0fef9236b62bd75f5"
+ integrity sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.25.7"
+ "@babel/helper-optimise-call-expression" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+
"@babel/helper-simple-access@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461"
@@ -546,6 +666,14 @@
dependencies:
"@babel/types" "^7.16.0"
+"@babel/helper-skip-transparent-expression-wrappers@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz#382831c91038b1a6d32643f5f49505b8442cb87c"
+ integrity sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==
+ dependencies:
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f"
@@ -572,6 +700,11 @@
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
+"@babel/helper-string-parser@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54"
+ integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==
+
"@babel/helper-validator-identifier@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
@@ -592,11 +725,21 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+"@babel/helper-validator-identifier@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5"
+ integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==
+
"@babel/helper-validator-option@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3"
integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==
+"@babel/helper-validator-option@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz#97d1d684448228b30b506d90cace495d6f492729"
+ integrity sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==
+
"@babel/helper-wrap-function@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87"
@@ -662,6 +805,16 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
+"@babel/highlight@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5"
+ integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.25.7"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
@@ -677,6 +830,13 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.10.tgz#aba1b1cb9696a24a19f59c41af9cf17d1c716a88"
integrity sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==
+"@babel/parser@^7.25.7":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.8.tgz#f6aaf38e80c36129460c1657c0762db584c9d5e2"
+ integrity sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==
+ dependencies:
+ "@babel/types" "^7.25.8"
+
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2":
version "7.16.2"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183"
@@ -753,6 +913,15 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-decorators" "^7.8.3"
+"@babel/plugin-proposal-decorators@^7.10.5":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.7.tgz#dabfd82df5dff3a8fc61a434233bf8227c88402c"
+ integrity sha512-q1mqqqH0e1lhmsEQHV5U8OmdueBC2y0RFr2oUzZoFRtN3MvPmt2fsFRcNQAoGLTSNdHBFUYGnlgcRFhkBbKjPw==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/plugin-syntax-decorators" "^7.25.7"
+
"@babel/plugin-proposal-dynamic-import@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e"
@@ -997,6 +1166,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
+"@babel/plugin-syntax-decorators@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.7.tgz#cf26fdde4e750688e133c0e33ead2506377e88f7"
+ integrity sha512-oXduHo642ZhstLVYTe2z2GSJIruU0c/W3/Ghr6A5yGMsVrvdnxO1z+3pbTcT7f3/Clnt+1z8D/w1r1f1SHaCHw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
"@babel/plugin-syntax-decorators@^7.8.3":
version "7.16.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.5.tgz#8d397dee482716a79f1a22314f0b4770a5b67427"
@@ -1598,6 +1774,18 @@
resolve "^1.8.1"
semver "^5.5.1"
+"@babel/plugin-transform-runtime@^7.10.4":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz#435a4fab67273f00047dc806e05069c9c6344e12"
+ integrity sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg==
+ dependencies:
+ "@babel/helper-module-imports" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ babel-plugin-polyfill-corejs2 "^0.4.10"
+ babel-plugin-polyfill-corejs3 "^0.10.6"
+ babel-plugin-polyfill-regenerator "^0.6.1"
+ semver "^6.3.1"
+
"@babel/plugin-transform-shorthand-properties@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6"
@@ -2074,6 +2262,15 @@
"@babel/parser" "^7.16.7"
"@babel/types" "^7.16.7"
+"@babel/template@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.7.tgz#27f69ce382855d915b14ab0fe5fb4cbf88fa0769"
+ integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==
+ dependencies:
+ "@babel/code-frame" "^7.25.7"
+ "@babel/parser" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3"
@@ -2105,6 +2302,19 @@
debug "^4.1.0"
globals "^11.1.0"
+"@babel/traverse@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.7.tgz#83e367619be1cab8e4f2892ef30ba04c26a40fa8"
+ integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==
+ dependencies:
+ "@babel/code-frame" "^7.25.7"
+ "@babel/generator" "^7.25.7"
+ "@babel/parser" "^7.25.7"
+ "@babel/template" "^7.25.7"
+ "@babel/types" "^7.25.7"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
"@babel/traverse@^7.4.5":
version "7.16.10"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f"
@@ -2155,6 +2365,15 @@
"@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
+"@babel/types@^7.25.7", "@babel/types@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.8.tgz#5cf6037258e8a9bcad533f4979025140cb9993e1"
+ integrity sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==
+ dependencies:
+ "@babel/helper-string-parser" "^7.25.7"
+ "@babel/helper-validator-identifier" "^7.25.7"
+ to-fast-properties "^2.0.0"
+
"@cnakazawa/watch@^1.0.3":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
@@ -2424,6 +2643,13 @@
source-map "^0.6.0"
string-length "^2.0.0"
+"@jest/schemas@^29.6.3":
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03"
+ integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==
+ dependencies:
+ "@sinclair/typebox" "^0.27.8"
+
"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0":
version "24.9.0"
resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714"
@@ -2504,6 +2730,50 @@
"@types/yargs" "^15.0.0"
chalk "^4.0.0"
+"@jest/types@^29.6.3":
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59"
+ integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==
+ dependencies:
+ "@jest/schemas" "^29.6.3"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^17.0.8"
+ chalk "^4.0.0"
+
+"@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ version "0.3.25"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
"@lerna/add@3.21.0":
version "3.21.0"
resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.21.0.tgz#27007bde71cc7b0a2969ab3c2f0ae41578b4577b"
@@ -3334,6 +3604,58 @@
call-me-maybe "^1.0.1"
glob-to-regexp "^0.3.0"
+"@nestjs/common@^8.4.7":
+ version "8.4.7"
+ resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-8.4.7.tgz#fc4a575b797e230bb5a0bcab6da8b796aa88d605"
+ integrity sha512-m/YsbcBal+gA5CFrDpqXqsSfylo+DIQrkFY3qhVIltsYRfu8ct8J9pqsTO6OPf3mvqdOpFGrV5sBjoyAzOBvsw==
+ dependencies:
+ axios "0.27.2"
+ iterare "1.2.1"
+ tslib "2.4.0"
+ uuid "8.3.2"
+
+"@nestjs/config@^0.5.0":
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/@nestjs/config/-/config-0.5.0.tgz#ad1110d937ec26941b8fce5f575859046f8d7b4b"
+ integrity sha512-8vgakV722qNt3YBHbvhfwcNRLlwOv37pr5/1RUn5mYMmUh7JKobVNqHgTRWEuJK4BK3dCrhnjxPMPvHOCaA4LQ==
+ dependencies:
+ dotenv "8.2.0"
+ dotenv-expand "5.1.0"
+ lodash.get "4.4.2"
+ lodash.set "4.3.2"
+ uuid "8.1.0"
+
+"@nestjs/core@8.4.7":
+ version "8.4.7"
+ resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-8.4.7.tgz#fbec7fa744ac8749a4b966f759a6656c1cf43883"
+ integrity sha512-XB9uexHqzr2xkPo6QSiQWJJttyYYLmvQ5My64cFvWFi7Wk2NIus0/xUNInwX3kmFWB6pF1ab5Y2ZBvWdPwGBhw==
+ dependencies:
+ "@nuxtjs/opencollective" "0.3.2"
+ fast-safe-stringify "2.1.1"
+ iterare "1.2.1"
+ object-hash "3.0.0"
+ path-to-regexp "3.2.0"
+ tslib "2.4.0"
+ uuid "8.3.2"
+
+"@nestjs/platform-express@7.6.18":
+ version "7.6.18"
+ resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-7.6.18.tgz#cdf442dfd85948fc7b67bbc4007dddef83cdd4b9"
+ integrity sha512-Dty2bBhsW7EInMRPS1pkXKJ3GBBusEj6fnEpb0UfkaT3E7asay9c64kCmZE+8hU430qQjY+fhBb1RNWWPnUiwQ==
+ dependencies:
+ body-parser "1.19.0"
+ cors "2.8.5"
+ express "4.17.1"
+ multer "1.4.2"
+ tslib "2.2.0"
+
+"@nestjs/testing@^8.4.7":
+ version "8.4.7"
+ resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-8.4.7.tgz#fe4f356c0e081e25fe8c899a65e91dd88947fd13"
+ integrity sha512-aedpeJFicTBeiTCvJWUG45WMMS53f5eu8t2fXsfjsU1t+WdDJqYcZyrlCzA4dL1B7MfbqaTURdvuVVHTmJO8ag==
+ dependencies:
+ tslib "2.4.0"
+
"@nodelib/fs.scandir@2.1.3":
version "2.1.3"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
@@ -3376,6 +3698,15 @@
mkdirp "^1.0.4"
rimraf "^3.0.2"
+"@nuxtjs/opencollective@0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz#620ce1044f7ac77185e825e1936115bb38e2681c"
+ integrity sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==
+ dependencies:
+ chalk "^4.1.0"
+ consola "^2.15.0"
+ node-fetch "^2.6.1"
+
"@octokit/auth-token@^2.4.0":
version "2.4.2"
resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.2.tgz#10d0ae979b100fa6b72fa0e8e63e27e6d0dbff8a"
@@ -3507,6 +3838,11 @@
resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df"
integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==
+"@sinclair/typebox@^0.27.8":
+ version "0.27.8"
+ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e"
+ integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==
+
"@sindresorhus/is@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
@@ -3785,6 +4121,13 @@
"@types/qs" "*"
"@types/range-parser" "*"
+"@types/express-session@^1.18.0":
+ version "1.18.0"
+ resolved "https://registry.yarnpkg.com/@types/express-session/-/express-session-1.18.0.tgz#7c6f25c3604b28d6bc08a2e3929997bbc7672fa2"
+ integrity sha512-27JdDRgor6PoYlURY+Y5kCakqp5ulC0kmf7y+QwaY+hv9jEFuQOThgkjyA53RP3jmKuBsH5GR6qEfFmvb8mwOA==
+ dependencies:
+ "@types/express" "*"
+
"@types/express@*", "@types/express@^4.17.8":
version "4.17.8"
resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.8.tgz#3df4293293317e61c60137d273a2e96cd8d5f27a"
@@ -4062,6 +4405,13 @@
dependencies:
"@types/yargs-parser" "*"
+"@types/yargs@^17.0.8":
+ version "17.0.33"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d"
+ integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==
+ dependencies:
+ "@types/yargs-parser" "*"
+
"@typescript-eslint/eslint-plugin@3.9.1", "@typescript-eslint/eslint-plugin@^2.10.0", "@typescript-eslint/eslint-plugin@^4.4.1":
version "4.4.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.4.1.tgz#b8acea0373bd2a388ac47df44652f00bf8b368f5"
@@ -4278,6 +4628,11 @@
"@webassemblyjs/wast-parser" "1.8.5"
"@xtuc/long" "4.2.2"
+"@xmldom/xmldom@^0.7.0":
+ version "0.7.13"
+ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3"
+ integrity sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==
+
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
@@ -4560,6 +4915,11 @@ anymatch@~3.1.2:
normalize-path "^3.0.0"
picomatch "^2.0.4"
+append-field@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56"
+ integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==
+
aproba@^1.0.3, aproba@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
@@ -4766,6 +5126,13 @@ asn1.js@^5.2.0:
minimalistic-assert "^1.0.0"
safer-buffer "^2.1.0"
+asn1@^0.2.4:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
+ integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
+ dependencies:
+ safer-buffer "~2.1.0"
+
asn1@~0.2.3:
version "0.2.4"
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
@@ -4823,6 +5190,13 @@ async@^1.3.0:
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+async@^2.1.5:
+ version "2.6.4"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
+ integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==
+ dependencies:
+ lodash "^4.17.14"
+
async@^2.6.2:
version "2.6.3"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
@@ -4830,6 +5204,11 @@ async@^2.6.2:
dependencies:
lodash "^4.17.14"
+async@^3.2.3:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce"
+ integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==
+
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@@ -4875,6 +5254,14 @@ axios@*:
dependencies:
follow-redirects "^1.10.0"
+axios@0.27.2:
+ version "0.27.2"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
+ integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
+ dependencies:
+ follow-redirects "^1.14.9"
+ form-data "^4.0.0"
+
axios@^0.24.0:
version "0.24.0"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6"
@@ -4986,6 +5373,23 @@ babel-plugin-polyfill-corejs2@^0.3.0:
"@babel/helper-define-polyfill-provider" "^0.3.0"
semver "^6.1.1"
+babel-plugin-polyfill-corejs2@^0.4.10:
+ version "0.4.11"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33"
+ integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==
+ dependencies:
+ "@babel/compat-data" "^7.22.6"
+ "@babel/helper-define-polyfill-provider" "^0.6.2"
+ semver "^6.3.1"
+
+babel-plugin-polyfill-corejs3@^0.10.6:
+ version "0.10.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7"
+ integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.6.2"
+ core-js-compat "^3.38.0"
+
babel-plugin-polyfill-corejs3@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087"
@@ -5001,6 +5405,13 @@ babel-plugin-polyfill-regenerator@^0.3.0:
dependencies:
"@babel/helper-define-polyfill-provider" "^0.3.0"
+babel-plugin-polyfill-regenerator@^0.6.1:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e"
+ integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.6.2"
+
"babel-plugin-styled-components@>= 1":
version "2.1.4"
resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz#9a1f37c7f32ef927b4b008b529feb4a2c82b1092"
@@ -5244,6 +5655,13 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0"
concat-map "0.0.1"
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
braces@^2.3.1, braces@^2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
@@ -5376,6 +5794,23 @@ browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.9.1:
node-releases "^2.0.1"
picocolors "^1.0.0"
+browserslist@^4.23.3, browserslist@^4.24.0:
+ version "4.24.0"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4"
+ integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==
+ dependencies:
+ caniuse-lite "^1.0.30001663"
+ electron-to-chromium "^1.5.28"
+ node-releases "^2.0.18"
+ update-browserslist-db "^1.1.0"
+
+bs-logger@^0.2.6:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
+ integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==
+ dependencies:
+ fast-json-stable-stringify "2.x"
+
bser@2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
@@ -5432,6 +5867,14 @@ builtins@^1.0.3:
resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og=
+busboy@^0.2.11:
+ version "0.2.14"
+ resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
+ integrity sha512-InWFDomvlkEj+xWLBfU3AvnbVYqeTWmQopiW0tWWEy5yehYm2YkGEc59sUmw/4ty5Zj/b0WHGs1LgecuBSBGrg==
+ dependencies:
+ dicer "0.2.5"
+ readable-stream "1.1.x"
+
byline@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
@@ -5665,6 +6108,11 @@ caniuse-lite@^1.0.30001286:
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz#3e9debad420419618cfdf52dc9b6572b28a8fff6"
integrity sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==
+caniuse-lite@^1.0.30001663:
+ version "1.0.30001669"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz#fda8f1d29a8bfdc42de0c170d7f34a9cf19ed7a3"
+ integrity sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==
+
capture-exit@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4"
@@ -5718,6 +6166,14 @@ chalk@^4.0.0, chalk@^4.1.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+chalk@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
chardet@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
@@ -5794,6 +6250,11 @@ ci-info@^2.0.0:
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+ci-info@^3.2.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4"
+ integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
+
cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
@@ -5993,7 +6454,7 @@ columnify@^1.5.4:
strip-ansi "^3.0.0"
wcwidth "^1.0.0"
-combined-stream@^1.0.6, combined-stream@~1.0.6:
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
@@ -6072,7 +6533,7 @@ concat-map@0.0.1:
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
-concat-stream@^1.5.0:
+concat-stream@^1.5.0, concat-stream@^1.5.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
@@ -6132,6 +6593,11 @@ connect@^3.6.2:
parseurl "~1.3.3"
utils-merge "1.0.1"
+consola@^2.15.0:
+ version "2.15.3"
+ resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550"
+ integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==
+
console-browserify@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
@@ -6264,11 +6730,21 @@ cookie-signature@1.0.6:
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+cookie-signature@1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454"
+ integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==
+
cookie@0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+cookie@0.7.2:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7"
+ integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==
+
cookiejar@^2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
@@ -6299,6 +6775,13 @@ core-js-compat@^3.18.0, core-js-compat@^3.19.1:
browserslist "^4.18.1"
semver "7.0.0"
+core-js-compat@^3.38.0:
+ version "3.38.1"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09"
+ integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==
+ dependencies:
+ browserslist "^4.23.3"
+
core-js-compat@^3.6.2:
version "3.6.5"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c"
@@ -6337,7 +6820,7 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-cors@^2.8.5:
+cors@2.8.5, cors@^2.8.5:
version "2.8.5"
resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
@@ -6923,6 +7406,11 @@ define-property@^2.0.2:
is-descriptor "^1.0.2"
isobject "^3.0.1"
+deflate-js@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/deflate-js/-/deflate-js-0.2.3.tgz#f85abb58ebc5151a306147473d57c3e4f7e4426b"
+ integrity sha512-r5KgHJ/yTiWQs23nVeQz5dSL/kmW0MBszsssNyEqDCjjFDj4XG/c6QUN/I0JtY3ZHwwcaNBtGE8s+oV33acTfQ==
+
del@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4"
@@ -7010,6 +7498,14 @@ dezalgo@^1.0.0:
asap "^2.0.0"
wrappy "1"
+dicer@0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f"
+ integrity sha512-FDvbtnq7dzlPz0wyYlOExifDEZcu8h+rErEXgfxqmLfRfC/kJidEFh4+effJRO3P0xmfqyPbSMG0LveNRfTKVg==
+ dependencies:
+ readable-stream "1.1.x"
+ streamsearch "0.1.2"
+
diff-sequences@^24.9.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5"
@@ -7248,6 +7744,18 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+ejs@^2.5.6:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
+ integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
+
+ejs@^3.1.10:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b"
+ integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==
+ dependencies:
+ jake "^10.8.5"
+
electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.562:
version "1.3.564"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.564.tgz#e9c319ae437b3eb8bbf3e3bae4bead5a21945961"
@@ -7258,6 +7766,11 @@ electron-to-chromium@^1.4.17:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.17.tgz#16ec40f61005582d5d41fac08400a254dccfb85f"
integrity sha512-zhk1MravPtq/KBhmGB7TLBILmXTgRG9TFSI3qS3DbgyfHzIl72iiTE37r/BHIbPCJJlWIo5rySyxiH4vWhu2ZA==
+electron-to-chromium@^1.5.28:
+ version "1.5.41"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz#eae1ba6c49a1a61d84cf8263351d3513b2bcc534"
+ integrity sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==
+
elliptic@^6.5.3:
version "6.5.3"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6"
@@ -7488,6 +8001,11 @@ escalade@^3.1.1:
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+escalade@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
escape-goat@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
@@ -7944,7 +8462,21 @@ expect@^24.9.0:
jest-message-util "^24.9.0"
jest-regex-util "^24.9.0"
-express@^4.17.1:
+express-session@^1.18.0:
+ version "1.18.1"
+ resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.18.1.tgz#88d0bbd41878882840f24ec6227493fcb167e8d5"
+ integrity sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA==
+ dependencies:
+ cookie "0.7.2"
+ cookie-signature "1.0.7"
+ debug "2.6.9"
+ depd "~2.0.0"
+ on-headers "~1.0.2"
+ parseurl "~1.3.3"
+ safe-buffer "5.2.1"
+ uid-safe "~2.1.5"
+
+express@4.17.1, express@^4.17.1:
version "4.17.1"
resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
@@ -8074,7 +8606,7 @@ fast-glob@^3.1.1:
micromatch "^4.0.2"
picomatch "^2.2.1"
-fast-json-stable-stringify@^2.0.0:
+fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
@@ -8084,6 +8616,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+fast-safe-stringify@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884"
+ integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==
+
fast-url-parser@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d"
@@ -8170,6 +8707,13 @@ file-uri-to-path@1.0.0:
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+filelist@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5"
+ integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==
+ dependencies:
+ minimatch "^5.0.1"
+
filesize@6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f"
@@ -8309,6 +8853,11 @@ follow-redirects@^1.14.4:
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381"
integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==
+follow-redirects@^1.14.9:
+ version "1.15.9"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1"
+ integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
+
for-in@^0.1.3:
version "0.1.8"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
@@ -8354,6 +8903,15 @@ form-data@^2.3.1:
combined-stream "^1.0.6"
mime-types "^2.1.12"
+form-data@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48"
+ integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
form-data@~2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
@@ -8824,6 +9382,11 @@ graceful-fs@^4.2.6:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
+graceful-fs@^4.2.9:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
growly@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
@@ -10083,6 +10646,21 @@ istanbul-reports@^2.2.6:
dependencies:
html-escaper "^2.0.0"
+iterare@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042"
+ integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==
+
+jake@^10.8.5:
+ version "10.9.2"
+ resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f"
+ integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==
+ dependencies:
+ async "^3.2.3"
+ chalk "^4.0.2"
+ filelist "^1.0.4"
+ minimatch "^3.1.2"
+
jest-changed-files@^24.9.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039"
@@ -10423,6 +11001,18 @@ jest-util@^24.0.0, jest-util@^24.9.0:
slash "^2.0.0"
source-map "^0.6.0"
+jest-util@^29.0.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc"
+ integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ graceful-fs "^4.2.9"
+ picomatch "^2.2.3"
+
jest-validate@^24.9.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab"
@@ -10597,6 +11187,11 @@ jsesc@^2.5.1:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+jsesc@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e"
+ integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==
+
jsesc@~0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
@@ -10663,6 +11258,11 @@ json5@^2.1.2:
dependencies:
minimist "^1.2.5"
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
jsonfile@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
@@ -11134,7 +11734,7 @@ lodash.debounce@^4.0.8:
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
-lodash.get@^4.4.2:
+lodash.get@4.4.2, lodash.get@^4.4.2:
version "4.4.2"
resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
@@ -11215,7 +11815,7 @@ lodash.once@^4.0.0:
resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
-lodash.set@^4.3.2:
+lodash.set@4.3.2, lodash.set@^4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23"
integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=
@@ -11340,6 +11940,11 @@ make-dir@^3.0.0, make-dir@^3.0.2:
dependencies:
semver "^6.0.0"
+make-error@^1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
make-fetch-happen@^5.0.0:
version "5.0.2"
resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd"
@@ -11681,6 +12286,13 @@ minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
+minimatch@^5.0.1:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
+ integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
+ dependencies:
+ brace-expansion "^2.0.1"
+
minimist-options@4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
@@ -11899,6 +12511,20 @@ ms@2.1.2, ms@^2.0.0, ms@^2.1.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+multer@1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.2.tgz#2f1f4d12dbaeeba74cb37e623f234bf4d3d2057a"
+ integrity sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==
+ dependencies:
+ append-field "^1.0.0"
+ busboy "^0.2.11"
+ concat-stream "^1.5.2"
+ mkdirp "^0.5.1"
+ object-assign "^4.1.1"
+ on-finished "^2.3.0"
+ type-is "^1.6.4"
+ xtend "^4.0.0"
+
multicast-dns-service-types@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
@@ -12036,11 +12662,28 @@ node-fetch@^2.3.0, node-fetch@^2.5.0:
dependencies:
whatwg-url "^5.0.0"
+node-fetch@^2.6.1:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
+ integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
+ dependencies:
+ whatwg-url "^5.0.0"
+
node-forge@0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579"
integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==
+node-forge@^0.7.4:
+ version "0.7.6"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac"
+ integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==
+
+node-forge@^0.8.5:
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.8.5.tgz#57906f07614dc72762c84cef442f427c0e1b86ee"
+ integrity sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==
+
node-gyp@^5.0.2:
version "5.1.1"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e"
@@ -12134,6 +12777,23 @@ node-releases@^2.0.1:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5"
integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==
+node-releases@^2.0.18:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
+ integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
+
+node-rsa@^1.0.5:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/node-rsa/-/node-rsa-1.1.1.tgz#efd9ad382097782f506153398496f79e4464434d"
+ integrity sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==
+ dependencies:
+ asn1 "^0.2.4"
+
+node-xmllint@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/node-xmllint/-/node-xmllint-1.0.0.tgz#f680457eb0166a3d06996f1242d34d47000fe55b"
+ integrity sha512-71UV2HRUP+djvHpdyatiuv+Y1o8hI4ZI7bMfuuoACMLR1JJCErM4WXAclNeHd6BgHXkqeqnnAk3wpDkSQWmFXw==
+
nodemon@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9"
@@ -12334,6 +12994,11 @@ object-copy@^0.1.0:
define-property "^0.2.5"
kind-of "^3.0.3"
+object-hash@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
+ integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
+
object-hash@^2.0.1:
version "2.2.0"
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5"
@@ -12464,6 +13129,13 @@ on-finished@^2.2.0, on-finished@~2.3.0:
dependencies:
ee-first "1.1.1"
+on-finished@^2.3.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
on-headers@^1.0.0, on-headers@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
@@ -12884,6 +13556,11 @@ path-to-regexp@0.1.7:
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+path-to-regexp@3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.2.0.tgz#fa7877ecbc495c601907562222453c43cc204a5f"
+ integrity sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==
+
path-to-regexp@^1.7.0, path-to-regexp@^1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a"
@@ -12957,12 +13634,17 @@ picocolors@^1.0.0:
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+picocolors@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1:
version "2.2.2"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
-picomatch@^2.3.1:
+picomatch@^2.2.3, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
@@ -14046,6 +14728,11 @@ raf@^3.4.1:
dependencies:
performance-now "^2.1.0"
+random-bytes@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b"
+ integrity sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==
+
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@@ -14392,6 +15079,16 @@ read@1, read@~1.0.1:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
+readable-stream@1.1.x:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
@@ -14472,6 +15169,11 @@ redent@^3.0.0:
indent-string "^4.0.0"
strip-indent "^3.0.0"
+reflect-metadata@^0.2.1:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b"
+ integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==
+
regenerate-unicode-properties@^8.2.0:
version "8.2.0"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
@@ -14931,7 +15633,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
+safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -14948,6 +15650,22 @@ safe-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+samlify@2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/samlify/-/samlify-2.6.0.tgz#50010ae27b808e500c88c705763ecfd05a6ab519"
+ integrity sha512-/g1ELo/vF4Apw2kq4akQme5eaHyFmAXXZgZFgPjfhHoJ3I0W1MncbknpKNRbVQ7z2hRJd3x3Ngjw3k5RCSFQjA==
+ dependencies:
+ "@authenio/xml-encryption" "^0.11.3"
+ camelcase "^5.3.1"
+ deflate-js "^0.2.3"
+ node-forge "^0.8.5"
+ node-rsa "^1.0.5"
+ uuid "^3.3.2"
+ xml "^1.0.1"
+ xml-crypto "^1.4.0"
+ xmldom "^0.1.27"
+ xpath "^0.0.27"
+
sane@^4.0.3:
version "4.1.0"
resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded"
@@ -15080,6 +15798,11 @@ semver@7.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
semver@^7.2.1, semver@^7.3.2:
version "7.3.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
@@ -15097,6 +15820,11 @@ semver@^7.5.3:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13"
integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
+semver@^7.6.3:
+ version "7.6.3"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
+ integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
+
send@0.17.1:
version "0.17.1"
resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
@@ -15636,6 +16364,11 @@ stream-shift@^1.0.0:
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
+streamsearch@0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
+ integrity sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA==
+
strict-uri-encode@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
@@ -15764,6 +16497,11 @@ string_decoder@^1.0.0, string_decoder@^1.1.1:
dependencies:
safe-buffer "~5.2.0"
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==
+
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
@@ -16356,6 +17094,21 @@ trim-off-newlines@^1.0.0:
resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3"
integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM=
+ts-jest@^29.2.5:
+ version "29.2.5"
+ resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63"
+ integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==
+ dependencies:
+ bs-logger "^0.2.6"
+ ejs "^3.1.10"
+ fast-json-stable-stringify "^2.1.0"
+ jest-util "^29.0.0"
+ json5 "^2.2.3"
+ lodash.memoize "^4.1.2"
+ make-error "^1.3.6"
+ semver "^7.6.3"
+ yargs-parser "^21.1.1"
+
ts-pnp@1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a"
@@ -16381,6 +17134,16 @@ tsconfig-paths@^3.9.0:
minimist "^1.2.0"
strip-bom "^3.0.0"
+tslib@2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
+ integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
+
+tslib@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
+ integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
+
tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0:
version "1.13.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
@@ -16449,7 +17212,7 @@ type-fest@^0.8.1:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
-type-is@~1.6.17, type-is@~1.6.18:
+type-is@^1.6.4, type-is@~1.6.17, type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
@@ -16499,6 +17262,13 @@ uid-number@0.0.6:
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=
+uid-safe@~2.1.5:
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a"
+ integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==
+ dependencies:
+ random-bytes "~1.0.0"
+
umask@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
@@ -16646,6 +17416,14 @@ upath@^1.1.1, upath@^1.2.0:
resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+update-browserslist-db@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5"
+ integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==
+ dependencies:
+ escalade "^3.2.0"
+ picocolors "^1.1.0"
+
update-notifier@^4.1.1:
version "4.1.3"
resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3"
@@ -16773,6 +17551,16 @@ utils-merge@1.0.1:
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+uuid@8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d"
+ integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==
+
+uuid@8.3.2:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
uuid@^3.0.1, uuid@^3.3.2, uuid@^3.4.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
@@ -17397,16 +18185,44 @@ xdg-basedir@^4.0.0:
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
+xml-crypto@^1.4.0:
+ version "1.5.6"
+ resolved "https://registry.yarnpkg.com/xml-crypto/-/xml-crypto-1.5.6.tgz#e8122f0fe8489d7f444a32a45388798684aa7315"
+ integrity sha512-LCLvc59uItSD3QZprq+XaJWXb0umi3g8Ks3pZis1qZ9OYzQuHb4U//u5+vHr4gjn2KFAAAzFlja6OnS2LG/gRw==
+ dependencies:
+ "@xmldom/xmldom" "^0.7.0"
+ xpath "0.0.32"
+
xml-name-validator@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+xml@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5"
+ integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==
+
xmlchars@^2.1.1:
version "2.2.0"
resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+xmldom@^0.1.27, xmldom@~0.1.15:
+ version "0.1.31"
+ resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff"
+ integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==
+
+xpath@0.0.27, xpath@^0.0.27:
+ version "0.0.27"
+ resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.27.tgz#dd3421fbdcc5646ac32c48531b4d7e9d0c2cfa92"
+ integrity sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==
+
+xpath@0.0.32:
+ version "0.0.32"
+ resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.32.tgz#1b73d3351af736e17ec078d6da4b8175405c48af"
+ integrity sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==
+
xregexp@^4.3.0:
version "4.4.1"
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.4.1.tgz#c84a88fa79e9ab18ca543959712094492185fe65"
@@ -17473,6 +18289,11 @@ yargs-parser@^20.2.2:
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
yargs@16.2.0:
version "16.2.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"