|
1 | 1 | /* |
2 | 2 | * NoScript - a Firefox extension for whitelist driven safe JavaScript execution |
3 | 3 | * |
4 | | - * Copyright (C) 2005-2024 Giorgio Maone <https://maone.net> |
| 4 | + * Copyright (C) 2005-2026 Giorgio Maone <https://maone.net> |
5 | 5 | * |
6 | 6 | * SPDX-License-Identifier: GPL-3.0-or-later |
7 | 7 | * |
|
784 | 784 | } |
785 | 785 | return ALLOW; |
786 | 786 | } |
787 | | - let isFetch = "fetch" === policyType; |
788 | 787 |
|
| 788 | + const isFetch = "fetch" === policyType; |
789 | 789 | if ((isFetch || "frame" === policyType) && |
790 | 790 | (((isFetch && !originUrl |
791 | 791 | || url === originUrl) && originUrl === documentUrl |
792 | 792 | // some extensions make them both undefined, |
793 | 793 | // see https://github.com/eight04/image-picka/issues/150 |
794 | 794 | ) || |
795 | | - Sites.isInternal(originUrl)) |
| 795 | + Sites.isInternal(originUrl)) || |
| 796 | + Sites.isInternal(url) |
796 | 797 | ) { |
797 | 798 | // livemark request or similar browser-internal, always allow; |
798 | 799 | return ALLOW; |
799 | 800 | } |
800 | 801 |
|
| 802 | + let allowed = false; |
| 803 | + |
801 | 804 | if (/^(?:data|blob):/.test(url)) { |
802 | 805 | request._dataUrl = url; |
803 | 806 | request.url = url = documentUrl || originUrl; |
| 807 | + allowed = Sites.isInternal(url); |
804 | 808 | } |
805 | 809 |
|
806 | | - let allowed = Sites.isInternal(url); |
| 810 | + if (tabId < 0 && documentUrl?.startsWith("https:")) { |
| 811 | + allowed = [...ns.unrestrictedTabs] |
| 812 | + .some(tabId => TabStatus.hasOrigin(tabId, documentUrl)); |
| 813 | + } |
807 | 814 | if (!allowed) { |
808 | | - if (tabId < 0 && documentUrl?.startsWith("https:")) { |
809 | | - allowed = [...ns.unrestrictedTabs] |
810 | | - .some(tabId => TabStatus.hasOrigin(tabId, documentUrl)); |
811 | | - } |
812 | | - if (!allowed) { |
813 | | - const capabilities = intersectCapabilities( |
814 | | - policy.get(url, ns.policyContext(request)), |
815 | | - request); |
816 | | - allowed = !policyType || capabilities.has(policyType); |
817 | | - if (allowed && request._dataUrl && type.endsWith("frame")) { |
818 | | - let blocker = csp.buildFromCapabilities(capabilities); |
819 | | - if (blocker) { |
820 | | - let redirectUrl = CSP.patchDataURI(request._dataUrl, blocker); |
821 | | - if (redirectUrl !== request._dataUrl) { |
822 | | - return previous.return = {redirectUrl}; |
823 | | - } |
| 815 | + const capabilities = intersectCapabilities( |
| 816 | + policy.get(url, ns.policyContext(request)), |
| 817 | + request); |
| 818 | + allowed = !policyType || capabilities.has(policyType); |
| 819 | + if (allowed && request._dataUrl && type.endsWith("frame")) { |
| 820 | + const blocker = csp.buildFromCapabilities(capabilities); |
| 821 | + if (blocker) { |
| 822 | + const redirectUrl = CSP.patchDataURI(request._dataUrl, blocker); |
| 823 | + if (redirectUrl !== request._dataUrl) { |
| 824 | + return previous.return = { redirectUrl }; |
824 | 825 | } |
825 | 826 | } |
826 | 827 | } |
|
0 commit comments