diff --git a/apps/console/src/components/OrganizationErrorBoundary.tsx b/apps/console/src/components/OrganizationErrorBoundary.tsx index 70f7bfe97..4adb762ba 100644 --- a/apps/console/src/components/OrganizationErrorBoundary.tsx +++ b/apps/console/src/components/OrganizationErrorBoundary.tsx @@ -15,7 +15,7 @@ export function OrganizationErrorBoundary() { } if (error instanceof AssumptionRequiredError) { - return ; + return ; } return ; diff --git a/apps/console/src/pages/iam/auth/AuthLayout.tsx b/apps/console/src/pages/iam/auth/AuthLayout.tsx index 84516d3f1..a1d3a2790 100644 --- a/apps/console/src/pages/iam/auth/AuthLayout.tsx +++ b/apps/console/src/pages/iam/auth/AuthLayout.tsx @@ -1,9 +1,12 @@ import { Card, Logo } from "@probo/ui"; +import type { PropsWithChildren } from "react"; import { Outlet } from "react-router"; import { IAMRelayProvider } from "#/providers/IAMRelayProvider"; -export default function AuthLayout() { +export default function AuthLayout(props: PropsWithChildren) { + const { children } = props; + return (
@@ -12,7 +15,7 @@ export default function AuthLayout() {
- + {children ?? }
diff --git a/apps/console/src/pages/iam/organizations/AssumePage.tsx b/apps/console/src/pages/iam/organizations/AssumePage.tsx new file mode 100644 index 000000000..5da6f9909 --- /dev/null +++ b/apps/console/src/pages/iam/organizations/AssumePage.tsx @@ -0,0 +1,35 @@ +import { useTranslate } from "@probo/i18n"; +import { useLocation, useNavigate } from "react-router"; + +import { useAssume } from "#/hooks/iam/useAssume"; + +import AuthLayout from "../auth/AuthLayout"; + +interface State { + from: string; +} + +export default function AssumePage() { + const navigate = useNavigate(); + const location = useLocation(); + const state = location.state as State; + + const { __ } = useTranslate(); + + useAssume({ + onSuccess: () => void navigate(state.from), + }); + + return ( + +
+
+

{__("Sign in Redirection")}

+

+ {__("Redirecting you to your authentication URL…")} +

+
+
+
+ ); +} diff --git a/apps/console/src/routes.tsx b/apps/console/src/routes.tsx index 51589f5cb..367bfe9ff 100644 --- a/apps/console/src/routes.tsx +++ b/apps/console/src/routes.tsx @@ -120,119 +120,127 @@ const routes = [ () => import("./pages/DocumentSigningRequestsPage"), ), }, - { - path: "/organizations/:organizationId/employee", - Component: lazy( - () => import("./pages/organizations/employee/EmployeeLayoutLoader"), - ), - ErrorBoundary: OrganizationErrorBoundary, - children: [ - { - index: true, - Component: lazy( - () => - import("./pages/organizations/employee/EmployeeDocumentsPageLoader"), - ), - }, - { - path: ":documentId", - Component: lazy( - () => - import("./pages/organizations/employee/EmployeeDocumentSignaturePageLoader"), - ), - }, - ], - }, { path: "/organizations/:organizationId", - Component: lazy( - () => import("./pages/iam/organizations/ViewerMembershipLayoutLoader"), - ), - ErrorBoundary: OrganizationErrorBoundary, children: [ { - path: "", - Component: () => { - const { role } = use(CurrentUser); - switch (role) { - case Role.EMPLOYEE: - return ; - case Role.AUDITOR: - return ; - default: - return ; - } - }, + path: "assume", + Component: lazy(() => import("./pages/iam/organizations/AssumePage")), }, { - path: "settings", - Fallback: PageSkeleton, + path: "employee", Component: lazy( - () => import("./pages/iam/organizations/settings/SettingsLayout"), + () => import("./pages/organizations/employee/EmployeeLayoutLoader"), ), + ErrorBoundary: OrganizationErrorBoundary, children: [ { index: true, - loader: () => { - // eslint-disable-next-line - throw redirect("general"); - }, - }, - { - path: "general", Component: lazy( () => - import("./pages/iam/organizations/settings/GeneralSettingsPageLoader"), + import("./pages/organizations/employee/EmployeeDocumentsPageLoader"), ), }, { - path: "members", + path: ":documentId", Component: lazy( () => - import("./pages/iam/organizations/settings/MembersPageLoader"), - ), - }, - { - path: "saml-sso", - Component: lazy( - () => - import("./pages/iam/organizations/settings/SAMLSettingsPageLoader"), - ), - }, - { - path: "scim", - Component: lazy( - () => - import("./pages/iam/organizations/settings/SCIMSettingsPageLoader"), + import("./pages/organizations/employee/EmployeeDocumentSignaturePageLoader"), ), }, ], }, - ...riskRoutes, - ...measureRoutes, - ...documentsRoutes, - ...peopleRoutes, - ...vendorRoutes, - ...frameworkRoutes, - ...taskRoutes, - ...assetRoutes, - ...dataRoutes, - ...auditRoutes, - ...meetingsRoutes, - ...nonconformityRoutes, - ...obligationRoutes, - ...continualImprovementRoutes, - ...rightsRequestRoutes, - ...processingActivityRoutes, - ...statesOfApplicabilityRoutes, - ...compliancePageRoutes, - ...snapshotsRoutes, { - path: "*", - Component: PageError, + Component: lazy( + () => import("./pages/iam/organizations/ViewerMembershipLayoutLoader"), + ), + ErrorBoundary: OrganizationErrorBoundary, + children: [ + { + Component: () => { + const { role } = use(CurrentUser); + switch (role) { + case Role.EMPLOYEE: + return ; + case Role.AUDITOR: + return ; + default: + return ; + } + }, + }, + { + path: "settings", + Fallback: PageSkeleton, + Component: lazy( + () => import("./pages/iam/organizations/settings/SettingsLayout"), + ), + children: [ + { + index: true, + loader: () => { + // eslint-disable-next-line + throw redirect("general"); + }, + }, + { + path: "general", + Component: lazy( + () => + import("./pages/iam/organizations/settings/GeneralSettingsPageLoader"), + ), + }, + { + path: "members", + Component: lazy( + () => + import("./pages/iam/organizations/settings/MembersPageLoader"), + ), + }, + { + path: "saml-sso", + Component: lazy( + () => + import("./pages/iam/organizations/settings/SAMLSettingsPageLoader"), + ), + }, + { + path: "scim", + Component: lazy( + () => + import("./pages/iam/organizations/settings/SCIMSettingsPageLoader"), + ), + }, + ], + }, + ...riskRoutes, + ...measureRoutes, + ...documentsRoutes, + ...peopleRoutes, + ...vendorRoutes, + ...frameworkRoutes, + ...taskRoutes, + ...assetRoutes, + ...dataRoutes, + ...auditRoutes, + ...meetingsRoutes, + ...nonconformityRoutes, + ...obligationRoutes, + ...continualImprovementRoutes, + ...rightsRequestRoutes, + ...processingActivityRoutes, + ...statesOfApplicabilityRoutes, + ...compliancePageRoutes, + ...snapshotsRoutes, + { + path: "*", + Component: PageError, + }, + ], }, ], }, + // Fallback URL to the NotFound Page { path: "*", diff --git a/pkg/server/api/connect/v1/v1_resolver.go b/pkg/server/api/connect/v1/v1_resolver.go index 24a90c35a..f0ae97ea7 100644 --- a/pkg/server/api/connect/v1/v1_resolver.go +++ b/pkg/server/api/connect/v1/v1_resolver.go @@ -410,13 +410,9 @@ func (r *mutationResolver) SignIn(ctx context.Context, input types.SignInInput) var err error session, _, err = r.iam.SessionService.OpenPasswordChildSessionForOrganization(ctx, session.ID, *input.OrganizationID) if err != nil { - var errSessionExpired *iam.ErrSessionExpired var errMembershipNotFound *iam.ErrMembershipNotFound var errMembershipInactive *iam.ErrMembershipInactive - if errors.As(err, errSessionExpired) { - return nil, gqlutils.Unauthenticated(ctx, err) - } if errors.As(err, errMembershipNotFound) || errors.As(err, errMembershipInactive) { return nil, gqlutils.Forbidden(ctx, err) }