diff --git a/src/commands/get.command.ts b/src/commands/get.command.ts new file mode 100644 index 0000000000..346c689ebd --- /dev/null +++ b/src/commands/get.command.ts @@ -0,0 +1,93 @@ +import * as program from 'commander'; + +import { CipherType } from 'jslib/enums/cipherType'; + +import { CipherService } from 'jslib/abstractions/cipher.service'; +import { CollectionService } from 'jslib/abstractions/collection.service'; +import { FolderService } from 'jslib/abstractions/folder.service'; +import { TotpService } from 'jslib/abstractions/totp.service'; + +export class GetCommand { + constructor(private cipherService: CipherService, private folderService: FolderService, + private collectionService: CollectionService, private totpService: TotpService) { } + + async run(object: string, id: string, cmd: program.Command) { + switch (object) { + case 'item': + await this.getCipher(id); + break; + case 'totp': + await this.getTotp(id); + break; + case 'folder': + await this.getFolder(id); + break; + case 'collection': + await this.getCollection(id); + break; + default: + console.log('Unknown object: ' + object); + break; + } + } + + private async getCipher(id: string) { + const cipher = await this.cipherService.get(id); + if (cipher == null) { + console.log('Not found.'); + return; + } + + const decCipher = await cipher.decrypt(); + console.log(JSON.stringify(decCipher)); + } + + private async getTotp(id: string) { + const cipher = await this.cipherService.get(id); + if (cipher == null) { + console.log('Not found.'); + return; + } + + if (cipher.type !== CipherType.Login) { + console.log('Not a login.'); + return; + } + + const decCipher = await cipher.decrypt(); + if (decCipher.login.totp == null || decCipher.login.totp === '') { + console.log('No TOTP available.'); + return; + } + + const totp = await this.totpService.getCode(decCipher.login.totp); + if (totp == null) { + console.log('Couldn\'t generate TOTP code.'); + return; + } + + console.log(JSON.stringify(totp)); + } + + private async getFolder(id: string) { + const folder = await this.folderService.get(id); + if (folder == null) { + console.log('Not found.'); + return; + } + + const decFolder = await folder.decrypt(); + console.log(JSON.stringify(decFolder)); + } + + private async getCollection(id: string) { + const collection = await this.collectionService.get(id); + if (collection == null) { + console.log('Not found.'); + return; + } + + const decCollection = await collection.decrypt(); + console.log(JSON.stringify(decCollection)); + } +} diff --git a/src/commands/list.command.ts b/src/commands/list.command.ts new file mode 100644 index 0000000000..13e94b2bc0 --- /dev/null +++ b/src/commands/list.command.ts @@ -0,0 +1,42 @@ +import * as program from 'commander'; + +import { CipherService } from 'jslib/abstractions/cipher.service'; +import { CollectionService } from 'jslib/services/collection.service'; +import { FolderService } from 'jslib/services/folder.service'; + +export class ListCommand { + constructor(private cipherService: CipherService, private folderService: FolderService, + private collectionService: CollectionService) { } + + async run(object: string, cmd: program.Command) { + switch (object) { + case 'items': + await this.listCiphers(); + break; + case 'folders': + await this.listFolders(); + break; + case 'collections': + await this.listCollections(); + break; + default: + console.log('Unknown object: ' + object); + break; + } + } + + private async listCiphers() { + const ciphers = await this.cipherService.getAllDecrypted(); + console.log(JSON.stringify(ciphers)); + } + + private async listFolders() { + const folders = await this.folderService.getAllDecrypted(); + console.log(JSON.stringify(folders)); + } + + private async listCollections() { + const collections = await this.collectionService.getAllDecrypted(); + console.log(JSON.stringify(collections)); + } +} diff --git a/src/commands/sync.command.ts b/src/commands/sync.command.ts index 7883d60af4..05eea6fce7 100644 --- a/src/commands/sync.command.ts +++ b/src/commands/sync.command.ts @@ -3,9 +3,7 @@ import * as program from 'commander'; import { SyncService } from 'jslib/abstractions/sync.service'; export class SyncCommand { - constructor(private syncService: SyncService) { - - } + constructor(private syncService: SyncService) { } async run(cmd: program.Command) { try { diff --git a/src/main.ts b/src/main.ts index 04f31470e5..ac645c3992 100644 --- a/src/main.ts +++ b/src/main.ts @@ -82,6 +82,8 @@ export class Main { this.syncService = new SyncService(this.userService, this.apiService, this.settingsService, this.folderService, this.cipherService, this.cryptoService, this.collectionService, this.storageService, this.messagingService, (expired: boolean) => { }); + this.passwordGenerationService = new PasswordGenerationService(this.cryptoService, this.storageService); + this.totpService = new TotpService(this.storageService, this.cryptoFunctionService); this.authService = new AuthService(this.cryptoService, this.apiService, this.userService, this.tokenService, this.appIdService, this.i18nService, this.platformUtilsService, this.messagingService, true); this.program = new Program(this); diff --git a/src/program.ts b/src/program.ts index 69865b827c..0cd9b84204 100644 --- a/src/program.ts +++ b/src/program.ts @@ -2,6 +2,8 @@ import * as program from 'commander'; import { LoginCommand } from './commands/login.command'; import { SyncCommand } from './commands/sync.command'; +import { ListCommand } from './commands/list.command'; +import { GetCommand } from './commands/get.command'; import { Main } from './main'; @@ -36,7 +38,6 @@ export class Program { .description('Sync user\'s vault from server.') .option('-f, --force', 'Force a full sync.') .action(async (cmd) => { - console.log('Syncing...'); const command = new SyncCommand(this.main.syncService); await command.run(cmd); process.exit(); @@ -45,18 +46,21 @@ export class Program { program .command('list ') .description('List objects.') - .action((object, cmd) => { - console.log('Listing...'); - console.log(object); + .action(async (object, cmd) => { + const command = new ListCommand(this.main.cipherService, this.main.folderService, + this.main.collectionService); + await command.run(object, cmd); + process.exit(); }); program .command('get ') .description('Get an object.') - .action((object, id, cmd) => { - console.log('Getting...'); - console.log(object); - console.log(id); + .action(async (object, id, cmd) => { + const command = new GetCommand(this.main.cipherService, this.main.folderService, + this.main.collectionService, this.main.totpService); + await command.run(object, id, cmd); + process.exit(); }); program