1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-18 17:23:37 +00:00

[AC-1139] Changed canAccessVaultTab function to receive configService

This commit is contained in:
Rui Tome
2023-11-22 16:52:43 +00:00
parent 572e6e7ee2
commit 9cac254a18
11 changed files with 64 additions and 63 deletions

View File

@@ -1,12 +1,11 @@
import { Component, Input, OnInit } from "@angular/core";
import { combineLatest, map, Observable } from "rxjs";
import { Observable, switchMap } from "rxjs";
import {
canAccessAdmin,
OrganizationService,
} from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { Utils } from "@bitwarden/common/platform/misc/utils";
@@ -28,13 +27,10 @@ export class OrganizationSwitcherComponent implements OnInit {
loaded = false;
async ngOnInit() {
this.organizations$ = combineLatest([
this.organizationService.memberOrganizations$,
this.configService.getFeatureFlag$(FeatureFlag.FlexibleCollections, false),
]).pipe(
map(([orgs, flexibleCollectionsEnabled]) => {
const canAccess = canAccessAdmin(this.i18nService, flexibleCollectionsEnabled);
return canAccess ? orgs.sort(Utils.getSortFunction(this.i18nService, "name")) : [];
this.organizations$ = this.organizationService.memberOrganizations$.pipe(
switchMap(async (orgs) => {
const canAccess = await canAccessAdmin(this.i18nService, this.configService);
return canAccess ? orgs.sort(Utils.getSortFunction(this.i18nService, "name")) : orgs;
})
);

View File

@@ -6,7 +6,6 @@ import {
OrganizationService,
} from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
@@ -45,17 +44,12 @@ export class OrganizationPermissionsGuard implements CanActivate {
return this.router.createUrlTree(["/"]);
}
const flexibleCollectionsEnabled = await this.configService.getFeatureFlag(
FeatureFlag.FlexibleCollections,
false
);
const permissionsCallback: (
organization: Organization,
flexibleCollectionsEnabled: boolean
) => boolean = route.data?.organizationPermissions;
configService: ConfigServiceAbstraction
) => Promise<boolean> = route.data?.organizationPermissions;
const hasPermissions =
permissionsCallback == null || permissionsCallback(org, flexibleCollectionsEnabled);
permissionsCallback == null || (await permissionsCallback(org, this.configService));
if (!hasPermissions) {
// Handle linkable ciphers for organizations the user only has view access to
@@ -71,7 +65,7 @@ export class OrganizationPermissionsGuard implements CanActivate {
}
this.platformUtilsService.showToast("error", null, this.i18nService.t("accessDenied"));
return canAccessOrgAdmin(org, flexibleCollectionsEnabled)
return (await canAccessOrgAdmin(org, this.configService))
? this.router.createUrlTree(["/organizations", org.id])
: this.router.createUrlTree(["/"]);
}

View File

@@ -5,7 +5,6 @@ import {
canAccessOrgAdmin,
OrganizationService,
} from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction";
@Injectable({
@@ -20,21 +19,17 @@ export class OrganizationRedirectGuard implements CanActivate {
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const org = this.organizationService.get(route.params.organizationId);
const flexibleCollectionsEnabled = await this.configService.getFeatureFlag(
FeatureFlag.FlexibleCollections,
false
);
const customRedirect = route.data?.autoRedirectCallback;
if (customRedirect) {
let redirectPath = customRedirect(org, flexibleCollectionsEnabled);
let redirectPath = await customRedirect(org, this.configService);
if (typeof redirectPath === "string") {
redirectPath = [redirectPath];
}
return this.router.createUrlTree([state.url, ...redirectPath]);
}
if (canAccessOrgAdmin(org, flexibleCollectionsEnabled)) {
if (await canAccessOrgAdmin(org, this.configService)) {
return this.router.createUrlTree(["/organizations", org.id]);
}
return this.router.createUrlTree(["/"]);

View File

@@ -7,7 +7,7 @@
[activeOrganization]="organization"
></app-organization-switcher>
<bit-tab-nav-bar class="-tw-mb-px">
<bit-tab-link *ngIf="canShowVaultTab(organization)" route="vault">{{
<bit-tab-link *ngIf="canShowVaultTab(organization) | async" route="vault">{{
"vault" | i18n
}}</bit-tab-link>
<bit-tab-link *ngIf="canShowMembersTab(organization)" route="members">{{

View File

@@ -56,8 +56,8 @@ export class OrganizationLayoutComponent implements OnInit, OnDestroy {
this._destroy.complete();
}
canShowVaultTab(organization: Organization): boolean {
return canAccessVaultTab(organization, this.flexibleCollectionsEnabled);
async canShowVaultTab(organization: Organization): Promise<boolean> {
return await canAccessVaultTab(organization, this.configService);
}
canShowSettingsTab(organization: Organization): boolean {

View File

@@ -11,6 +11,7 @@ import {
canAccessSettingsTab,
} from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction";
import { OrganizationPermissionsGuard } from "../../admin-console/organizations/guards/org-permissions.guard";
import { OrganizationRedirectGuard } from "../../admin-console/organizations/guards/org-redirect.guard";
@@ -78,11 +79,11 @@ const routes: Routes = [
},
];
function getOrganizationRoute(
async function getOrganizationRoute(
organization: Organization,
flexibleCollectionsEnabled: boolean
): string {
if (canAccessVaultTab(organization, flexibleCollectionsEnabled)) {
configService: ConfigServiceAbstraction
): Promise<string> {
if (await canAccessVaultTab(organization, configService)) {
return "vault";
}
if (canAccessMembersTab(organization)) {

View File

@@ -22,9 +22,15 @@
class="nav-item"
routerLinkActive="active"
>
<a class="nav-link" [routerLink]="['/organizations', (organizations$ | async)[0].id]">{{
"organizations" | i18n
}}</a>
<ng-container *ngIf="{ orgs: organizations$ | async } as data">
<a
*ngIf="data.orgs?.length > 0"
class="nav-link"
[routerLink]="['/organizations', data.orgs[0].id]"
>
{{ "organizations" | i18n }}
</a>
</ng-container>
</li>
<ng-container *ngIf="providers.length >= 1">
<li class="nav-item" routerLinkActive="active" *ngIf="providers.length == 1">

View File

@@ -1,5 +1,5 @@
import { Component, OnInit } from "@angular/core";
import { combineLatest, map, Observable } from "rxjs";
import { map, Observable, switchMap } from "rxjs";
import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service";
import {
@@ -9,7 +9,6 @@ import {
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { TokenService } from "@bitwarden/common/auth/abstractions/token.service";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum";
import { Provider } from "@bitwarden/common/models/domain/provider";
import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction";
@@ -60,13 +59,10 @@ export class NavbarComponent implements OnInit {
}
this.providers = await this.providerService.getAll();
this.organizations$ = combineLatest([
this.organizationService.memberOrganizations$,
this.configService.getFeatureFlag$(FeatureFlag.FlexibleCollections, false),
]).pipe(
map(([organizations, featureFlag]) => {
const canAccess = canAccessAdmin(this.i18nService, featureFlag);
return canAccess ? organizations : [];
this.organizations$ = this.organizationService.memberOrganizations$.pipe(
switchMap(async (orgs) => {
const isAdmin = await canAccessAdmin(this.i18nService, this.configService);
return isAdmin ? orgs : [];
})
);
this.canLock$ = this.vaultTimeoutSettingsService

View File

@@ -6,7 +6,6 @@ import {
OrganizationService,
canAccessVaultTab,
} from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction";
import { ImportComponent } from "@bitwarden/importer/ui";
@@ -22,8 +21,6 @@ export class ImportWebComponent implements OnInit {
protected loading = false;
protected disabled = false;
private flexibleCollectionsEnabled: boolean;
constructor(
private route: ActivatedRoute,
private organizationService: OrganizationService,
@@ -31,11 +28,8 @@ export class ImportWebComponent implements OnInit {
private configService: ConfigServiceAbstraction
) {}
async ngOnInit() {
ngOnInit(): void {
this.routeOrgId = this.route.snapshot.paramMap.get("organizationId");
this.flexibleCollectionsEnabled = await this.configService.getFeatureFlag(
FeatureFlag.FlexibleCollections
);
}
/**
@@ -52,7 +46,7 @@ export class ImportWebComponent implements OnInit {
return;
}
if (canAccessVaultTab(organization, this.flexibleCollectionsEnabled)) {
if (await canAccessVaultTab(organization, this.configService)) {
await this.router.navigate(["organizations", organizationId, "vault"]);
}
}

View File

@@ -319,7 +319,7 @@ export class CollectionDialogComponent implements OnInit, OnDestroy {
protected canDelete$ = this.flexibleCollectionsEnabled$.pipe(
switchMap(async (flexibleCollectionsEnabled) => {
return (
this.editMode && this.collection?.canDelete(this.organization!, flexibleCollectionsEnabled)
this.editMode && this.collection.canDelete(this.organization, flexibleCollectionsEnabled)
);
})
);