From ff0883c8e6982a4c84a51e31a04a73d09e73576d Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 2 Aug 2024 16:22:44 +0530 Subject: [PATCH 1/2] fix: error handling of signpdf function --- apps/OpenSign/src/components/pdf/PdfHeader.js | 22 +- apps/OpenSign/src/constant/Utils.js | 63 ++-- apps/OpenSign/src/pages/PdfRequestFiles.js | 341 +++++++++--------- apps/OpenSign/src/pages/SignyourselfPdf.js | 64 ++-- .../OpenSign/src/pages/TemplatePlaceholder.js | 22 +- 5 files changed, 232 insertions(+), 280 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/PdfHeader.js b/apps/OpenSign/src/components/pdf/PdfHeader.js index c12085814..b2d01d3b3 100644 --- a/apps/OpenSign/src/components/pdf/PdfHeader.js +++ b/apps/OpenSign/src/components/pdf/PdfHeader.js @@ -414,19 +414,15 @@ function Header({ ) : isPublicTemplate ? ( - <> -
- -
- +
+ +
) : (

This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender " + - senderEmail + - " directly.If you think this email is inappropriate or spam, you may file a complaint with OpenSign™ here.

" - }; - await axios.post(url, params, { - headers: headers - }); - } catch (error) { - console.log("error", error); + const newIndex = index + 1; + const usermail = { + Email: pdfDetails?.[0]?.Placeholders[newIndex]?.email || "" + }; + const user = usermail?.Email + ? usermail + : pdfDetails?.[0]?.Signers[newIndex]; + if (sendmail !== "false" && sendInOrder) { + const requestBody = pdfDetails?.[0]?.RequestBody; + const requestSubject = pdfDetails?.[0]?.RequestSubject; + if (user) { + const expireDate = pdfDetails?.[0].ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString( + "en-US", + { + day: "numeric", + month: "long", + year: "numeric" } + ); + let senderEmail = pdfDetails?.[0].ExtUserPtr.Email; + let senderPhone = pdfDetails?.[0]?.ExtUserPtr?.Phone; + const senderName = `${pdfDetails?.[0].ExtUserPtr.Name}`; + + try { + const imgPng = + "https://qikinnovation.ams3.digitaloceanspaces.com/logo.png"; + let url = `${localStorage.getItem( + "baseUrl" + )}functions/sendmailv3`; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": + localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + }; + const objectId = user?.objectId; + const hostUrl = window.location.origin; + //encode this url value `${pdfDetails?.[0].objectId}/${user.Email}/${objectId}` to base64 using `btoa` function + let encodeBase64; + if (objectId) { + encodeBase64 = btoa( + `${pdfDetails?.[0].objectId}/${user.Email}/${objectId}` + ); + } else { + encodeBase64 = btoa( + `${pdfDetails?.[0].objectId}/${user.Email}` + ); + } + const hostPublicUrl = isStaging + ? "https://staging-app.opensignlabs.com" + : "https://app.opensignlabs.com"; + let signPdf = props?.templateId + ? `${hostPublicUrl}/login/${encodeBase64}` + : `${hostUrl}/login/${encodeBase64}`; + const openSignUrl = + "https://www.opensignlabs.com/contact-us"; + const orgName = pdfDetails[0]?.ExtUserPtr.Company + ? pdfDetails[0].ExtUserPtr.Company + : ""; + const themeBGcolor = themeColor; + let replaceVar; + if (requestBody && requestSubject && isSubscribed) { + const replacedRequestBody = requestBody.replace( + /"/g, + "'" + ); + const htmlReqBody = + "" + + replacedRequestBody + + " "; + + const variables = { + document_title: pdfDetails?.[0].Name, + sender_name: senderName, + sender_mail: senderEmail, + sender_phone: senderPhone, + receiver_name: user.Name, + receiver_email: user.Email, + receiver_phone: user.Phone, + expiry_date: localExpireDate, + company_name: orgName, + signing_url: `Sign here` + }; + replaceVar = replaceMailVaribles( + requestSubject, + htmlReqBody, + variables + ); + } + + let params = { + mailProvider: activeMailAdapter, + extUserId: extUserId, + recipient: user.Email, + subject: requestSubject + ? replaceVar?.subject + : `${pdfDetails?.[0].ExtUserPtr.Name} has requested you to sign "${pdfDetails?.[0].Name}"`, + from: senderEmail, + html: requestBody + ? replaceVar?.body + : "

Digital Signature Request

" + + pdfDetails?.[0].ExtUserPtr.Name + + " has requested you to review and sign " + + pdfDetails?.[0].Name + + ".

Sender " + + senderEmail + + "
Organization " + + orgName + + "
Expires on " + + localExpireDate + + "

This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender " + + senderEmail + + " directly.If you think this email is inappropriate or spam, you may file a complaint with OpenSign™ here.

" + }; + await axios.post(url, params, { + headers: headers + }); + } catch (error) { + console.log("error", error); } } - } else { - setIsAlert({ - isShow: true, - alertMessage: "something went wrong" - }); } - } catch (err) { - setIsAlert({ - isShow: true, - alertMessage: "something went wrong" - }); + } else { + setIsUiLoading(false); + setIsAlert({ isShow: true, alertMessage: resSign.message }); } } catch (err) { setIsUiLoading(false); @@ -1657,26 +1645,19 @@ function PdfRequestFiles(props) { requestSignTourFunction()} { - setIsAlert({ - isShow: false, - alertMessage: "" - }); - }} + title={"Alert"} + handleClose={() => + setIsAlert({ isShow: false, alertMessage: "" }) + } >

{isAlert.alertMessage}

-
diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.js b/apps/OpenSign/src/pages/SignyourselfPdf.js index 4f81bd83d..93b9591e7 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.js +++ b/apps/OpenSign/src/pages/SignyourselfPdf.js @@ -710,15 +710,28 @@ function SignYourSelf() { setIsUiLoading(false); if (err && err.message.includes("is encrypted.")) { setIsAlert({ + header: "Error", isShow: true, alertMessage: `Currently encrypted pdf files are not supported.` }); } else { - console.log("err in signing", err); - setIsAlert({ - isShow: true, - alertMessage: `Something went wrong.` - }); + console.log("err in signing", err.message); + if ( + err.message === + "PKCS#12 MAC could not be verified. Invalid password?" + ) { + setIsAlert({ + header: "Error", + isShow: true, + alertMessage: `PFX file password is invalid.` + }); + } else { + setIsAlert({ + header: "Error", + isShow: true, + alertMessage: `Something went wrong.` + }); + } } } } @@ -726,6 +739,7 @@ function SignYourSelf() { console.log("err in embedselfsign ", err); setIsUiLoading(false); setIsAlert({ + header: "Error", isShow: true, alertMessage: "something went wrong, please try again later." }); @@ -776,34 +790,19 @@ function SignYourSelf() { //remove suffiix of base64 const suffixbase64 = getNewse64 && getNewse64.split(",").pop(); - let singleSign = { + const params = { pdfFile: base64Url, docId: documentId, isCustomCompletionMail: isCustomCompletionMail, mailProvider: activeMailAdapter, signature: suffixbase64 }; - - await axios - .post(`${localStorage.getItem("baseUrl")}functions/signPdf`, singleSign, { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - // sessionToken: localStorage.getItem("accesstoken") - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - }) - .then((Listdata) => { - const json = Listdata.data; - - setPdfUrl(json.result.data); - if (json.result.data) { - getDocumentDetails(false); - } - }) - .catch((err) => { - console.log("axois err ", err); - }); + const resSignPdf = await Parse.Cloud.run("signPdf", params); + if (resSignPdf) { + const signedpdf = JSON.parse(JSON.stringify(resSignPdf)); + setPdfUrl(signedpdf); + getDocumentDetails(false); + } }; //function for save x and y position and show signature tab on that position @@ -1230,16 +1229,13 @@ function SignYourSelf() { setZoomPercent={setZoomPercent} zoomPercent={zoomPercent} /> -
+
{ - setIsAlert({ - isShow: false, - alertMessage: "" - }); - }} + handleClose={() => + setIsAlert({ isShow: false, alertMessage: "" }) + } >

{isAlert.alertMessage}

diff --git a/apps/OpenSign/src/pages/TemplatePlaceholder.js b/apps/OpenSign/src/pages/TemplatePlaceholder.js index e96cab49d..68e39dfc7 100644 --- a/apps/OpenSign/src/pages/TemplatePlaceholder.js +++ b/apps/OpenSign/src/pages/TemplatePlaceholder.js @@ -1317,7 +1317,7 @@ const TemplatePlaceholder = () => { setZoomPercent={setZoomPercent} zoomPercent={zoomPercent} /> -
+
{/* this modal is used show alert set placeholder for all signers before send mail */} { {currentEmail.length > 0 && ( <>
) : ( -
+
{
)} -
Date: Fri, 2 Aug 2024 17:11:02 +0530 Subject: [PATCH 2/2] fix: initial routing error in self-hosting --- apps/OpenSign/src/pages/Login.js | 14 +++---- apps/OpenSign/src/primitives/Validate.js | 37 ++++++++++--------- apps/OpenSign/src/primitives/ValidateRoute.js | 22 ++++++----- 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/apps/OpenSign/src/pages/Login.js b/apps/OpenSign/src/pages/Login.js index a2cc612f6..1b03909e8 100644 --- a/apps/OpenSign/src/pages/Login.js +++ b/apps/OpenSign/src/pages/Login.js @@ -44,16 +44,11 @@ function Login() { const [isLoginSSO, setIsLoginSSO] = useState(false); useEffect(() => { - if (localStorage.getItem("accesstoken")) { - setState({ ...state, loading: true }); - GetLoginData(); - } - dispatch(fetchAppInfo()); - saveLogo(); + checkUserExt(); // eslint-disable-next-line }, []); - const saveLogo = async () => { + const checkUserExt = async () => { const app = await getAppLogo(); if (!isEnableSubscription && app?.user === "not_exist") { navigate("/addadmin"); @@ -63,6 +58,11 @@ function Login() { } else { setImage(appInfo?.applogo || undefined); } + if (localStorage.getItem("accesstoken")) { + setState({ ...state, loading: true }); + GetLoginData(); + } + dispatch(fetchAppInfo()); }; const handleChange = (event) => { const { name, value } = event.target; diff --git a/apps/OpenSign/src/primitives/Validate.js b/apps/OpenSign/src/primitives/Validate.js index 805ff8c0f..76265e138 100644 --- a/apps/OpenSign/src/primitives/Validate.js +++ b/apps/OpenSign/src/primitives/Validate.js @@ -8,26 +8,27 @@ const Validate = () => { const [isUserValid, setIsUserValid] = useState(true); useEffect(() => { (async () => { - try { - const userDetails = JSON.parse( - localStorage.getItem( - `Parse/${localStorage.getItem("parseAppId")}/currentUser` - ) - ); - - // Use the session token to validate the user - const userQuery = new Parse.Query(Parse.User); - const user = await userQuery.get(userDetails?.objectId, { - sessionToken: localStorage.getItem("accesstoken") - }); - if (user) { - setIsUserValid(true); - } else { + if (localStorage.getItem("accesstoken")) { + try { + const userDetails = JSON.parse( + localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ) + ); + // Use the session token to validate the user + const userQuery = new Parse.Query(Parse.User); + const user = await userQuery.get(userDetails?.objectId, { + sessionToken: localStorage.getItem("accesstoken") + }); + if (user) { + setIsUserValid(true); + } else { + setIsUserValid(false); + } + } catch (error) { + // Session token is invalid or there was an error setIsUserValid(false); } - } catch (error) { - // Session token is invalid or there was an error - setIsUserValid(false); } })(); diff --git a/apps/OpenSign/src/primitives/ValidateRoute.js b/apps/OpenSign/src/primitives/ValidateRoute.js index e7339f532..0e85afed1 100644 --- a/apps/OpenSign/src/primitives/ValidateRoute.js +++ b/apps/OpenSign/src/primitives/ValidateRoute.js @@ -4,18 +4,20 @@ import { Outlet } from "react-router-dom"; const ValidateRoute = () => { useEffect(() => { (async () => { - try { - // Use the session token to validate the user - const userQuery = new Parse.Query(Parse.User); - const user = await userQuery.get(Parse?.User?.current()?.id, { - sessionToken: localStorage.getItem("accesstoken") - }); - if (!user) { + if (localStorage.getItem("accesstoken")) { + try { + // Use the session token to validate the user + const userQuery = new Parse.Query(Parse.User); + const user = await userQuery.get(Parse?.User?.current()?.id, { + sessionToken: localStorage.getItem("accesstoken") + }); + if (!user) { + handlelogout(); + } + } catch (error) { + console.log("err in validate route", error); handlelogout(); } - } catch (error) { - console.log("err in validate route", error); - handlelogout(); } })(); }, []);