Path: blob/main/src/vs/workbench/services/files/electron-browser/elevatedFileService.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { localize } from '../../../../nls.js';6import { VSBuffer, VSBufferReadable, VSBufferReadableStream } from '../../../../base/common/buffer.js';7import { randomPath } from '../../../../base/common/extpath.js';8import { Schemas } from '../../../../base/common/network.js';9import { URI } from '../../../../base/common/uri.js';10import { IFileService, IFileStatWithMetadata, IWriteFileOptions } from '../../../../platform/files/common/files.js';11import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';12import { INativeHostService } from '../../../../platform/native/common/native.js';13import { IWorkspaceTrustRequestService } from '../../../../platform/workspace/common/workspaceTrust.js';14import { INativeWorkbenchEnvironmentService } from '../../environment/electron-browser/environmentService.js';15import { IElevatedFileService } from '../common/elevatedFileService.js';16import { isWindows } from '../../../../base/common/platform.js';17import { ILabelService } from '../../../../platform/label/common/label.js';18export class NativeElevatedFileService implements IElevatedFileService {1920readonly _serviceBrand: undefined;2122constructor(23@INativeHostService private readonly nativeHostService: INativeHostService,24@IFileService private readonly fileService: IFileService,25@INativeWorkbenchEnvironmentService private readonly environmentService: INativeWorkbenchEnvironmentService,26@IWorkspaceTrustRequestService private readonly workspaceTrustRequestService: IWorkspaceTrustRequestService,27@ILabelService private readonly labelService: ILabelService28) { }2930isSupported(resource: URI): boolean {31// Saving elevated is currently only supported for local32// files for as long as we have no generic support from33// the file service34// (https://github.com/microsoft/vscode/issues/48659)35return resource.scheme === Schemas.file;36}3738async writeFileElevated(resource: URI, value: VSBuffer | VSBufferReadable | VSBufferReadableStream, options?: IWriteFileOptions): Promise<IFileStatWithMetadata> {39const trusted = await this.workspaceTrustRequestService.requestWorkspaceTrust({40message: isWindows ? localize('fileNotTrustedMessageWindows', "You are about to save '{0}' as admin.", this.labelService.getUriLabel(resource)) : localize('fileNotTrustedMessagePosix', "You are about to save '{0}' as super user.", this.labelService.getUriLabel(resource)),41});42if (!trusted) {43throw new Error(localize('fileNotTrusted', "Workspace is not trusted."));44}4546const source = URI.file(randomPath(this.environmentService.userDataPath, 'code-elevated'));47try {48// write into a tmp file first49await this.fileService.writeFile(source, value, options);5051// then sudo prompt copy52await this.nativeHostService.writeElevated(source, resource, options);53} finally {5455// clean up56await this.fileService.del(source);57}5859return this.fileService.resolve(resource, { resolveMetadata: true });60}61}6263registerSingleton(IElevatedFileService, NativeElevatedFileService, InstantiationType.Delayed);646566