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.
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
- />
+
+ {newpassword === confirmpassword ? "✓" : "✗"}{" "} + {t("password-match-length")} +
+ )} ++ {lengthValid ? "✓" : "✗"} {t("password-length")} +
++ {caseDigitValid ? "✓" : "✗"} {t("password-case")} +
++ {specialCharValid ? "✓" : "✗"} {t("password-special-char")} +
+