diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 24bc3afd51..f7498200fd 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -40,7 +40,16 @@ import { ImportComponent as OrgImportComponent } from './organizations/tools/imp import { InactiveTwoFactorReportComponent as OrgInactiveTwoFactorReportComponent, } from './organizations/tools/inactive-two-factor-report.component'; +import { + ReusedPasswordsReportComponent as OrgReusedPasswordsReportComponent, +} from './organizations/tools/reused-passwords-report.component'; import { ToolsComponent as OrgToolsComponent } from './organizations/tools/tools.component'; +import { + UnsecuredWebsitesReportComponent as OrgUnsecuredWebsitesReportComponent, +} from './organizations/tools/unsecured-websites-report.component'; +import { + WeakPasswordsReportComponent as OrgWeakPasswordsReportComponent, +} from './organizations/tools/weak-passwords-report.component'; import { VaultComponent as OrgVaultComponent } from './organizations/vault/vault.component'; @@ -214,6 +223,21 @@ const routes: Routes = [ component: OrgInactiveTwoFactorReportComponent, data: { titleId: 'inactive2faReport' }, }, + { + path: 'reused-passwords-report', + component: OrgReusedPasswordsReportComponent, + data: { titleId: 'reusedPasswordsReport' }, + }, + { + path: 'unsecured-websites-report', + component: OrgUnsecuredWebsitesReportComponent, + data: { titleId: 'unsecuredWebsitesReport' }, + }, + { + path: 'weak-passwords-report', + component: OrgWeakPasswordsReportComponent, + data: { titleId: 'weakPasswordsReport' }, + }, ], }, { diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 1662c336f6..a8a0bbe2c1 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -70,7 +70,16 @@ import { ImportComponent as OrgImportComponent } from './organizations/tools/imp import { InactiveTwoFactorReportComponent as OrgInactiveTwoFactorReportComponent, } from './organizations/tools/inactive-two-factor-report.component'; +import { + ReusedPasswordsReportComponent as OrgReusedPasswordsReportComponent, +} from './organizations/tools/reused-passwords-report.component'; import { ToolsComponent as OrgToolsComponent } from './organizations/tools/tools.component'; +import { + UnsecuredWebsitesReportComponent as OrgUnsecuredWebsitesReportComponent, +} from './organizations/tools/unsecured-websites-report.component'; +import { + WeakPasswordsReportComponent as OrgWeakPasswordsReportComponent, +} from './organizations/tools/weak-passwords-report.component'; import { AddEditComponent as OrgAddEditComponent } from './organizations/vault/add-edit.component'; import { AttachmentsComponent as OrgAttachmentsComponent } from './organizations/vault/attachments.component'; @@ -267,6 +276,7 @@ registerLocaleData(localeZhCn, 'zh-CN'); OrgManageCollectionsComponent, OrgManageComponent, OrgPeopleComponent, + OrgReusedPasswordsReportComponent, OrgSettingComponent, OrgToolsComponent, OrgTwoFactorSetupComponent, @@ -275,7 +285,9 @@ registerLocaleData(localeZhCn, 'zh-CN'); OrgUserGroupsComponent, OrganizationsComponent, OrganizationLayoutComponent, + OrgUnsecuredWebsitesReportComponent, OrgVaultComponent, + OrgWeakPasswordsReportComponent, PasswordGeneratorComponent, PasswordGeneratorHistoryComponent, PasswordStrengthComponent, diff --git a/src/app/organizations/tools/exposed-passwords-report.component.ts b/src/app/organizations/tools/exposed-passwords-report.component.ts index 7103807c2c..88c26ed638 100644 --- a/src/app/organizations/tools/exposed-passwords-report.component.ts +++ b/src/app/organizations/tools/exposed-passwords-report.component.ts @@ -20,10 +20,10 @@ import { CipherView } from 'jslib/models/view/cipherView'; templateUrl: '../../tools/exposed-passwords-report.component.html', }) export class ExposedPasswordsReportComponent extends BaseExposedPasswordsReportComponent { - constructor(ciphersService: CipherService, auditService: AuditService, + constructor(cipherService: CipherService, auditService: AuditService, componentFactoryResolver: ComponentFactoryResolver, messagingService: MessagingService, userService: UserService, private route: ActivatedRoute) { - super(ciphersService, auditService, componentFactoryResolver, messagingService, userService); + super(cipherService, auditService, componentFactoryResolver, messagingService, userService); } ngOnInit() { diff --git a/src/app/organizations/tools/inactive-two-factor-report.component.ts b/src/app/organizations/tools/inactive-two-factor-report.component.ts index e45b168b21..2e982278d7 100644 --- a/src/app/organizations/tools/inactive-two-factor-report.component.ts +++ b/src/app/organizations/tools/inactive-two-factor-report.component.ts @@ -19,10 +19,10 @@ import { CipherView } from 'jslib/models/view/cipherView'; templateUrl: '../../tools/inactive-two-factor-report.component.html', }) export class InactiveTwoFactorReportComponent extends BaseInactiveTwoFactorReportComponent { - constructor(ciphersService: CipherService, componentFactoryResolver: ComponentFactoryResolver, + constructor(cipherService: CipherService, componentFactoryResolver: ComponentFactoryResolver, messagingService: MessagingService, userService: UserService, private route: ActivatedRoute) { - super(ciphersService, componentFactoryResolver, messagingService, userService); + super(cipherService, componentFactoryResolver, messagingService, userService); } async ngOnInit() { diff --git a/src/app/organizations/tools/reused-passwords-report.component.ts b/src/app/organizations/tools/reused-passwords-report.component.ts new file mode 100644 index 0000000000..8dfc11ab8d --- /dev/null +++ b/src/app/organizations/tools/reused-passwords-report.component.ts @@ -0,0 +1,38 @@ +import { + Component, + ComponentFactoryResolver, +} from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { CipherService } from 'jslib/abstractions/cipher.service'; +import { MessagingService } from 'jslib/abstractions/messaging.service'; +import { UserService } from 'jslib/abstractions/user.service'; + +import { CipherView } from 'jslib/models/view/cipherView'; + +import { + ReusedPasswordsReportComponent as BaseReusedPasswordsReportComponent, +} from '../../tools/reused-passwords-report.component'; + +@Component({ + selector: 'app-reused-passwords-report', + templateUrl: '../../tools/reused-passwords-report.component.html', +}) +export class ReusedPasswordsReportComponent extends BaseReusedPasswordsReportComponent { + constructor(cipherService: CipherService, componentFactoryResolver: ComponentFactoryResolver, + messagingService: MessagingService, userService: UserService, + private route: ActivatedRoute) { + super(cipherService, componentFactoryResolver, messagingService, userService); + } + + async ngOnInit() { + this.route.parent.parent.params.subscribe(async (params) => { + this.organization = await this.userService.getOrganization(params.organizationId); + await super.ngOnInit(); + }); + } + + getAllCiphers(): Promise { + return this.cipherService.getAllFromApiForOrganization(this.organization.id); + } +} diff --git a/src/app/organizations/tools/unsecured-websites-report.component.ts b/src/app/organizations/tools/unsecured-websites-report.component.ts new file mode 100644 index 0000000000..de77d87197 --- /dev/null +++ b/src/app/organizations/tools/unsecured-websites-report.component.ts @@ -0,0 +1,38 @@ +import { + Component, + ComponentFactoryResolver, +} from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { CipherService } from 'jslib/abstractions/cipher.service'; +import { MessagingService } from 'jslib/abstractions/messaging.service'; +import { UserService } from 'jslib/abstractions/user.service'; + +import { + UnsecuredWebsitesReportComponent as BaseUnsecuredWebsitesReportComponent, +} from '../../tools/unsecured-websites-report.component'; + +import { CipherView } from 'jslib/models/view/cipherView'; + +@Component({ + selector: 'app-unsecured-websites-report', + templateUrl: '../../tools/unsecured-websites-report.component.html', +}) +export class UnsecuredWebsitesReportComponent extends BaseUnsecuredWebsitesReportComponent { + constructor(cipherService: CipherService, componentFactoryResolver: ComponentFactoryResolver, + messagingService: MessagingService, userService: UserService, + private route: ActivatedRoute) { + super(cipherService, componentFactoryResolver, messagingService, userService); + } + + async ngOnInit() { + this.route.parent.parent.params.subscribe(async (params) => { + this.organization = await this.userService.getOrganization(params.organizationId); + await super.ngOnInit(); + }); + } + + getAllCiphers(): Promise { + return this.cipherService.getAllFromApiForOrganization(this.organization.id); + } +} diff --git a/src/app/organizations/tools/weak-passwords-report.component.ts b/src/app/organizations/tools/weak-passwords-report.component.ts new file mode 100644 index 0000000000..9c98101a10 --- /dev/null +++ b/src/app/organizations/tools/weak-passwords-report.component.ts @@ -0,0 +1,39 @@ +import { + Component, + ComponentFactoryResolver, +} from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { CipherService } from 'jslib/abstractions/cipher.service'; +import { MessagingService } from 'jslib/abstractions/messaging.service'; +import { PasswordGenerationService } from 'jslib/abstractions/passwordGeneration.service'; +import { UserService } from 'jslib/abstractions/user.service'; + +import { CipherView } from 'jslib/models/view/cipherView'; + +import { + WeakPasswordsReportComponent as BaseWeakPasswordsReportComponent, +} from '../../tools/weak-passwords-report.component'; + +@Component({ + selector: 'app-weak-passwords-report', + templateUrl: '../../tools/weak-passwords-report.component.html', +}) +export class WeakPasswordsReportComponent extends BaseWeakPasswordsReportComponent { + constructor(cipherService: CipherService, passwordGenerationService: PasswordGenerationService, + componentFactoryResolver: ComponentFactoryResolver, messagingService: MessagingService, + userService: UserService, private route: ActivatedRoute) { + super(cipherService, passwordGenerationService, componentFactoryResolver, messagingService, userService); + } + + async ngOnInit() { + this.route.parent.parent.params.subscribe(async (params) => { + this.organization = await this.userService.getOrganization(params.organizationId); + await super.ngOnInit(); + }); + } + + getAllCiphers(): Promise { + return this.cipherService.getAllFromApiForOrganization(this.organization.id); + } +} diff --git a/src/app/tools/reused-passwords-report.component.ts b/src/app/tools/reused-passwords-report.component.ts index a82ffe707f..06d0cccf9c 100644 --- a/src/app/tools/reused-passwords-report.component.ts +++ b/src/app/tools/reused-passwords-report.component.ts @@ -21,7 +21,7 @@ import { CipherReportComponent } from './cipher-report.component'; export class ReusedPasswordsReportComponent extends CipherReportComponent implements OnInit { passwordUseMap: Map; - constructor(private ciphersService: CipherService, componentFactoryResolver: ComponentFactoryResolver, + constructor(protected cipherService: CipherService, componentFactoryResolver: ComponentFactoryResolver, messagingService: MessagingService, userService: UserService) { super(componentFactoryResolver, userService, messagingService, true); } @@ -33,7 +33,7 @@ export class ReusedPasswordsReportComponent extends CipherReportComponent implem } async setCiphers() { - const allCiphers = await this.ciphersService.getAllDecrypted(); + const allCiphers = await this.getAllCiphers(); const ciphersWithPasswords: CipherView[] = []; this.passwordUseMap = new Map(); allCiphers.forEach((c) => { @@ -51,4 +51,8 @@ export class ReusedPasswordsReportComponent extends CipherReportComponent implem this.passwordUseMap.has(c.login.password) && this.passwordUseMap.get(c.login.password) > 1); this.ciphers = reusedPasswordCiphers; } + + protected getAllCiphers(): Promise { + return this.cipherService.getAllDecrypted(); + } } diff --git a/src/app/tools/unsecured-websites-report.component.ts b/src/app/tools/unsecured-websites-report.component.ts index 3620334d4e..290c812b47 100644 --- a/src/app/tools/unsecured-websites-report.component.ts +++ b/src/app/tools/unsecured-websites-report.component.ts @@ -10,6 +10,8 @@ import { UserService } from 'jslib/abstractions/user.service'; import { CipherType } from 'jslib/enums/cipherType'; +import { CipherView } from 'jslib/models/view/cipherView'; + import { CipherReportComponent } from './cipher-report.component'; @Component({ @@ -17,7 +19,7 @@ import { CipherReportComponent } from './cipher-report.component'; templateUrl: 'unsecured-websites-report.component.html', }) export class UnsecuredWebsitesReportComponent extends CipherReportComponent implements OnInit { - constructor(private ciphersService: CipherService, componentFactoryResolver: ComponentFactoryResolver, + constructor(protected cipherService: CipherService, componentFactoryResolver: ComponentFactoryResolver, messagingService: MessagingService, userService: UserService) { super(componentFactoryResolver, userService, messagingService, true); } @@ -29,7 +31,7 @@ export class UnsecuredWebsitesReportComponent extends CipherReportComponent impl } async setCiphers() { - const allCiphers = await this.ciphersService.getAllDecrypted(); + const allCiphers = await this.getAllCiphers(); const unsecuredCiphers = allCiphers.filter((c) => { if (c.type !== CipherType.Login || !c.login.hasUris) { return false; @@ -38,4 +40,8 @@ export class UnsecuredWebsitesReportComponent extends CipherReportComponent impl }); this.ciphers = unsecuredCiphers; } + + protected getAllCiphers(): Promise { + return this.cipherService.getAllDecrypted(); + } } diff --git a/src/app/tools/weak-passwords-report.component.ts b/src/app/tools/weak-passwords-report.component.ts index b7852942cb..1df7045a3a 100644 --- a/src/app/tools/weak-passwords-report.component.ts +++ b/src/app/tools/weak-passwords-report.component.ts @@ -24,7 +24,7 @@ export class WeakPasswordsReportComponent extends CipherReportComponent implemen private passwordStrengthCache = new Map(); - constructor(private ciphersService: CipherService, private passwordGenerationService: PasswordGenerationService, + constructor(protected cipherService: CipherService, protected passwordGenerationService: PasswordGenerationService, componentFactoryResolver: ComponentFactoryResolver, messagingService: MessagingService, userService: UserService) { super(componentFactoryResolver, userService, messagingService, true); @@ -37,7 +37,7 @@ export class WeakPasswordsReportComponent extends CipherReportComponent implemen } async setCiphers() { - const allCiphers = await this.ciphersService.getAllDecrypted(); + const allCiphers = await this.getAllCiphers(); const weakPasswordCiphers: CipherView[] = []; allCiphers.forEach((c) => { if (c.type !== CipherType.Login || c.login.password == null || c.login.password === '') { @@ -71,6 +71,10 @@ export class WeakPasswordsReportComponent extends CipherReportComponent implemen this.ciphers = weakPasswordCiphers; } + protected getAllCiphers(): Promise { + return this.cipherService.getAllDecrypted(); + } + private scoreKey(score: number): [string, string] { switch (score) { case 4: