Skip to content

Commit d7e836d

Browse files
authored
- enable sign verification in insiders by default (microsoft#167188)
- disable sign verification in linux armhf
1 parent 7191317 commit d7e836d

File tree

3 files changed

+39
-6
lines changed

3 files changed

+39
-6
lines changed

src/vs/platform/extensionManagement/node/extensionDownloader.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { Schemas } from 'vs/base/common/network';
1010
import { isWindows } from 'vs/base/common/platform';
1111
import { joinPath } from 'vs/base/common/resources';
1212
import * as semver from 'vs/base/common/semver/semver';
13+
import { isBoolean } from 'vs/base/common/types';
1314
import { URI } from 'vs/base/common/uri';
1415
import { generateUuid } from 'vs/base/common/uuid';
1516
import { Promises as FSPromises } from 'vs/base/node/pfs';
@@ -18,8 +19,10 @@ import { INativeEnvironmentService } from 'vs/platform/environment/common/enviro
1819
import { ExtensionManagementError, ExtensionManagementErrorCode, IExtensionGalleryService, IGalleryExtension, InstallOperation } from 'vs/platform/extensionManagement/common/extensionManagement';
1920
import { ExtensionKey, groupByExtension } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
2021
import { ExtensionSignatureVerificationError, IExtensionSignatureVerificationService } from 'vs/platform/extensionManagement/node/extensionSignatureVerificationService';
22+
import { TargetPlatform } from 'vs/platform/extensions/common/extensions';
2123
import { IFileService, IFileStatWithMetadata } from 'vs/platform/files/common/files';
2224
import { ILogService } from 'vs/platform/log/common/log';
25+
import { IProductService } from 'vs/platform/product/common/productService';
2326

2427
export class ExtensionsDownloader extends Disposable {
2528

@@ -30,10 +33,12 @@ export class ExtensionsDownloader extends Disposable {
3033
private readonly cleanUpPromise: Promise<void>;
3134

3235
constructor(
36+
private readonly targetPlatform: Promise<TargetPlatform>,
3337
@INativeEnvironmentService environmentService: INativeEnvironmentService,
3438
@IFileService private readonly fileService: IFileService,
3539
@IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService,
3640
@IConfigurationService private readonly configurationService: IConfigurationService,
41+
@IProductService private readonly productService: IProductService,
3742
@IExtensionSignatureVerificationService private readonly extensionSignatureVerificationService: IExtensionSignatureVerificationService,
3843
@ILogService private readonly logService: ILogService,
3944
) {
@@ -54,7 +59,7 @@ export class ExtensionsDownloader extends Disposable {
5459
}
5560

5661
let verified: boolean = false;
57-
if (extension.isSigned && this.configurationService.getValue('extensions.verifySignature') === true) {
62+
if (await this.checkForVerification(extension)) {
5863
const signatureArchiveLocation = await this.downloadSignatureArchive(extension);
5964
try {
6065
verified = await this.extensionSignatureVerificationService.verify(location.fsPath, signatureArchiveLocation.fsPath);
@@ -69,6 +74,22 @@ export class ExtensionsDownloader extends Disposable {
6974
return { location, verified };
7075
}
7176

77+
private async checkForVerification(extension: IGalleryExtension): Promise<boolean> {
78+
if (!extension.isSigned) {
79+
return false;
80+
}
81+
const targetPlatform = await this.targetPlatform;
82+
// Signing module has issue in this platform - https://github.com/microsoft/vscode/issues/164726
83+
if (targetPlatform === TargetPlatform.LINUX_ARMHF) {
84+
return false;
85+
}
86+
const value = this.configurationService.getValue('extensions.verifySignature');
87+
if (isBoolean(value)) {
88+
return value;
89+
}
90+
return this.productService.quality !== 'stable';
91+
}
92+
7293
private async downloadSignatureArchive(extension: IGalleryExtension): Promise<URI> {
7394
await this.cleanUpPromise;
7495

src/vs/platform/extensionManagement/node/extensionManagementService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi
8787
const extensionLifecycle = this._register(instantiationService.createInstance(ExtensionsLifecycle));
8888
this.extensionsScanner = this._register(instantiationService.createInstance(ExtensionsScanner, extension => extensionLifecycle.postUninstall(extension)));
8989
this.manifestCache = this._register(new ExtensionsManifestCache(environmentService, this));
90-
this.extensionsDownloader = this._register(instantiationService.createInstance(ExtensionsDownloader));
90+
this.extensionsDownloader = this._register(instantiationService.createInstance(ExtensionsDownloader, this.getTargetPlatform()));
9191

9292
const extensionsWatcher = this._register(new ExtensionsWatcher(this, this.extensionsScannerService, userDataProfilesService, extensionsProfileScannerService, uriIdentityService, fileService, logService));
9393
this._register(extensionsWatcher.onDidChangeExtensionsByAnotherSource(e => this.onDidChangeExtensionsFromAnotherSource(e)));

src/vs/platform/extensionManagement/test/node/installGalleryExtensionTask.test.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@ import { getGalleryExtensionId } from 'vs/platform/extensionManagement/common/ex
2121
import { ExtensionsDownloader } from 'vs/platform/extensionManagement/node/extensionDownloader';
2222
import { ExtensionsScanner, InstallGalleryExtensionTask } from 'vs/platform/extensionManagement/node/extensionManagementService';
2323
import { IExtensionSignatureVerificationService } from 'vs/platform/extensionManagement/node/extensionSignatureVerificationService';
24+
import { TargetPlatform } from 'vs/platform/extensions/common/extensions';
2425
import { IFileService } from 'vs/platform/files/common/files';
2526
import { FileService } from 'vs/platform/files/common/fileService';
2627
import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider';
2728
import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock';
2829
import { ILogService, NullLogService } from 'vs/platform/log/common/log';
30+
import { IProductService } from 'vs/platform/product/common/productService';
2931

3032
const ROOT = URI.file('tests').with({ scheme: 'vscode-tests' });
3133

@@ -86,8 +88,17 @@ suite('InstallGalleryExtensionTask Tests', () => {
8688

8789
teardown(() => disposables.clear());
8890

89-
test('if verification is disabled by default, the task skips verification', async () => {
90-
const testObject = new TestInstallGalleryExtensionTask(aGalleryExtension('a', { isSigned: true }), anExtensionsDownloader('error'));
91+
test('if verification is enabled by default, the task completes', async () => {
92+
const testObject = new TestInstallGalleryExtensionTask(aGalleryExtension('a', { isSigned: true }), anExtensionsDownloader(true));
93+
94+
await testObject.run();
95+
96+
assert.strictEqual(testObject.wasVerified, true);
97+
assert.strictEqual(testObject.installed, true);
98+
});
99+
100+
test('if verification is disabled in stable, the task completes', async () => {
101+
const testObject = new TestInstallGalleryExtensionTask(aGalleryExtension('a', { isSigned: true }), anExtensionsDownloader('error', undefined, 'stable'));
91102

92103
await testObject.run();
93104

@@ -160,13 +171,14 @@ suite('InstallGalleryExtensionTask Tests', () => {
160171
assert.strictEqual(testObject.installed, true);
161172
});
162173

163-
function anExtensionsDownloader(verificationResult: string | boolean, isSignatureVerificationEnabled?: boolean): ExtensionsDownloader {
174+
function anExtensionsDownloader(verificationResult: string | boolean, isSignatureVerificationEnabled?: boolean, quality?: string): ExtensionsDownloader {
164175
const logService = new NullLogService();
165176
const fileService = disposables.add(new FileService(logService));
166177
const fileSystemProvider = disposables.add(new InMemoryFileSystemProvider());
167178
fileService.registerProvider(ROOT.scheme, fileSystemProvider);
168179

169180
const instantiationService = new TestInstantiationService();
181+
instantiationService.stub(IProductService, { quality: quality ?? 'insiders' });
170182
instantiationService.stub(IFileService, fileService);
171183
instantiationService.stub(ILogService, logService);
172184
instantiationService.stub(INativeEnvironmentService, <Partial<INativeEnvironmentService>>{ extensionsDownloadLocation: joinPath(ROOT, 'CachedExtensionVSIXs') });
@@ -180,7 +192,7 @@ suite('InstallGalleryExtensionTask Tests', () => {
180192
});
181193
instantiationService.stub(IConfigurationService, new TestConfigurationService(isBoolean(isSignatureVerificationEnabled) ? { extensions: { verifySignature: isSignatureVerificationEnabled } } : undefined));
182194
instantiationService.stub(IExtensionSignatureVerificationService, new TestExtensionSignatureVerificationService(verificationResult));
183-
return instantiationService.createInstance(ExtensionsDownloader);
195+
return instantiationService.createInstance(ExtensionsDownloader, Promise.resolve(TargetPlatform.LINUX_X64));
184196
}
185197

186198
function aGalleryExtension(name: string, properties: Partial<IGalleryExtension> = {}, galleryExtensionProperties: any = {}, assets: Partial<IGalleryExtensionAssets> = {}): IGalleryExtension {

0 commit comments

Comments
 (0)