From 93c291dba18bbe3590700ed1895da76b6cbd56cd Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Wed, 12 Dec 2018 09:11:10 -0500 Subject: [PATCH] base cipher report component class --- src/app/tools/cipher-report.component.ts | 60 +++++++++++++++++++ .../exposed-passwords-report.component.ts | 50 ++-------------- .../inactive-two-factor-report.component.ts | 58 ++++-------------- .../reused-passwords-report.component.ts | 56 +++-------------- .../unsecured-websites-report.component.ts | 59 +++--------------- .../tools/weak-passwords-report.component.ts | 56 +++-------------- 6 files changed, 103 insertions(+), 236 deletions(-) create mode 100644 src/app/tools/cipher-report.component.ts diff --git a/src/app/tools/cipher-report.component.ts b/src/app/tools/cipher-report.component.ts new file mode 100644 index 0000000000..50ed7d78cc --- /dev/null +++ b/src/app/tools/cipher-report.component.ts @@ -0,0 +1,60 @@ +import { + ComponentFactoryResolver, + ViewChild, + ViewContainerRef, +} from '@angular/core'; + +import { CipherView } from 'jslib/models/view/cipherView'; + +import { ModalComponent } from '../modal.component'; +import { AddEditComponent } from '../vault/add-edit.component'; + +export class CipherReportComponent { + @ViewChild('cipherAddEdit', { read: ViewContainerRef }) cipherAddEditModalRef: ViewContainerRef; + + loading = false; + hasLoaded = false; + ciphers: CipherView[] = []; + + private modal: ModalComponent = null; + + constructor(private componentFactoryResolver: ComponentFactoryResolver) { } + + async load() { + this.loading = true; + await this.setCiphers(); + this.loading = false; + this.hasLoaded = true; + } + + selectCipher(cipher: CipherView) { + if (this.modal != null) { + this.modal.close(); + } + + const factory = this.componentFactoryResolver.resolveComponentFactory(ModalComponent); + this.modal = this.cipherAddEditModalRef.createComponent(factory).instance; + const childComponent = this.modal.show( + AddEditComponent, this.cipherAddEditModalRef); + + childComponent.cipherId = cipher == null ? null : cipher.id; + childComponent.onSavedCipher.subscribe(async (c: CipherView) => { + this.modal.close(); + await this.load(); + }); + childComponent.onDeletedCipher.subscribe(async (c: CipherView) => { + this.modal.close(); + await this.load(); + }); + + this.modal.onClosed.subscribe(() => { + this.modal = null; + }); + + return childComponent; + } + + protected async setCiphers() { + this.ciphers = []; + } +} diff --git a/src/app/tools/exposed-passwords-report.component.ts b/src/app/tools/exposed-passwords-report.component.ts index 59f0c6bbe5..b6a42c6fac 100644 --- a/src/app/tools/exposed-passwords-report.component.ts +++ b/src/app/tools/exposed-passwords-report.component.ts @@ -1,8 +1,6 @@ import { Component, ComponentFactoryResolver, - ViewChild, - ViewContainerRef, } from '@angular/core'; import { AuditService } from 'jslib/abstractions/audit.service'; @@ -12,28 +10,21 @@ import { CipherView } from 'jslib/models/view/cipherView'; import { CipherType } from 'jslib/enums/cipherType'; -import { ModalComponent } from '../modal.component'; -import { AddEditComponent } from '../vault/add-edit.component'; +import { CipherReportComponent } from './cipher-report.component'; @Component({ selector: 'app-exposed-passwords-report', templateUrl: 'exposed-passwords-report.component.html', }) -export class ExposedPasswordsReportComponent { - @ViewChild('cipherAddEdit', { read: ViewContainerRef }) cipherAddEditModalRef: ViewContainerRef; - - loading = false; - hasLoaded = false; - ciphers: CipherView[] = []; +export class ExposedPasswordsReportComponent extends CipherReportComponent { exposedPasswordMap = new Map(); - private modal: ModalComponent = null; - constructor(private ciphersService: CipherService, private auditService: AuditService, - private componentFactoryResolver: ComponentFactoryResolver) { } + componentFactoryResolver: ComponentFactoryResolver) { + super(componentFactoryResolver); + } - async load() { - this.loading = true; + async setCiphers() { const allCiphers = await this.ciphersService.getAllDecrypted(); const exposedPasswordCiphers: CipherView[] = []; const promises: Array> = []; @@ -51,34 +42,5 @@ export class ExposedPasswordsReportComponent { }); await Promise.all(promises); this.ciphers = exposedPasswordCiphers; - this.loading = false; - this.hasLoaded = true; - } - - selectCipher(cipher: CipherView) { - if (this.modal != null) { - this.modal.close(); - } - - const factory = this.componentFactoryResolver.resolveComponentFactory(ModalComponent); - this.modal = this.cipherAddEditModalRef.createComponent(factory).instance; - const childComponent = this.modal.show( - AddEditComponent, this.cipherAddEditModalRef); - - childComponent.cipherId = cipher == null ? null : cipher.id; - childComponent.onSavedCipher.subscribe(async (c: CipherView) => { - this.modal.close(); - await this.load(); - }); - childComponent.onDeletedCipher.subscribe(async (c: CipherView) => { - this.modal.close(); - await this.load(); - }); - - this.modal.onClosed.subscribe(() => { - this.modal = null; - }); - - return childComponent; } } diff --git a/src/app/tools/inactive-two-factor-report.component.ts b/src/app/tools/inactive-two-factor-report.component.ts index f1dbe67256..836e7cf212 100644 --- a/src/app/tools/inactive-two-factor-report.component.ts +++ b/src/app/tools/inactive-two-factor-report.component.ts @@ -2,8 +2,6 @@ import { Component, ComponentFactoryResolver, OnInit, - ViewChild, - ViewContainerRef, } from '@angular/core'; import { CipherService } from 'jslib/abstractions/cipher.service'; @@ -12,34 +10,27 @@ import { CipherView } from 'jslib/models/view/cipherView'; import { CipherType } from 'jslib/enums/cipherType'; -import { ModalComponent } from '../modal.component'; -import { AddEditComponent } from '../vault/add-edit.component'; - import { Utils } from 'jslib/misc/utils'; +import { CipherReportComponent } from './cipher-report.component'; + @Component({ selector: 'app-inactive-two-factor-report', templateUrl: 'inactive-two-factor-report.component.html', }) -export class InactiveTwoFactorReportComponent implements OnInit { - @ViewChild('cipherAddEdit', { read: ViewContainerRef }) cipherAddEditModalRef: ViewContainerRef; - - loading = false; - hasLoaded = false; +export class InactiveTwoFactorReportComponent extends CipherReportComponent implements OnInit { services = new Map(); cipherDocs = new Map(); - ciphers: CipherView[] = []; - private modal: ModalComponent = null; - - constructor(private ciphersService: CipherService, private componentFactoryResolver: ComponentFactoryResolver) { } - - async ngOnInit() { - await this.load(); + constructor(private ciphersService: CipherService, componentFactoryResolver: ComponentFactoryResolver) { + super(componentFactoryResolver); } - async load() { - this.loading = true; + ngOnInit() { + this.load(); + } + + async setCiphers() { try { await this.load2fa(); } catch { } @@ -70,35 +61,6 @@ export class InactiveTwoFactorReportComponent implements OnInit { this.ciphers = inactive2faCiphers; this.cipherDocs = docs; } - this.loading = false; - this.hasLoaded = true; - } - - selectCipher(cipher: CipherView) { - if (this.modal != null) { - this.modal.close(); - } - - const factory = this.componentFactoryResolver.resolveComponentFactory(ModalComponent); - this.modal = this.cipherAddEditModalRef.createComponent(factory).instance; - const childComponent = this.modal.show( - AddEditComponent, this.cipherAddEditModalRef); - - childComponent.cipherId = cipher == null ? null : cipher.id; - childComponent.onSavedCipher.subscribe(async (c: CipherView) => { - this.modal.close(); - await this.load(); - }); - childComponent.onDeletedCipher.subscribe(async (c: CipherView) => { - this.modal.close(); - await this.load(); - }); - - this.modal.onClosed.subscribe(() => { - this.modal = null; - }); - - return childComponent; } private async load2fa() { diff --git a/src/app/tools/reused-passwords-report.component.ts b/src/app/tools/reused-passwords-report.component.ts index 6feb71d7ae..4d18f9fbd8 100644 --- a/src/app/tools/reused-passwords-report.component.ts +++ b/src/app/tools/reused-passwords-report.component.ts @@ -2,8 +2,6 @@ import { Component, ComponentFactoryResolver, OnInit, - ViewChild, - ViewContainerRef, } from '@angular/core'; import { CipherService } from 'jslib/abstractions/cipher.service'; @@ -12,31 +10,24 @@ import { CipherView } from 'jslib/models/view/cipherView'; import { CipherType } from 'jslib/enums/cipherType'; -import { ModalComponent } from '../modal.component'; -import { AddEditComponent } from '../vault/add-edit.component'; +import { CipherReportComponent } from './cipher-report.component'; @Component({ selector: 'app-reused-passwords-report', templateUrl: 'reused-passwords-report.component.html', }) -export class ReusedPasswordsReportComponent implements OnInit { - @ViewChild('cipherAddEdit', { read: ViewContainerRef }) cipherAddEditModalRef: ViewContainerRef; - - loading = true; - hasLoaded = false; - ciphers: CipherView[] = []; +export class ReusedPasswordsReportComponent extends CipherReportComponent implements OnInit { passwordUseMap: Map; - private modal: ModalComponent = null; - - constructor(private ciphersService: CipherService, private componentFactoryResolver: ComponentFactoryResolver) { } - - async ngOnInit() { - await this.load(); + constructor(private ciphersService: CipherService, componentFactoryResolver: ComponentFactoryResolver) { + super(componentFactoryResolver); } - async load() { - this.loading = true; + ngOnInit() { + this.load(); + } + + async setCiphers() { const allCiphers = await this.ciphersService.getAllDecrypted(); const ciphersWithPasswords: CipherView[] = []; this.passwordUseMap = new Map(); @@ -54,34 +45,5 @@ export class ReusedPasswordsReportComponent implements OnInit { const reusedPasswordCiphers = ciphersWithPasswords.filter((c) => this.passwordUseMap.has(c.login.password) && this.passwordUseMap.get(c.login.password) > 1); this.ciphers = reusedPasswordCiphers; - this.loading = false; - this.hasLoaded = true; - } - - selectCipher(cipher: CipherView) { - if (this.modal != null) { - this.modal.close(); - } - - const factory = this.componentFactoryResolver.resolveComponentFactory(ModalComponent); - this.modal = this.cipherAddEditModalRef.createComponent(factory).instance; - const childComponent = this.modal.show( - AddEditComponent, this.cipherAddEditModalRef); - - childComponent.cipherId = cipher == null ? null : cipher.id; - childComponent.onSavedCipher.subscribe(async (c: CipherView) => { - this.modal.close(); - await this.load(); - }); - childComponent.onDeletedCipher.subscribe(async (c: CipherView) => { - this.modal.close(); - await this.load(); - }); - - this.modal.onClosed.subscribe(() => { - this.modal = null; - }); - - return childComponent; } } diff --git a/src/app/tools/unsecured-websites-report.component.ts b/src/app/tools/unsecured-websites-report.component.ts index f35ccadd66..ef53b038b0 100644 --- a/src/app/tools/unsecured-websites-report.component.ts +++ b/src/app/tools/unsecured-websites-report.component.ts @@ -2,40 +2,28 @@ import { Component, ComponentFactoryResolver, OnInit, - ViewChild, - ViewContainerRef, } from '@angular/core'; import { CipherService } from 'jslib/abstractions/cipher.service'; -import { CipherView } from 'jslib/models/view/cipherView'; - import { CipherType } from 'jslib/enums/cipherType'; -import { ModalComponent } from '../modal.component'; -import { AddEditComponent } from '../vault/add-edit.component'; +import { CipherReportComponent } from './cipher-report.component'; @Component({ selector: 'app-unsecured-websites-report', templateUrl: 'unsecured-websites-report.component.html', }) -export class UnsecuredWebsitesReportComponent implements OnInit { - @ViewChild('cipherAddEdit', { read: ViewContainerRef }) cipherAddEditModalRef: ViewContainerRef; - - loading = true; - hasLoaded = false; - ciphers: CipherView[] = []; - - private modal: ModalComponent = null; - - constructor(private ciphersService: CipherService, private componentFactoryResolver: ComponentFactoryResolver) { } - - async ngOnInit() { - await this.load(); +export class UnsecuredWebsitesReportComponent extends CipherReportComponent implements OnInit { + constructor(private ciphersService: CipherService, componentFactoryResolver: ComponentFactoryResolver) { + super(componentFactoryResolver); } - async load() { - this.loading = true; + ngOnInit() { + this.load(); + } + + async setCiphers() { const allCiphers = await this.ciphersService.getAllDecrypted(); const unsecuredCiphers = allCiphers.filter((c) => { if (c.type !== CipherType.Login || !c.login.hasUris) { @@ -44,34 +32,5 @@ export class UnsecuredWebsitesReportComponent implements OnInit { return c.login.uris.find((u) => u.uri.indexOf('http://') === 0) != null; }); this.ciphers = unsecuredCiphers; - this.loading = false; - this.hasLoaded = true; - } - - selectCipher(cipher: CipherView) { - if (this.modal != null) { - this.modal.close(); - } - - const factory = this.componentFactoryResolver.resolveComponentFactory(ModalComponent); - this.modal = this.cipherAddEditModalRef.createComponent(factory).instance; - const childComponent = this.modal.show( - AddEditComponent, this.cipherAddEditModalRef); - - childComponent.cipherId = cipher == null ? null : cipher.id; - childComponent.onSavedCipher.subscribe(async (c: CipherView) => { - this.modal.close(); - await this.load(); - }); - childComponent.onDeletedCipher.subscribe(async (c: CipherView) => { - this.modal.close(); - await this.load(); - }); - - this.modal.onClosed.subscribe(() => { - this.modal = null; - }); - - return childComponent; } } diff --git a/src/app/tools/weak-passwords-report.component.ts b/src/app/tools/weak-passwords-report.component.ts index a7b3144791..a356161c74 100644 --- a/src/app/tools/weak-passwords-report.component.ts +++ b/src/app/tools/weak-passwords-report.component.ts @@ -2,8 +2,6 @@ import { Component, ComponentFactoryResolver, OnInit, - ViewChild, - ViewContainerRef, } from '@angular/core'; import { CipherService } from 'jslib/abstractions/cipher.service'; @@ -13,32 +11,25 @@ import { CipherView } from 'jslib/models/view/cipherView'; import { CipherType } from 'jslib/enums/cipherType'; -import { ModalComponent } from '../modal.component'; -import { AddEditComponent } from '../vault/add-edit.component'; +import { CipherReportComponent } from './cipher-report.component'; @Component({ selector: 'app-weak-passwords-report', templateUrl: 'weak-passwords-report.component.html', }) -export class WeakPasswordsReportComponent implements OnInit { - @ViewChild('cipherAddEdit', { read: ViewContainerRef }) cipherAddEditModalRef: ViewContainerRef; - - loading = true; - hasLoaded = false; - ciphers: CipherView[] = []; +export class WeakPasswordsReportComponent extends CipherReportComponent implements OnInit { passwordStrengthMap = new Map(); - private modal: ModalComponent = null; - constructor(private ciphersService: CipherService, private passwordGenerationService: PasswordGenerationService, - private componentFactoryResolver: ComponentFactoryResolver) { } - - async ngOnInit() { - await this.load(); + componentFactoryResolver: ComponentFactoryResolver) { + super(componentFactoryResolver); } - async load() { - this.loading = true; + ngOnInit() { + this.load(); + } + + async setCiphers() { const allCiphers = await this.ciphersService.getAllDecrypted(); const weakPasswordCiphers: CipherView[] = []; allCiphers.forEach((c) => { @@ -52,35 +43,6 @@ export class WeakPasswordsReportComponent implements OnInit { } }); this.ciphers = weakPasswordCiphers; - this.loading = false; - this.hasLoaded = true; - } - - selectCipher(cipher: CipherView) { - if (this.modal != null) { - this.modal.close(); - } - - const factory = this.componentFactoryResolver.resolveComponentFactory(ModalComponent); - this.modal = this.cipherAddEditModalRef.createComponent(factory).instance; - const childComponent = this.modal.show( - AddEditComponent, this.cipherAddEditModalRef); - - childComponent.cipherId = cipher == null ? null : cipher.id; - childComponent.onSavedCipher.subscribe(async (c: CipherView) => { - this.modal.close(); - await this.load(); - }); - childComponent.onDeletedCipher.subscribe(async (c: CipherView) => { - this.modal.close(); - await this.load(); - }); - - this.modal.onClosed.subscribe(() => { - this.modal = null; - }); - - return childComponent; } private scoreKey(score: number): [string, string] {