| import { execaSync } from 'execa' |
| import { jsonParse, jsonStringify } from '../slowOperations.js' |
| import { |
| CREDENTIALS_SERVICE_SUFFIX, |
| getSecureStorageServiceName, |
| getUsername, |
| } from './macOsKeychainHelpers.js' |
| import type { SecureStorage, SecureStorageData } from './index.js' |
|
|
| |
| |
| |
| |
| export const linuxSecretStorage: SecureStorage = { |
| name: 'libsecret', |
| read(): SecureStorageData | null { |
| try { |
| const username = getUsername() |
| const serviceName = getSecureStorageServiceName( |
| CREDENTIALS_SERVICE_SUFFIX, |
| ) |
| |
| const result = execaSync( |
| 'secret-tool', |
| ['lookup', 'service', serviceName, 'account', username], |
| { reject: false }, |
| ) |
|
|
| if (result.exitCode === 0 && result.stdout) { |
| return jsonParse(result.stdout) |
| } |
| } catch { |
| |
| } |
| return null |
| }, |
| async readAsync(): Promise<SecureStorageData | null> { |
| |
| return this.read() |
| }, |
| update(data: SecureStorageData): { success: boolean; warning?: string } { |
| try { |
| const username = getUsername() |
| const serviceName = getSecureStorageServiceName( |
| CREDENTIALS_SERVICE_SUFFIX, |
| ) |
| const payload = jsonStringify(data) |
| |
| |
| const result = execaSync( |
| 'secret-tool', |
| [ |
| 'store', |
| '--label', |
| serviceName, |
| 'service', |
| serviceName, |
| 'account', |
| username, |
| ], |
| { input: payload, reject: false }, |
| ) |
|
|
| return { success: result.exitCode === 0 } |
| } catch { |
| return { success: false } |
| } |
| }, |
| delete(): boolean { |
| try { |
| const username = getUsername() |
| const serviceName = getSecureStorageServiceName( |
| CREDENTIALS_SERVICE_SUFFIX, |
| ) |
| |
| const result = execaSync( |
| 'secret-tool', |
| ['clear', 'service', serviceName, 'account', username], |
| { reject: false }, |
| ) |
| return result.exitCode === 0 |
| } catch { |
| return false |
| } |
| }, |
| } |
|
|