Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ENGG-1696] MV3: support for rq_request_initiator_origin() predefined function #1677

Merged
merged 41 commits into from
May 13, 2024
Merged
Show file tree
Hide file tree
Changes from 40 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
bd75bf1
MV3: Expose onBeforeAjaxRequest hook for service worker to register n…
lazyvab May 5, 2024
bd161d3
Merge branch 'master' into mv3-onBeforeAjaxRequest
lazyvab May 5, 2024
5fd9294
added request processor
nafees87n May 5, 2024
f79a111
fix: tabService cleanup
nafees87n May 6, 2024
6fd3b69
fix: cache the rules
nafees87n May 6, 2024
6a12905
added todo comment
nafees87n May 6, 2024
5ebdf30
Merge branch 'master' of github.com:requestly/requestly into mv3-onBe…
nafees87n May 6, 2024
7b9e69b
update timeout
nafees87n May 6, 2024
9a5fb07
cleanup AJAX interception
nafees87n May 6, 2024
33b9555
cleanup request processor
nafees87n May 6, 2024
fbd91c2
remove logs
nafees87n May 6, 2024
c57153b
fix: excluded
nafees87n May 6, 2024
700a21c
fix: excluded domains
nafees87n May 7, 2024
7cf95cc
added comment
nafees87n May 8, 2024
5317844
moved to psmh
nafees87n May 8, 2024
320c482
refactor: methods
nafees87n May 9, 2024
799ed06
remove session rules on extension status toggle
nafees87n May 9, 2024
7d5d21d
do no create dnr for predefined function
nafees87n May 8, 2024
85b36d3
added predefined function session rule
nafees87n May 8, 2024
7929428
fix:type
nafees87n May 9, 2024
dae2618
null safe
nafees87n May 9, 2024
04aab48
refactor: request processor
nafees87n May 9, 2024
098938a
fix: headers match
nafees87n May 9, 2024
570ff34
added filters check
nafees87n May 9, 2024
f7847bd
fix: request type
nafees87n May 9, 2024
4d9c0b9
fix: regex substitution
nafees87n May 9, 2024
0ad179d
fix: moved to file
nafees87n May 10, 2024
150a24d
Merge branch 'mv3-onBeforeAjaxRequest' of github.com:requestly/reques…
nafees87n May 10, 2024
8966751
fix: initiator domain function
nafees87n May 10, 2024
f2fd960
fix: parseHeaders rule
nafees87n May 10, 2024
9676ceb
fix: matchedRule info
nafees87n May 10, 2024
3291940
Merge branch 'mv3-onBeforeAjaxRequest' of github.com:requestly/reques…
nafees87n May 10, 2024
d8d5ca4
fixed match rule getter
nafees87n May 10, 2024
801be2a
fix: destructure
nafees87n May 10, 2024
6d07fb1
Merge branch 'mv3-onBeforeAjaxRequest' of github.com:requestly/reques…
nafees87n May 10, 2024
6b599cc
fix: matched rule
nafees87n May 10, 2024
2d08aab
Merge branch 'master' of github.com:requestly/requestly into ENGG-1696
nafees87n May 13, 2024
a0e2a26
fix: import changes
nafees87n May 13, 2024
c2c4e1c
remove log
nafees87n May 13, 2024
69c4aac
fix: functions
nafees87n May 13, 2024
b022b98
Merge branch 'master' into ENGG-1696
nafees87n May 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
72 changes: 42 additions & 30 deletions app/src/modules/extension/ruleParser/parseHeadersRule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,53 @@ import { ExtensionRule, ExtensionRuleAction, HeadersRuleOperation, ModifyHeaderI
import { parseConditionFromSource } from "./utils";

const parseHeaders = (headers: HeadersRuleModificationData[]): ModifyHeaderInfo[] => {
return headers.map((header) => {
if (header.type === HeaderRuleActionType.REMOVE) {
return {
header: header.header,
operation: "remove" as HeadersRuleOperation,
};
} else {
return {
header: header.header,
value: header.value,
operation: "set" as HeadersRuleOperation,
};
}
});
return headers
.map((header) => {
if (header.value === "rq_request_initiator_origin()") {
return null;
}

if (header.type === HeaderRuleActionType.REMOVE) {
return {
header: header.header,
operation: "remove" as HeadersRuleOperation,
};
} else {
return {
header: header.header,
value: header.value,
operation: "set" as HeadersRuleOperation,
};
}
})
.filter(Boolean);
};

const parseHeadersRule = (rule: HeadersRule): ExtensionRule[] => {
return rule.pairs.map(
(rulePair): ExtensionRule => {
const condition = parseConditionFromSource(rulePair.source);
const action: ExtensionRuleAction = {
type: RuleActionType.MODIFY_HEADERS,
};

if (rulePair.modifications?.Request?.length) {
action.requestHeaders = parseHeaders(rulePair.modifications?.Request);
}
return rule.pairs
.map(
(rulePair): ExtensionRule => {
const condition = parseConditionFromSource(rulePair.source);
const action: ExtensionRuleAction = {
type: RuleActionType.MODIFY_HEADERS,
};

if (rulePair.modifications?.Response?.length) {
action.responseHeaders = parseHeaders(rulePair.modifications?.Response);
}
if (rulePair.modifications?.Request?.length) {
action.requestHeaders = parseHeaders(rulePair.modifications?.Request);
}

if (rulePair.modifications?.Response?.length) {
action.responseHeaders = parseHeaders(rulePair.modifications?.Response);
}

return { action, condition };
}
);
if (!(action.requestHeaders?.length || action.responseHeaders?.length)) {
return null;
}

return { action, condition };
}
)
.filter(Boolean);
};

export default parseHeadersRule;
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import { Rule } from "common/types";
import { findMatchingRule } from "../ruleMatcher";
import { updateRequestSpecificRules } from "../rulesManager";
import { AJAXRequestDetails, SessionRuleType } from "./types";

const INITIATOR_DOMAIN_FUNCTION = "rq_request_initiator_origin()";

export const handleInitiatorDomainFunction = async (
tabId: number,
requestDetails: AJAXRequestDetails,
rules: Rule[]
) => {
const { isApplied, matchedPair } = findMatchingRule(rules, requestDetails) ?? {};

if (!isApplied) {
return;
}

const headerKeyValueMap: Record<"Response" | "Request", Record<string, string>> = {
Request: {},
Response: {},
};

if (matchedPair.modifications?.Request?.length) {
matchedPair.modifications.Request.forEach((header: { header: string; type: string; value: string }) => {
if (header.value === INITIATOR_DOMAIN_FUNCTION) {
headerKeyValueMap.Request[header.header] = requestDetails.initiatorDomain;
}
});
}

if (matchedPair.modifications?.Response?.length) {
matchedPair.modifications.Response.forEach((header: { header: string; type: string; value: string }) => {
if (header.value === INITIATOR_DOMAIN_FUNCTION) {
headerKeyValueMap.Response[header.header] = requestDetails.initiatorDomain;
}
});
}

const ruleAction: {
requestHeaders?: chrome.declarativeNetRequest.RuleAction["requestHeaders"];
responseHeaders?: chrome.declarativeNetRequest.RuleAction["responseHeaders"];
} = {};

if (Object.keys(headerKeyValueMap.Request).length) {
ruleAction.requestHeaders = Object.entries(headerKeyValueMap.Request).map(([header, value]) => ({
header,
value,
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
}));
}

if (Object.keys(headerKeyValueMap.Response).length) {
ruleAction.responseHeaders = Object.entries(headerKeyValueMap.Response).map(([header, value]) => ({
header,
value,
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
}));
}

if (!Object.keys(ruleAction).length) {
return;
}

await updateRequestSpecificRules(
tabId,
requestDetails.url,
{
action: {
...ruleAction,
type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS,
},
condition: {
urlFilter: `|${requestDetails.url}|`,
resourceTypes: [chrome.declarativeNetRequest.ResourceType.XMLHTTPREQUEST],
tabIds: [tabId],
requestMethods: [requestDetails.method.toLowerCase() as chrome.declarativeNetRequest.RequestMethod],
excludedInitiatorDomains: ["requestly.io", "requestly.com"],
},
},
SessionRuleType.INITIATOR_DOMAIN
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@ import { getEnabledRules, onRuleOrGroupChange } from "common/rulesStore";
import { Rule, RuleType } from "common/types";
import { AJAXRequestDetails } from "./types";
import { forwardHeadersOnRedirect } from "./handleHeadersOnRedirect";
import { handleInitiatorDomainFunction } from "./handleInitiatorDomainFunction";

class RequestProcessor {
cachedRules: Record<string, Rule[]> = {
redirectRules: [],
replaceRules: [],
headerRules: [],
};

private updateCachedRules = async () => {
this.cachedRules.redirectRules = await getEnabledRules(RuleType.REDIRECT);
this.cachedRules.replaceRules = await getEnabledRules(RuleType.REPLACE);
this.cachedRules.headerRules = await getEnabledRules(RuleType.HEADERS);
};

constructor() {
Expand All @@ -28,6 +31,8 @@ class RequestProcessor {
...requestProcessor.cachedRules.redirectRules,
...requestProcessor.cachedRules.replaceRules,
]);

await handleInitiatorDomainFunction(tabId, requestDetails, requestProcessor.cachedRules.headerRules);
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ export interface AJAXRequestDetails {

export enum SessionRuleType {
FORWARD_IGNORED_HEADERS = "forwardIgnoredHeaders",
INITIATOR_DOMAIN = "initiatorDomain",
}
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,9 @@ export const matchRuleWithRequest = function (rule: Rule, requestDetails: AJAXRe
);

if (!matchedPair) {
return null;
return {
isApplied: false,
};
}

const destinationUrl = populateRedirectedUrl(matchedPair, rule.ruleType, requestDetails);
Expand Down Expand Up @@ -203,7 +205,7 @@ export const populateRedirectedUrl = (rulePair: RulePair, ruleType: RuleType, re
export const findMatchingRule = (rules: Rule[], requestDetails: AJAXRequestDetails) => {
for (const rule of rules) {
const matchedRule = matchRuleWithRequest(rule, requestDetails);
if (matchedRule) {
if (matchedRule.isApplied) {
return matchedRule;
}
}
Expand Down