From 19f666fe82b69dc03827ee255acc6c0791e42421 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 23 Aug 2024 10:27:09 -0700 Subject: [PATCH 1/5] expose onInput in component, force lowercase for email input --- Client/src/Components/Inputs/Field/index.jsx | 5 +++++ Client/src/Pages/Auth/Register/Register.jsx | 1 + 2 files changed, 6 insertions(+) diff --git a/Client/src/Components/Inputs/Field/index.jsx b/Client/src/Components/Inputs/Field/index.jsx index 0b2fe56fe..335ed178f 100644 --- a/Client/src/Components/Inputs/Field/index.jsx +++ b/Client/src/Components/Inputs/Field/index.jsx @@ -48,6 +48,7 @@ const Field = forwardRef( placeholder, value, onChange, + onInput, error, disabled, }, @@ -87,6 +88,7 @@ const Field = forwardRef( multiline={type === "description"} rows={type === "description" ? 4 : 1} value={value} + onInput={onInput} onChange={onChange} disabled={disabled} inputRef={ref} @@ -176,6 +178,8 @@ const Field = forwardRef( } ); +Field.displayName = "Field"; + Field.propTypes = { type: PropTypes.oneOf(["text", "password", "url", "email", "description"]), id: PropTypes.string.isRequired, @@ -189,6 +193,7 @@ Field.propTypes = { placeholder: PropTypes.string, value: PropTypes.string.isRequired, onChange: PropTypes.func, + onInput: PropTypes.func, error: PropTypes.string, disabled: PropTypes.bool, }; diff --git a/Client/src/Pages/Auth/Register/Register.jsx b/Client/src/Pages/Auth/Register/Register.jsx index a06075b5a..4680c1821 100644 --- a/Client/src/Pages/Auth/Register/Register.jsx +++ b/Client/src/Pages/Auth/Register/Register.jsx @@ -226,6 +226,7 @@ const StepTwo = ({ form, errors, onSubmit, onChange, onBack }) => { placeholder="jordan.ellis@domain.com" autoComplete="email" value={form.email} + onInput={(e) => (e.target.value = e.target.value.toLowerCase())} onChange={onChange} error={errors.email} ref={inputRef} From ee22216bf904ea9e5cfba79d236b3c6df9943e48 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 23 Aug 2024 10:30:27 -0700 Subject: [PATCH 2/5] Add custom validator to check for lowercase --- Client/src/Validation/validation.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Client/src/Validation/validation.js b/Client/src/Validation/validation.js index ab2501199..35d47d6b1 100644 --- a/Client/src/Validation/validation.js +++ b/Client/src/Validation/validation.js @@ -49,6 +49,13 @@ const credentials = joi.object({ .string() .trim() .email({ tlds: { allow: false } }) + .custom((value, helpers) => { + const lowercasedValue = value.toLowerCase(); + if (value !== lowercasedValue) { + return helpers.message("Email must be in lowercase"); + } + return lowercasedValue; + }) .messages({ "string.empty": "Email is required", "string.email": "Must be a valid email address", @@ -72,14 +79,10 @@ const credentials = joi.object({ }); const monitorValidation = joi.object({ - url: joi - .string() - .uri({ allowRelative: true }) - .trim() - .messages({ - "string.empty": "This field is required.", - "string.uri": "The URL you provided is not valid.", - }), + url: joi.string().uri({ allowRelative: true }).trim().messages({ + "string.empty": "This field is required.", + "string.uri": "The URL you provided is not valid.", + }), name: joi.string().trim().max(50).allow("").messages({ "string.max": "This field should not exceed the 50 characters limit.", }), From 73136545cc8f124fd6803eb9dec5a82fdec02376 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 23 Aug 2024 10:33:37 -0700 Subject: [PATCH 3/5] Add backend validation to check for lowercase --- Docker/.gitignore | 3 ++- Server/validation/joi.js | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Docker/.gitignore b/Docker/.gitignore index e1b726025..89aa6bfac 100644 --- a/Docker/.gitignore +++ b/Docker/.gitignore @@ -2,4 +2,5 @@ !build_images.sh mongo/data/* redis/data/* -*.env \ No newline at end of file +*.env +certbot/* \ No newline at end of file diff --git a/Server/validation/joi.js b/Server/validation/joi.js index 26e62a6db..775aee7b5 100644 --- a/Server/validation/joi.js +++ b/Server/validation/joi.js @@ -35,7 +35,17 @@ const registerValidation = joi.object({ .string() .required() .pattern(/^[A-Za-z]+$/), - email: joi.string().email().required(), + email: joi + .string() + .email() + .required() + .custom((value, helpers) => { + const lowercasedValue = value.toLowerCase(); + if (value !== lowercasedValue) { + return helpers.message("Email must be in lowercase"); + } + return lowercasedValue; + }), password: joi .string() .min(8) From 9149f3e103ed933cdb6d9b0f35344e704ea71ab3 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 23 Aug 2024 10:35:08 -0700 Subject: [PATCH 4/5] add validation for backend login --- Server/validation/joi.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Server/validation/joi.js b/Server/validation/joi.js index 775aee7b5..4f8042e12 100644 --- a/Server/validation/joi.js +++ b/Server/validation/joi.js @@ -16,7 +16,17 @@ const roleValidatior = (role) => (value, helpers) => { //**************************************** const loginValidation = joi.object({ - email: joi.string().email().required(), + email: joi + .string() + .email() + .required() + .custom((value, helpers) => { + const lowercasedValue = value.toLowerCase(); + if (value !== lowercasedValue) { + return helpers.message("Email must be in lowercase"); + } + return lowercasedValue; + }), password: joi .string() .min(8) From d9781f05add0043102f0a3a0cdf3a29492855f68 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 23 Aug 2024 10:36:02 -0700 Subject: [PATCH 5/5] force input to lowercase for login --- Client/src/Pages/Auth/Login.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/Client/src/Pages/Auth/Login.jsx b/Client/src/Pages/Auth/Login.jsx index ecdd27060..b962fbb9a 100644 --- a/Client/src/Pages/Auth/Login.jsx +++ b/Client/src/Pages/Auth/Login.jsx @@ -129,6 +129,7 @@ const StepOne = ({ form, errors, onSubmit, onChange, onBack }) => { placeholder="jordan.ellis@domain.com" autoComplete="email" value={form.email} + onInput={(e) => (e.target.value = e.target.value.toLowerCase())} onChange={onChange} error={errors.email} ref={inputRef}