Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/encryption/electron-main/encryptionMainService.ts
3294 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { safeStorage as safeStorageElectron, app } from 'electron';
7
import { isMacintosh, isWindows } from '../../../base/common/platform.js';
8
import { KnownStorageProvider, IEncryptionMainService, PasswordStoreCLIOption } from '../common/encryptionService.js';
9
import { ILogService } from '../../log/common/log.js';
10
11
// These APIs are currently only supported in our custom build of electron so
12
// we need to guard against them not being available.
13
interface ISafeStorageAdditionalAPIs {
14
setUsePlainTextEncryption(usePlainText: boolean): void;
15
getSelectedStorageBackend(): string;
16
}
17
18
const safeStorage: typeof import('electron').safeStorage & Partial<ISafeStorageAdditionalAPIs> = safeStorageElectron;
19
20
export class EncryptionMainService implements IEncryptionMainService {
21
_serviceBrand: undefined;
22
23
constructor(
24
@ILogService private readonly logService: ILogService
25
) {
26
// if this commandLine switch is set, the user has opted in to using basic text encryption
27
if (app.commandLine.getSwitchValue('password-store') === PasswordStoreCLIOption.basic) {
28
this.logService.trace('[EncryptionMainService] setting usePlainTextEncryption to true...');
29
safeStorage.setUsePlainTextEncryption?.(true);
30
this.logService.trace('[EncryptionMainService] set usePlainTextEncryption to true');
31
}
32
}
33
34
async encrypt(value: string): Promise<string> {
35
this.logService.trace('[EncryptionMainService] Encrypting value...');
36
try {
37
const result = JSON.stringify(safeStorage.encryptString(value));
38
this.logService.trace('[EncryptionMainService] Encrypted value.');
39
return result;
40
} catch (e) {
41
this.logService.error(e);
42
throw e;
43
}
44
}
45
46
async decrypt(value: string): Promise<string> {
47
let parsedValue: { data: string };
48
try {
49
parsedValue = JSON.parse(value);
50
if (!parsedValue.data) {
51
throw new Error(`[EncryptionMainService] Invalid encrypted value: ${value}`);
52
}
53
const bufferToDecrypt = Buffer.from(parsedValue.data);
54
55
this.logService.trace('[EncryptionMainService] Decrypting value...');
56
const result = safeStorage.decryptString(bufferToDecrypt);
57
this.logService.trace('[EncryptionMainService] Decrypted value.');
58
return result;
59
} catch (e) {
60
this.logService.error(e);
61
throw e;
62
}
63
}
64
65
isEncryptionAvailable(): Promise<boolean> {
66
this.logService.trace('[EncryptionMainService] Checking if encryption is available...');
67
const result = safeStorage.isEncryptionAvailable();
68
this.logService.trace('[EncryptionMainService] Encryption is available: ', result);
69
return Promise.resolve(result);
70
}
71
72
getKeyStorageProvider(): Promise<KnownStorageProvider> {
73
if (isWindows) {
74
return Promise.resolve(KnownStorageProvider.dplib);
75
}
76
if (isMacintosh) {
77
return Promise.resolve(KnownStorageProvider.keychainAccess);
78
}
79
if (safeStorage.getSelectedStorageBackend) {
80
try {
81
this.logService.trace('[EncryptionMainService] Getting selected storage backend...');
82
const result = safeStorage.getSelectedStorageBackend() as KnownStorageProvider;
83
this.logService.trace('[EncryptionMainService] Selected storage backend: ', result);
84
return Promise.resolve(result);
85
} catch (e) {
86
this.logService.error(e);
87
}
88
}
89
return Promise.resolve(KnownStorageProvider.unknown);
90
}
91
92
async setUsePlainTextEncryption(): Promise<void> {
93
if (isWindows) {
94
throw new Error('Setting plain text encryption is not supported on Windows.');
95
}
96
97
if (isMacintosh) {
98
throw new Error('Setting plain text encryption is not supported on macOS.');
99
}
100
101
if (!safeStorage.setUsePlainTextEncryption) {
102
throw new Error('Setting plain text encryption is not supported.');
103
}
104
105
this.logService.trace('[EncryptionMainService] Setting usePlainTextEncryption to true...');
106
safeStorage.setUsePlainTextEncryption(true);
107
this.logService.trace('[EncryptionMainService] Set usePlainTextEncryption to true');
108
}
109
}
110
111