Skip to content

Commit 9ba05d2

Browse files
Merge pull request #676 from OpenSignLabs/guestsign_url
fix: issue of url encoded parameter in guest login url
2 parents a7dd47f + 0f67013 commit 9ba05d2

File tree

8 files changed

+76
-50
lines changed

8 files changed

+76
-50
lines changed

apps/OpenSign/src/App.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ function App() {
109109
path="/login/:id/:userMail/:contactBookId/:serverUrl"
110110
element={<LazyPage Page={GuestLogin} />}
111111
/>
112+
<Route
113+
path="/login/:base64url"
114+
element={<LazyPage Page={GuestLogin} />}
115+
/>
112116
<Route path="/debugpdf" element={<LazyPage Page={DebugPdf} />} />
113117
<Route
114118
path="/forgetpassword"

apps/OpenSign/src/pages/GuestLogin.js

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,19 @@ import axios from "axios";
66
import { isEnableSubscription, themeColor } from "../constant/const";
77
import { contractUsers, getAppLogo } from "../constant/Utils";
88
import logo from "../assets/images/logo.png";
9+
import { appInfo } from "../constant/appinfo";
910

1011
function GuestLogin() {
11-
const { id, userMail, contactBookId, serverUrl } = useParams();
12+
const { id, userMail, contactBookId, base64url } = useParams();
1213
let navigate = useNavigate();
1314
const [email, setEmail] = useState(userMail);
1415
const [OTP, setOTP] = useState("");
1516
const [EnterOTP, setEnterOtp] = useState(false);
1617
const [loading, setLoading] = useState(false);
1718
const [isLoading, setIsLoading] = useState(true);
1819
const [appLogo, setAppLogo] = useState("");
19-
20+
const [documentId, setDocumentId] = useState(id);
21+
const [contactId, setContactId] = useState(contactBookId);
2022
useEffect(() => {
2123
handleServerUrl();
2224

@@ -36,17 +38,24 @@ function GuestLogin() {
3638
setAppLogo(logo);
3739
}
3840

39-
//split url in array from '&'
4041
localStorage.clear();
41-
const checkSplit = serverUrl.split("&");
42-
const server = checkSplit[0];
43-
const parseId = checkSplit[1];
44-
const appName = checkSplit[2];
45-
46-
const newServer = server.replaceAll("%2F", "/");
42+
const parseId = appInfo.appId;
43+
const newServer = `${appInfo.baseUrl}/`;
44+
const appName = appInfo.appname;
4745
localStorage.setItem("baseUrl", newServer);
4846
localStorage.setItem("parseAppId", parseId);
4947
localStorage.setItem("_appName", appName);
48+
//this condition is used decode base64 to string and get userEmail,documentId, contactBoookId data.
49+
if (!id) {
50+
//`atob` function is used to decode base64
51+
const decodebase64 = atob(base64url);
52+
//split url in array from '/'
53+
const checkSplit = decodebase64.split("/");
54+
setDocumentId(checkSplit[0]);
55+
setEmail(checkSplit[1]);
56+
setContactId(checkSplit[2]);
57+
}
58+
5059
setIsLoading(false);
5160
};
5261

@@ -74,7 +83,7 @@ function GuestLogin() {
7483
};
7584
let body = {
7685
email: email.toString(),
77-
docId: id
86+
docId: documentId
7887
};
7988
let Otp = await axios.post(url, body, { headers: headers });
8089

@@ -137,7 +146,7 @@ function GuestLogin() {
137146
//save isGuestSigner true in local to handle login flow header in mobile view
138147
localStorage.setItem("isGuestSigner", true);
139148
setLoading(false);
140-
navigate(`/load/recipientSignPdf/${id}/${contactBookId}`);
149+
navigate(`/load/recipientSignPdf/${documentId}/${contactId}`);
141150
}
142151
} catch (error) {
143152
console.log("err ", error);

apps/OpenSign/src/pages/Opensigndrive.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ function Opensigndrive() {
6464
const sortingValue = ["Name", "Date"];
6565
const [isDontShow, setIsDontShow] = useState(false);
6666
const [tourData, setTourData] = useState();
67+
const [showTourFirstTIme, setShowTourFirstTime] = useState(true);
6768
const orderName = {
6869
Ascending: "Ascending",
6970
Descending: "Descending",
@@ -134,7 +135,9 @@ function Opensigndrive() {
134135
//function for get all pdf document list
135136
const getPdfDocumentList = async (disbaleLoading) => {
136137
setLoading(true);
137-
checkTourStatus();
138+
if (showTourFirstTIme) {
139+
checkTourStatus();
140+
}
138141
if (!disbaleLoading) {
139142
setIsLoading({ isLoad: true, message: "This might take some time" });
140143
}
@@ -250,17 +253,23 @@ function Opensigndrive() {
250253
}, [loading, sortingOrder, selectedSort]); // Add/remove scroll event listener when loading changes
251254

252255
//function for handle folder name path
253-
const handleRoute = (index) => {
254-
setPdfData([]);
256+
const handleRoute = (index, folderData) => {
255257
setSkip(0);
258+
// after onclick on route filter route from that index
256259
const updateFolderName = folderName.filter((x, i) => {
257260
if (i <= index) {
258261
return x;
259262
}
260263
});
261264
setFolderName(updateFolderName);
265+
//get route details after onclick path of folder name
266+
const getCurrentId = folderData[index];
262267
const getLastId = updateFolderName[updateFolderName.length - 1];
263-
setDocId(getLastId.objectId);
268+
//below condition is used to check if user click on same route which already open then don't change any thing
269+
if (docId !== getCurrentId.objectId) {
270+
setPdfData([]);
271+
setDocId(getLastId.objectId);
272+
}
264273
};
265274

266275
//function for add new folder name
@@ -439,7 +448,7 @@ function Opensigndrive() {
439448
return (
440449
<React.Fragment key={id}>
441450
<span
442-
onClick={() => handleRoute(id)}
451+
onClick={() => handleRoute(id, folderData)}
443452
style={{
444453
color: "#a64b4e",
445454
fontWeight: "400",
@@ -474,6 +483,7 @@ function Opensigndrive() {
474483

475484
const closeTour = async () => {
476485
setIsTour(false);
486+
setShowTourFirstTime(false);
477487
if (isDontShow) {
478488
const serverUrl = localStorage.getItem("baseUrl");
479489
const appId = localStorage.getItem("parseAppId");

apps/OpenSign/src/pages/PdfRequestFiles.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -740,14 +740,13 @@ function PdfRequestFiles() {
740740
localStorage.getItem("parseAppId"),
741741
sessionToken: localStorage.getItem("accesstoken")
742742
};
743-
const serverUrl = localStorage.getItem("baseUrl");
744-
const newServer = serverUrl.replaceAll("/", "%2F");
745743
const objectId = user.objectId;
746-
const serverParams = `${newServer}&${localStorage.getItem(
747-
"parseAppId"
748-
)}&${localStorage.getItem("_appName")}`;
749744
const hostUrl = window.location.origin;
750-
let signPdf = `${hostUrl}/login/${pdfDetails?.[0].objectId}/${user.Email}/${objectId}/${serverParams}`;
745+
//encode this url value `${pdfDetails?.[0].objectId}/${user.Email}/${objectId}` to base64 using `btoa` function
746+
const encodeBase64 = btoa(
747+
`${pdfDetails?.[0].objectId}/${user.Email}/${objectId}`
748+
);
749+
let signPdf = `${hostUrl}/login/${encodeBase64}`;
751750
const openSignUrl =
752751
"https://www.opensignlabs.com/contact-us";
753752
const orgName = pdfDetails[0]?.ExtUserPtr.Company
@@ -1245,9 +1244,9 @@ function PdfRequestFiles() {
12451244
isDecline.currnt === "Sure"
12461245
? "Are you sure want to decline this document ?"
12471246
: isDecline.currnt === "YouDeclined"
1248-
? "You have declined this document!"
1249-
: isDecline.currnt === "another" &&
1250-
"You can not sign this document as it has been declined/revoked."
1247+
? "You have declined this document!"
1248+
: isDecline.currnt === "another" &&
1249+
"You can not sign this document as it has been declined/revoked."
12511250
}
12521251
footerMessage={isDecline.currnt === "Sure"}
12531252
declineDoc={declineDoc}

apps/OpenSign/src/pages/PlaceHolderSign.js

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,6 @@ function PlaceHolderSign() {
251251
navigate(`/subscription`);
252252
}
253253
}
254-
255254
//function for get document details
256255
const getDocumentDetails = async () => {
257256
fetchTenantDetails();
@@ -968,15 +967,13 @@ function PlaceHolderSign() {
968967
const shareLinkList = [];
969968
let signerMail = signersdata;
970969
for (let i = 0; i < signerMail.length; i++) {
971-
const serverUrl = localStorage.getItem("baseUrl");
972-
const newServer = serverUrl.replaceAll("/", "%2F");
973970
const objectId = signerMail[i].objectId;
974-
const serverParams = `${newServer}&${localStorage.getItem(
975-
"parseAppId"
976-
)}&${localStorage.getItem("_appName")}`;
977-
978971
const hostUrl = window.location.origin;
979-
let signPdf = `${hostUrl}/login/${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}/${serverParams}`;
972+
//encode this url value `${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}` to base64 using `btoa` function
973+
const encodeBase64 = btoa(
974+
`${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}`
975+
);
976+
let signPdf = `${hostUrl}/login/${encodeBase64}`;
980977
shareLinkList.push({ signerEmail: signerMail[i].Email, url: signPdf });
981978
}
982979
return shareLinkList.map((data, ind) => {
@@ -1050,15 +1047,13 @@ function PlaceHolderSign() {
10501047
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
10511048
sessionToken: localStorage.getItem("accesstoken")
10521049
};
1053-
const serverUrl = localStorage.getItem("baseUrl");
1054-
const newServer = serverUrl.replaceAll("/", "%2F");
10551050
const objectId = signerMail[i].objectId;
1056-
const serverParams = `${newServer}&${localStorage.getItem(
1057-
"parseAppId"
1058-
)}&${localStorage.getItem("_appName")}`;
1059-
10601051
const hostUrl = window.location.origin;
1061-
let signPdf = `${hostUrl}/login/${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}/${serverParams}`;
1052+
//encode this url value `${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}` to base64 using `btoa` function
1053+
const encodeBase64 = btoa(
1054+
`${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}`
1055+
);
1056+
let signPdf = `${hostUrl}/login/${encodeBase64}`;
10621057
const openSignUrl = "https://www.opensignlabs.com/";
10631058
const orgName = pdfDetails[0]?.ExtUserPtr.Company
10641059
? pdfDetails[0].ExtUserPtr.Company

apps/OpenSign/src/primitives/GetReportDisplay.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -287,13 +287,15 @@ const ReportTable = (props) => {
287287
const handleShare = (item) => {
288288
setActLoader({ [item.objectId]: true });
289289
const host = window.location.origin;
290-
const serverUrl = process.env.REACT_APP_SERVERURL
291-
? process.env.REACT_APP_SERVERURL
292-
: window.location.origin + "/api/app";
293-
const baseURL = serverUrl.replace(/\//g, "%2F");
290+
const getUrl = (x) => {
291+
//encode this url value `${item.objectId}/${x.Email}/${x.objectId}` to base64 using `btoa` function
292+
const encodeBase64 = btoa(`${item.objectId}/${x.Email}/${x.objectId}`);
293+
return `${host}/login/${encodeBase64}`;
294+
};
295+
294296
const urls = item.Signers.map((x) => ({
295297
email: x.Email,
296-
url: `${host}/login/${item.objectId}/${x.Email}/${x.objectId}/${baseURL}%2F&opensign&contracts`
298+
url: getUrl(x)
297299
}));
298300
setShareUrls(urls);
299301
setIsShare({ [item.objectId]: true });

apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,10 @@ export default async function createDocumentWithTemplate(request, response) {
217217
};
218218

219219
const objectId = contactMail[i].contactPtr.objectId;
220-
221220
const hostUrl = baseUrl.origin;
222-
let signPdf = `${hostUrl}/login/${res.id}/${contactMail[i].email}/${objectId}/${serverParams}`;
221+
//encode this url value `${res.id}/${contactMail[i].email}/${objectId}` to base64 using `btoa` function
222+
const encodeBase64 = btoa(`${res.id}/${contactMail[i].email}/${objectId}`);
223+
let signPdf = `${hostUrl}/login/${encodeBase64}`;
223224
const openSignUrl = 'https://www.opensignlabs.com/contact-us';
224225
const orgName = template.ExtUserPtr.Company ? template.ExtUserPtr.Company : '';
225226
const themeBGcolor = '#47a3ad';
@@ -316,11 +317,13 @@ export default async function createDocumentWithTemplate(request, response) {
316317
properties: { response_code: 200 },
317318
});
318319
}
320+
//encode this url value `${res.id}/${x.email}/${x.contactPtr.objectId}` to base64 using `btoa` function
321+
const encodeBase64 = btoa(`${res.id}/${x.email}/${x.contactPtr.objectId}`);
319322
return response.json({
320323
objectId: res.id,
321324
signurl: contact.map(x => ({
322325
email: x.email,
323-
url: `${baseUrl.origin}/login/${res.id}/${x.email}/${x.contactPtr.objectId}/${serverParams}`,
326+
url: `${baseUrl.origin}/login/${encodeBase64}`,
324327
})),
325328
message: 'Document sent successfully!',
326329
});

apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,9 @@ export default async function createDocumentwithCoordinate(request, response) {
278278

279279
const objectId = contactMail[i].contactPtr.objectId;
280280
const hostUrl = baseUrl.origin;
281-
let signPdf = `${hostUrl}/login/${res.id}/${contactMail[i].email}/${objectId}/${serverParams}`;
281+
//encode this url value `${response.id}/${contactMail[i].email}/${objectId}` to base64 using `btoa` function
282+
const encodeBase64 = btoa(`${response.id}/${contactMail[i].email}/${objectId}`);
283+
let signPdf = `${hostUrl}/login/${encodeBase64}`;
282284
const openSignUrl = 'https://www.opensignlabs.com/contact-us';
283285
const orgName = parseExtUser.Company ? parseExtUser.Company : '';
284286
const themeBGcolor = '#47a3ad';
@@ -359,11 +361,13 @@ export default async function createDocumentwithCoordinate(request, response) {
359361
properties: { response_code: 200 },
360362
});
361363
}
364+
//encode this url value `${res.id}/${x.email}/${x.contactPtr.objectId}` to base64 using `btoa` function
365+
const encodeBase64 = btoa(`${res.id}/${x.email}/${x.contactPtr.objectId}`);
362366
return response.json({
363367
objectId: res.id,
364368
signurl: contact.map(x => ({
365369
email: x.email,
366-
url: `${baseUrl.origin}/login/${res.id}/${x.email}/${x.contactPtr.objectId}/${serverParams}`,
370+
url: `${baseUrl.origin}/login/${encodeBase64}`,
367371
})),
368372
message: 'Document sent successfully!',
369373
});

0 commit comments

Comments
 (0)