security.page.tsx 3.8 KB

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