Skip to content

Commit a1c786c

Browse files
authored
Hiding the exposed data for Deferred Installation Flow (#2523)
* - Masking information in the deferred screen * - Cleanup
1 parent d7f1b19 commit a1c786c

File tree

4 files changed

+42
-5
lines changed

4 files changed

+42
-5
lines changed

src/rest/routes/deferred/deferred-request-parse.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ describe("Checking the deferred request parsing route", () => {
4949
.get(`/rest/app/cloud/deferred/parse/${VALID_REQUEST_ID}`);
5050
expect(resp.status).toEqual(200);
5151
expect(resp.body).toMatchObject({
52-
"jiraHost": "https://test-atlassian-instance.atlassian.net",
53-
"orgName": "custom-orgName"
52+
"jiraHost": "https://t*********************e.atlassian.net",
53+
"orgName": "c************e"
5454
});
5555
});
5656
});

src/rest/routes/deferred/deferred-request-parse.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
} from "services/subscription-deferred-install-service";
66
import { InvalidArgumentError } from "config/errors";
77
import { DeferralParsedRequest } from "rest-interfaces";
8+
import maskString from "utils/mask-string";
89

910
export const DeferredRequestParseRoute = errorWrapper("ParseRequestId", async function DeferredRequestParseRoute(req: Request, res: Response<DeferralParsedRequest>) {
1011
const requestId = req.params.requestId;
@@ -13,10 +14,17 @@ export const DeferredRequestParseRoute = errorWrapper("ParseRequestId", async fu
1314
throw new InvalidArgumentError("Missing requestId in query");
1415
}
1516

16-
const deferredInstallPayload = await extractSubscriptionDeferredInstallPayload(requestId);
17+
const { jiraHost, orgName } = await extractSubscriptionDeferredInstallPayload(requestId);
18+
if (!jiraHost) {
19+
throw new Error("No jiraHost");
20+
}
21+
22+
const host = new URL(jiraHost).hostname.split(".")[0];
23+
const maskedHost = maskString(host);
24+
const maskedOrgName = maskString(orgName);
1725

1826
res.status(200).send({
19-
jiraHost: deferredInstallPayload.jiraHost as string,
20-
orgName: deferredInstallPayload.orgName
27+
jiraHost: `https://${maskedHost}.atlassian.net`,
28+
orgName: maskedOrgName
2129
});
2230
});

src/util/mask-string.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
2+
import maskString from "utils/mask-string";
3+
4+
const testData = [
5+
{
6+
actual: "nico-robin",
7+
result: "n********n"
8+
},
9+
{
10+
actual: "boa-hancock",
11+
result: "b*********k"
12+
},
13+
{
14+
actual: "nerfertari-vivi",
15+
result: "n*************i"
16+
}
17+
];
18+
19+
describe("Test for mask string", () => {
20+
testData.forEach(datum => {
21+
const { actual, result } = datum;
22+
it(`Testing ${actual} for ${result}`, () => {
23+
expect(maskString(actual)).toBe(result);
24+
});
25+
});
26+
});

src/util/mask-string.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const maskString = (str: string) => str[0] + str.slice(1).replace(/.(?!$)/g, "*");
2+
3+
export default maskString;

0 commit comments

Comments
 (0)