From bfd3bee27300799f534afd593b29606f6061ea0e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 26 Nov 2021 10:25:43 +0100 Subject: [PATCH] #15756 prevent installing unsupported extensions in main service --- .../common/abstractExtensionManagementService.ts | 12 ++++++------ .../common/extensionManagement.ts | 1 + .../contrib/extensions/browser/extensionsActions.ts | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts index 117e765ce8b..e0dbc062914 100644 --- a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts +++ b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts @@ -353,10 +353,15 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } private async checkAndGetCompatibleVersion(extension: IGalleryExtension, fetchCompatibleVersion: boolean, installPreRelease: boolean): Promise<{ extension: IGalleryExtension, manifest: IExtensionManifest }> { - if (await this.isMalicious(extension)) { + const report = await this.getExtensionsControlManifest(); + if (getMaliciousExtensionsSet(report).has(extension.identifier.id)) { throw new ExtensionManagementError(nls.localize('malicious extension', "Can't install '{0}' extension since it was reported to be problematic.", extension.identifier.id), ExtensionManagementErrorCode.Malicious); } + if (!!report.unsupportedPreReleaseExtensions && !!report.unsupportedPreReleaseExtensions[extension.identifier.id]) { + throw new ExtensionManagementError(nls.localize('unsupported prerelease extension', "Can't install '{0}' extension because it is no longer supported. It is now part of the '{1}' extension as a pre-release version.", extension.identifier.id, report.unsupportedPreReleaseExtensions[extension.identifier.id].displayName), ExtensionManagementErrorCode.UnsupportedPreRelease); + } + if (!await this.canInstall(extension)) { const targetPlatform = await this.getTargetPlatform(); throw new ExtensionManagementError(nls.localize('incompatible platform', "The '{0}' extension is not available in {1} for {2}.", extension.identifier.id, this.productService.nameLong, TargetPlatformToString(targetPlatform)), ExtensionManagementErrorCode.IncompatibleTargetPlatform); @@ -402,11 +407,6 @@ export abstract class AbstractExtensionManagementService extends Disposable impl return compatibleExtension; } - private async isMalicious(extension: IGalleryExtension): Promise { - const report = await this.getExtensionsControlManifest(); - return getMaliciousExtensionsSet(report).has(extension.identifier.id); - } - private async unininstallExtension(extension: ILocalExtension, options: UninstallOptions): Promise { const uninstallExtensionTask = this.uninstallingExtensions.get(extension.identifier.id.toLowerCase()); if (uninstallExtensionTask) { diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 15afacc7856..5baf92d1c4a 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -365,6 +365,7 @@ export interface DidUninstallExtensionEvent { export enum ExtensionManagementErrorCode { Unsupported = 'Unsupported', + UnsupportedPreRelease = 'UnsupportedPreRelease', Malicious = 'Malicious', Incompatible = 'Incompatible', IncompatiblePreRelease = 'IncompatiblePreRelease', diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 39e5da42b88..14a04b375b6 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -137,7 +137,7 @@ export class PromptExtensionInstallFailureAction extends Action { return; } - if ([ExtensionManagementErrorCode.Incompatible, ExtensionManagementErrorCode.IncompatibleTargetPlatform, ExtensionManagementErrorCode.Malicious].includes(this.error.name)) { + if ([ExtensionManagementErrorCode.Incompatible, ExtensionManagementErrorCode.IncompatibleTargetPlatform, ExtensionManagementErrorCode.Malicious, ExtensionManagementErrorCode.UnsupportedPreRelease].includes(this.error.name)) { await this.dialogService.show(Severity.Info, getErrorMessage(this.error)); return; }