1
0
Эх сурвалжийг харах

add option "set content security policy" (see #724)

Gildas 4 жил өмнө
parent
commit
9ed750f8c5

+ 4 - 0
_locales/de/messages.json

@@ -471,6 +471,10 @@
 		"message": "Originalseite sichern",
 		"message": "Originalseite sichern",
 		"description": "Options page label: 'save raw page'"
 		"description": "Options page label: 'save raw page'"
 	},
 	},
+	"optionInsertMetaCSP": {
+		"message": "set content security policy",
+		"description": "Options page label: 'set content security policy'"
+	},
 	"optionSaveToClipboard": {
 	"optionSaveToClipboard": {
 		"message": "In die Zwischenablage speichern",
 		"message": "In die Zwischenablage speichern",
 		"description": "Options page label: 'copy to clipboard'"
 		"description": "Options page label: 'copy to clipboard'"

+ 4 - 0
_locales/en/messages.json

@@ -471,6 +471,10 @@
 		"message": "save raw page",
 		"message": "save raw page",
 		"description": "Options page label: 'save raw page'"
 		"description": "Options page label: 'save raw page'"
 	},
 	},
+	"optionInsertMetaCSP": {
+		"message": "set content security policy",
+		"description": "Options page label: 'set content security policy'"
+	},
 	"optionSaveToClipboard": {
 	"optionSaveToClipboard": {
 		"message": "copy to clipboard",
 		"message": "copy to clipboard",
 		"description": "Options page label: 'copy to clipboard'"
 		"description": "Options page label: 'copy to clipboard'"

+ 4 - 0
_locales/es/messages.json

@@ -471,6 +471,10 @@
 		"message": "guardar página en crudo",
 		"message": "guardar página en crudo",
 		"description": "Options page label: 'save raw page'"
 		"description": "Options page label: 'save raw page'"
 	},
 	},
+	"optionInsertMetaCSP": {
+		"message": "establecer la política de seguridad del contenido",
+		"description": "Options page label: 'set content security policy'"
+	},
 	"optionSaveToClipboard": {
 	"optionSaveToClipboard": {
 		"message": "guardar en el portapapeles",
 		"message": "guardar en el portapapeles",
 		"description": "Options page label: 'copy to clipboard'"
 		"description": "Options page label: 'copy to clipboard'"

+ 4 - 0
_locales/fr/messages.json

@@ -471,6 +471,10 @@
 		"message": "sauvegarder la page brute",
 		"message": "sauvegarder la page brute",
 		"description": "Options page label: 'save raw page'"
 		"description": "Options page label: 'save raw page'"
 	},
 	},
+	"optionInsertMetaCSP": {
+		"message": "définir la stratégie de sécurité du contenu",
+		"description": "Options page label: 'set content security policy'"
+	},
 	"optionSaveToClipboard": {
 	"optionSaveToClipboard": {
 		"message": "copier dans le presse-papiers",
 		"message": "copier dans le presse-papiers",
 		"description": "Options page label: 'copy to clipboard'"
 		"description": "Options page label: 'copy to clipboard'"

+ 4 - 0
_locales/ja/messages.json

@@ -471,6 +471,10 @@
 		"message": "生のページを保存",
 		"message": "生のページを保存",
 		"description": "Options page label: 'save raw page'"
 		"description": "Options page label: 'save raw page'"
 	},
 	},
+	"optionInsertMetaCSP": {
+		"message": "set content security policy",
+		"description": "Options page label: 'set content security policy'"
+	},
 	"optionSaveToClipboard": {
 	"optionSaveToClipboard": {
 		"message": "クリップボードに保存する",
 		"message": "クリップボードに保存する",
 		"description": "Options page label: 'copy to clipboard'"
 		"description": "Options page label: 'copy to clipboard'"

+ 4 - 0
_locales/pl/messages.json

@@ -471,6 +471,10 @@
 		"message": "zapisuj surową stronę",
 		"message": "zapisuj surową stronę",
 		"description": "Options page label: 'save raw page'"
 		"description": "Options page label: 'save raw page'"
 	},
 	},
+	"optionInsertMetaCSP": {
+		"message": "set content security policy",
+		"description": "Options page label: 'set content security policy'"
+	},
 	"optionSaveToClipboard": {
 	"optionSaveToClipboard": {
 		"message": "kopiuj do schowka",
 		"message": "kopiuj do schowka",
 		"description": "Options page label: 'copy to clipboard'"
 		"description": "Options page label: 'copy to clipboard'"

+ 4 - 0
_locales/ru/messages.json

@@ -471,6 +471,10 @@
 		"message": "сохранить исходную страницу",
 		"message": "сохранить исходную страницу",
 		"description": "Options page label: 'save raw page'"
 		"description": "Options page label: 'save raw page'"
 	},
 	},
+	"optionInsertMetaCSP": {
+		"message": "set content security policy",
+		"description": "Options page label: 'set content security policy'"
+	},
 	"optionSaveToClipboard": {
 	"optionSaveToClipboard": {
 		"message": "копировать в буфер обмена",
 		"message": "копировать в буфер обмена",
 		"description": "Options page label: 'copy to clipboard'"
 		"description": "Options page label: 'copy to clipboard'"

+ 4 - 0
_locales/uk/messages.json

@@ -471,6 +471,10 @@
 		"message": "зберегти вихідну сторінку",
 		"message": "зберегти вихідну сторінку",
 		"description": "Options page label: 'save raw page'"
 		"description": "Options page label: 'save raw page'"
 	},
 	},
+	"optionInsertMetaCSP": {
+		"message": "set content security policy",
+		"description": "Options page label: 'set content security policy'"
+	},
 	"optionSaveToClipboard": {
 	"optionSaveToClipboard": {
 		"message": "зберегти в буфер обміну",
 		"message": "зберегти в буфер обміну",
 		"description": "Options page label: 'copy to clipboard'"
 		"description": "Options page label: 'copy to clipboard'"

+ 4 - 0
_locales/zh_CN/messages.json

@@ -471,6 +471,10 @@
 		"message": "保存原始页面",
 		"message": "保存原始页面",
 		"description": "Options page label: 'save raw page'"
 		"description": "Options page label: 'save raw page'"
 	},
 	},
+	"optionInsertMetaCSP": {
+		"message": "set content security policy",
+		"description": "Options page label: 'set content security policy'"
+	},
 	"optionSaveToClipboard": {
 	"optionSaveToClipboard": {
 		"message": "保存到剪切板",
 		"message": "保存到剪切板",
 		"description": "Options page label: 'copy to clipboard'"
 		"description": "Options page label: 'copy to clipboard'"

+ 4 - 0
_locales/zh_TW/messages.json

@@ -471,6 +471,10 @@
 		"message": "保存原始頁面",
 		"message": "保存原始頁面",
 		"description": "Options page label: 'save raw page'"
 		"description": "Options page label: 'save raw page'"
 	},
 	},
+	"optionInsertMetaCSP": {
+		"message": "set content security policy",
+		"description": "Options page label: 'set content security policy'"
+	},
 	"optionSaveToClipboard": {
 	"optionSaveToClipboard": {
 		"message": "保存到剪切板",
 		"message": "保存到剪切板",
 		"description": "Options page label: 'copy to clipboard'"
 		"description": "Options page label: 'copy to clipboard'"

+ 1 - 0
cli/single-file-cli-api.js

@@ -61,6 +61,7 @@ const DEFAULT_OPTIONS = {
 	userScriptEnabled: false,
 	userScriptEnabled: false,
 	saveFavicon: true,
 	saveFavicon: true,
 	includeBOM: false,
 	includeBOM: false,
+	insertMetaCSP: true,
 	insertMetaNoIndex: false,
 	insertMetaNoIndex: false,
 	insertSingleFileComment: true
 	insertSingleFileComment: true
 };
 };

+ 1 - 0
extension/core/bg/config.js

@@ -102,6 +102,7 @@ const DEFAULT_CONFIG = {
 	warnUnsavedPage: true,
 	warnUnsavedPage: true,
 	autoSaveExternalSave: false,
 	autoSaveExternalSave: false,
 	insertMetaNoIndex: false,
 	insertMetaNoIndex: false,
+	insertMetaCSP: true,
 	passReferrerOnError: false,
 	passReferrerOnError: false,
 	insertSingleFileComment: true
 	insertSingleFileComment: true
 };
 };

+ 5 - 0
extension/ui/bg/ui-options.js

@@ -34,6 +34,7 @@ const removeFramesLabel = document.getElementById("removeFramesLabel");
 const removeImportsLabel = document.getElementById("removeImportsLabel");
 const removeImportsLabel = document.getElementById("removeImportsLabel");
 const removeScriptsLabel = document.getElementById("removeScriptsLabel");
 const removeScriptsLabel = document.getElementById("removeScriptsLabel");
 const saveRawPageLabel = document.getElementById("saveRawPageLabel");
 const saveRawPageLabel = document.getElementById("saveRawPageLabel");
+const insertMetaCSPLabel = document.getElementById("insertMetaCSPLabel");
 const saveToClipboardLabel = document.getElementById("saveToClipboardLabel");
 const saveToClipboardLabel = document.getElementById("saveToClipboardLabel");
 const saveToFilesystemLabel = document.getElementById("saveToFilesystemLabel");
 const saveToFilesystemLabel = document.getElementById("saveToFilesystemLabel");
 const addProofLabel = document.getElementById("addProofLabel");
 const addProofLabel = document.getElementById("addProofLabel");
@@ -123,6 +124,7 @@ const removeFramesInput = document.getElementById("removeFramesInput");
 const removeImportsInput = document.getElementById("removeImportsInput");
 const removeImportsInput = document.getElementById("removeImportsInput");
 const removeScriptsInput = document.getElementById("removeScriptsInput");
 const removeScriptsInput = document.getElementById("removeScriptsInput");
 const saveRawPageInput = document.getElementById("saveRawPageInput");
 const saveRawPageInput = document.getElementById("saveRawPageInput");
+const insertMetaCSPInput = document.getElementById("insertMetaCSPInput");
 const saveToClipboardInput = document.getElementById("saveToClipboardInput");
 const saveToClipboardInput = document.getElementById("saveToClipboardInput");
 const addProofInput = document.getElementById("addProofInput");
 const addProofInput = document.getElementById("addProofInput");
 const saveToGDriveInput = document.getElementById("saveToGDriveInput");
 const saveToGDriveInput = document.getElementById("saveToGDriveInput");
@@ -462,6 +464,7 @@ removeFramesLabel.textContent = browser.i18n.getMessage("optionRemoveFrames");
 removeImportsLabel.textContent = browser.i18n.getMessage("optionRemoveImports");
 removeImportsLabel.textContent = browser.i18n.getMessage("optionRemoveImports");
 removeScriptsLabel.textContent = browser.i18n.getMessage("optionRemoveScripts");
 removeScriptsLabel.textContent = browser.i18n.getMessage("optionRemoveScripts");
 saveRawPageLabel.textContent = browser.i18n.getMessage("optionSaveRawPage");
 saveRawPageLabel.textContent = browser.i18n.getMessage("optionSaveRawPage");
+insertMetaCSPLabel.textContent = browser.i18n.getMessage("optionInsertMetaCSP");
 saveToClipboardLabel.textContent = browser.i18n.getMessage("optionSaveToClipboard");
 saveToClipboardLabel.textContent = browser.i18n.getMessage("optionSaveToClipboard");
 saveToFilesystemLabel.textContent = browser.i18n.getMessage("optionSaveToFilesystem");
 saveToFilesystemLabel.textContent = browser.i18n.getMessage("optionSaveToFilesystem");
 addProofLabel.textContent = browser.i18n.getMessage("optionAddProof");
 addProofLabel.textContent = browser.i18n.getMessage("optionAddProof");
@@ -664,6 +667,7 @@ async function refresh(profileName) {
 	removeImportsInput.checked = profileOptions.removeImports;
 	removeImportsInput.checked = profileOptions.removeImports;
 	removeScriptsInput.checked = profileOptions.removeScripts;
 	removeScriptsInput.checked = profileOptions.removeScripts;
 	saveRawPageInput.checked = profileOptions.saveRawPage;
 	saveRawPageInput.checked = profileOptions.saveRawPage;
+	insertMetaCSPInput.checked = profileOptions.insertMetaCSP;
 	saveToClipboardInput.checked = profileOptions.saveToClipboard;
 	saveToClipboardInput.checked = profileOptions.saveToClipboard;
 	addProofInput.checked = profileOptions.addProof;
 	addProofInput.checked = profileOptions.addProof;
 	saveToGDriveInput.checked = profileOptions.saveToGDrive;
 	saveToGDriveInput.checked = profileOptions.saveToGDrive;
@@ -748,6 +752,7 @@ async function update() {
 			removeImports: removeImportsInput.checked,
 			removeImports: removeImportsInput.checked,
 			removeScripts: removeScriptsInput.checked,
 			removeScripts: removeScriptsInput.checked,
 			saveRawPage: saveRawPageInput.checked,
 			saveRawPage: saveRawPageInput.checked,
+			insertMetaCSP: insertMetaCSPInput.checked,
 			saveToClipboard: saveToClipboardInput.checked,
 			saveToClipboard: saveToClipboardInput.checked,
 			addProof: addProofInput.checked,
 			addProof: addProofInput.checked,
 			saveToGDrive: saveToGDriveInput.checked,
 			saveToGDrive: saveToGDriveInput.checked,

+ 6 - 0
extension/ui/pages/help.html

@@ -208,6 +208,12 @@
 							the time needed to save a page.</p>
 							the time needed to save a page.</p>
 						<p class="notice">It is recommended to <u>check</u> this option</p>
 						<p class="notice">It is recommended to <u>check</u> this option</p>
 					</li>
 					</li>
+					<li data-options-label="insertMetaCSPLabel"> <span class="option">Option: set content security
+							policy</span>
+						<p>Check this option to add a meta tag with a policy to block any external resources from being
+							loaded.</p>
+						<p class="notice">It is recommended to <u>check</u> this option</p>
+					</li>
 					<li data-options-label="removeFramesLabel"> <span class="option">Option: remove frames</span>
 					<li data-options-label="removeFramesLabel"> <span class="option">Option: remove frames</span>
 						<p>Check this option to remove all frame and iframe elements. Checking this option can
 						<p>Check this option to remove all frame and iframe elements. Checking this option can
 							considerably reduce the size of the file without altering the document most of the time. It
 							considerably reduce the size of the file without altering the document most of the time. It

+ 4 - 0
extension/ui/pages/options.html

@@ -94,6 +94,10 @@
 				<label for="removeHiddenElementsInput" id="removeHiddenElementsLabel"></label>
 				<label for="removeHiddenElementsInput" id="removeHiddenElementsLabel"></label>
 				<input type="checkbox" id="removeHiddenElementsInput">
 				<input type="checkbox" id="removeHiddenElementsInput">
 			</div>
 			</div>
+			<div class="option">
+				<label for="insertMetaCSPInput" id="insertMetaCSPLabel"></label>
+				<input type="checkbox" id="insertMetaCSPInput">
+			</div>
 			<div class="option">
 			<div class="option">
 				<label for="removeFramesInput" id="removeFramesLabel"></label>
 				<label for="removeFramesInput" id="removeFramesLabel"></label>
 				<input type="checkbox" id="removeFramesInput">
 				<input type="checkbox" id="removeFramesInput">

+ 6 - 0
lib/single-file/single-file-core.js

@@ -494,6 +494,12 @@ class Processor {
 				canonicalLink.href = this.options.saveUrl;
 				canonicalLink.href = this.options.saveUrl;
 			}
 			}
 		}
 		}
+		if (this.options.insertMetaCSP) {
+			const metaTag = this.doc.createElement("meta");
+			metaTag.httpEquiv = "content-security-policy";
+			metaTag.content = "default-src 'none'; font-src 'self' data:; img-src 'self' data:; style-src 'unsafe-inline'; script-src 'unsafe-inline' data:;";
+			this.doc.head.appendChild(metaTag);
+		}
 		if (this.options.insertMetaNoIndex) {
 		if (this.options.insertMetaNoIndex) {
 			let metaElement = this.doc.querySelector("meta[name=robots][content*=noindex]");
 			let metaElement = this.doc.querySelector("meta[name=robots][content*=noindex]");
 			if (!metaElement) {
 			if (!metaElement) {