From a6c6e2b524c320ce9d74346a23c20a62ffda3eea Mon Sep 17 00:00:00 2001 From: Yann Stepienik Date: Sun, 2 Jul 2023 14:53:14 +0100 Subject: [PATCH] [release] v0.9.0-unstable5 --- client/src/pages/config/routeConfigPage.jsx | 2 + client/src/pages/config/routes/newRoute.jsx | 3 +- .../src/pages/config/routes/routeSecurity.jsx | 4 +- client/src/pages/config/routes/routeman.jsx | 4 +- .../src/pages/config/routes/routeoverview.jsx | 5 +- client/src/pages/config/users/configman.jsx | 152 +++++++++--------- client/src/pages/config/users/proxyman.jsx | 2 +- client/src/pages/config/users/restart.jsx | 25 ++- client/src/pages/openid/openid-edit.jsx | 9 -- .../pages/servapps/containers/newService.jsx | 32 ++-- .../pages/servapps/containers/overview.jsx | 2 +- client/src/pages/servapps/exposeModal.jsx | 1 + client/src/pages/servapps/servapps.jsx | 2 +- package.json | 2 +- src/configapi/patch.go | 2 +- src/configapi/set.go | 7 +- src/httpServer.go | 34 ++-- src/utils/db.go | 3 +- 18 files changed, 150 insertions(+), 141 deletions(-) diff --git a/client/src/pages/config/routeConfigPage.jsx b/client/src/pages/config/routeConfigPage.jsx index 075731d..c7238ad 100644 --- a/client/src/pages/config/routeConfigPage.jsx +++ b/client/src/pages/config/routeConfigPage.jsx @@ -53,12 +53,14 @@ const RouteConfigPage = () => { submitButton routeConfig={currentRoute} routeNames={config.HTTPConfig.ProxyConfig.Routes.map((r) => r.Name)} + config={config} /> }, { title: 'Security', children: }, ]}/>} diff --git a/client/src/pages/config/routes/newRoute.jsx b/client/src/pages/config/routes/newRoute.jsx index fb4ba89..802c6a7 100644 --- a/client/src/pages/config/routes/newRoute.jsx +++ b/client/src/pages/config/routes/newRoute.jsx @@ -30,7 +30,7 @@ const NewRouteCreate = ({ openNewModal, setOpenNewModal, config }) => { const routes = config.HTTPConfig.ProxyConfig.Routes || []; return <> - + setOpenNewModal(false)}> New URL {openNewModal && <> @@ -66,6 +66,7 @@ const NewRouteCreate = ({ openNewModal, setOpenNewModal, config }) => { down={() => {}} deleteRoute={() => {}} noControls + config={config} /> diff --git a/client/src/pages/config/routes/routeSecurity.jsx b/client/src/pages/config/routes/routeSecurity.jsx index a6c8f52..fbb7c07 100644 --- a/client/src/pages/config/routes/routeSecurity.jsx +++ b/client/src/pages/config/routes/routeSecurity.jsx @@ -14,11 +14,11 @@ import RestartModal from '../users/restart'; import { CosmosCheckbox, CosmosFormDivider, CosmosInputText, CosmosSelect } from '../users/formShortcuts'; import { snackit } from '../../../api/wrap'; -const RouteSecurity = ({ routeConfig }) => { +const RouteSecurity = ({ routeConfig, config }) => { const [openModal, setOpenModal] = React.useState(false); return
- + {routeConfig && <> { } }, 500) -const RouteManagement = ({ routeConfig, routeNames, TargetContainer, noControls = false, lockTarget = false, title, setRouteConfig, submitButton = false, newRoute }) => { +const RouteManagement = ({ routeConfig, routeNames, config, TargetContainer, noControls = false, lockTarget = false, title, setRouteConfig, submitButton = false, newRoute }) => { const [openModal, setOpenModal] = React.useState(false); const [hostError, setHostError] = React.useState(null); @@ -55,7 +55,7 @@ const RouteManagement = ({ routeConfig, routeNames, TargetContainer, noControls }, []) return
- + {routeConfig && <> { - const [openModal, setOpenModal] = React.useState(false); const isMobile = useMediaQuery((theme) => theme.breakpoints.down('sm')); const [confirmDelete, setConfirmDelete] = React.useState(false); function deleteRoute(event) { event.stopPropagation(); API.config.deleteRoute(routeConfig.Name).then(() => { - setOpenModal(true); + window.location.href = '/cosmos-ui/config-url'; }); } return
- - {routeConfig && <> {routeConfig.Name}    diff --git a/client/src/pages/config/users/configman.jsx b/client/src/pages/config/users/configman.jsx index 81dd2b7..0a87e5e 100644 --- a/client/src/pages/config/users/configman.jsx +++ b/client/src/pages/config/users/configman.jsx @@ -37,12 +37,14 @@ import UploadButtons from '../../../components/fileUpload'; import { TwitterPicker } from 'react-color'; import {SetPrimaryColor, SetSecondaryColor} from '../../../App'; +import { LoadingButton } from '@mui/lab'; const ConfigManagement = () => { const [config, setConfig] = React.useState(null); const [openModal, setOpenModal] = React.useState(false); const [uploadingBackground, setUploadingBackground] = React.useState(false); + const [saveLabel, setSaveLabel] = React.useState("Save"); function refresh() { API.config.get().then((res) => { @@ -60,7 +62,7 @@ const ConfigManagement = () => { refresh(); }}>Refresh

{config && <> - + { MongoDB: Yup.string().max(512), LoggingLevel: Yup.string().max(255).required('Logging Level is required'), })} + onSubmit={async (values, { setErrors, setStatus, setSubmitting }) => { - try { - let toSave = { - ...config, - MongoDB: values.MongoDB, - LoggingLevel: values.LoggingLevel, - RequireMFA: values.RequireMFA, - // AutoUpdate: values.AutoUpdate, - BlockedCountries: values.GeoBlocking, - HTTPConfig: { - ...config.HTTPConfig, - Hostname: values.Hostname, - GenerateMissingAuthCert: values.GenerateMissingAuthCert, - HTTPPort: values.HTTPPort, - HTTPSPort: values.HTTPSPort, - SSLEmail: values.SSLEmail, - UseWildcardCertificate: values.UseWildcardCertificate, - HTTPSCertificateMode: values.HTTPSCertificateMode, - DNSChallengeProvider: values.DNSChallengeProvider, - DNSChallengeConfig: values.DNSChallengeConfig, - ForceHTTPSCertificateRenewal: values.ForceHTTPSCertificateRenewal, - }, - EmailConfig: { - ...config.EmailConfig, - Enabled: values.Email_Enabled, - Host: values.Email_Host, - Port: values.Email_Port, - Username: values.Email_Username, - Password: values.Email_Password, - From: values.Email_From, - UseTLS: values.Email_UseTLS, - }, - DockerConfig: { - ...config.DockerConfig, - SkipPruneNetwork: values.SkipPruneNetwork, - DefaultDataPath: values.DefaultDataPath - }, - HomepageConfig: { - ...config.HomepageConfig, - Background: values.Background - }, - ThemeConfig: { - ...config.ThemeConfig, - PrimaryColor: values.PrimaryColor, - SecondaryColor: values.SecondaryColor - }, - } - - API.config.set(toSave).then((data) => { - if (data.status == 'error') { - setStatus({ success: false }); - if (data.code == 'UL001') { - setErrors({ submit: 'Wrong nickname or password. Try again or try resetting your password' }); - } else if (data.status == 'error') { - setErrors({ submit: 'Unexpected error. Try again later.' }); - } - setSubmitting(false); - return; - } else { - setStatus({ success: true }); - setSubmitting(false); - setOpenModal(true); - } - }) - } catch (err) { - setStatus({ success: false }); - setErrors({ submit: err.message }); - setSubmitting(false); + setSubmitting(true); + + let toSave = { + ...config, + MongoDB: values.MongoDB, + LoggingLevel: values.LoggingLevel, + RequireMFA: values.RequireMFA, + // AutoUpdate: values.AutoUpdate, + BlockedCountries: values.GeoBlocking, + HTTPConfig: { + ...config.HTTPConfig, + Hostname: values.Hostname, + GenerateMissingAuthCert: values.GenerateMissingAuthCert, + HTTPPort: values.HTTPPort, + HTTPSPort: values.HTTPSPort, + SSLEmail: values.SSLEmail, + UseWildcardCertificate: values.UseWildcardCertificate, + HTTPSCertificateMode: values.HTTPSCertificateMode, + DNSChallengeProvider: values.DNSChallengeProvider, + DNSChallengeConfig: values.DNSChallengeConfig, + ForceHTTPSCertificateRenewal: values.ForceHTTPSCertificateRenewal, + }, + EmailConfig: { + ...config.EmailConfig, + Enabled: values.Email_Enabled, + Host: values.Email_Host, + Port: values.Email_Port, + Username: values.Email_Username, + Password: values.Email_Password, + From: values.Email_From, + UseTLS: values.Email_UseTLS, + }, + DockerConfig: { + ...config.DockerConfig, + SkipPruneNetwork: values.SkipPruneNetwork, + DefaultDataPath: values.DefaultDataPath + }, + HomepageConfig: { + ...config.HomepageConfig, + Background: values.Background + }, + ThemeConfig: { + ...config.ThemeConfig, + PrimaryColor: values.PrimaryColor, + SecondaryColor: values.SecondaryColor + }, } + + return API.config.set(toSave).then((data) => { + setOpenModal(true); + setSaveLabel("Saved!"); + setTimeout(() => { + setSaveLabel("Save"); + }, 3000); + }).catch((err) => { + setOpenModal(true); + setSaveLabel("Error while saving, try again."); + setTimeout(() => { + setSaveLabel("Save"); + }, 3000); + }); }} > {(formik) => ( @@ -182,19 +178,17 @@ const ConfigManagement = () => { )} - - - + {saveLabel} +
@@ -593,19 +587,17 @@ const ConfigManagement = () => { )} - - - + {saveLabel} + diff --git a/client/src/pages/config/users/proxyman.jsx b/client/src/pages/config/users/proxyman.jsx index 5b9807e..1572573 100644 --- a/client/src/pages/config/users/proxyman.jsx +++ b/client/src/pages/config/users/proxyman.jsx @@ -144,7 +144,7 @@ const ProxyManagement = () => { {config && <> - + {routes && { @@ -33,11 +34,29 @@ function checkIsOnline() { }); } -const RestartModal = ({openModal, setOpenModal}) => { +const RestartModal = ({openModal, setOpenModal, config}) => { const [isRestarting, setIsRestarting] = useState(false); const [warn, setWarn] = useState(false); + const needsRefresh = config && (config.HTTPConfig.HTTPSCertificateMode == "SELFSIGNED" || + !isDomain(config.HTTPConfig.Hostname)) + const isNotDomain = config && !isDomain(config.HTTPConfig.Hostname); - return <> + return config ? (needsRefresh && <> + setOpenModal(false)}> + Refresh Page + + + You need to refresh the page to apply changes. {isNotDomain && 'You are not using a domain names, the server will be offline for a few seconds to remap your docker ports.'} + + + + + + + ) + :(<> setOpenModal(false)}> {!isRestarting ? 'Restart Server?' : 'Restarting Server...'} @@ -68,7 +87,7 @@ const RestartModal = ({openModal, setOpenModal}) => { }}>Restart } - ; + ); }; export default RestartModal; diff --git a/client/src/pages/openid/openid-edit.jsx b/client/src/pages/openid/openid-edit.jsx index 022bf1a..8562ddb 100644 --- a/client/src/pages/openid/openid-edit.jsx +++ b/client/src/pages/openid/openid-edit.jsx @@ -17,21 +17,12 @@ import { Formik, useFormik } from 'formik'; import * as yup from 'yup'; const OpenIdEditModal = ({ clientId, openNewModal, setOpenNewModal, config, onSubmit }) => { - const [openRestartModal, setOpenRestartModal] = useState(false); const [submitErrors, setSubmitErrors] = useState([]); const [newRoute, setNewRoute] = useState(null); - function addRoute() { - return API.config.addRoute(newRoute).then((res) => { - setOpenNewModal(false); - setOpenRestartModal(true); - }); - } - const clientConfig = config.OpenIDClients && Object.values(config.OpenIDClients).find((c) => c.id === clientId); return <> - setOpenNewModal(false)}> { service = {...service}; delete service['cosmos-installer']; + const refreshConfig = () => { + API.config.get().then((res) => { + setConfig(res.data); + }); + }; + React.useEffect(() => { - // refreshContainer(); + refreshConfig(); }, []); + const needsRestart = service && service.services && Object.values(service.services).some((c) => { + return c.routes && c.routes.length > 0; + }); + const create = () => { setLog([ 'Creating Service... ', @@ -77,18 +87,16 @@ const NewDockerService = ({service, refresh}) => { preRef.current.scrollTop = preRef.current.scrollHeight; if (newlog.includes('[OPERATION SUCCEEDED]')) { setIsDone(true); + + needsRestart && setOpenModal(true); refresh && refresh(); } }); } - const needsRestart = service && service.services && Object.values(service.services).some((c) => { - return c.routes && c.routes.length > 0; - }); - return
- + {!isDone && { {installer && installer['post-install'] && installer['post-install'].map(m =>{ return {m.label} })} - {needsRestart && Cosmos needs to be restarted to apply changes to the URLs} - {needsRestart && - - } }
         {!log.length && `
diff --git a/client/src/pages/servapps/containers/overview.jsx b/client/src/pages/servapps/containers/overview.jsx
index e9ed96e..544bf7f 100644
--- a/client/src/pages/servapps/containers/overview.jsx
+++ b/client/src/pages/servapps/containers/overview.jsx
@@ -48,7 +48,7 @@ const ContainerOverview = ({ containerInfo, config, refresh, updatesAvailable, s
 
   return (
     
- + r.Name)} setRouteConfig={(_newRoute) => { setNewRoute(sanitizeRoute(_newRoute)); diff --git a/client/src/pages/servapps/servapps.jsx b/client/src/pages/servapps/servapps.jsx index 1e35bbb..9f24dce 100644 --- a/client/src/pages/servapps/servapps.jsx +++ b/client/src/pages/servapps/servapps.jsx @@ -127,7 +127,7 @@ const ServApps = () => { } return
- +