{"id":21969,"date":"2026-05-03T10:35:55","date_gmt":"2026-05-03T10:35:55","guid":{"rendered":"https:\/\/www.salvatorerobuschi.com\/reserved-area\/recupero-password\/"},"modified":"2026-06-05T07:38:35","modified_gmt":"2026-06-05T07:38:35","slug":"password-reset","status":"publish","type":"page","link":"https:\/\/www.salvatorerobuschi.com\/en\/reserved-area\/password-reset\/","title":{"rendered":"Password reset"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"21969\" class=\"elementor elementor-21969 elementor-20020\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-669ecc2 e-con-full e-flex e-con e-parent\" data-id=\"669ecc2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-39b9b34 elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget elementor-widget-heading\" data-id=\"39b9b34\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Need to change your <span style=\"color: #e4002b\">password?<\/span><\/h1>\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-571f546 e-con-full e-flex e-con e-child\" data-id=\"571f546\" data-element_type=\"container\" data-e-type=\"container\" id=\"iu-container\">\n\t\t<div class=\"elementor-element elementor-element-9da32f5 e-con-full e-flex e-con e-child\" data-id=\"9da32f5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-abee6aa elementor-widget elementor-widget-text-editor\" data-id=\"abee6aa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Enter your <span style=\"color: #e4002b;\">username<\/span> and click <span style=\"color: #e4002b;\">next<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c4719cf elementor-button-align-start elementor-mobile-button-align-start elementor-widget elementor-widget-form\" data-id=\"c4719cf\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;step_next_label&quot;:&quot;Next&quot;,&quot;step_previous_label&quot;:&quot;Previous&quot;,&quot;step_type&quot;:&quot;none&quot;,&quot;step_icon_shape&quot;:&quot;circle&quot;}\" data-widget_type=\"form.default\">\n\t\t\t\t\t\t\t<form class=\"elementor-form\" method=\"post\" name=\"Inserisci nome utente\" aria-label=\"Inserisci nome utente\">\n\t\t\t<input type=\"hidden\" name=\"post_id\" value=\"21969\"\/>\n\t\t\t<input type=\"hidden\" name=\"form_id\" value=\"c4719cf\"\/>\n\t\t\t<input type=\"hidden\" name=\"referer_title\" value=\"Download area password reset | Salvatore Robuschi Pumps\" \/>\n\n\t\t\t\t\t\t\t<input type=\"hidden\" name=\"queried_id\" value=\"21969\"\/>\n\t\t\t\n\t\t\t<div class=\"elementor-form-fields-wrapper elementor-labels-above\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-text elementor-field-group elementor-column elementor-field-group-username elementor-col-100 elementor-field-required elementor-mark-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"text\" name=\"form_fields[username]\" id=\"form-field-username\" class=\"elementor-field elementor-size-md  elementor-field-textual\" placeholder=\"Username *\" required=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons\">\n\t\t\t\t\t<button class=\"elementor-button elementor-size-sm\" type=\"submit\" id=\"iu-submit\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Next<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/button>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/form>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c93a748 elementor-widget elementor-widget-text-editor\" data-id=\"c93a748\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"iu-service-error\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Service temporarily unavailable<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-31d5534 elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-shortcode\" data-id=\"31d5534\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><script>\r\n\r\ndocument.getElementById(\"mnemosyne-submit\").addEventListener(\"click\", async function (e) {\r\n\r\n    \/\/ 1. Prevent the default form submission so the page doesn't reload\r\n\r\n    e.preventDefault();\r\n\r\n\r\n\r\n    \/\/ 2. Grab the input elements\r\n\r\n    const usernameInput = document.getElementById(\"form-field-username\");\r\n\r\n    const passwordInput = document.getElementById(\"form-field-password\");\r\n\r\n\r\n\r\n    \/\/ Grab the warning elements\r\n\r\n    const warningEmpty = document.getElementById(\"warning-empty\");\r\n\r\n    const warningCredentials = document.getElementById(\"warning-credentials\");\r\n\r\n    const warningNetwork = document.getElementById(\"warning-network\");\r\n\r\n    \r\n\r\n    \/\/ SHORTCODE ATTRIBUTES\r\n\r\n    const redirectUrl = \"\/en\/reserved-area\";\r\n\r\n    const otpVerificationPage = \"\";\r\n\r\n    \r\n\r\n    \/\/ Use .trim() to ensure they didn't just type spaces\r\n\r\n    const username = usernameInput ? usernameInput.value.trim() : \"\";\r\n\r\n    const password = passwordInput ? passwordInput.value : \"\";\r\n\r\n\r\n\r\n    \/\/ RESET: Hide all warnings at the start of every submission attempt\r\n\r\n    if (warningEmpty) warningEmpty.style.display = \"none\";\r\n\r\n    if (warningCredentials) warningCredentials.style.display = \"none\";\r\n\r\n    if (warningNetwork) warningNetwork.style.display = \"none\";\r\n\r\n\r\n\r\n    \/\/ 3. Validation check\r\n\r\n    if (username === \"\" || password === \"\") {\r\n\r\n        console.log(\"vuoto: Username or password is empty\");\r\n\r\n        \r\n\r\n        \/\/ Show empty fields warning\r\n\r\n        if (warningEmpty) warningEmpty.style.display = \"block\"; \r\n\r\n        \r\n\r\n        return; \/\/ Stop the script\r\n\r\n    }\r\n\r\n\r\n\r\n    \/\/ 4. Set up your REST API endpoint\r\n\r\n    const apiUrl = \"https:\/\/drawings.salvatorerobuschi.com\/auth\/login\"; \r\n\r\n\r\n\r\n    try {\r\n\r\n        \/\/ 5. Call the REST API to get the JWT\r\n\r\n        const response = await fetch(apiUrl, {\r\n\r\n            method: \"POST\",\r\n\r\n            headers: {\r\n\r\n                \"Content-Type\": \"application\/json\",\r\n\r\n                \"Accept\": \"application\/json\"\r\n\r\n            },\r\n\r\n            body: JSON.stringify({\r\n\r\n                username: username,\r\n\r\n                password: password\r\n\r\n            })\r\n\r\n        });\r\n\r\n\r\n\r\n        const data = await response.json();\r\n\r\n\r\n\r\n        \/\/ 6. Handle the API response\r\n\r\n        if (response.ok) {\r\n\r\n            \/\/ Success! The API returned a 2xx status code.\r\n\r\n            console.log(\"Authentication successful!\");\r\n\r\n            \r\n\r\n            \/\/ Extract the token\r\n\r\n            const token = data.token; \r\n\r\n\r\n\r\n            \/\/ Save the JWT and Username to localStorage\r\n\r\n            localStorage.setItem(\"mnemosyne_jwt\", token);\r\n\r\n            localStorage.setItem(\"mnemosyne_username\", username);\r\n\r\n            \r\n\r\n            console.log(\"JWT and Username recovered and saved.\");\r\n\r\n            \r\n\r\n            \/\/ Redirect the user\r\n\r\n            window.location.href = redirectUrl;\r\n\r\n            \r\n\r\n        } else {\r\n\r\n            \/\/ Check if it's the specific OTP unverified error\r\n\r\n            if (response.status === 403 && data.message === \"Invalid OTP\") {\r\n\r\n                console.warn(\"User not verified. Redirecting to OTP verification.\");\r\n\r\n                \r\n\r\n                \/\/ Save the email to local storage so the verify-otp page can use it\r\n\r\n                if (data.email) {\r\n\r\n                    localStorage.setItem(\"mnemosyne_email\", data.email);\r\n\r\n                }\r\n\r\n                \r\n\r\n                \/\/ Redirect to OTP verification page\r\n\r\n                window.location.href = otpVerificationPage;\r\n\r\n                return; \/\/ Stop further execution\r\n\r\n            }\r\n\r\n\r\n\r\n            \/\/ Auth Error: Standard invalid credentials\r\n\r\n            console.error(\"Authentication failed:\", data.message || data.error);\r\n\r\n            \r\n\r\n            \/\/ Show the wrong credentials warning\r\n\r\n            if (warningCredentials) warningCredentials.style.display = \"block\";\r\n\r\n        }\r\n\r\n\r\n\r\n    } catch (error) {\r\n\r\n        \/\/ Network Error: Catch network errors (e.g., CORS issues, server down)\r\n\r\n        console.error(\"Network error while calling the API:\", error);\r\n\r\n        \r\n\r\n        \/\/ Show the network error warning\r\n\r\n        if (warningNetwork) warningNetwork.style.display = \"block\";\r\n\r\n    }\r\n\r\n});\r\n\r\n<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-03f1ddc e-con-full e-flex e-con e-child\" data-id=\"03f1ddc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c99c47f elementor-widget elementor-widget-heading\" data-id=\"c99c47f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Helpful links<\/p>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-640930b elementor-widget elementor-widget-text-editor\" data-id=\"640930b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Already have an account? <a href=\"\/en\/reserved-area\/login\/\">Log in<\/a><br \/>Don&#8217;t have an account? <a href=\"\/en\/reserved-area\/register\">Register<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-57a41c8 e-con-full e-flex e-con e-child\" data-id=\"57a41c8\" data-element_type=\"container\" data-e-type=\"container\" id=\"sq-container\">\n\t\t<div class=\"elementor-element elementor-element-caa9fa2 e-con-full e-flex e-con e-child\" data-id=\"caa9fa2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5029dfe elementor-widget elementor-widget-text-editor\" data-id=\"5029dfe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Enter the answer to your <span style=\"color: #e4002b;\">security question<\/span> and click <span style=\"color: #e4002b;\">next<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-348c3db elementor-button-align-start elementor-mobile-button-align-start elementor-widget elementor-widget-form\" data-id=\"348c3db\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;step_next_label&quot;:&quot;Next&quot;,&quot;step_previous_label&quot;:&quot;Previous&quot;,&quot;step_type&quot;:&quot;none&quot;,&quot;step_icon_shape&quot;:&quot;circle&quot;}\" data-widget_type=\"form.default\">\n\t\t\t\t\t\t\t<form class=\"elementor-form\" method=\"post\" name=\"Domanda di sicurezza\" aria-label=\"Domanda di sicurezza\">\n\t\t\t<input type=\"hidden\" name=\"post_id\" value=\"21969\"\/>\n\t\t\t<input type=\"hidden\" name=\"form_id\" value=\"348c3db\"\/>\n\t\t\t<input type=\"hidden\" name=\"referer_title\" value=\"Download area password reset | Salvatore Robuschi Pumps\" \/>\n\n\t\t\t\t\t\t\t<input type=\"hidden\" name=\"queried_id\" value=\"21969\"\/>\n\t\t\t\n\t\t\t<div class=\"elementor-form-fields-wrapper elementor-labels-above\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-text elementor-field-group elementor-column elementor-field-group-securityquestion elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"text\" name=\"form_fields[securityquestion]\" id=\"form-field-securityquestion\" class=\"elementor-field elementor-size-md  elementor-field-textual\" placeholder=\"Security question\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-text elementor-field-group elementor-column elementor-field-group-securityanswer elementor-col-100 elementor-field-required elementor-mark-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"text\" name=\"form_fields[securityanswer]\" id=\"form-field-securityanswer\" class=\"elementor-field elementor-size-md  elementor-field-textual\" placeholder=\"Security answer *\" required=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons\">\n\t\t\t\t\t<button class=\"elementor-button elementor-size-sm\" type=\"submit\" id=\"sq-submit\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Next<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/button>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/form>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3239c81 elementor-widget elementor-widget-text-editor\" data-id=\"3239c81\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"sq-incomplete\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>You must answer the question to proceed<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-136415c elementor-widget elementor-widget-text-editor\" data-id=\"136415c\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"sq-success\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>If the answer is correct and the account exists, you will <span style=\"color: #e4002b;\">receive an email<\/span> with a <span style=\"color: #e4002b;\">password reset link<\/span>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-261cebc elementor-widget elementor-widget-text-editor\" data-id=\"261cebc\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"sq-service-error\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The service is temporarily unavailable<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-312fe8c elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-shortcode\" data-id=\"312fe8c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><script>\r\n\r\ndocument.getElementById(\"mnemosyne-submit\").addEventListener(\"click\", async function (e) {\r\n\r\n    \/\/ 1. Prevent the default form submission so the page doesn't reload\r\n\r\n    e.preventDefault();\r\n\r\n\r\n\r\n    \/\/ 2. Grab the input elements\r\n\r\n    const usernameInput = document.getElementById(\"form-field-username\");\r\n\r\n    const passwordInput = document.getElementById(\"form-field-password\");\r\n\r\n\r\n\r\n    \/\/ Grab the warning elements\r\n\r\n    const warningEmpty = document.getElementById(\"warning-empty\");\r\n\r\n    const warningCredentials = document.getElementById(\"warning-credentials\");\r\n\r\n    const warningNetwork = document.getElementById(\"warning-network\");\r\n\r\n    \r\n\r\n    \/\/ SHORTCODE ATTRIBUTES\r\n\r\n    const redirectUrl = \"\/en\/reserved-area\";\r\n\r\n    const otpVerificationPage = \"\";\r\n\r\n    \r\n\r\n    \/\/ Use .trim() to ensure they didn't just type spaces\r\n\r\n    const username = usernameInput ? usernameInput.value.trim() : \"\";\r\n\r\n    const password = passwordInput ? passwordInput.value : \"\";\r\n\r\n\r\n\r\n    \/\/ RESET: Hide all warnings at the start of every submission attempt\r\n\r\n    if (warningEmpty) warningEmpty.style.display = \"none\";\r\n\r\n    if (warningCredentials) warningCredentials.style.display = \"none\";\r\n\r\n    if (warningNetwork) warningNetwork.style.display = \"none\";\r\n\r\n\r\n\r\n    \/\/ 3. Validation check\r\n\r\n    if (username === \"\" || password === \"\") {\r\n\r\n        console.log(\"vuoto: Username or password is empty\");\r\n\r\n        \r\n\r\n        \/\/ Show empty fields warning\r\n\r\n        if (warningEmpty) warningEmpty.style.display = \"block\"; \r\n\r\n        \r\n\r\n        return; \/\/ Stop the script\r\n\r\n    }\r\n\r\n\r\n\r\n    \/\/ 4. Set up your REST API endpoint\r\n\r\n    const apiUrl = \"https:\/\/drawings.salvatorerobuschi.com\/auth\/login\"; \r\n\r\n\r\n\r\n    try {\r\n\r\n        \/\/ 5. Call the REST API to get the JWT\r\n\r\n        const response = await fetch(apiUrl, {\r\n\r\n            method: \"POST\",\r\n\r\n            headers: {\r\n\r\n                \"Content-Type\": \"application\/json\",\r\n\r\n                \"Accept\": \"application\/json\"\r\n\r\n            },\r\n\r\n            body: JSON.stringify({\r\n\r\n                username: username,\r\n\r\n                password: password\r\n\r\n            })\r\n\r\n        });\r\n\r\n\r\n\r\n        const data = await response.json();\r\n\r\n\r\n\r\n        \/\/ 6. Handle the API response\r\n\r\n        if (response.ok) {\r\n\r\n            \/\/ Success! The API returned a 2xx status code.\r\n\r\n            console.log(\"Authentication successful!\");\r\n\r\n            \r\n\r\n            \/\/ Extract the token\r\n\r\n            const token = data.token; \r\n\r\n\r\n\r\n            \/\/ Save the JWT and Username to localStorage\r\n\r\n            localStorage.setItem(\"mnemosyne_jwt\", token);\r\n\r\n            localStorage.setItem(\"mnemosyne_username\", username);\r\n\r\n            \r\n\r\n            console.log(\"JWT and Username recovered and saved.\");\r\n\r\n            \r\n\r\n            \/\/ Redirect the user\r\n\r\n            window.location.href = redirectUrl;\r\n\r\n            \r\n\r\n        } else {\r\n\r\n            \/\/ Check if it's the specific OTP unverified error\r\n\r\n            if (response.status === 403 && data.message === \"Invalid OTP\") {\r\n\r\n                console.warn(\"User not verified. Redirecting to OTP verification.\");\r\n\r\n                \r\n\r\n                \/\/ Save the email to local storage so the verify-otp page can use it\r\n\r\n                if (data.email) {\r\n\r\n                    localStorage.setItem(\"mnemosyne_email\", data.email);\r\n\r\n                }\r\n\r\n                \r\n\r\n                \/\/ Redirect to OTP verification page\r\n\r\n                window.location.href = otpVerificationPage;\r\n\r\n                return; \/\/ Stop further execution\r\n\r\n            }\r\n\r\n\r\n\r\n            \/\/ Auth Error: Standard invalid credentials\r\n\r\n            console.error(\"Authentication failed:\", data.message || data.error);\r\n\r\n            \r\n\r\n            \/\/ Show the wrong credentials warning\r\n\r\n            if (warningCredentials) warningCredentials.style.display = \"block\";\r\n\r\n        }\r\n\r\n\r\n\r\n    } catch (error) {\r\n\r\n        \/\/ Network Error: Catch network errors (e.g., CORS issues, server down)\r\n\r\n        console.error(\"Network error while calling the API:\", error);\r\n\r\n        \r\n\r\n        \/\/ Show the network error warning\r\n\r\n        if (warningNetwork) warningNetwork.style.display = \"block\";\r\n\r\n    }\r\n\r\n});\r\n\r\n<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6639008 e-con-full e-flex e-con e-child\" data-id=\"6639008\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3ee9705 elementor-widget elementor-widget-heading\" data-id=\"3ee9705\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Helpful links<\/p>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e8a0cee elementor-widget elementor-widget-text-editor\" data-id=\"e8a0cee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Already have an account? <a href=\"\/en\/reserved-area\/login\/\">Log in<\/a><br \/>Don&#8217;t have an account? <a href=\"\/en\/reserved-area\/register\">Register<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3129462 e-con-full e-flex e-con e-child\" data-id=\"3129462\" data-element_type=\"container\" data-e-type=\"container\" id=\"pc-container\">\n\t\t<div class=\"elementor-element elementor-element-e0d5fa1 e-con-full e-flex e-con e-child\" data-id=\"e0d5fa1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-df349a8 elementor-widget elementor-widget-text-editor\" data-id=\"df349a8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Enter and confirm your <span style=\"color: #e4002b;\">new password<\/span>, then click <span style=\"color: #e4002b;\">next<\/span>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3c9a095 elementor-button-align-start elementor-mobile-button-align-start elementor-widget elementor-widget-form\" data-id=\"3c9a095\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;step_next_label&quot;:&quot;Next&quot;,&quot;step_previous_label&quot;:&quot;Previous&quot;,&quot;step_type&quot;:&quot;none&quot;,&quot;step_icon_shape&quot;:&quot;circle&quot;}\" data-widget_type=\"form.default\">\n\t\t\t\t\t\t\t<form class=\"elementor-form\" method=\"post\" name=\"Modifica password\" aria-label=\"Modifica password\">\n\t\t\t<input type=\"hidden\" name=\"post_id\" value=\"21969\"\/>\n\t\t\t<input type=\"hidden\" name=\"form_id\" value=\"3c9a095\"\/>\n\t\t\t<input type=\"hidden\" name=\"referer_title\" value=\"Download area password reset | Salvatore Robuschi Pumps\" \/>\n\n\t\t\t\t\t\t\t<input type=\"hidden\" name=\"queried_id\" value=\"21969\"\/>\n\t\t\t\n\t\t\t<div class=\"elementor-form-fields-wrapper elementor-labels-above\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-password elementor-field-group elementor-column elementor-field-group-pcpassword elementor-col-100 elementor-field-required elementor-mark-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"password\" name=\"form_fields[pcpassword]\" id=\"form-field-pcpassword\" class=\"elementor-field elementor-size-md  elementor-field-textual\" placeholder=\"Password *\" required=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-password elementor-field-group elementor-column elementor-field-group-pcpasswordconfirm elementor-col-100 elementor-field-required elementor-mark-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"password\" name=\"form_fields[pcpasswordconfirm]\" id=\"form-field-pcpasswordconfirm\" class=\"elementor-field elementor-size-md  elementor-field-textual\" placeholder=\"Confirm password *\" required=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons\">\n\t\t\t\t\t<button class=\"elementor-button elementor-size-sm\" type=\"submit\" id=\"pc-submit\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Next<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/button>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/form>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d93438f elementor-widget elementor-widget-text-editor\" data-id=\"d93438f\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"pc-mandatory\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Both fields are required<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1ea0a12 elementor-widget elementor-widget-text-editor\" data-id=\"1ea0a12\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"pc-service-error\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The service is temporarily unavailable<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0be489c elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-shortcode\" data-id=\"0be489c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><script>\r\n\r\ndocument.getElementById(\"mnemosyne-submit\").addEventListener(\"click\", async function (e) {\r\n\r\n    \/\/ 1. Prevent the default form submission so the page doesn't reload\r\n\r\n    e.preventDefault();\r\n\r\n\r\n\r\n    \/\/ 2. Grab the input elements\r\n\r\n    const usernameInput = document.getElementById(\"form-field-username\");\r\n\r\n    const passwordInput = document.getElementById(\"form-field-password\");\r\n\r\n\r\n\r\n    \/\/ Grab the warning elements\r\n\r\n    const warningEmpty = document.getElementById(\"warning-empty\");\r\n\r\n    const warningCredentials = document.getElementById(\"warning-credentials\");\r\n\r\n    const warningNetwork = document.getElementById(\"warning-network\");\r\n\r\n    \r\n\r\n    \/\/ SHORTCODE ATTRIBUTES\r\n\r\n    const redirectUrl = \"\/en\/reserved-area\";\r\n\r\n    const otpVerificationPage = \"\";\r\n\r\n    \r\n\r\n    \/\/ Use .trim() to ensure they didn't just type spaces\r\n\r\n    const username = usernameInput ? usernameInput.value.trim() : \"\";\r\n\r\n    const password = passwordInput ? passwordInput.value : \"\";\r\n\r\n\r\n\r\n    \/\/ RESET: Hide all warnings at the start of every submission attempt\r\n\r\n    if (warningEmpty) warningEmpty.style.display = \"none\";\r\n\r\n    if (warningCredentials) warningCredentials.style.display = \"none\";\r\n\r\n    if (warningNetwork) warningNetwork.style.display = \"none\";\r\n\r\n\r\n\r\n    \/\/ 3. Validation check\r\n\r\n    if (username === \"\" || password === \"\") {\r\n\r\n        console.log(\"vuoto: Username or password is empty\");\r\n\r\n        \r\n\r\n        \/\/ Show empty fields warning\r\n\r\n        if (warningEmpty) warningEmpty.style.display = \"block\"; \r\n\r\n        \r\n\r\n        return; \/\/ Stop the script\r\n\r\n    }\r\n\r\n\r\n\r\n    \/\/ 4. Set up your REST API endpoint\r\n\r\n    const apiUrl = \"https:\/\/drawings.salvatorerobuschi.com\/auth\/login\"; \r\n\r\n\r\n\r\n    try {\r\n\r\n        \/\/ 5. Call the REST API to get the JWT\r\n\r\n        const response = await fetch(apiUrl, {\r\n\r\n            method: \"POST\",\r\n\r\n            headers: {\r\n\r\n                \"Content-Type\": \"application\/json\",\r\n\r\n                \"Accept\": \"application\/json\"\r\n\r\n            },\r\n\r\n            body: JSON.stringify({\r\n\r\n                username: username,\r\n\r\n                password: password\r\n\r\n            })\r\n\r\n        });\r\n\r\n\r\n\r\n        const data = await response.json();\r\n\r\n\r\n\r\n        \/\/ 6. Handle the API response\r\n\r\n        if (response.ok) {\r\n\r\n            \/\/ Success! The API returned a 2xx status code.\r\n\r\n            console.log(\"Authentication successful!\");\r\n\r\n            \r\n\r\n            \/\/ Extract the token\r\n\r\n            const token = data.token; \r\n\r\n\r\n\r\n            \/\/ Save the JWT and Username to localStorage\r\n\r\n            localStorage.setItem(\"mnemosyne_jwt\", token);\r\n\r\n            localStorage.setItem(\"mnemosyne_username\", username);\r\n\r\n            \r\n\r\n            console.log(\"JWT and Username recovered and saved.\");\r\n\r\n            \r\n\r\n            \/\/ Redirect the user\r\n\r\n            window.location.href = redirectUrl;\r\n\r\n            \r\n\r\n        } else {\r\n\r\n            \/\/ Check if it's the specific OTP unverified error\r\n\r\n            if (response.status === 403 && data.message === \"Invalid OTP\") {\r\n\r\n                console.warn(\"User not verified. Redirecting to OTP verification.\");\r\n\r\n                \r\n\r\n                \/\/ Save the email to local storage so the verify-otp page can use it\r\n\r\n                if (data.email) {\r\n\r\n                    localStorage.setItem(\"mnemosyne_email\", data.email);\r\n\r\n                }\r\n\r\n                \r\n\r\n                \/\/ Redirect to OTP verification page\r\n\r\n                window.location.href = otpVerificationPage;\r\n\r\n                return; \/\/ Stop further execution\r\n\r\n            }\r\n\r\n\r\n\r\n            \/\/ Auth Error: Standard invalid credentials\r\n\r\n            console.error(\"Authentication failed:\", data.message || data.error);\r\n\r\n            \r\n\r\n            \/\/ Show the wrong credentials warning\r\n\r\n            if (warningCredentials) warningCredentials.style.display = \"block\";\r\n\r\n        }\r\n\r\n\r\n\r\n    } catch (error) {\r\n\r\n        \/\/ Network Error: Catch network errors (e.g., CORS issues, server down)\r\n\r\n        console.error(\"Network error while calling the API:\", error);\r\n\r\n        \r\n\r\n        \/\/ Show the network error warning\r\n\r\n        if (warningNetwork) warningNetwork.style.display = \"block\";\r\n\r\n    }\r\n\r\n});\r\n\r\n<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-35e7bd6 e-con-full e-flex e-con e-child\" data-id=\"35e7bd6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d58e115 elementor-widget elementor-widget-heading\" data-id=\"d58e115\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Helpful links<\/p>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c98dbe4 elementor-widget elementor-widget-text-editor\" data-id=\"c98dbe4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Already have an account? <a href=\"\/en\/reserved-area\/login\/\">Log in<\/a><br \/>Don&#8217;t have an account? <a href=\"\/en\/reserved-area\/register\">Register<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-46ef28a e-con-full e-flex e-con e-child\" data-id=\"46ef28a\" data-element_type=\"container\" data-e-type=\"container\" id=\"password-changed-container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b56b5b1 elementor-widget elementor-widget-text-editor\" data-id=\"b56b5b1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Your password has been <span style=\"color: #e4002b;\">successfully changed<\/span>. You can now access the <span style=\"color: #e4002b;\">download area<\/span>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9c1e5db elementor-widget elementor-widget-button\" data-id=\"9c1e5db\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/www.salvatorerobuschi.com\/en\/reserved-area\/login\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" id=\"a\" data-name=\"Livello 1\" viewBox=\"0 0 500 500\"><path id=\"b\" data-name=\"Tracciato 24\" d=\"M0,273.64h405.31l-145.15,134.84,32.19,34.59,207.64-193.04L292.36,56.93l-32.19,34.56,145.09,134.84H0v47.3Z\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Log in<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-34db3d2 e-con-full e-flex e-con e-child\" data-id=\"34db3d2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8394221 elementor-widget elementor-widget-shortcode\" data-id=\"8394221\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><script>\r\ndocument.addEventListener('DOMContentLoaded', function () {\r\n    \/\/ --- Configuration ---\r\n    const API_BASE = \"https:\/\/drawings.salvatorerobuschi.com\";\r\n    const urlParams = new URLSearchParams(window.location.search);\r\n    const resetToken = urlParams.get('code'); \/\/ Check for ?code=\r\n\r\n    \/\/ --- Containers ---\r\n    const containers = {\r\n        username: document.getElementById('iu-container'),\r\n        security: document.getElementById('sq-container'),\r\n        password: document.getElementById('pc-container'),\r\n        success: document.getElementById('password-changed-container')\r\n    };\r\n\r\n    \/\/ --- Inputs & Buttons ---\r\n    const fields = {\r\n        username: document.getElementById('form-field-username'),\r\n        displayQuestion: document.getElementById('form-field-securityquestion'),\r\n        answer: document.getElementById('form-field-securityanswer'),\r\n        newPass: document.getElementById('form-field-pcpassword'),\r\n        confirmPass: document.getElementById('form-field-pcpasswordconfirm')\r\n    };\r\n\r\n    const buttons = {\r\n        username: document.getElementById('iu-submit'),\r\n        security: document.getElementById('sq-submit'),\r\n        password: document.getElementById('pc-submit')\r\n    };\r\n\r\n    \/\/ --- Error\/Status Msgs ---\r\n    const status = {\r\n        iuError: document.getElementById('iu-service-error'),\r\n        sqIncomplete: document.getElementById('sq-incomplete'),\r\n        sqSuccess: document.getElementById('sq-success'),\r\n        sqError: document.getElementById('sq-service-error'),\r\n        pcMandatory: document.getElementById('pc-mandatory'),\r\n        pcError: document.getElementById('pc-service-error')\r\n    };\r\n\r\n    \/\/ --- Helper: UI Logic ---\r\n    function showStep(stepName) {\r\n        Object.values(containers).forEach(el => { if(el) el.style.display = 'none'; });\r\n        if (containers[stepName]) containers[stepName].style.display = 'flex';\r\n    }\r\n\r\n    function hideAllErrors() {\r\n        Object.values(status).forEach(el => { if(el) el.style.display = 'none'; });\r\n    }\r\n\r\n    \/\/ --- Initialization ---\r\n    hideAllErrors();\r\n    if (fields.displayQuestion) fields.displayQuestion.readOnly = true;\r\n\r\n    if (resetToken) {\r\n        showStep('password');\r\n    } else {\r\n        showStep('username');\r\n    }\r\n\r\n    \/\/ --- STEP 1: Request Question ---\r\n    if (buttons.username) {\r\n        buttons.username.addEventListener('click', async function (e) {\r\n            e.preventDefault();\r\n            hideAllErrors();\r\n            const identifier = fields.username.value.trim();\r\n\r\n            if (!identifier) return;\r\n\r\n            try {\r\n                const response = await fetch(`${API_BASE}\/auth\/recovery\/question`, {\r\n                    method: 'POST',\r\n                    headers: { 'Content-Type': 'application\/json' },\r\n                    body: JSON.stringify({ identifier })\r\n                });\r\n\r\n                const data = await response.json();\r\n\r\n                if (response.ok) {\r\n                    fields.displayQuestion.value = data.question;\r\n                    showStep('security');\r\n                } else {\r\n                    if (status.iuError) status.iuError.style.display = 'block';\r\n                }\r\n            } catch (err) {\r\n                if (status.iuError) status.iuError.style.display = 'block';\r\n            }\r\n        });\r\n    }\r\n\r\n    \/\/ --- STEP 2: Submit Answer (Request Email) ---\r\n    if (buttons.security) {\r\n        buttons.security.addEventListener('click', async function (e) {\r\n            e.preventDefault();\r\n            hideAllErrors();\r\n            \r\n            const identifier = fields.username.value.trim();\r\n            const secretAnswer = fields.answer.value.trim();\r\n\r\n            if (!secretAnswer) {\r\n                if (status.sqIncomplete) status.sqIncomplete.style.display = 'block';\r\n                return;\r\n            }\r\n\r\n            try {\r\n                const response = await fetch(`${API_BASE}\/auth\/recovery\/request`, {\r\n                    method: 'POST',\r\n                    headers: { 'Content-Type': 'application\/json' },\r\n                    body: JSON.stringify({ identifier, secretAnswer })\r\n                });\r\n\r\n                const data = await response.json();\r\n\r\n                if (response.ok) {\r\n                    if (status.sqSuccess) status.sqSuccess.style.display = 'block';\r\n                    \/\/ Optional: disable button to prevent multiple emails\r\n                    buttons.security.disabled = true;\r\n                } else {\r\n                    if (status.sqError) status.sqError.style.display = 'block';\r\n                }\r\n            } catch (err) {\r\n                if (status.sqError) status.sqError.style.display = 'block';\r\n            }\r\n        });\r\n    }\r\n\r\n    \/\/ --- STEP 3: Change Password ---\r\n    if (buttons.password) {\r\n        buttons.password.addEventListener('click', async function (e) {\r\n            e.preventDefault();\r\n            hideAllErrors();\r\n\r\n            const pass = fields.newPass.value;\r\n            const confirm = fields.confirmPass.value;\r\n\r\n            if (!pass || pass !== confirm) {\r\n                if (status.pcMandatory) status.pcMandatory.style.display = 'block';\r\n                return;\r\n            }\r\n\r\n            try {\r\n                const response = await fetch(`${API_BASE}\/auth\/recovery\/reset`, {\r\n                    method: 'POST',\r\n                    headers: { 'Content-Type': 'application\/json' },\r\n                    body: JSON.stringify({\r\n                        token: resetToken,\r\n                        newPassword: pass\r\n                    })\r\n                });\r\n\r\n                if (response.ok) {\r\n                    showStep('success');\r\n                } else {\r\n                    if (status.pcError) status.pcError.style.display = 'block';\r\n                }\r\n            } catch (err) {\r\n                if (status.pcError) status.pcError.style.display = 'block';\r\n            }\r\n        });\r\n    }\r\n});<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Need to change your password? Enter your username and click next Service temporarily unavailable Helpful links Already have an account? Log inDon&#8217;t have an account? Register Enter the answer to your security question and click next You must answer the question to proceed If the answer is correct and the account exists, you will receive [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":21836,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_wds_title":"Download area password reset | Salvatore Robuschi Pumps","_wds_metadesc":"Forgot your password? Follow the steps to reset your credentials and regain access to the Salvatore Robuschi reserved area for CAD drawings.","_wds_focus-keywords":"salvatore robuschi password reset,reserved area password reset,reset credentials","_wds_meta-robots-adv":"","_wds_meta-robots-noindex":false,"_wds_meta-robots-nofollow":false,"_wds_meta-robots-index":false,"_wds_meta-robots-follow":false,"_wds_autolinks-exclude":false,"_wds_canonical":"","_wds_opengraph":[],"_wds_twitter":[],"footnotes":""},"class_list":["post-21969","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.salvatorerobuschi.com\/en\/wp-json\/wp\/v2\/pages\/21969","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvatorerobuschi.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.salvatorerobuschi.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.salvatorerobuschi.com\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.salvatorerobuschi.com\/en\/wp-json\/wp\/v2\/comments?post=21969"}],"version-history":[{"count":5,"href":"https:\/\/www.salvatorerobuschi.com\/en\/wp-json\/wp\/v2\/pages\/21969\/revisions"}],"predecessor-version":[{"id":23616,"href":"https:\/\/www.salvatorerobuschi.com\/en\/wp-json\/wp\/v2\/pages\/21969\/revisions\/23616"}],"up":[{"embeddable":true,"href":"https:\/\/www.salvatorerobuschi.com\/en\/wp-json\/wp\/v2\/pages\/21836"}],"wp:attachment":[{"href":"https:\/\/www.salvatorerobuschi.com\/en\/wp-json\/wp\/v2\/media?parent=21969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}