Skip to content

Commit

Permalink
AUT-2164: Create new service to check for fraudulent emails
Browse files Browse the repository at this point in the history
  • Loading branch information
LazarAlexandru-Constantin committed May 17, 2024
1 parent e972401 commit 3020999
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 7 deletions.
1 change: 1 addition & 0 deletions src/app.constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ export const API_ENDPOINTS = {
VERIFY_MFA_CODE: "/verify-mfa-code",
ACCOUNT_RECOVERY: "/account-recovery",
CHECK_REAUTH_USER: "/check-reauth-user",
CHECK_EMAIL_FRAUD_BLOCK: "/check-email-fraud-block",
};

export const ERROR_MESSAGES = {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import {
createApiResponse,
getRequestConfig,
Http,
http,
} from "../../utils/http";
import { API_ENDPOINTS } from "../../app.constants";
import { ApiResponseResult } from "../../types";
import {
CheckEmailFraudBlockInterface,
CheckEmailFraudBlockResponse,
} from "./types";

export function checkEmailFraudBlockService(
axios: Http = http
): CheckEmailFraudBlockInterface {
const checkEmailFraudBlock = async function (
email: string,
sessionId: string,
sourceIp: string,
clientSessionId: string,
persistentSessionId: string
): Promise<ApiResponseResult<CheckEmailFraudBlockResponse>> {
const response = await axios.client.post<CheckEmailFraudBlockResponse>(
API_ENDPOINTS.CHECK_EMAIL_FRAUD_BLOCK,
{
email: email.toLowerCase(),
},
getRequestConfig({
sessionId: sessionId,
sourceIp: sourceIp,
clientSessionId: clientSessionId,
persistentSessionId: persistentSessionId,
})
);
return createApiResponse<CheckEmailFraudBlockResponse>(response);
};
return {
checkEmailFraudBlock,
};
}
16 changes: 16 additions & 0 deletions src/components/check-email-fraud-block/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { ApiResponseResult, DefaultApiResponse } from "../../types";

export interface CheckEmailFraudBlockInterface {
checkEmailFraudBlock: (
email: string,
sessionId: string,
sourceIp: string,
clientSessionId: string,
persistentSessionId: string
) => Promise<ApiResponseResult<CheckEmailFraudBlockResponse>>;
}

export interface CheckEmailFraudBlockResponse extends DefaultApiResponse {
email: string;
isBlockedStatus: string;
}
17 changes: 16 additions & 1 deletion src/components/enter-email/enter-email-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ import {
timestampNMinutesFromNow,
timestampNSecondsFromNow,
} from "../../utils/lock-helper";
import { checkEmailFraudBlockService } from "../check-email-fraud-block/checkEmailFraudBlockService";
import { CheckEmailFraudBlockInterface } from "../check-email-fraud-block/types";
import { logger } from "../../utils/logger";

export const RE_ENTER_EMAIL_TEMPLATE =
"enter-email/index-re-enter-email-account.njk";
Expand Down Expand Up @@ -59,7 +62,8 @@ export function enterEmailCreateGet(req: Request, res: Response): void {

export function enterEmailPost(
service: EnterEmailServiceInterface = enterEmailService(),
checkReauthService: CheckReauthServiceInterface = checkReauthUsersService()
checkReauthService: CheckReauthServiceInterface = checkReauthUsersService(),
checkEmailFraudService: CheckEmailFraudBlockInterface = checkEmailFraudBlockService()
): ExpressRouteFunc {
return async function (req: Request, res: Response) {
const email = req.body.email;
Expand Down Expand Up @@ -126,6 +130,17 @@ export function enterEmailPost(
result.data.lockoutInformation.length > 0
)
setUpAuthAppLocks(req, result.data.lockoutInformation);

const checkEmailFraudResponse =
await checkEmailFraudService.checkEmailFraudBlock(
email,
sessionId,
req.ip,
clientSessionId,
persistentSessionId
);
logger.info(`checkEmailFraudResponse: ${checkEmailFraudResponse.data}`);

req.session.user.enterEmailMfaType = result.data.mfaMethodType;
req.session.user.redactedPhoneNumber = result.data.phoneNumberLastThree;
const nextState = result.data.doesUserExist
Expand Down
30 changes: 24 additions & 6 deletions src/components/enter-email/tests/enter-email-integration.test.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
import request from "supertest";
import { describe } from "mocha";
import { expect, sinon } from "../../../../test/utils/test-utils";
import nock = require("nock");
import * as cheerio from "cheerio";
import decache from "decache";
import {
API_ENDPOINTS,
HTTP_STATUS_CODES,
PATH_NAMES,
} from "../../../app.constants";
import { API_ENDPOINTS, HTTP_STATUS_CODES, PATH_NAMES } from "../../../app.constants";
import { CheckReauthServiceInterface } from "../../check-reauth-users/types";
import { AxiosResponse } from "axios";
import { createApiResponse } from "../../../utils/http";
import { DefaultApiResponse } from "../../../types";
import nock = require("nock");

describe("Integration::enter email", () => {
let token: string | string[];
Expand Down Expand Up @@ -167,6 +163,13 @@ describe("Integration::enter email", () => {
email: "[email protected]",
doesUserExist: true,
});
nock(baseApi)
.post(API_ENDPOINTS.CHECK_EMAIL_FRAUD_BLOCK)
.once()
.reply(HTTP_STATUS_CODES.OK, {
email: "[email protected]",
isBlockedStatus: "Pending",
});

request(app)
.post(PATH_NAMES.ENTER_EMAIL_SIGN_IN)
Expand All @@ -185,6 +188,13 @@ describe("Integration::enter email", () => {
email: "[email protected]",
doesUserExist: false,
});
nock(baseApi)
.post(API_ENDPOINTS.CHECK_EMAIL_FRAUD_BLOCK)
.once()
.reply(HTTP_STATUS_CODES.OK, {
email: "[email protected]",
isBlockedStatus: "Pending",
});

request(app)
.post(PATH_NAMES.ENTER_EMAIL_SIGN_IN)
Expand Down Expand Up @@ -236,6 +246,14 @@ describe("Integration::enter email", () => {
doesUserExist: true,
});

nock(baseApi)
.post(API_ENDPOINTS.CHECK_EMAIL_FRAUD_BLOCK)
.once()
.reply(HTTP_STATUS_CODES.OK, {
email: "[email protected]",
isBlockedStatus: "Pending",
});

request(app)
.post(PATH_NAMES.ENTER_EMAIL_SIGN_IN)
.type("form")
Expand Down

0 comments on commit 3020999

Please sign in to comment.