diff --git a/README.md b/README.md index 242420a669..83e6675f43 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Welcome to OpenSign, the premier open source docusign alternative - document e-s - **PDF Template Creation:** OpenSign™ allows you to create and store PDF document templates for repeated use thereby saving you a lot of time & collect e-signatures seamlessly. - **OpenSign™ Drive:** It is a centralised secure vault for your digital documents that makes storing, signing, organizing, sharing & archieving your docs a breeze. - **Audit Trails & completion certificate:** Being a security focused solution, OpenSign™ makes it a top priority to save detailed logs for tracking document activities along with time-stamps, IP addresses, email IDs & phone numbers. A completion certificate is generated as soon as document is completed which contains all the document related logs for added safety. -- **API Support:** OpenSign™ API allows seamless integration into existing systems and software. You can generate an API key from the app and refer the [official API docs](https://docs.opensignlabs.com/docs/API-docs/opensign-api-v-1) to start integrating it in your existing applications. +- **API Support:** OpenSign™ API allows seamless integration into existing systems and software. You can generate an API key from the app and refer the [official API docs](https://docs.opensignlabs.com/docs/API-docs/v1.1) to start integrating it in your existing applications. - **Integrations:** The open source document signing experience becomes even more seamless because of integrations with various Cloud storage systems, CRMs & enterprise platforms. We also have a Zapier integration that allows you to integrate it with virtually any application. Login page Dash_board diff --git a/apps/OpenSign/public/locales/de/translation.json b/apps/OpenSign/public/locales/de/translation.json index 37e06faa9b..5477e2ddfd 100644 --- a/apps/OpenSign/public/locales/de/translation.json +++ b/apps/OpenSign/public/locales/de/translation.json @@ -71,6 +71,7 @@ "login-page": "Anmeldeseite", "or": "ODER", "signup-page": "Registrierungsseite", + "password-match-length": "Neues Passwort und Bestätigungspasswort sollten übereinstimmen", "password-length": "Das Passwort sollte 8 Zeichen lang sein", "password-case": "Das Passwort sollte einen Großbuchstaben, einen Kleinbuchstaben und eine Zahl enthalten", "password-special-char": "Das Passwort sollte ein Sonderzeichen enthalten", diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index a93284b2df..162c0f97dc 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -71,6 +71,7 @@ "login-page": "Login P+age", "or": "OR", "signup-page": "Signup page", + "password-match-length": "New password and confirmation password should match", "password-length": "Password should be 8 characters long", "password-case": "Password should contain uppercase letter, lowercase letter, digit", "password-special-char": " Password should contain special character", diff --git a/apps/OpenSign/public/locales/es/translation.json b/apps/OpenSign/public/locales/es/translation.json index fcc0de75bf..5892ad3f42 100644 --- a/apps/OpenSign/public/locales/es/translation.json +++ b/apps/OpenSign/public/locales/es/translation.json @@ -71,6 +71,7 @@ "login-page": "Página de inicio de sesión", "or": "O", "signup-page": "Página de registro", + "password-match-length": "La nueva contraseña y la confirmación deben coincidir", "password-length": "La contraseña debe tener 8 caracteres", "password-case": "La contraseña debe incluir mayúsculas, minúsculas y números", "password-special-char": " La contraseña debe incluir caracteres especiales", diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index 6e73886e2d..b1d95d3901 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -71,6 +71,7 @@ "login-page": "Page de connexion", "or": "OU", "signup-page": "Page d'inscription", + "password-match-length": "Le nouveau mot de passe et la confirmation doivent correspondre", "password-length": "Le mot de passe doit être de plus de 8 caractères", "password-case": "Le mot de passe doit contenir une lettre majuscule, minuscule et un chiffre ", "password-special-char": "Le mot de passe doit contenir un caractère spécial", diff --git a/apps/OpenSign/public/locales/hi/translation.json b/apps/OpenSign/public/locales/hi/translation.json index 717183cd4f..b1d88178c1 100644 --- a/apps/OpenSign/public/locales/hi/translation.json +++ b/apps/OpenSign/public/locales/hi/translation.json @@ -71,6 +71,7 @@ "login-page": "लॉगिन पृष्ठ", "or": "या", "signup-page": "साइनअप पृष्ठ", + "password-match-length": "नया पासवर्ड और पुष्टि पासवर्ड मेल खाना चाहिए", "password-length": "पासवर्ड 8 वर्ण लंबा होना चाहिए", "password-case": "पासवर्ड में अपरकेस अक्षर, लोअरकेस अक्षर, अंक होना चाहिए", "password-special-char": " पासवर्ड में विशेष वर्ण होना चाहिए", diff --git a/apps/OpenSign/public/locales/it/translation.json b/apps/OpenSign/public/locales/it/translation.json index ff97dd03c4..dce713064c 100644 --- a/apps/OpenSign/public/locales/it/translation.json +++ b/apps/OpenSign/public/locales/it/translation.json @@ -71,6 +71,7 @@ "login-page": "Pagina di accesso", "or": "O", "signup-page": "Pagina di registrazione", + "password-match-length": "La nuova password e la conferma devono corrispondere", "password-length": "La password deve contenere almeno 8 caratteri", "password-case": "La password deve contenere una lettera maiuscola, una minuscola e un numero", "password-special-char": "La password deve contenere un carattere speciale", diff --git a/apps/OpenSign/src/pages/ChangePassword.jsx b/apps/OpenSign/src/pages/ChangePassword.jsx index b162a4388a..dd539792ad 100644 --- a/apps/OpenSign/src/pages/ChangePassword.jsx +++ b/apps/OpenSign/src/pages/ChangePassword.jsx @@ -8,41 +8,70 @@ function ChangePassword() { const [currentpassword, setCurrentPassword] = useState(""); const [newpassword, setnewpassword] = useState(""); const [confirmpassword, setconfirmpassword] = useState(""); + const [lengthValid, setLengthValid] = useState(false); + const [caseDigitValid, setCaseDigitValid] = useState(false); + const [specialCharValid, setSpecialCharValid] = useState(false); + const [showNewPassword, setNewShowPassword] = useState(false); + const [showConfirmPassword, setShowConfirmPassword] = useState(false); + const toggleNewPasswordVisibility = () => { + setNewShowPassword(!showNewPassword); + }; + const toggleConfirmPasswordVisibility = () => { + setShowConfirmPassword(!showConfirmPassword); + }; + + const handlePasswordChange = (e) => { + const newPassword = e.target.value; + setconfirmpassword(newPassword); + // Check conditions separately + setLengthValid(newPassword.length >= 8); + setCaseDigitValid( + /[a-z]/.test(newPassword) && + /[A-Z]/.test(newPassword) && + /\d/.test(newPassword) + ); + setSpecialCharValid(/[!@#$%^&*()\-_=+{};:,<.>]/.test(newPassword)); + }; const handleSubmit = async (evt) => { evt.preventDefault(); try { if (newpassword === confirmpassword) { - Parse.User.logIn(localStorage.getItem("userEmail"), currentpassword) - .then(async (user) => { - if (user) { - const User = new Parse.User(); - const query = new Parse.Query(User); - await query.get(user.id).then((user) => { - // Updates the data we want - user.set("password", newpassword); - user - .save() - .then(async () => { - let _user = user.toJSON(); - if (_user) { - await Parse.User.become(_user.sessionToken); - localStorage.setItem("accesstoken", _user.sessionToken); - } - alert(t("password-update-alert-1")); - }) - .catch((error) => { - console.log("err", error); - alert(t("something-went-wrong-mssg")); - }); - }); - } else { - alert(t("password-update-alert-2")); - } - }) - .catch((error) => { - alert(t("password-update-alert-3")); - console.error("Error while logging in user", error); - }); + if (lengthValid && caseDigitValid && specialCharValid) { + Parse.User.logIn(localStorage.getItem("userEmail"), currentpassword) + .then(async (user) => { + if (user) { + const User = new Parse.User(); + const query = new Parse.Query(User); + await query.get(user.id).then((user) => { + // Updates the data we want + user.set("password", newpassword); + user + .save() + .then(async () => { + let _user = user.toJSON(); + if (_user) { + await Parse.User.become(_user.sessionToken); + localStorage.setItem("accesstoken", _user.sessionToken); + } + setCurrentPassword(""); + setnewpassword(""); + setconfirmpassword(""); + alert(t("password-update-alert-1")); + }) + .catch((error) => { + console.log("err", error); + alert(t("something-went-wrong-mssg")); + }); + }); + } else { + alert(t("password-update-alert-2")); + } + }) + .catch((error) => { + alert(t("password-update-alert-3")); + console.error("Error while logging in user", error); + }); + } } else { alert(t("password-update-alert-4")); } @@ -80,34 +109,93 @@ function ChangePassword() { - setnewpassword(e.target.value)} - className="op-input op-input-bordered op-input-sm text-xs w-full" - placeholder={t("new-password")} - onInvalid={(e) => e.target.setCustomValidity(t("input-required"))} - onInput={(e) => e.target.setCustomValidity("")} - required - /> +
+ setnewpassword(e.target.value)} + className="op-input op-input-bordered op-input-sm text-xs w-full" + placeholder={t("new-password")} + onInvalid={(e) => + e.target.setCustomValidity(t("input-required")) + } + onInput={(e) => e.target.setCustomValidity("")} + required + /> + + {showNewPassword ? ( + // Close eye icon + ) : ( + // Open eye icon + )} + +
-
+ {confirmpassword.length > 0 && ( +
+ {newpassword.length > 0 && ( +

+ {newpassword === confirmpassword ? "✓" : "✗"}{" "} + {t("password-match-length")} +

+ )} +

+ {lengthValid ? "✓" : "✗"} {t("password-length")} +

+

+ {caseDigitValid ? "✓" : "✗"} {t("password-case")} +

+

+ {specialCharValid ? "✓" : "✗"} {t("password-special-char")} +

+
+ )}