[release] v0.7.6

This commit is contained in:
Yann Stepienik 2023-06-18 11:15:58 +01:00
parent bfe587b1ed
commit 10abffbf26
13 changed files with 62 additions and 17 deletions

View file

@ -1,4 +1,7 @@
## Version 0.7.1 -> 0.7.5
## Version 0.7.1 -> 0.7.6
- Add more special characters to be used for password validation
- Add configurable default data path for binds
- Remove Redirects from home page
- Fix compat with non-HTTP protocol like WebDAV (for Nextcloud for example)
- Fix regression with DNS wildcards certificates
- Fix issue with the installer when changing both the labels and the volumes

View file

@ -73,8 +73,8 @@ const AuthRegister = ({nickname, isRegister, isInviteLink, regkey}) => {
.max(255)
.required('Password is required')
.matches(
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*])(?=.{9,})/,
'Must Contain 9 Characters, One Uppercase, One Lowercase, One Number and one special case Character'
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[~!@#$%\^&\*\(\)_\+=\-\{\[\}\]:;"'<,>\.\?\/])(?=.{9,})/,
'Must Contain 9 Characters, One Uppercase, One Lowercase, One Number and one special case Character (~!@#$%^&*()_+=-{[}]:;"\'<>.?/)'
),
})}
onSubmit={async (values, { setErrors, setStatus, setSubmitting }) => {

View file

@ -80,6 +80,9 @@ const ConfigManagement = () => {
Email_Password: config.EmailConfig.Password,
Email_From: config.EmailConfig.From,
Email_UseTLS : config.EmailConfig.UseTLS,
SkipPruneNetwork: config.DockerConfig.SkipPruneNetwork,
DefaultDataPath: config.DockerConfig.DefaultDataPath
}}
validationSchema={Yup.object().shape({
Hostname: Yup.string().max(255).required('Hostname is required'),
@ -116,6 +119,11 @@ const ConfigManagement = () => {
Password: values.Email_Password,
From: values.Email_From,
UseTLS: values.Email_UseTLS,
},
DockerConfig: {
...config.DockerConfig,
SkipPruneNetwork: values.SkipPruneNetwork,
DefaultDataPath: values.DefaultDataPath
}
}
@ -353,6 +361,23 @@ const ConfigManagement = () => {
</Stack>
</MainCard>
<MainCard title="Docker">
<Stack spacing={2}>
<CosmosCheckbox
label="Skip Prune Network"
name="SkipPruneNetwork"
formik={formik}
/>
<CosmosInputText
label="Default data path for installs"
name="DefaultDataPath"
formik={formik}
/>
</Stack>
</MainCard>
<MainCard title="Security">
<Grid container spacing={3}>

View file

@ -167,7 +167,7 @@ const HomePage = () => {
<Grid2 container spacing={2} style={{ zIndex: 2 }}>
{config && serveApps && routes.map((route) => {
let skip = false;
let skip = route.Mode == "REDIRECT";
if(route.Mode == "SERVAPP") {
const containerName = route.Target.split(':')[1].slice(2);
const container = serveApps.find((c) => c.Names.includes('/' + containerName));

View file

@ -455,7 +455,7 @@ const NewInstall = () => {
// nickname cant be admin or root
nickname: Yup.string().required('Nickname is required').min(3).max(32)
.matches(/^(?!admin|root).*$/, 'Nickname cannot be admin or root'),
password: Yup.string().required('Password is required').min(8).max(128).matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*])(?=.{9,})/, 'Password must contain 9 characters: at least 1 lowercase, 1 uppercase, 1 number, and 1 special character'),
password: Yup.string().required('Password is required').min(8).max(128).matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[~!@#$%\^&\*\(\)_\+=\-\{\[\}\]:;"'<,>\.\?\/])(?=.{9,})/, 'Password must contain 9 characters: at least 1 lowercase, 1 uppercase, 1 number, and 1 special character'),
email: Yup.string().email('Must be a valid email').max(255),
confirmPassword: Yup.string().oneOf([Yup.ref('password'), null], 'Passwords must match'),
})}

View file

@ -93,6 +93,17 @@ const DockerComposeImport = ({ refresh, dockerComposeInit, installerInit, defaul
const [overrides, setOverrides] = useState({});
const [context, setContext] = useState({});
const [installer, setInstaller] = useState(installerInit);
const [config, setConfig] = useState({});
function refreshConfig() {
API.config.get().then((res) => {
setConfig(res.data);
});
}
React.useEffect(() => {
refreshConfig();
}, []);
useEffect(() => {
if (!openModal) {
@ -325,12 +336,14 @@ const DockerComposeImport = ({ refresh, dockerComposeInit, installerInit, defaul
Hostnames: hostnames,
Context: context,
Passwords: [
randomString(32),
randomString(32),
randomString(32)
randomString(24),
randomString(24),
randomString(24),
randomString(24)
],
CPU_ARCH: API.CPU_ARCH,
CPU_AVX: API.CPU_AVX,
DefaultDataPath: (config && config.DockerConfig && config.DockerConfig.DefaultDataPath) || "/usr",
});
const jsoned = JSON.parse(rendered);
@ -441,7 +454,7 @@ const DockerComposeImport = ({ refresh, dockerComposeInit, installerInit, defaul
setYmlError(e.message);
return;
}
}, [openModal, dockerCompose, serviceName, hostnames, overrides, installer]);
}, [openModal, dockerCompose, serviceName, hostnames, overrides, installer, config]);
const openModalFunc = () => {
setOpenModal(true);

View file

@ -5,7 +5,7 @@ const hasNumber = (number) => new RegExp(/[0-9]/).test(number);
const hasMixed = (number) => new RegExp(/[a-z]/).test(number) && new RegExp(/[A-Z]/).test(number);
// has special chars
const hasSpecial = (number) => new RegExp(/[!#@$%^&*)(+=._-]/).test(number);
const hasSpecial = (number) => new RegExp(/[~!@#$%\^&\*\(\)_\+=\-\{\[\}\]:;"'<,>\.\?\/]/).test(number);
// set color based on password strength
export const strengthColor = (count) => {

View file

@ -1,6 +1,6 @@
{
"name": "cosmos-server",
"version": "0.7.5",
"version": "0.7.6",
"description": "",
"main": "test-server.js",
"bugs": {

View file

@ -39,7 +39,7 @@ type NewInstallJSON struct {
type AdminJSON struct {
Nickname string `validate:"required,min=3,max=32,alphanum"`
Password string `validate:"required,min=9,max=128,containsany=!@#$%^&*()_+,containsany=ABCDEFGHIJKLMNOPQRSTUVWXYZ,containsany=abcdefghijklmnopqrstuvwxyz,containsany=0123456789"`
Password string `validate:"required,min=9,max=128,containsany=~!@#$%^&*()_+=-{[}]:;"'<>.?/,containsany=ABCDEFGHIJKLMNOPQRSTUVWXYZ,containsany=abcdefghijklmnopqrstuvwxyz,containsany=0123456789"`
}
func NewInstallRoute(w http.ResponseWriter, req *http.Request) {

View file

@ -14,7 +14,7 @@ import (
type LoginRequestJSON struct {
Nickname string `validate:"required,min=3,max=32,alphanum"`
Password string `validate:"required,min=8,max=128,containsany=!@#$%^&*()_+,containsany=ABCDEFGHIJKLMNOPQRSTUVWXYZ,containsany=abcdefghijklmnopqrstuvwxyz,containsany=0123456789"`
Password string `validate:"required,min=8,max=128,containsany=~!@#$%^&*()_+=-{[}]:;"'<>.?/,containsany=ABCDEFGHIJKLMNOPQRSTUVWXYZ,containsany=abcdefghijklmnopqrstuvwxyz,containsany=0123456789"`
}
func UserLogin(w http.ResponseWriter, req *http.Request) {

View file

@ -13,7 +13,7 @@ import (
type RegisterRequestJSON struct {
Nickname string `validate:"required,min=3,max=32,alphanum"`
Password string `validate:"required,min=9,max=128,containsany=!@#$%^&*()_+,containsany=ABCDEFGHIJKLMNOPQRSTUVWXYZ,containsany=abcdefghijklmnopqrstuvwxyz,containsany=0123456789"`
Password string `validate:"required,min=9,max=128,containsany=~!@#$%^&*()_+=-{[}]:;"'<>.?/,containsany=ABCDEFGHIJKLMNOPQRSTUVWXYZ,containsany=abcdefghijklmnopqrstuvwxyz,containsany=0123456789"`
RegisterKey string `validate:"required,min=1,max=512,alphanum"`
}

View file

@ -126,6 +126,7 @@ type SmartShieldPolicy struct {
type DockerConfig struct {
SkipPruneNetwork bool
DefaultDataPath string
}
type ProxyConfig struct {

View file

@ -78,6 +78,9 @@ var DefaultConfig = Config{
Routes: []ProxyRouteConfig{},
},
},
DockerConfig: DockerConfig{
DefaultDataPath: "/usr",
},
MarketConfig: MarketConfig{
Sources: []MarketSource{
},
@ -216,9 +219,9 @@ func LoadBaseMainConfig(config Config) {
MainConfig.ServerCountry = os.Getenv("COSMOS_SERVER_COUNTRY")
}
// if BaseMainConfig.NewInstall {
// MainConfig.HTTPConfig.HTTPSCertificateMode = "DISABLED"
// }
if MainConfig.DockerConfig.DefaultDataPath == "" {
MainConfig.DockerConfig.DefaultDataPath = "/usr"
}
}
func GetMainConfig() Config {