|
381 | 381 |
|
382 | 382 | const wantsContext = checked.includes("ctx"); |
383 | 383 |
|
384 | | - let { siteMatch, contextMatch, perms } = ns.policy.get(key, contextUrl); |
| 384 | + let cookieStoreId = sender.tab && sender.tab.cookieStoreId; |
| 385 | + let policy = ns.getPolicy(cookieStoreId); |
| 386 | + let { siteMatch, contextMatch, perms } = policy.get(key, contextUrl); |
385 | 387 |
|
386 | 388 | if (!perms.capabilities.has(policyType) || |
387 | 389 | !contextMatch && wantsContext && ctxKey) { |
|
391 | 393 | const isDefault = perms === ns.policy.DEFAULT; |
392 | 394 | perms = perms.clone(); |
393 | 395 | if (isDefault) perms.temp = wantsTemp; |
394 | | - ns.policy.set(key, perms); |
| 396 | + policy.set(key, perms); |
395 | 397 | if (ctxKey && wantsContext) { |
396 | 398 | perms.contextual.set(ctxKey, perms = perms.clone(/* noContext = */ true)); |
397 | 399 | } |
398 | 400 | } |
399 | 401 | perms.temp = wantsTemp; |
400 | 402 | perms.capabilities.add(policyType); |
401 | 403 | await ns.savePolicy(); |
| 404 | + await ns.saveContextStore(); |
402 | 405 | await RequestGuard.DNRPolicy?.update(); |
403 | 406 | } |
404 | 407 | return {enable: key}; |
|
645 | 648 | function intersectCapabilities(policyMatch, request) { |
646 | 649 | const {cascadePermissions, cascadeRestrictions} = ns.sync; |
647 | 650 | if (request.frameId !== 0 && cascadeRestrictions || request.type != "main_frame" && cascadePermissions) { |
648 | | - const {tabUrl, frameAncestors} = request; |
| 651 | + const {tabUrl, frameAncestors, cookieStoreId} = request; |
649 | 652 | const topUrl = tabUrl || |
650 | 653 | cascadePermissions && request.frameId == 0 && request.documentUrl || |
651 | 654 | frameAncestors && frameAncestors[frameAncestors?.length - 1]?.url || |
652 | 655 | TabCache.get(request.tabId)?.url; |
653 | 656 | if (topUrl) { |
654 | | - return ns.policy.cascade(policyMatch, topUrl, { |
| 657 | + const policy = ns.getPolicy(cookieStoreId); |
| 658 | + return policy.cascade(policyMatch, topUrl, { |
655 | 659 | permissions: cascadePermissions, |
656 | 660 | restrictions: cascadeRestrictions, |
657 | 661 | }).capabilities; |
|
719 | 723 |
|
720 | 724 | function checkLANRequest(request) { |
721 | 725 | if (!ns.isEnforced(request.tabId)) return ALLOW; |
722 | | - let {originUrl, url} = request; |
| 726 | + let {originUrl, url, cookieStoreId} = request; |
| 727 | + let policy = ns.getPolicy(cookieStoreId); |
723 | 728 | if (originUrl && !Sites.isInternal(originUrl) && url.startsWith("http") && |
724 | | - !ns.policy.can(originUrl, "lan", ns.policyContext(request))) { |
| 729 | + !policy.can(originUrl, "lan", ns.policyContext(request))) { |
725 | 730 | // we want to block any request whose origin resolves to at least one external WAN IP |
726 | 731 | // and whose destination resolves to at least one LAN IP |
727 | 732 | const {proxyInfo} = request; // see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/proxy/ProxyInfo |
|
756 | 761 |
|
757 | 762 | normalizeRequest(request); |
758 | 763 |
|
759 | | - let {tabId, type, url, originUrl} = request; |
| 764 | + let {tabId, type, cookieStoreId, url, originUrl} = request; |
760 | 765 |
|
761 | | - const { policy } = ns; |
| 766 | + const policy = ns.getPolicy(cookieStoreId); |
762 | 767 |
|
763 | 768 | let previous = recent.find(request); |
764 | 769 | if (previous) { |
|
917 | 922 | let result = ALLOW; |
918 | 923 |
|
919 | 924 | pending.headersProcessed = true; |
920 | | - let {url, tabId, responseHeaders, type} = request; |
| 925 | + let {url, tabId, cookieStoreId, responseHeaders, type} = request; |
921 | 926 | let isMainFrame = type === "main_frame"; |
922 | 927 | try { |
923 | 928 | let capabilities; |
924 | 929 | if (ns.isEnforced(tabId)) { |
925 | | - const { policy } = ns; |
| 930 | + const policy = ns.getPolicy(cookieStoreId); |
926 | 931 | const policyMatch = policy.get(url, ns.policyContext(request)); |
927 | 932 | let { perms } = policyMatch; |
928 | 933 | if (isMainFrame) { |
|
1013 | 1018 | async function injectPolicyScript(details) { |
1014 | 1019 | await ns.initializing; |
1015 | 1020 | if (ns.local.debug?.disablePolicyInjection) return ''; // DEV_ONLY |
1016 | | - const {url, tabId, frameId, type} = details; |
| 1021 | + const {url, tabId, frameId, cookieStoreId, type} = details; |
1017 | 1022 | const isTop = type == "main_frame"; |
1018 | 1023 | const domPolicy = await ns.computeChildPolicy( |
1019 | 1024 | { url }, |
1020 | 1025 | { |
1021 | 1026 | tab: { id: tabId, url: isTop ? url : null }, |
1022 | 1027 | frameId: isTop ? 0 : frameId, |
| 1028 | + cookieStoreId, |
1023 | 1029 | } |
1024 | 1030 | ); |
1025 | 1031 | domPolicy.navigationURL = url; |
|
0 commit comments