2022-05-14 14:50:21 +00:00
|
|
|
import React, { useEffect } from 'react';
|
|
|
|
import { useParams } from 'react-router-dom';
|
|
|
|
import { Box, Flex, Stack, Button, useToast } from '@chakra-ui/react';
|
|
|
|
import { useClient } from 'urql';
|
|
|
|
import { FaSave } from 'react-icons/fa';
|
|
|
|
import _ from 'lodash';
|
|
|
|
import { EnvVariablesQuery } from '../graphql/queries';
|
2022-01-25 04:04:35 +00:00
|
|
|
import {
|
2022-05-14 14:50:21 +00:00
|
|
|
SelectInputType,
|
|
|
|
HiddenInputType,
|
|
|
|
TextInputType,
|
|
|
|
HMACEncryptionType,
|
|
|
|
RSAEncryptionType,
|
|
|
|
ECDSAEncryptionType,
|
|
|
|
envVarTypes,
|
|
|
|
envSubViews,
|
|
|
|
} from '../constants';
|
|
|
|
import { UpdateEnvVariables } from '../graphql/mutation';
|
|
|
|
import { getObjectDiff, capitalizeFirstLetter } from '../utils';
|
|
|
|
import OAuthConfig from '../components/EnvComponents/OAuthConfig';
|
|
|
|
import Roles from '../components/EnvComponents/Roles';
|
|
|
|
import JWTConfigurations from '../components/EnvComponents/JWTConfiguration';
|
|
|
|
import SessionStorage from '../components/EnvComponents/SessionStorage';
|
|
|
|
import EmailConfigurations from '../components/EnvComponents/EmailConfiguration';
|
|
|
|
import DomainWhiteListing from '../components/EnvComponents/DomainWhitelisting';
|
|
|
|
import OrganizationInfo from '../components/EnvComponents/OrganizationInfo';
|
|
|
|
import AccessToken from '../components/EnvComponents/AccessToken';
|
2022-05-31 07:41:54 +00:00
|
|
|
import Features from '../components/EnvComponents/Features';
|
2022-05-14 14:50:21 +00:00
|
|
|
import SecurityAdminSecret from '../components/EnvComponents/SecurityAdminSecret';
|
|
|
|
import DatabaseCredentials from '../components/EnvComponents/DatabaseCredentials';
|
2022-05-07 16:40:29 +00:00
|
|
|
|
|
|
|
const Environment = () => {
|
2022-05-14 14:50:21 +00:00
|
|
|
const client = useClient();
|
|
|
|
const toast = useToast();
|
|
|
|
const [adminSecret, setAdminSecret] = React.useState<
|
|
|
|
Record<string, string | boolean>
|
|
|
|
>({
|
|
|
|
value: '',
|
|
|
|
disableInputField: true,
|
|
|
|
});
|
|
|
|
const [loading, setLoading] = React.useState<boolean>(true);
|
|
|
|
const [envVariables, setEnvVariables] = React.useState<envVarTypes>({
|
|
|
|
GOOGLE_CLIENT_ID: '',
|
|
|
|
GOOGLE_CLIENT_SECRET: '',
|
|
|
|
GITHUB_CLIENT_ID: '',
|
|
|
|
GITHUB_CLIENT_SECRET: '',
|
|
|
|
FACEBOOK_CLIENT_ID: '',
|
|
|
|
FACEBOOK_CLIENT_SECRET: '',
|
2022-06-06 16:38:32 +00:00
|
|
|
LINKEDIN_CLIENT_ID: '',
|
|
|
|
LINKEDIN_CLIENT_SECRET: '',
|
2022-06-12 09:19:48 +00:00
|
|
|
APPLE_CLIENT_ID: '',
|
|
|
|
APPLE_CLIENT_SECRET: '',
|
2022-08-13 07:05:00 +00:00
|
|
|
TWITTER_CLIENT_ID: '',
|
|
|
|
TWITTER_CLIENT_SECRET: '',
|
2023-02-25 23:53:02 +00:00
|
|
|
MICROSOFT_CLIENT_ID: '',
|
|
|
|
MICROSOFT_CLIENT_SECRET: '',
|
|
|
|
MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID: '',
|
2023-12-02 06:51:53 +00:00
|
|
|
TWITCH_CLIENT_ID: '',
|
|
|
|
TWITCH_CLIENT_SECRET: '',
|
2022-05-14 14:50:21 +00:00
|
|
|
ROLES: [],
|
|
|
|
DEFAULT_ROLES: [],
|
|
|
|
PROTECTED_ROLES: [],
|
|
|
|
JWT_TYPE: '',
|
|
|
|
JWT_SECRET: '',
|
|
|
|
JWT_ROLE_CLAIM: '',
|
|
|
|
JWT_PRIVATE_KEY: '',
|
|
|
|
JWT_PUBLIC_KEY: '',
|
|
|
|
REDIS_URL: '',
|
|
|
|
SMTP_HOST: '',
|
|
|
|
SMTP_PORT: '',
|
|
|
|
SMTP_USERNAME: '',
|
|
|
|
SMTP_PASSWORD: '',
|
2022-10-25 02:48:29 +00:00
|
|
|
SMTP_LOCAL_NAME: '',
|
2022-05-14 14:50:21 +00:00
|
|
|
SENDER_EMAIL: '',
|
2023-05-15 21:57:33 +00:00
|
|
|
SENDER_NAME: '',
|
2022-05-14 14:50:21 +00:00
|
|
|
ALLOWED_ORIGINS: [],
|
|
|
|
ORGANIZATION_NAME: '',
|
|
|
|
ORGANIZATION_LOGO: '',
|
|
|
|
CUSTOM_ACCESS_TOKEN_SCRIPT: '',
|
|
|
|
ADMIN_SECRET: '',
|
2022-10-02 16:31:22 +00:00
|
|
|
APP_COOKIE_SECURE: false,
|
|
|
|
ADMIN_COOKIE_SECURE: false,
|
2022-05-14 14:50:21 +00:00
|
|
|
DISABLE_LOGIN_PAGE: false,
|
|
|
|
DISABLE_MAGIC_LINK_LOGIN: false,
|
|
|
|
DISABLE_EMAIL_VERIFICATION: false,
|
|
|
|
DISABLE_BASIC_AUTHENTICATION: false,
|
|
|
|
DISABLE_SIGN_UP: false,
|
2022-06-18 10:01:57 +00:00
|
|
|
DISABLE_STRONG_PASSWORD: false,
|
2022-05-14 14:50:21 +00:00
|
|
|
OLD_ADMIN_SECRET: '',
|
|
|
|
DATABASE_NAME: '',
|
|
|
|
DATABASE_TYPE: '',
|
|
|
|
DATABASE_URL: '',
|
|
|
|
ACCESS_TOKEN_EXPIRY_TIME: '',
|
2022-08-11 12:20:45 +00:00
|
|
|
DISABLE_MULTI_FACTOR_AUTHENTICATION: false,
|
|
|
|
ENFORCE_MULTI_FACTOR_AUTHENTICATION: false,
|
2023-04-01 12:06:07 +00:00
|
|
|
DEFAULT_AUTHORIZE_RESPONSE_TYPE: '',
|
|
|
|
DEFAULT_AUTHORIZE_RESPONSE_MODE: '',
|
2023-08-28 14:21:42 +00:00
|
|
|
DISABLE_PLAYGROUND: false,
|
2023-11-16 13:00:54 +00:00
|
|
|
DISABLE_TOTP_LOGIN: false,
|
|
|
|
DISABLE_MAIL_OTP_LOGIN: true,
|
2022-05-14 14:50:21 +00:00
|
|
|
});
|
2022-05-07 16:40:29 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
const [fieldVisibility, setFieldVisibility] = React.useState<
|
|
|
|
Record<string, boolean>
|
|
|
|
>({
|
|
|
|
GOOGLE_CLIENT_SECRET: false,
|
|
|
|
GITHUB_CLIENT_SECRET: false,
|
|
|
|
FACEBOOK_CLIENT_SECRET: false,
|
2022-06-06 16:38:32 +00:00
|
|
|
LINKEDIN_CLIENT_SECRET: false,
|
2022-06-12 09:19:48 +00:00
|
|
|
APPLE_CLIENT_SECRET: false,
|
2022-08-13 07:05:00 +00:00
|
|
|
TWITTER_CLIENT_SECRET: false,
|
2023-12-02 06:51:53 +00:00
|
|
|
TWITCH_CLIENT_SECRET: false,
|
2022-05-14 14:50:21 +00:00
|
|
|
JWT_SECRET: false,
|
|
|
|
SMTP_PASSWORD: false,
|
|
|
|
ADMIN_SECRET: false,
|
|
|
|
OLD_ADMIN_SECRET: false,
|
|
|
|
});
|
2022-05-07 16:40:29 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
const { sec } = useParams();
|
2022-05-07 16:40:29 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
async function getData() {
|
|
|
|
const {
|
|
|
|
data: { _env: envData },
|
|
|
|
} = await client.query(EnvVariablesQuery).toPromise();
|
|
|
|
setLoading(false);
|
2022-01-19 16:50:25 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
setEnvVariables({
|
|
|
|
...envData,
|
|
|
|
OLD_ADMIN_SECRET: envData.ADMIN_SECRET,
|
|
|
|
ADMIN_SECRET: '',
|
|
|
|
});
|
|
|
|
setAdminSecret({
|
|
|
|
value: '',
|
|
|
|
disableInputField: true,
|
|
|
|
});
|
|
|
|
}
|
2022-01-25 07:36:52 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
useEffect(() => {
|
|
|
|
getData();
|
|
|
|
}, [sec]);
|
2022-01-25 04:04:35 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
const validateAdminSecretHandler = (event: any) => {
|
|
|
|
if (envVariables.OLD_ADMIN_SECRET === event.target.value) {
|
|
|
|
setAdminSecret({
|
|
|
|
...adminSecret,
|
|
|
|
value: event.target.value,
|
|
|
|
disableInputField: false,
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
setAdminSecret({
|
|
|
|
...adminSecret,
|
|
|
|
value: event.target.value,
|
|
|
|
disableInputField: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (envVariables.ADMIN_SECRET !== '') {
|
|
|
|
setEnvVariables({ ...envVariables, ADMIN_SECRET: '' });
|
|
|
|
}
|
|
|
|
};
|
2022-01-25 04:04:35 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
const saveHandler = async () => {
|
|
|
|
setLoading(true);
|
|
|
|
const {
|
|
|
|
data: { _env: envData },
|
|
|
|
} = await client.query(EnvVariablesQuery).toPromise();
|
|
|
|
const diff = getObjectDiff(envVariables, envData);
|
|
|
|
const updatedEnvVariables = diff.reduce(
|
|
|
|
(acc: any, property: string) => ({
|
|
|
|
...acc,
|
|
|
|
// @ts-ignore
|
|
|
|
[property]: envVariables[property],
|
|
|
|
}),
|
2022-10-02 17:06:57 +00:00
|
|
|
{},
|
2022-05-14 14:50:21 +00:00
|
|
|
);
|
|
|
|
if (
|
|
|
|
updatedEnvVariables[HiddenInputType.ADMIN_SECRET] === '' ||
|
|
|
|
updatedEnvVariables[HiddenInputType.OLD_ADMIN_SECRET] !==
|
|
|
|
envData.ADMIN_SECRET
|
|
|
|
) {
|
|
|
|
delete updatedEnvVariables.OLD_ADMIN_SECRET;
|
|
|
|
delete updatedEnvVariables.ADMIN_SECRET;
|
|
|
|
}
|
2022-01-25 04:04:35 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
delete updatedEnvVariables.DATABASE_URL;
|
|
|
|
delete updatedEnvVariables.DATABASE_TYPE;
|
|
|
|
delete updatedEnvVariables.DATABASE_NAME;
|
2022-01-25 04:04:35 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
const res = await client
|
|
|
|
.mutation(UpdateEnvVariables, { params: updatedEnvVariables })
|
|
|
|
.toPromise();
|
2022-01-25 07:36:52 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
setLoading(false);
|
2022-01-25 07:36:52 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
if (res.error) {
|
|
|
|
toast({
|
|
|
|
title: capitalizeFirstLetter(res.error.message),
|
|
|
|
isClosable: true,
|
|
|
|
status: 'error',
|
|
|
|
position: 'bottom-right',
|
|
|
|
});
|
2022-01-25 07:36:52 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
return;
|
|
|
|
}
|
2022-01-25 07:36:52 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
setAdminSecret({
|
|
|
|
value: '',
|
|
|
|
disableInputField: true,
|
|
|
|
});
|
2022-01-25 07:36:52 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
getData();
|
2022-01-25 07:36:52 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
toast({
|
|
|
|
title: `Successfully updated ${
|
|
|
|
Object.keys(updatedEnvVariables).length
|
|
|
|
} variables`,
|
|
|
|
isClosable: true,
|
|
|
|
status: 'success',
|
2022-12-22 18:49:32 +00:00
|
|
|
position: 'top-right',
|
2022-05-14 14:50:21 +00:00
|
|
|
});
|
|
|
|
};
|
2022-01-25 07:36:52 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
const renderComponent = (tab: any) => {
|
|
|
|
switch (tab) {
|
|
|
|
case envSubViews.INSTANCE_INFO:
|
|
|
|
return (
|
|
|
|
<OAuthConfig
|
|
|
|
envVariables={envVariables}
|
|
|
|
setVariables={setEnvVariables}
|
|
|
|
fieldVisibility={fieldVisibility}
|
|
|
|
setFieldVisibility={setFieldVisibility}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case envSubViews.ROLES:
|
|
|
|
return (
|
|
|
|
<Roles variables={envVariables} setVariables={setEnvVariables} />
|
|
|
|
);
|
|
|
|
case envSubViews.JWT_CONFIG:
|
|
|
|
return (
|
|
|
|
<JWTConfigurations
|
|
|
|
variables={envVariables}
|
|
|
|
setVariables={setEnvVariables}
|
|
|
|
fieldVisibility={fieldVisibility}
|
|
|
|
setFieldVisibility={setFieldVisibility}
|
|
|
|
SelectInputType={SelectInputType.JWT_TYPE}
|
|
|
|
HMACEncryptionType={HMACEncryptionType}
|
|
|
|
RSAEncryptionType={RSAEncryptionType}
|
|
|
|
ECDSAEncryptionType={ECDSAEncryptionType}
|
|
|
|
getData={getData}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case envSubViews.SESSION_STORAGE:
|
|
|
|
return (
|
|
|
|
<SessionStorage
|
|
|
|
variables={envVariables}
|
|
|
|
setVariables={setEnvVariables}
|
|
|
|
RedisURL={TextInputType.REDIS_URL}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case envSubViews.EMAIL_CONFIG:
|
|
|
|
return (
|
|
|
|
<EmailConfigurations
|
|
|
|
variables={envVariables}
|
|
|
|
setVariables={setEnvVariables}
|
|
|
|
fieldVisibility={fieldVisibility}
|
|
|
|
setFieldVisibility={setFieldVisibility}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case envSubViews.WHITELIST_VARIABLES:
|
|
|
|
return (
|
|
|
|
<DomainWhiteListing
|
|
|
|
variables={envVariables}
|
|
|
|
setVariables={setEnvVariables}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case envSubViews.ORGANIZATION_INFO:
|
|
|
|
return (
|
|
|
|
<OrganizationInfo
|
|
|
|
variables={envVariables}
|
|
|
|
setVariables={setEnvVariables}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case envSubViews.ACCESS_TOKEN:
|
|
|
|
return (
|
|
|
|
<AccessToken
|
|
|
|
variables={envVariables}
|
|
|
|
setVariables={setEnvVariables}
|
|
|
|
/>
|
|
|
|
);
|
2022-05-31 07:41:54 +00:00
|
|
|
case envSubViews.FEATURES:
|
2022-05-14 14:50:21 +00:00
|
|
|
return (
|
2022-05-31 07:41:54 +00:00
|
|
|
<Features variables={envVariables} setVariables={setEnvVariables} />
|
2022-05-14 14:50:21 +00:00
|
|
|
);
|
|
|
|
case envSubViews.ADMIN_SECRET:
|
|
|
|
return (
|
|
|
|
<SecurityAdminSecret
|
|
|
|
variables={envVariables}
|
|
|
|
setVariables={setEnvVariables}
|
|
|
|
fieldVisibility={fieldVisibility}
|
|
|
|
setFieldVisibility={setFieldVisibility}
|
|
|
|
validateAdminSecretHandler={validateAdminSecretHandler}
|
|
|
|
adminSecret={adminSecret}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case envSubViews.DB_CRED:
|
|
|
|
return (
|
|
|
|
<DatabaseCredentials
|
|
|
|
variables={envVariables}
|
|
|
|
setVariables={setEnvVariables}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
default:
|
|
|
|
return (
|
|
|
|
<OAuthConfig
|
|
|
|
envVariables={envVariables}
|
|
|
|
setVariables={setEnvVariables}
|
|
|
|
fieldVisibility={fieldVisibility}
|
|
|
|
setFieldVisibility={setFieldVisibility}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
return (
|
|
|
|
<Box m="5" py="5" px="10" bg="white" rounded="md">
|
|
|
|
{renderComponent(sec)}
|
|
|
|
<Stack spacing={6} padding="1% 0" mt={4}>
|
|
|
|
<Flex justifyContent="end" alignItems="center">
|
|
|
|
<Button
|
|
|
|
leftIcon={<FaSave />}
|
|
|
|
colorScheme="blue"
|
|
|
|
variant="solid"
|
|
|
|
onClick={saveHandler}
|
|
|
|
isDisabled={loading}
|
|
|
|
>
|
|
|
|
Save
|
|
|
|
</Button>
|
|
|
|
</Flex>
|
|
|
|
</Stack>
|
|
|
|
</Box>
|
|
|
|
);
|
2022-05-07 16:40:29 +00:00
|
|
|
};
|
2022-01-25 04:04:35 +00:00
|
|
|
|
2022-05-14 14:50:21 +00:00
|
|
|
export default Environment;
|