Skip to content

Commit

Permalink
Merge pull request #47 from GustavoASC/use-secret-storage-api
Browse files Browse the repository at this point in the history
Use secret storage API
  • Loading branch information
GustavoASC authored Oct 19, 2023
2 parents ce671c0 + 184c6b8 commit 1591706
Show file tree
Hide file tree
Showing 9 changed files with 47 additions and 35 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/).

## [1.3.9] - 2023-10-18
### Changed

- Now uses SecretStorageApi as KeyTar has been deprecated

## [1.3.5] - 2022-09-20
### Changed

Expand Down
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
},
"license": "MIT",
"publisher": "GustavoASC",
"version": "1.3.5",
"version": "1.3.9",
"icon": "img/icon.png",
"engines": {
"vscode": "^1.70.0"
Expand Down Expand Up @@ -212,7 +212,6 @@
"googleapis": "52.1.0",
"google-auth-library": "7.14.0",
"server-destroy": "1.0.1",
"keytar": "7.9.0",
"mime-types": "2.1.27",
"archiver": "4.0.2"
},
Expand Down
11 changes: 4 additions & 7 deletions src/drive/credentials/credentialsManager.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
import * as os from "os";
import { KeytarCredentialsProvider } from './keytarCredentialsProvider';
import { SecretStorageCredentialsProvider } from './secretStorageCredentialsProvider';
import { SecretStorage } from "vscode";

export const CREDENTIALS_JSON_SERVICE = 'Google Drive for VSCode - Credentials';
export const TOKENS_JSON_SERVICE = 'Google Drive for VSCode - Token';

export class CredentialsManager {

private credentialsProvider = new KeytarCredentialsProvider();

changeProvider(provider: ICredentialsProvider): void {
this.credentialsProvider = provider;
}
constructor(private credentialsProvider: ICredentialsProvider) {}

storePassword(passContent: string, serviceName: string): Promise<void> {
return new Promise((resolve, reject) => {
Expand Down Expand Up @@ -56,7 +53,7 @@ export class CredentialsManager {

export interface ICredentialsProvider {

getPassword(service: string, account: string): Promise<string | null>;
getPassword(service: string, account: string): Promise<string | undefined>;
setPassword(service: string, account: string, password: string): Promise<void>;
deletePassword(service: string, account: string): Promise<boolean>;

Expand Down
2 changes: 1 addition & 1 deletion src/drive/credentials/envCredentialsProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { ICredentialsProvider, CREDENTIALS_JSON_SERVICE, TOKENS_JSON_SERVICE } f

export class EnvCredentialsProvider implements ICredentialsProvider {

getPassword(service: string, _account: string): Promise<string | null> {
getPassword(service: string, _account: string): Promise<string | undefined> {
return new Promise((resolve) => {
const envName = this.resolveEnvName(service);
const envValue: any = process.env[envName];
Expand Down
18 changes: 0 additions & 18 deletions src/drive/credentials/keytarCredentialsProvider.ts

This file was deleted.

30 changes: 30 additions & 0 deletions src/drive/credentials/secretStorageCredentialsProvider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { ICredentialsProvider } from "./credentialsManager";
import { SecretStorage } from "vscode";


export class SecretStorageCredentialsProvider implements ICredentialsProvider {

constructor(private secretStorage: SecretStorage) {
}

getPassword(service: string, _: string): Promise<string | undefined> {
return new Promise((resolve) => {
this.secretStorage.get(service)
.then(value => resolve(value));
});
}

setPassword(service: string, _: string, password: string): Promise<void> {
return new Promise((resolve) => {
resolve(this.secretStorage.store(service, password));
});
}

deletePassword(service: string, _: string): Promise<boolean> {
return new Promise((resolve) => {
this.secretStorage.delete(service)
.then(_ => resolve(true));
})
}

}
6 changes: 4 additions & 2 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,18 @@ import { DRIVE_SCHEME } from './drive/fileSystem/fileSystemConstants';
import { DriveView } from './drive/view/driveView';
import { CredentialsManager } from './drive/credentials/credentialsManager';
import { VscodeClipboardProvider } from './vscodeClipboardProvider';
import { SecretStorageCredentialsProvider } from './drive/credentials/secretStorageCredentialsProvider';

export const CONFIGURE_CREDENTIALS_COMMAND = 'google.drive.configureCredentials';
export const CREATE_FOLDER_COMMAND = 'google.drive.createFolder';


// this method is called when your extension is activated
// your extension is activated the very first time the command is executed
export function activate({ subscriptions }: vscode.ExtensionContext) {
export function activate({ subscriptions, secrets }: vscode.ExtensionContext) {

const credentialsManager = new CredentialsManager();

const credentialsManager = new CredentialsManager(new SecretStorageCredentialsProvider(secrets));

const driveAuthenticator = new DriveAuthenticator(credentialsManager);
const credentialsConfigurator = new CredentialsConfigurator(driveAuthenticator);
Expand Down
3 changes: 1 addition & 2 deletions src/test/drive/credentials/credentialsManager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ describe('Credentials manager', () => {
// Prepares manager and env variables to return proper credentials
process.env['DRIVE_CREDENTIALS'] = 'bXkgZHVtbXkgY3JlZGVudGlhbHM=';
process.env['DRIVE_TOKEN'] = 'dGhlIGR1bW15IHRva2Vu=';
const manager = new CredentialsManager();
manager.changeProvider(new EnvCredentialsProvider());
const manager = new CredentialsManager(new EnvCredentialsProvider());

// Checks pass credentials
const credentials = await manager.retrievePassword(CREDENTIALS_JSON_SERVICE);
Expand Down
4 changes: 1 addition & 3 deletions src/test/integration/suite/integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,7 @@ suite('Operations on real Google Drive API', () => {
const envProvider = process.env.DRIVE_CREDENTIALS && process.env.DRIVE_TOKEN
if (envProvider) {

const credentialsManager = new CredentialsManager();
credentialsManager.changeProvider(new EnvCredentialsProvider());

const credentialsManager = new CredentialsManager(new EnvCredentialsProvider());

// Prepares the file provider to fetch and manipulate information from Google Drive
const driveAuthenticator = new DriveAuthenticator(credentialsManager);
Expand Down

0 comments on commit 1591706

Please sign in to comment.