mirror of
https://github.com/microsoft/vscode.git
synced 2026-05-30 04:06:26 +01:00
Fix #127155
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
|
||||
import { ILocalExtension, IGalleryExtension, IExtensionIdentifier, IReportedExtension, IExtensionIdentifierWithVersion } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { compareIgnoreCase } from 'vs/base/common/strings';
|
||||
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
|
||||
import { ExtensionIdentifier, IExtension } from 'vs/platform/extensions/common/extensions';
|
||||
|
||||
export function areSameExtensions(a: IExtensionIdentifier, b: IExtensionIdentifier): boolean {
|
||||
if (a.uuid && b.uuid) {
|
||||
@@ -128,3 +128,22 @@ export function getMaliciousExtensionsSet(report: IReportedExtension[]): Set<str
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export function getExtensionDependencies(installedExtensions: ReadonlyArray<IExtension>, extension: IExtension): IExtension[] {
|
||||
const dependencies: IExtension[] = [];
|
||||
const extensions = extension.manifest.extensionDependencies?.slice(0) ?? [];
|
||||
|
||||
while (extensions.length) {
|
||||
const id = extensions.shift();
|
||||
|
||||
if (id && dependencies.every(e => !areSameExtensions(e.identifier, { id }))) {
|
||||
const ext = installedExtensions.filter(e => areSameExtensions(e.identifier, { id }));
|
||||
if (ext.length === 1) {
|
||||
dependencies.push(ext[0]);
|
||||
extensions.push(...ext[0].manifest.extensionDependencies?.slice(0) ?? []);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return dependencies;
|
||||
}
|
||||
|
||||
@@ -2167,10 +2167,10 @@ export class SystemDisabledWarningAction extends ExtensionAction {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const untrustedSupportType = this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(this.extension.local.manifest);
|
||||
if (this.workspaceTrustService.workspaceTrustEnabled && untrustedSupportType !== true && !this.workspaceTrustService.isWorkpaceTrusted()) {
|
||||
if (this.workspaceTrustService.workspaceTrustEnabled && !this.workspaceTrustService.isWorkpaceTrusted() && this.extension.enablementState === EnablementState.DisabledByTrustRequirement) {
|
||||
const untrustedSupportType = this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(this.extension.local.manifest);
|
||||
const untrustedDetails = getWorkpaceSupportTypeMessage(this.extension.local.manifest.capabilities?.untrustedWorkspaces);
|
||||
|
||||
this.enabled = true;
|
||||
this.class = `${SystemDisabledWarningAction.TRUST_CLASS}`;
|
||||
this.tooltip = untrustedDetails || (untrustedSupportType === 'limited' ?
|
||||
|
||||
@@ -11,7 +11,7 @@ import { PagedModel, IPagedModel, IPager, DelayedPagedModel } from 'vs/base/comm
|
||||
import { SortBy, SortOrder, IQueryOptions } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { IExtensionManagementServer, IExtensionManagementServerService, EnablementState, IWorkbenchExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
|
||||
import { IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations';
|
||||
import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
|
||||
import { areSameExtensions, getExtensionDependencies } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
|
||||
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { append, $ } from 'vs/base/browser/dom';
|
||||
@@ -577,7 +577,22 @@ export class ExtensionsListView extends ViewPane {
|
||||
}
|
||||
|
||||
const hasVirtualSupportType = (extension: IExtension, supportType: ExtensionVirtualWorkpaceSupportType) => extension.local && this.extensionManifestPropertiesService.getExtensionVirtualWorkspaceSupportType(extension.local.manifest) === supportType;
|
||||
const hasRestrictedSupportType = (extension: IExtension, supportType: ExtensionUntrustedWorkpaceSupportType) => extension.local && this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(extension.local.manifest) === supportType;
|
||||
const hasRestrictedSupportType = (extension: IExtension, supportType: ExtensionUntrustedWorkpaceSupportType) => {
|
||||
if (!extension.local) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(extension.local.manifest) === supportType) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (supportType === false) {
|
||||
const dependencies = getExtensionDependencies(local.map(ext => ext.local!), extension.local);
|
||||
return dependencies.some(ext => this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(ext.manifest) === supportType);
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
if (type === 'virtual') {
|
||||
// show limited and disabled extensions unless disabled because of a untrusted workspace
|
||||
|
||||
@@ -25,7 +25,6 @@ import { localize } from 'vs/nls';
|
||||
import { ConfigurationScope, Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry';
|
||||
import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs';
|
||||
import { ExtensionUntrustedWorkpaceSupportType } from 'vs/platform/extensions/common/extensions';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { ILabelService } from 'vs/platform/label/common/label';
|
||||
import { WorkbenchTable } from 'vs/platform/list/browser/listService';
|
||||
@@ -52,6 +51,7 @@ import { IExtensionManifestPropertiesService } from 'vs/workbench/services/exten
|
||||
import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity';
|
||||
import { WorkspaceTrustEditorInput } from 'vs/workbench/services/workspaces/browser/workspaceTrustEditorInput';
|
||||
import { IEditorOptions } from 'vs/platform/editor/common/editor';
|
||||
import { getExtensionDependencies } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
|
||||
|
||||
export const shieldIcon = registerCodicon('workspace-trust-icon', Codicon.shield);
|
||||
|
||||
@@ -765,9 +765,7 @@ export class WorkspaceTrustEditor extends EditorPane {
|
||||
}).length;
|
||||
|
||||
// Features List
|
||||
const onDemandExtensionCount = this.getExtensionCountByUntrustedWorkspaceSupport('limited');
|
||||
const onStartExtensionCount = this.getExtensionCountByUntrustedWorkspaceSupport(false);
|
||||
this.renderAffectedFeatures(settingsRequiringTrustedWorkspaceCount, onDemandExtensionCount + onStartExtensionCount);
|
||||
this.renderAffectedFeatures(settingsRequiringTrustedWorkspaceCount, this.getExtensionCount());
|
||||
|
||||
// Configuration Tree
|
||||
this.workpaceTrustedUrisTable.updateTable();
|
||||
@@ -778,14 +776,25 @@ export class WorkspaceTrustEditor extends EditorPane {
|
||||
this.rendering = false;
|
||||
}
|
||||
|
||||
private getExtensionCountByUntrustedWorkspaceSupport(trustRequestType: ExtensionUntrustedWorkpaceSupportType): number {
|
||||
private getExtensionCount(): number {
|
||||
const set = new Set<string>();
|
||||
|
||||
const inVirtualWorkspace = isVirtualWorkspace(this.workspaceService.getWorkspace());
|
||||
const localExtensions = this.extensionWorkbenchService.local.filter(ext => ext.local).map(ext => ext.local!);
|
||||
const filtered = localExtensions.filter(ext => this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(ext.manifest) === trustRequestType);
|
||||
for (const ext of filtered) {
|
||||
if (!inVirtualWorkspace || this.extensionManifestPropertiesService.getExtensionVirtualWorkspaceSupportType(ext.manifest) !== false) {
|
||||
set.add(ext.identifier.id);
|
||||
|
||||
for (const extension of localExtensions) {
|
||||
if (inVirtualWorkspace && this.extensionManifestPropertiesService.getExtensionVirtualWorkspaceSupportType(extension.manifest) === false) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(extension.manifest) !== true) {
|
||||
set.add(extension.identifier.id);
|
||||
continue;
|
||||
}
|
||||
|
||||
const dependencies = getExtensionDependencies(localExtensions, extension);
|
||||
if (dependencies.some(ext => this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(ext.manifest) === false)) {
|
||||
set.add(extension.identifier.id);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+16
-8
@@ -8,7 +8,7 @@ import { Event, Emitter } from 'vs/base/common/event';
|
||||
import { Disposable, toDisposable } from 'vs/base/common/lifecycle';
|
||||
import { IExtensionManagementService, IExtensionIdentifier, IGlobalExtensionEnablementService, ENABLED_EXTENSIONS_STORAGE_PATH, DISABLED_EXTENSIONS_STORAGE_PATH } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IWorkbenchExtensionManagementService, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
|
||||
import { areSameExtensions, BetterMergeId } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
|
||||
import { areSameExtensions, BetterMergeId, getExtensionDependencies } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
|
||||
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
|
||||
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
|
||||
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
|
||||
@@ -245,10 +245,11 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench
|
||||
else {
|
||||
enablementState = this._getUserEnablementState(extension.identifier);
|
||||
if (this._isEnabledEnablementState(enablementState)) {
|
||||
if (this._isDisabledByWorkspaceTrust(extension)) {
|
||||
if (this._isDisabledByWorkspaceTrust(extension, extensions)) {
|
||||
enablementState = EnablementState.DisabledByTrustRequirement;
|
||||
}
|
||||
if (this._isDisabledByExtensionDependency(extension, extensions, computedEnablementStates)) {
|
||||
|
||||
else if (this._isDisabledByExtensionDependency(extension, extensions, computedEnablementStates)) {
|
||||
enablementState = EnablementState.DisabledByExtensionDependency;
|
||||
}
|
||||
}
|
||||
@@ -316,12 +317,14 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench
|
||||
return false;
|
||||
}
|
||||
|
||||
private _isDisabledByWorkspaceTrust(extension: IExtension): boolean {
|
||||
private _isDisabledByWorkspaceTrust(extension: IExtension, extensions: ReadonlyArray<IExtension>): boolean {
|
||||
if (this.workspaceTrustManagementService.isWorkpaceTrusted()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(extension.manifest) === false;
|
||||
// Find dependencies from the same server as of the extension
|
||||
const installedExtensions = extensions.filter(e => this.extensionManagementServerService.getExtensionManagementServer(e) === this.extensionManagementServerService.getExtensionManagementServer(extension));
|
||||
return [extension, ...getExtensionDependencies(installedExtensions, extension)].some(extension => this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(extension.manifest) === false);
|
||||
}
|
||||
|
||||
private _isDisabledByExtensionDependency(extension: IExtension, extensions: ReadonlyArray<IExtension>, computedEnablementStates: Map<IExtension, EnablementState>): boolean {
|
||||
@@ -501,10 +504,15 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench
|
||||
|
||||
public async updateEnablementByWorkspaceTrustRequirement(): Promise<void> {
|
||||
await this.extensionsManager.whenInitialized();
|
||||
|
||||
const disabledExtensions = this.extensionsManager.extensions
|
||||
.filter(extension =>
|
||||
this._isEnabledEnablementState(this._getUserEnablementState(extension.identifier)) &&
|
||||
this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(extension.manifest) === false);
|
||||
.filter(extension => {
|
||||
const dependencies = getExtensionDependencies(this.extensionsManager.extensions, extension);
|
||||
const isEnabled = this._isEnabledEnablementState(this._getUserEnablementState(extension.identifier));
|
||||
|
||||
return isEnabled && (this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(extension.manifest) === false ||
|
||||
dependencies.some(ext => this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(ext.manifest) === false));
|
||||
});
|
||||
|
||||
if (disabledExtensions.length) {
|
||||
this._onEnablementChanged.fire(disabledExtensions);
|
||||
|
||||
Reference in New Issue
Block a user