import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { NextPage } from 'next'; import { useRouter } from 'next/router'; import type { SAMLTrace } from '@boxyhq/saml-jackson'; import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; import { materialOceanic } from 'react-syntax-highlighter/dist/cjs/styles/prism'; import useSWR from 'swr'; import { ApiSuccess, ApiError } from 'types'; import { fetcher } from '@lib/ui/utils'; import { errorToast } from '@components/Toaster'; import Loading from '@components/Loading'; import { useTranslation } from 'next-i18next'; import { LinkBack } from '@components/LinkBack'; import { Badge } from 'react-daisyui'; import { CopyToClipboardButton } from '@components/ClipboardButton'; const DescriptionListItem = ({ term, value }: { term: string; value: string | JSX.Element }) => (
{term}
{value}
); const SAMLTraceInspector: NextPage = () => { const { t } = useTranslation('common'); const router = useRouter(); const { traceId } = router.query as { traceId: string }; const { data, error, isLoading } = useSWR, ApiError>( `/api/admin/saml-tracer/${traceId}`, fetcher, { revalidateOnFocus: false, } ); if (error) { errorToast(error.message); return null; } if (isLoading) { return ; } if (!data) return null; const trace = data.data; const assertionType = trace.context.samlResponse ? 'Response' : 'Request'; return ( <> router.back()} />

{t('trace_details')}

{t('trace_id')} {traceId} {t('assertion_type')}: {assertionType} {t('sp_protocol')}: {trace.context.requestedOIDCFlow ? 'OIDC' : trace.context.isSAMLFederated ? t('saml_federation') : trace.context.isIdPFlow ? t('idp_login') : 'OAuth 2.0'}

{typeof trace.timestamp === 'number' && ( )} {trace.context.tenant && } {trace.context.product && ( )} {trace.context.relayState && ( )} {trace.context.redirectUri && ( )} {trace.context.clientID && ( )} {trace.context.issuer && } {trace.context.acsUrl && } {trace.context.entityId && ( )} {trace.context.providerName && ( )} {assertionType === 'Response' && trace.context.samlResponse && ( {trace.context.samlResponse} } /> )} {assertionType === 'Request' && trace.context.samlRequest && ( {trace.context.samlRequest} } /> )} {typeof trace.context.profile === 'object' && trace.context.profile && ( {JSON.stringify(trace.context.profile)} } /> )}
); }; export default SAMLTraceInspector; export async function getServerSideProps({ locale }) { return { props: { ...(await serverSideTranslations(locale, ['common'])), }, }; }