|
|
"use strict";
|
|
|
/*---------------------------------------------------------------------------------------------
|
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
|
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
|
});
|
|
|
};
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
const vscode = require("vscode");
|
|
|
const nls = require("vscode-nls");
|
|
|
const localize = nls.loadMessageBundle();
|
|
|
var HTMLPreviewSecurityLevel;
|
|
|
(function (HTMLPreviewSecurityLevel) {
|
|
|
HTMLPreviewSecurityLevel[HTMLPreviewSecurityLevel["Strict"] = 0] = "Strict";
|
|
|
HTMLPreviewSecurityLevel[HTMLPreviewSecurityLevel["AllowInsecureContent"] = 1] = "AllowInsecureContent";
|
|
|
HTMLPreviewSecurityLevel[HTMLPreviewSecurityLevel["AllowScriptsAndAllContent"] = 2] = "AllowScriptsAndAllContent";
|
|
|
HTMLPreviewSecurityLevel[HTMLPreviewSecurityLevel["AllowInsecureLocalContent"] = 3] = "AllowInsecureLocalContent";
|
|
|
})(HTMLPreviewSecurityLevel = exports.HTMLPreviewSecurityLevel || (exports.HTMLPreviewSecurityLevel = {}));
|
|
|
class ExtensionContentSecurityPolicyArbiter {
|
|
|
constructor(globalState, workspaceState) {
|
|
|
this.globalState = globalState;
|
|
|
this.workspaceState = workspaceState;
|
|
|
this.old_trusted_workspace_key = 'trusted_preview_workspace:';
|
|
|
this.security_level_key = 'preview_security_level:';
|
|
|
this.should_disable_security_warning_key = 'preview_should_show_security_warning:';
|
|
|
}
|
|
|
getSecurityLevelForResource(resource) {
|
|
|
// Use new security level setting first
|
|
|
const level = this.globalState.get(this.security_level_key + this.getRoot(resource), undefined);
|
|
|
if (typeof level !== 'undefined') {
|
|
|
return level;
|
|
|
}
|
|
|
// Fallback to old trusted workspace setting
|
|
|
if (this.globalState.get(this.old_trusted_workspace_key + this.getRoot(resource), false)) {
|
|
|
return HTMLPreviewSecurityLevel.AllowScriptsAndAllContent;
|
|
|
}
|
|
|
return HTMLPreviewSecurityLevel.Strict;
|
|
|
}
|
|
|
setSecurityLevelForResource(resource, level) {
|
|
|
return this.globalState.update(this.security_level_key + this.getRoot(resource), level);
|
|
|
}
|
|
|
shouldAllowSvgsForResource(resource) {
|
|
|
const securityLevel = this.getSecurityLevelForResource(resource);
|
|
|
return securityLevel === HTMLPreviewSecurityLevel.AllowInsecureContent || securityLevel === HTMLPreviewSecurityLevel.AllowScriptsAndAllContent;
|
|
|
}
|
|
|
shouldDisableSecurityWarnings() {
|
|
|
return this.workspaceState.get(this.should_disable_security_warning_key, false);
|
|
|
}
|
|
|
setShouldDisableSecurityWarning(disabled) {
|
|
|
return this.workspaceState.update(this.should_disable_security_warning_key, disabled);
|
|
|
}
|
|
|
getRoot(resource) {
|
|
|
if (vscode.workspace.workspaceFolders) {
|
|
|
const folderForResource = vscode.workspace.getWorkspaceFolder(resource);
|
|
|
if (folderForResource) {
|
|
|
return folderForResource.uri;
|
|
|
}
|
|
|
if (vscode.workspace.workspaceFolders.length) {
|
|
|
return vscode.workspace.workspaceFolders[0].uri;
|
|
|
}
|
|
|
}
|
|
|
return resource;
|
|
|
}
|
|
|
}
|
|
|
exports.ExtensionContentSecurityPolicyArbiter = ExtensionContentSecurityPolicyArbiter;
|
|
|
class PreviewSecuritySelector {
|
|
|
constructor(cspArbiter, webviewManager) {
|
|
|
this.cspArbiter = cspArbiter;
|
|
|
this.webviewManager = webviewManager;
|
|
|
}
|
|
|
showSecuritySelectorForResource(resource) {
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
function markActiveWhen(when) {
|
|
|
return when ? '• ' : '';
|
|
|
}
|
|
|
const currentSecurityLevel = this.cspArbiter.getSecurityLevelForResource(resource);
|
|
|
const selection = yield vscode.window.showQuickPick([
|
|
|
{
|
|
|
type: HTMLPreviewSecurityLevel.Strict,
|
|
|
label: markActiveWhen(currentSecurityLevel === HTMLPreviewSecurityLevel.Strict) + localize('strict.title', 'Strict'),
|
|
|
description: localize('strict.description', 'Only load secure content'),
|
|
|
}, {
|
|
|
type: HTMLPreviewSecurityLevel.AllowInsecureLocalContent,
|
|
|
label: markActiveWhen(currentSecurityLevel === HTMLPreviewSecurityLevel.AllowInsecureLocalContent) + localize('insecureLocalContent.title', 'Allow insecure local content'),
|
|
|
description: localize('insecureLocalContent.description', 'Enable loading content over http served from localhost'),
|
|
|
}, {
|
|
|
type: HTMLPreviewSecurityLevel.AllowInsecureContent,
|
|
|
label: markActiveWhen(currentSecurityLevel === HTMLPreviewSecurityLevel.AllowInsecureContent) + localize('insecureContent.title', 'Allow insecure content'),
|
|
|
description: localize('insecureContent.description', 'Enable loading content over http'),
|
|
|
}, {
|
|
|
type: HTMLPreviewSecurityLevel.AllowScriptsAndAllContent,
|
|
|
label: markActiveWhen(currentSecurityLevel === HTMLPreviewSecurityLevel.AllowScriptsAndAllContent) + localize('disable.title', 'Disable'),
|
|
|
description: localize('disable.description', 'Allow all content and script execution. Not recommended'),
|
|
|
}, {
|
|
|
type: 'moreinfo',
|
|
|
label: localize('moreInfo.title', 'More Information'),
|
|
|
description: ''
|
|
|
}, {
|
|
|
type: 'toggle',
|
|
|
label: this.cspArbiter.shouldDisableSecurityWarnings()
|
|
|
? localize('enableSecurityWarning.title', "Enable preview security warnings in this workspace")
|
|
|
: localize('disableSecurityWarning.title', "Disable preview security warning in this workspace"),
|
|
|
description: localize('toggleSecurityWarning.description', 'Does not affect the content security level')
|
|
|
},
|
|
|
], {
|
|
|
placeHolder: localize('preview.showPreviewSecuritySelector.title', 'Select security settings for HTML previews in this workspace'),
|
|
|
});
|
|
|
if (!selection) {
|
|
|
return;
|
|
|
}
|
|
|
if (selection.type === 'moreinfo') {
|
|
|
vscode.commands.executeCommand('vscode.open', vscode.Uri.parse('https://go.microsoft.com/fwlink/?linkid=854414'));
|
|
|
return;
|
|
|
}
|
|
|
if (selection.type === 'toggle') {
|
|
|
this.cspArbiter.setShouldDisableSecurityWarning(!this.cspArbiter.shouldDisableSecurityWarnings());
|
|
|
return;
|
|
|
}
|
|
|
else {
|
|
|
yield this.cspArbiter.setSecurityLevelForResource(resource, selection.type);
|
|
|
}
|
|
|
this.webviewManager.refresh();
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
exports.PreviewSecuritySelector = PreviewSecuritySelector;
|