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'])),
},
};
}