security.page.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import { useEffect, useMemo } from 'react';
  2. import type {
  3. NextPage, GetServerSideProps, GetServerSidePropsContext,
  4. } from 'next';
  5. import { useTranslation } from 'next-i18next';
  6. import dynamic from 'next/dynamic';
  7. import Head from 'next/head';
  8. import type { Container } from 'unstated';
  9. import { Provider } from 'unstated';
  10. import type { CrowiRequest } from '~/interfaces/crowi-request';
  11. import type { CommonProps } from '~/pages/utils/commons';
  12. import { generateCustomTitle } from '~/pages/utils/commons';
  13. import { useCurrentUser, useIsMailerSetup, useSiteUrl } from '~/stores-universal/context';
  14. import { retrieveServerSideProps } from '../../utils/admin-page-util';
  15. const AdminLayout = dynamic(() => import('~/components/Layout/AdminLayout'), { ssr: false });
  16. const SecurityManagement = dynamic(() => import('~/client/components/Admin/Security/SecurityManagement'), { ssr: false });
  17. const ForbiddenPage = dynamic(() => import('~/client/components/Admin/ForbiddenPage').then(mod => mod.ForbiddenPage), { ssr: false });
  18. type Props = CommonProps & {
  19. isMailerSetup: boolean,
  20. siteUrl: string,
  21. };
  22. const AdminSecuritySettingsPage: NextPage<Props> = (props) => {
  23. const { t } = useTranslation('admin');
  24. useCurrentUser(props.currentUser ?? null);
  25. useSiteUrl(props.siteUrl);
  26. useIsMailerSetup(props.isMailerSetup);
  27. const componentTitle = t('security_settings.security_settings');
  28. const pageTitle = generateCustomTitle(props, componentTitle);
  29. const adminSecurityContainers: Container<any>[] = useMemo(() => [], []);
  30. useEffect(() => {
  31. (async() => {
  32. const AdminGeneralSecurityContainer = (await import('~/client/services/AdminGeneralSecurityContainer')).default;
  33. const adminGeneralSecurityContainer = new AdminGeneralSecurityContainer();
  34. const AdminLocalSecurityContainer = (await import('~/client/services/AdminLocalSecurityContainer')).default;
  35. const adminLocalSecurityContainer = new AdminLocalSecurityContainer();
  36. const AdminLdapSecurityContainer = (await import('~/client/services/AdminLdapSecurityContainer')).default;
  37. const adminLdapSecurityContainer = new AdminLdapSecurityContainer();
  38. const AdminSamlSecurityContainer = (await import('~/client/services/AdminSamlSecurityContainer')).default;
  39. const adminSamlSecurityContainer = new AdminSamlSecurityContainer();
  40. const AdminOidcSecurityContainer = (await import('~/client/services/AdminOidcSecurityContainer')).default;
  41. const adminOidcSecurityContainer = new AdminOidcSecurityContainer();
  42. const AdminGoogleSecurityContainer = (await import('~/client/services/AdminGoogleSecurityContainer')).default;
  43. const adminGoogleSecurityContainer = new AdminGoogleSecurityContainer();
  44. const AdminGitHubSecurityContainer = (await import('~/client/services/AdminGitHubSecurityContainer')).default;
  45. const adminGitHubSecurityContainer = new AdminGitHubSecurityContainer();
  46. adminSecurityContainers.push(
  47. adminGeneralSecurityContainer,
  48. adminLocalSecurityContainer,
  49. adminLdapSecurityContainer,
  50. adminSamlSecurityContainer,
  51. adminOidcSecurityContainer,
  52. adminGoogleSecurityContainer,
  53. adminGitHubSecurityContainer,
  54. );
  55. })();
  56. }, [adminSecurityContainers]);
  57. if (props.isAccessDeniedForNonAdminUser) {
  58. return <ForbiddenPage />;
  59. }
  60. return (
  61. <Provider inject={[...adminSecurityContainers]}>
  62. <AdminLayout componentTitle={componentTitle}>
  63. <Head>
  64. <title>{pageTitle}</title>
  65. </Head>
  66. <SecurityManagement />
  67. </AdminLayout>
  68. </Provider>
  69. );
  70. };
  71. const injectServerConfigurations = async(context: GetServerSidePropsContext, props: Props): Promise<void> => {
  72. const req: CrowiRequest = context.req as CrowiRequest;
  73. const { crowi } = req;
  74. const { growiInfoService, mailService } = crowi;
  75. props.siteUrl = growiInfoService.getSiteUrl();
  76. props.isMailerSetup = mailService.isMailerSetup;
  77. };
  78. export const getServerSideProps: GetServerSideProps = async(context: GetServerSidePropsContext) => {
  79. const props = await retrieveServerSideProps(context, injectServerConfigurations);
  80. return props;
  81. };
  82. export default AdminSecuritySettingsPage;