提交 27aebd40 编写于 作者: S Sandeep Somavarapu

use fileservice for read/write marketplace machineid

上级 f3c88424
...@@ -25,6 +25,7 @@ import { resolveMarketplaceHeaders } from 'vs/platform/extensionManagement/node/ ...@@ -25,6 +25,7 @@ import { resolveMarketplaceHeaders } from 'vs/platform/extensionManagement/node/
import { IThemeMainService } from 'vs/platform/theme/electron-main/themeMainService'; import { IThemeMainService } from 'vs/platform/theme/electron-main/themeMainService';
import { endsWith } from 'vs/base/common/strings'; import { endsWith } from 'vs/base/common/strings';
import { RunOnceScheduler } from 'vs/base/common/async'; import { RunOnceScheduler } from 'vs/base/common/async';
import { IFileService } from 'vs/platform/files/common/files';
const RUN_TEXTMATE_IN_WORKER = false; const RUN_TEXTMATE_IN_WORKER = false;
...@@ -76,6 +77,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { ...@@ -76,6 +77,7 @@ export class CodeWindow extends Disposable implements ICodeWindow {
config: IWindowCreationOptions, config: IWindowCreationOptions,
@ILogService private readonly logService: ILogService, @ILogService private readonly logService: ILogService,
@IEnvironmentService private readonly environmentService: IEnvironmentService, @IEnvironmentService private readonly environmentService: IEnvironmentService,
@IFileService private readonly fileService: IFileService,
@IConfigurationService private readonly configurationService: IConfigurationService, @IConfigurationService private readonly configurationService: IConfigurationService,
@IThemeMainService private readonly themeMainService: IThemeMainService, @IThemeMainService private readonly themeMainService: IThemeMainService,
@IWorkspacesMainService private readonly workspacesMainService: IWorkspacesMainService, @IWorkspacesMainService private readonly workspacesMainService: IWorkspacesMainService,
...@@ -307,7 +309,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { ...@@ -307,7 +309,7 @@ export class CodeWindow extends Disposable implements ICodeWindow {
private handleMarketplaceRequests(): void { private handleMarketplaceRequests(): void {
// Resolve marketplace headers // Resolve marketplace headers
this.marketplaceHeadersPromise = resolveMarketplaceHeaders(this.environmentService); this.marketplaceHeadersPromise = resolveMarketplaceHeaders(this.environmentService, this.fileService);
// Inject headers when requests are incoming // Inject headers when requests are incoming
const urls = ['https://marketplace.visualstudio.com/*', 'https://*.vsassets.io/*']; const urls = ['https://marketplace.visualstudio.com/*', 'https://*.vsassets.io/*'];
......
...@@ -15,7 +15,6 @@ import pkg from 'vs/platform/product/node/package'; ...@@ -15,7 +15,6 @@ import pkg from 'vs/platform/product/node/package';
import product from 'vs/platform/product/node/product'; import product from 'vs/platform/product/node/product';
import { isEngineValid } from 'vs/platform/extensions/node/extensionValidator'; import { isEngineValid } from 'vs/platform/extensions/node/extensionValidator';
import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { writeFileSync, readFile } from 'vs/base/node/pfs';
import { generateUuid, isUUID } from 'vs/base/common/uuid'; import { generateUuid, isUUID } from 'vs/base/common/uuid';
import { values } from 'vs/base/common/map'; import { values } from 'vs/base/common/map';
import { CancellationToken } from 'vs/base/common/cancellation'; import { CancellationToken } from 'vs/base/common/cancellation';
...@@ -24,6 +23,7 @@ import { IExtensionManifest } from 'vs/platform/extensions/common/extensions'; ...@@ -24,6 +23,7 @@ import { IExtensionManifest } from 'vs/platform/extensions/common/extensions';
import { IFileService } from 'vs/platform/files/common/files'; import { IFileService } from 'vs/platform/files/common/files';
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
import { joinPath } from 'vs/base/common/resources'; import { joinPath } from 'vs/base/common/resources';
import { VSBuffer } from 'vs/base/common/buffer';
interface IRawGalleryExtensionFile { interface IRawGalleryExtensionFile {
assetType: string; assetType: string;
...@@ -343,7 +343,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { ...@@ -343,7 +343,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
const config = product.extensionsGallery; const config = product.extensionsGallery;
this.extensionsGalleryUrl = config && config.serviceUrl; this.extensionsGalleryUrl = config && config.serviceUrl;
this.extensionsControlUrl = config && config.controlUrl; this.extensionsControlUrl = config && config.controlUrl;
this.commonHeadersPromise = resolveMarketplaceHeaders(this.environmentService); this.commonHeadersPromise = resolveMarketplaceHeaders(this.environmentService, this.fileService);
} }
private api(path = ''): string { private api(path = ''): string {
...@@ -774,24 +774,30 @@ export class ExtensionGalleryService implements IExtensionGalleryService { ...@@ -774,24 +774,30 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
} }
} }
export function resolveMarketplaceHeaders(environmentService: IEnvironmentService): Promise<{ [key: string]: string; }> { export async function resolveMarketplaceHeaders(environmentService: IEnvironmentService, fileService: IFileService): Promise<{ [key: string]: string; }> {
const marketplaceMachineIdFile = path.join(environmentService.userDataPath, 'machineid'); const marketplaceMachineIdFile = URI.file(path.join(environmentService.userDataPath, 'machineid'));
return readFile(marketplaceMachineIdFile, 'utf8') let uuid: string | null = null;
.then<string | null>(contents => isUUID(contents) ? contents : null, () => null /* error reading ID file */)
.then(uuid => { try {
if (!uuid) { const contents = await fileService.readFile(marketplaceMachineIdFile);
uuid = generateUuid(); const value = contents.value.toString();
try { uuid = isUUID(value) ? value : null;
writeFileSync(marketplaceMachineIdFile, uuid); } catch (e) {
} catch (error) { uuid = null;
//noop }
}
} if (!uuid) {
return { uuid = generateUuid();
'X-Market-Client-Id': `VSCode ${pkg.version}`, try {
'User-Agent': `VSCode ${pkg.version}`, await fileService.writeFile(marketplaceMachineIdFile, VSBuffer.fromString(uuid));
'X-Market-User-Id': uuid } catch (error) {
}; //noop
}); }
}
return {
'X-Market-Client-Id': `VSCode ${pkg.version}`,
'User-Agent': `VSCode ${pkg.version}`,
'X-Market-User-Id': uuid
};
} }
\ No newline at end of file
...@@ -12,13 +12,29 @@ import { join } from 'vs/base/common/path'; ...@@ -12,13 +12,29 @@ import { join } from 'vs/base/common/path';
import { mkdirp, RimRafMode, rimraf } from 'vs/base/node/pfs'; import { mkdirp, RimRafMode, rimraf } from 'vs/base/node/pfs';
import { resolveMarketplaceHeaders } from 'vs/platform/extensionManagement/node/extensionGalleryService'; import { resolveMarketplaceHeaders } from 'vs/platform/extensionManagement/node/extensionGalleryService';
import { isUUID } from 'vs/base/common/uuid'; import { isUUID } from 'vs/base/common/uuid';
import { DisposableStore } from 'vs/base/common/lifecycle';
import { IFileService } from 'vs/platform/files/common/files';
import { FileService } from 'vs/platform/files/common/fileService';
import { NullLogService } from 'vs/platform/log/common/log';
import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider';
import { Schemas } from 'vs/base/common/network';
suite('Extension Gallery Service', () => { suite('Extension Gallery Service', () => {
const parentDir = getRandomTestPath(os.tmpdir(), 'vsctests', 'extensiongalleryservice'); const parentDir = getRandomTestPath(os.tmpdir(), 'vsctests', 'extensiongalleryservice');
const marketplaceHome = join(parentDir, 'Marketplace'); const marketplaceHome = join(parentDir, 'Marketplace');
let fileService: IFileService;
let disposables: DisposableStore;
setup(done => { setup(done => {
disposables = new DisposableStore();
fileService = new FileService(new NullLogService());
disposables.add(fileService);
const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService());
disposables.add(diskFileSystemProvider);
fileService.registerProvider(Schemas.file, diskFileSystemProvider);
// Delete any existing backups completely and then re-create it. // Delete any existing backups completely and then re-create it.
rimraf(marketplaceHome, RimRafMode.MOVE).then(() => { rimraf(marketplaceHome, RimRafMode.MOVE).then(() => {
mkdirp(marketplaceHome).then(() => { mkdirp(marketplaceHome).then(() => {
...@@ -28,6 +44,7 @@ suite('Extension Gallery Service', () => { ...@@ -28,6 +44,7 @@ suite('Extension Gallery Service', () => {
}); });
teardown(done => { teardown(done => {
disposables.clear();
rimraf(marketplaceHome, RimRafMode.MOVE).then(done, done); rimraf(marketplaceHome, RimRafMode.MOVE).then(done, done);
}); });
...@@ -35,10 +52,10 @@ suite('Extension Gallery Service', () => { ...@@ -35,10 +52,10 @@ suite('Extension Gallery Service', () => {
const args = ['--user-data-dir', marketplaceHome]; const args = ['--user-data-dir', marketplaceHome];
const environmentService = new EnvironmentService(parseArgs(args), process.execPath); const environmentService = new EnvironmentService(parseArgs(args), process.execPath);
return resolveMarketplaceHeaders(environmentService).then(headers => { return resolveMarketplaceHeaders(environmentService, fileService).then(headers => {
assert.ok(isUUID(headers['X-Market-User-Id'])); assert.ok(isUUID(headers['X-Market-User-Id']));
return resolveMarketplaceHeaders(environmentService).then(headers2 => { return resolveMarketplaceHeaders(environmentService, fileService).then(headers2 => {
assert.equal(headers['X-Market-User-Id'], headers2['X-Market-User-Id']); assert.equal(headers['X-Market-User-Id'], headers2['X-Market-User-Id']);
}); });
}); });
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册