From 4b0bc238fc6e716ad2663e30b8a6621d550aa1a0 Mon Sep 17 00:00:00 2001 From: Akhil Mohan Date: Mon, 28 Aug 2023 19:37:23 +0530 Subject: [PATCH] feat(rbac): changed the action names for org --- .../controllers/v1/membershipOrgController.ts | 6 +- .../controllers/v1/organizationController.ts | 21 +- backend/src/controllers/v1/roleController.ts | 10 +- .../v1/secretScanningController.ts | 10 +- .../src/controllers/v1/workspaceController.ts | 4 +- .../controllers/v2/organizationsController.ts | 11 +- .../controllers/v1/organizationsController.ts | 34 ++-- .../src/ee/controllers/v1/ssoController.ts | 8 +- backend/src/services/RoleService.ts | 102 +++++----- .../context/OrgPermissionContext/index.tsx | 2 +- .../src/context/OrgPermissionContext/types.ts | 20 +- frontend/src/context/index.tsx | 2 +- frontend/src/pages/org/[id]/billing/index.tsx | 4 +- .../src/pages/org/[id]/overview/index.tsx | 184 +++++++++--------- .../pages/org/[id]/secret-scanning/index.tsx | 6 +- .../src/views/Org/MembersPage/MembersPage.tsx | 4 +- .../OrgMembersTable/OrgMembersTable.tsx | 8 +- .../components/RiskStatusSelection.tsx | 4 +- .../BillingCloudTab/PreviewSection.tsx | 6 +- .../BillingDetailsTab/CompanyNameSection.tsx | 4 +- .../BillingDetailsTab/InvoiceEmailSection.tsx | 4 +- .../BillingDetailsTab/PmtMethodsSection.tsx | 4 +- .../BillingDetailsTab/PmtMethodsTable.tsx | 4 +- .../BillingDetailsTab/TaxIDSection.tsx | 4 +- .../BillingDetailsTab/TaxIDTable.tsx | 4 +- .../BillingTabGroup/BillingTabGroup.tsx | 4 +- .../components/OrgAuthTab/OrgAuthTab.tsx | 4 +- .../components/OrgAuthTab/OrgSSOSection.tsx | 6 +- .../OrgIncidentContactsSection.tsx | 6 +- .../OrgIncidentContactsTable.tsx | 4 +- .../OrgNameChangeSection.tsx | 6 +- .../OrgServiceAccountsTable.tsx | 4 +- 32 files changed, 252 insertions(+), 252 deletions(-) diff --git a/backend/src/controllers/v1/membershipOrgController.ts b/backend/src/controllers/v1/membershipOrgController.ts index 9bc7e243b..6e32fd662 100644 --- a/backend/src/controllers/v1/membershipOrgController.ts +++ b/backend/src/controllers/v1/membershipOrgController.ts @@ -19,7 +19,7 @@ import { import { validateUserEmail } from "../../validation"; import { validateRequest } from "../../helpers/validation"; import { - GeneralPermissionActions, + OrgPermissionActions, OrgPermissionSubjects, getUserOrgPermissions } from "../../services/RoleService"; @@ -50,7 +50,7 @@ export const deleteMembershipOrg = async (req: Request, _res: Response) => { membershipOrgToDelete.organization.toString() ); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Delete, + OrgPermissionActions.Delete, OrgPermissionSubjects.Member ); @@ -98,7 +98,7 @@ export const inviteUserToOrganization = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Create, + OrgPermissionActions.Create, OrgPermissionSubjects.Member ); diff --git a/backend/src/controllers/v1/organizationController.ts b/backend/src/controllers/v1/organizationController.ts index 4bad1db25..3386c8767 100644 --- a/backend/src/controllers/v1/organizationController.ts +++ b/backend/src/controllers/v1/organizationController.ts @@ -14,9 +14,8 @@ import { licenseServerKeyRequest } from "../../config/request"; import { validateRequest } from "../../helpers/validation"; import * as reqValidator from "../../validation/organization"; import { - GeneralPermissionActions, + OrgPermissionActions, OrgPermissionSubjects, - WorkspacePermissionActions, getUserOrgPermissions } from "../../services/RoleService"; import { OrganizationNotFoundError } from "../../utils/errors"; @@ -104,7 +103,7 @@ export const getOrganizationMembers = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Member ); @@ -130,7 +129,7 @@ export const getOrganizationWorkspaces = async (req: Request, res: Response) => const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - WorkspacePermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Workspace ); @@ -172,7 +171,7 @@ export const changeOrganizationName = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Edit, + OrgPermissionActions.Edit, OrgPermissionSubjects.Settings ); @@ -207,7 +206,7 @@ export const getOrganizationIncidentContacts = async (req: Request, res: Respons const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.IncidentAccount ); @@ -234,7 +233,7 @@ export const addOrganizationIncidentContact = async (req: Request, res: Response const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Create, + OrgPermissionActions.Create, OrgPermissionSubjects.IncidentAccount ); @@ -263,7 +262,7 @@ export const deleteOrganizationIncidentContact = async (req: Request, res: Respo const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Delete, + OrgPermissionActions.Delete, OrgPermissionSubjects.IncidentAccount ); @@ -292,7 +291,7 @@ export const createOrganizationPortalSession = async (req: Request, res: Respons const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Edit, + OrgPermissionActions.Edit, OrgPermissionSubjects.Billing ); @@ -356,11 +355,11 @@ export const getOrganizationMembersAndTheirWorkspaces = async (req: Request, res const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Member ); ForbiddenError.from(permission).throwUnlessCan( - WorkspacePermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Workspace ); diff --git a/backend/src/controllers/v1/roleController.ts b/backend/src/controllers/v1/roleController.ts index cf1b1a600..f5d50d22f 100644 --- a/backend/src/controllers/v1/roleController.ts +++ b/backend/src/controllers/v1/roleController.ts @@ -2,7 +2,7 @@ import { Request, Response } from "express"; import { BadRequestError } from "../../utils/errors"; import Role from "../../models/role"; import { - GeneralPermissionActions, + OrgPermissionActions, OrgPermissionSubjects, adminPermissions, getUserOrgPermissions, @@ -30,7 +30,7 @@ export const createRole = async (req: Request, res: Response) => { } = await validateRequest(CreateRoleSchema, req); const { permission } = await getUserOrgPermissions(req.user.id, orgId); - if (permission.cannot(GeneralPermissionActions.Create, OrgPermissionSubjects.Role)) { + if (permission.cannot(OrgPermissionActions.Create, OrgPermissionSubjects.Role)) { throw BadRequestError({ message: "User doesn't have the permission." }); } @@ -68,7 +68,7 @@ export const updateRole = async (req: Request, res: Response) => { const isOrgRole = !workspaceId; // if workspaceid is provided then its a workspace rule const { permission } = await getUserOrgPermissions(req.user.id, orgId); - if (permission.cannot(GeneralPermissionActions.Edit, OrgPermissionSubjects.Role)) { + if (permission.cannot(OrgPermissionActions.Edit, OrgPermissionSubjects.Role)) { throw BadRequestError({ message: "User doesn't have the permission." }); } @@ -112,7 +112,7 @@ export const deleteRole = async (req: Request, res: Response) => { } const { permission } = await getUserOrgPermissions(req.user.id, role.organization.toString()); - if (permission.cannot(GeneralPermissionActions.Delete, OrgPermissionSubjects.Role)) { + if (permission.cannot(OrgPermissionActions.Delete, OrgPermissionSubjects.Role)) { throw BadRequestError({ message: "User doesn't have the permission." }); } await Role.findByIdAndDelete(role.id); @@ -132,7 +132,7 @@ export const getRoles = async (req: Request, res: Response) => { const isOrgRole = !workspaceId; const { permission } = await getUserOrgPermissions(req.user.id, orgId); - if (permission.cannot(GeneralPermissionActions.Read, OrgPermissionSubjects.Role)) { + if (permission.cannot(OrgPermissionActions.Read, OrgPermissionSubjects.Role)) { throw BadRequestError({ message: "User doesn't have the permission." }); } diff --git a/backend/src/controllers/v1/secretScanningController.ts b/backend/src/controllers/v1/secretScanningController.ts index bb0403b3b..df2fe173a 100644 --- a/backend/src/controllers/v1/secretScanningController.ts +++ b/backend/src/controllers/v1/secretScanningController.ts @@ -12,7 +12,7 @@ import { Organization } from "../../models"; import { validateRequest } from "../../helpers/validation"; import * as reqValidator from "../../validation/secretScanning"; import { - GeneralPermissionActions, + OrgPermissionActions, OrgPermissionSubjects, getUserOrgPermissions } from "../../services/RoleService"; @@ -33,7 +33,7 @@ export const createInstallationSession = async (req: Request, res: Response) => const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Create, + OrgPermissionActions.Create, OrgPermissionSubjects.SecretScanning ); @@ -69,7 +69,7 @@ export const linkInstallationToOrganization = async (req: Request, res: Response installationSession.organization.toString() ); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Edit, + OrgPermissionActions.Edit, OrgPermissionSubjects.SecretScanning ); @@ -131,7 +131,7 @@ export const getRisksForOrganization = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.SecretScanning ); @@ -151,7 +151,7 @@ export const updateRisksStatus = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Edit, + OrgPermissionActions.Edit, OrgPermissionSubjects.SecretScanning ); diff --git a/backend/src/controllers/v1/workspaceController.ts b/backend/src/controllers/v1/workspaceController.ts index 29ed27297..1b5787671 100644 --- a/backend/src/controllers/v1/workspaceController.ts +++ b/backend/src/controllers/v1/workspaceController.ts @@ -15,8 +15,8 @@ import { addMemberships } from "../../helpers/membership"; import { ADMIN } from "../../variables"; import { OrganizationNotFoundError } from "../../utils/errors"; import { + OrgPermissionActions, OrgPermissionSubjects, - WorkspacePermissionActions, getUserOrgPermissions } from "../../services/RoleService"; import { ForbiddenError } from "@casl/ability"; @@ -146,7 +146,7 @@ export const createWorkspace = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - WorkspacePermissionActions.Create, + OrgPermissionActions.Create, OrgPermissionSubjects.Workspace ); diff --git a/backend/src/controllers/v2/organizationsController.ts b/backend/src/controllers/v2/organizationsController.ts index d74ac27ba..2044183af 100644 --- a/backend/src/controllers/v2/organizationsController.ts +++ b/backend/src/controllers/v2/organizationsController.ts @@ -9,9 +9,8 @@ import { CUSTOM } from "../../variables"; import * as reqValidator from "../../validation/organization"; import { validateRequest } from "../../helpers/validation"; import { - GeneralPermissionActions, + OrgPermissionActions, OrgPermissionSubjects, - WorkspacePermissionActions, getUserOrgPermissions } from "../../services/RoleService"; import { ForbiddenError } from "@casl/ability"; @@ -61,7 +60,7 @@ export const getOrganizationMemberships = async (req: Request, res: Response) => const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Member ); @@ -139,7 +138,7 @@ export const updateOrganizationMembership = async (req: Request, res: Response) } = await validateRequest(reqValidator.UpdateOrgMemberv2, req); const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Edit, + OrgPermissionActions.Edit, OrgPermissionSubjects.Member ); @@ -220,7 +219,7 @@ export const deleteOrganizationMembership = async (req: Request, res: Response) } = await validateRequest(reqValidator.DeleteOrgMemberv2, req); const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Delete, + OrgPermissionActions.Delete, OrgPermissionSubjects.Member ); @@ -284,7 +283,7 @@ export const getOrganizationWorkspaces = async (req: Request, res: Response) => const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - WorkspacePermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Workspace ); diff --git a/backend/src/ee/controllers/v1/organizationsController.ts b/backend/src/ee/controllers/v1/organizationsController.ts index 6bc8b2533..1811a46f3 100644 --- a/backend/src/ee/controllers/v1/organizationsController.ts +++ b/backend/src/ee/controllers/v1/organizationsController.ts @@ -6,7 +6,7 @@ import { EELicenseService } from "../../services"; import { validateRequest } from "../../../helpers/validation"; import * as reqValidator from "../../../validation/organization"; import { - GeneralPermissionActions, + OrgPermissionActions, OrgPermissionSubjects, getUserOrgPermissions } from "../../../services/RoleService"; @@ -22,7 +22,7 @@ export const getOrganizationPlansTable = async (req: Request, res: Response) => const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Billing ); @@ -44,7 +44,7 @@ export const getOrganizationPlan = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Billing ); @@ -72,11 +72,11 @@ export const startOrganizationTrial = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Create, + OrgPermissionActions.Create, OrgPermissionSubjects.Billing ); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Edit, + OrgPermissionActions.Edit, OrgPermissionSubjects.Billing ); @@ -118,7 +118,7 @@ export const getOrganizationPlanBillingInfo = async (req: Request, res: Response const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Billing ); @@ -151,7 +151,7 @@ export const getOrganizationPlanTable = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Billing ); @@ -178,7 +178,7 @@ export const getOrganizationBillingDetails = async (req: Request, res: Response) const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Billing ); @@ -206,7 +206,7 @@ export const updateOrganizationBillingDetails = async (req: Request, res: Respon const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Edit, + OrgPermissionActions.Edit, OrgPermissionSubjects.Billing ); @@ -240,7 +240,7 @@ export const getOrganizationPmtMethods = async (req: Request, res: Response) => const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Billing ); @@ -273,7 +273,7 @@ export const addOrganizationPmtMethod = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Create, + OrgPermissionActions.Create, OrgPermissionSubjects.Billing ); @@ -314,7 +314,7 @@ export const deleteOrganizationPmtMethod = async (req: Request, res: Response) = const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Delete, + OrgPermissionActions.Delete, OrgPermissionSubjects.Billing ); @@ -344,7 +344,7 @@ export const getOrganizationTaxIds = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Billing ); @@ -377,7 +377,7 @@ export const addOrganizationTaxId = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Create, + OrgPermissionActions.Create, OrgPermissionSubjects.Billing ); @@ -414,7 +414,7 @@ export const deleteOrganizationTaxId = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Delete, + OrgPermissionActions.Delete, OrgPermissionSubjects.Billing ); @@ -447,7 +447,7 @@ export const getOrganizationInvoices = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Billing ); @@ -482,7 +482,7 @@ export const getOrganizationLicenses = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Billing ); diff --git a/backend/src/ee/controllers/v1/ssoController.ts b/backend/src/ee/controllers/v1/ssoController.ts index 3e83711d6..bacc6befc 100644 --- a/backend/src/ee/controllers/v1/ssoController.ts +++ b/backend/src/ee/controllers/v1/ssoController.ts @@ -11,7 +11,7 @@ import { EELicenseService } from "../../services"; import * as reqValidator from "../../../validation/sso"; import { validateRequest } from "../../../helpers/validation"; import { - GeneralPermissionActions, + OrgPermissionActions, OrgPermissionSubjects, getUserOrgPermissions } from "../../../services/RoleService"; @@ -49,7 +49,7 @@ export const getSSOConfig = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Read, + OrgPermissionActions.Read, OrgPermissionSubjects.Sso ); @@ -73,7 +73,7 @@ export const updateSSOConfig = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Edit, + OrgPermissionActions.Edit, OrgPermissionSubjects.Sso ); @@ -208,7 +208,7 @@ export const createSSOConfig = async (req: Request, res: Response) => { const { permission } = await getUserOrgPermissions(req.user._id, organizationId); ForbiddenError.from(permission).throwUnlessCan( - GeneralPermissionActions.Create, + OrgPermissionActions.Create, OrgPermissionSubjects.Sso ); diff --git a/backend/src/services/RoleService.ts b/backend/src/services/RoleService.ts index 178ab7c90..648128246 100644 --- a/backend/src/services/RoleService.ts +++ b/backend/src/services/RoleService.ts @@ -4,18 +4,13 @@ import { IRole } from "../models/role"; import { BadRequestError, UnauthorizedRequestError } from "../utils/errors"; import { ACCEPTED } from "../variables"; -export enum GeneralPermissionActions { +export enum OrgPermissionActions { Read = "read", Create = "create", Edit = "edit", Delete = "delete" } -export enum WorkspacePermissionActions { - Read = "read", - Create = "create" -} - export enum OrgPermissionSubjects { Workspace = "workspace", Role = "role", @@ -28,55 +23,56 @@ export enum OrgPermissionSubjects { } export type OrgPermissionSet = - | [WorkspacePermissionActions, OrgPermissionSubjects.Workspace] - | [GeneralPermissionActions, OrgPermissionSubjects.Role] - | [GeneralPermissionActions, OrgPermissionSubjects.Member] - | [GeneralPermissionActions, OrgPermissionSubjects.Settings] - | [GeneralPermissionActions, OrgPermissionSubjects.IncidentAccount] - | [GeneralPermissionActions, OrgPermissionSubjects.Sso] - | [GeneralPermissionActions, OrgPermissionSubjects.SecretScanning] - | [GeneralPermissionActions, OrgPermissionSubjects.Billing]; + | [OrgPermissionActions.Read, OrgPermissionSubjects.Workspace] + | [OrgPermissionActions.Create, OrgPermissionSubjects.Workspace] + | [OrgPermissionActions, OrgPermissionSubjects.Role] + | [OrgPermissionActions, OrgPermissionSubjects.Member] + | [OrgPermissionActions, OrgPermissionSubjects.Settings] + | [OrgPermissionActions, OrgPermissionSubjects.IncidentAccount] + | [OrgPermissionActions, OrgPermissionSubjects.Sso] + | [OrgPermissionActions, OrgPermissionSubjects.SecretScanning] + | [OrgPermissionActions, OrgPermissionSubjects.Billing]; const buildAdminPermission = () => { const { can, build } = new AbilityBuilder>(createMongoAbility); // ws permissions - can(WorkspacePermissionActions.Read, OrgPermissionSubjects.Workspace); - can(WorkspacePermissionActions.Create, OrgPermissionSubjects.Workspace); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Workspace); + can(OrgPermissionActions.Create, OrgPermissionSubjects.Workspace); // role permission - can(GeneralPermissionActions.Read, OrgPermissionSubjects.Role); - can(GeneralPermissionActions.Create, OrgPermissionSubjects.Role); - can(GeneralPermissionActions.Edit, OrgPermissionSubjects.Role); - can(GeneralPermissionActions.Delete, OrgPermissionSubjects.Role); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Role); + can(OrgPermissionActions.Create, OrgPermissionSubjects.Role); + can(OrgPermissionActions.Edit, OrgPermissionSubjects.Role); + can(OrgPermissionActions.Delete, OrgPermissionSubjects.Role); - can(GeneralPermissionActions.Read, OrgPermissionSubjects.Member); - can(GeneralPermissionActions.Create, OrgPermissionSubjects.Member); - can(GeneralPermissionActions.Edit, OrgPermissionSubjects.Member); - can(GeneralPermissionActions.Delete, OrgPermissionSubjects.Member); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Member); + can(OrgPermissionActions.Create, OrgPermissionSubjects.Member); + can(OrgPermissionActions.Edit, OrgPermissionSubjects.Member); + can(OrgPermissionActions.Delete, OrgPermissionSubjects.Member); - can(GeneralPermissionActions.Read, OrgPermissionSubjects.SecretScanning); - can(GeneralPermissionActions.Create, OrgPermissionSubjects.SecretScanning); - can(GeneralPermissionActions.Edit, OrgPermissionSubjects.SecretScanning); - can(GeneralPermissionActions.Delete, OrgPermissionSubjects.SecretScanning); + can(OrgPermissionActions.Read, OrgPermissionSubjects.SecretScanning); + can(OrgPermissionActions.Create, OrgPermissionSubjects.SecretScanning); + can(OrgPermissionActions.Edit, OrgPermissionSubjects.SecretScanning); + can(OrgPermissionActions.Delete, OrgPermissionSubjects.SecretScanning); - can(GeneralPermissionActions.Read, OrgPermissionSubjects.Settings); - can(GeneralPermissionActions.Create, OrgPermissionSubjects.Settings); - can(GeneralPermissionActions.Edit, OrgPermissionSubjects.Settings); - can(GeneralPermissionActions.Delete, OrgPermissionSubjects.Settings); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Settings); + can(OrgPermissionActions.Create, OrgPermissionSubjects.Settings); + can(OrgPermissionActions.Edit, OrgPermissionSubjects.Settings); + can(OrgPermissionActions.Delete, OrgPermissionSubjects.Settings); - can(GeneralPermissionActions.Read, OrgPermissionSubjects.IncidentAccount); - can(GeneralPermissionActions.Create, OrgPermissionSubjects.IncidentAccount); - can(GeneralPermissionActions.Edit, OrgPermissionSubjects.IncidentAccount); - can(GeneralPermissionActions.Delete, OrgPermissionSubjects.IncidentAccount); + can(OrgPermissionActions.Read, OrgPermissionSubjects.IncidentAccount); + can(OrgPermissionActions.Create, OrgPermissionSubjects.IncidentAccount); + can(OrgPermissionActions.Edit, OrgPermissionSubjects.IncidentAccount); + can(OrgPermissionActions.Delete, OrgPermissionSubjects.IncidentAccount); - can(GeneralPermissionActions.Read, OrgPermissionSubjects.Sso); - can(GeneralPermissionActions.Create, OrgPermissionSubjects.Sso); - can(GeneralPermissionActions.Edit, OrgPermissionSubjects.Sso); - can(GeneralPermissionActions.Delete, OrgPermissionSubjects.Sso); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Sso); + can(OrgPermissionActions.Create, OrgPermissionSubjects.Sso); + can(OrgPermissionActions.Edit, OrgPermissionSubjects.Sso); + can(OrgPermissionActions.Delete, OrgPermissionSubjects.Sso); - can(GeneralPermissionActions.Read, OrgPermissionSubjects.Billing); - can(GeneralPermissionActions.Create, OrgPermissionSubjects.Billing); - can(GeneralPermissionActions.Edit, OrgPermissionSubjects.Billing); - can(GeneralPermissionActions.Delete, OrgPermissionSubjects.Billing); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Billing); + can(OrgPermissionActions.Create, OrgPermissionSubjects.Billing); + can(OrgPermissionActions.Edit, OrgPermissionSubjects.Billing); + can(OrgPermissionActions.Delete, OrgPermissionSubjects.Billing); return build(); }; @@ -86,15 +82,15 @@ export const adminPermissions = buildAdminPermission(); const buildMemberPermission = () => { const { can, build } = new AbilityBuilder>(createMongoAbility); - can(WorkspacePermissionActions.Read, OrgPermissionSubjects.Workspace); - can(WorkspacePermissionActions.Create, OrgPermissionSubjects.Workspace); - can(GeneralPermissionActions.Read, OrgPermissionSubjects.Member); - can(GeneralPermissionActions.Read, OrgPermissionSubjects.Role); - can(GeneralPermissionActions.Read, OrgPermissionSubjects.Settings); - can(GeneralPermissionActions.Read, OrgPermissionSubjects.Billing); - can(GeneralPermissionActions.Read, OrgPermissionSubjects.Sso); - can(GeneralPermissionActions.Read, OrgPermissionSubjects.IncidentAccount); - can(GeneralPermissionActions.Read, OrgPermissionSubjects.SecretScanning); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Workspace); + can(OrgPermissionActions.Create, OrgPermissionSubjects.Workspace); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Member); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Role); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Settings); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Billing); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Sso); + can(OrgPermissionActions.Read, OrgPermissionSubjects.IncidentAccount); + can(OrgPermissionActions.Read, OrgPermissionSubjects.SecretScanning); return build(); }; diff --git a/frontend/src/context/OrgPermissionContext/index.tsx b/frontend/src/context/OrgPermissionContext/index.tsx index dddbe4ef9..730fe55b1 100644 --- a/frontend/src/context/OrgPermissionContext/index.tsx +++ b/frontend/src/context/OrgPermissionContext/index.tsx @@ -1,3 +1,3 @@ export { OrgPermissionProvider, useOrgPermission } from "./OrgPermissionContext"; export type { TOrgPermission } from "./types"; -export { GeneralPermissionActions,OrgPermissionSubjects } from "./types"; +export { OrgPermissionActions, OrgPermissionSubjects } from "./types"; diff --git a/frontend/src/context/OrgPermissionContext/types.ts b/frontend/src/context/OrgPermissionContext/types.ts index a7bc6dda1..a4f1ab5ef 100644 --- a/frontend/src/context/OrgPermissionContext/types.ts +++ b/frontend/src/context/OrgPermissionContext/types.ts @@ -1,6 +1,6 @@ import { MongoAbility } from "@casl/ability"; -export enum GeneralPermissionActions { +export enum OrgPermissionActions { Read = "read", Create = "create", Edit = "edit", @@ -19,14 +19,14 @@ export enum OrgPermissionSubjects { } export type OrgPermissionSet = - | [GeneralPermissionActions.Create, OrgPermissionSubjects.Workspace] - | [GeneralPermissionActions.Read, OrgPermissionSubjects.Workspace] - | [GeneralPermissionActions, OrgPermissionSubjects.Role] - | [GeneralPermissionActions, OrgPermissionSubjects.Member] - | [GeneralPermissionActions, OrgPermissionSubjects.Settings] - | [GeneralPermissionActions, OrgPermissionSubjects.IncidentAccount] - | [GeneralPermissionActions, OrgPermissionSubjects.Sso] - | [GeneralPermissionActions, OrgPermissionSubjects.SecretScanning] - | [GeneralPermissionActions, OrgPermissionSubjects.Billing]; + | [OrgPermissionActions.Create, OrgPermissionSubjects.Workspace] + | [OrgPermissionActions.Read, OrgPermissionSubjects.Workspace] + | [OrgPermissionActions, OrgPermissionSubjects.Role] + | [OrgPermissionActions, OrgPermissionSubjects.Member] + | [OrgPermissionActions, OrgPermissionSubjects.Settings] + | [OrgPermissionActions, OrgPermissionSubjects.IncidentAccount] + | [OrgPermissionActions, OrgPermissionSubjects.Sso] + | [OrgPermissionActions, OrgPermissionSubjects.SecretScanning] + | [OrgPermissionActions, OrgPermissionSubjects.Billing]; export type TOrgPermission = MongoAbility; diff --git a/frontend/src/context/index.tsx b/frontend/src/context/index.tsx index 491fa2439..35c39f533 100644 --- a/frontend/src/context/index.tsx +++ b/frontend/src/context/index.tsx @@ -2,7 +2,7 @@ export { AuthProvider } from "./AuthContext"; export { OrgProvider, useOrganization } from "./OrganizationContext"; export type { TOrgPermission } from "./OrgPermissionContext"; export { - GeneralPermissionActions, + OrgPermissionActions, OrgPermissionProvider, OrgPermissionSubjects, useOrgPermission diff --git a/frontend/src/pages/org/[id]/billing/index.tsx b/frontend/src/pages/org/[id]/billing/index.tsx index f79c210c7..643ad4b30 100644 --- a/frontend/src/pages/org/[id]/billing/index.tsx +++ b/frontend/src/pages/org/[id]/billing/index.tsx @@ -1,7 +1,7 @@ import { useTranslation } from "react-i18next"; import Head from "next/head"; -import { GeneralPermissionActions, OrgPermissionSubjects, TOrgPermission } from "@app/context"; +import { OrgPermissionActions, OrgPermissionSubjects, TOrgPermission } from "@app/context"; import { withPermission } from "@app/hoc"; import { BillingSettingsPage } from "@app/views/Settings/BillingSettingsPage"; @@ -20,7 +20,7 @@ const SettingsBilling = withPermission<{}, TOrgPermission>( ); }, - { action: GeneralPermissionActions.Delete, subject: OrgPermissionSubjects.Billing } + { action: OrgPermissionActions.Delete, subject: OrgPermissionSubjects.Billing } ); Object.assign(SettingsBilling, { requireAuth: true }); diff --git a/frontend/src/pages/org/[id]/overview/index.tsx b/frontend/src/pages/org/[id]/overview/index.tsx index 3e0eb1f69..ea72be394 100644 --- a/frontend/src/pages/org/[id]/overview/index.tsx +++ b/frontend/src/pages/org/[id]/overview/index.tsx @@ -16,8 +16,8 @@ import { faArrowUpRightFromSquare, faCheck, faCheckCircle, - faExclamationCircle, faClipboard, + faExclamationCircle, faHandPeace, faMagnifyingGlass, faNetworkWired, @@ -43,9 +43,8 @@ import { Skeleton, UpgradePlanModal } from "@app/components/v2"; -import { useFetchServerStatus } from "@app/hooks/api/serverDetails"; import { - GeneralPermissionActions, + OrgPermissionActions, OrgPermissionSubjects, useSubscription, useUser, @@ -59,6 +58,7 @@ import { useRegisterUserAction, useUploadWsKey } from "@app/hooks/api"; +import { useFetchServerStatus } from "@app/hooks/api/serverDetails"; import { usePopUp } from "@app/hooks/usePopUp"; import { encryptAssymmetric } from "../../../../components/utilities/cryptography/crypto"; @@ -473,82 +473,81 @@ const OrganizationPage = withPermission( const { createNotification } = useNotificationContext(); const addWsUser = useAddUserToWs(); - const { popUp, handlePopUpOpen, handlePopUpClose, handlePopUpToggle } = usePopUp([ - "addNewWs", - "upgradePlan" - ] as const); - const { - control, - formState: { isSubmitting }, - reset, - handleSubmit - } = useForm({ - resolver: yupResolver(formSchema) - }); + const { popUp, handlePopUpOpen, handlePopUpClose, handlePopUpToggle } = usePopUp([ + "addNewWs", + "upgradePlan" + ] as const); + const { + control, + formState: { isSubmitting }, + reset, + handleSubmit + } = useForm({ + resolver: yupResolver(formSchema) + }); - const [hasUserClickedSlack, setHasUserClickedSlack] = useState(false); - const [hasUserClickedIntro, setHasUserClickedIntro] = useState(false); - const [hasUserPushedSecrets, setHasUserPushedSecrets] = useState(false); - const [usersInOrg, setUsersInOrg] = useState(false); - const [searchFilter, setSearchFilter] = useState(""); - const createWs = useCreateWorkspace(); - const { user } = useUser(); - const uploadWsKey = useUploadWsKey(); - const { data: serverDetails } = useFetchServerStatus(); - + const [hasUserClickedSlack, setHasUserClickedSlack] = useState(false); + const [hasUserClickedIntro, setHasUserClickedIntro] = useState(false); + const [hasUserPushedSecrets, setHasUserPushedSecrets] = useState(false); + const [usersInOrg, setUsersInOrg] = useState(false); + const [searchFilter, setSearchFilter] = useState(""); + const createWs = useCreateWorkspace(); + const { user } = useUser(); + const uploadWsKey = useUploadWsKey(); + const { data: serverDetails } = useFetchServerStatus(); - const onCreateProject = async ({ name, addMembers }: TAddProjectFormData) => { - // type check - if (!currentOrg) return; - try { - const { - data: { - workspace: { _id: newWorkspaceId } - } - } = await createWs.mutateAsync({ - organizationId: currentOrg, - workspaceName: name - }); - - const randomBytes = crypto.randomBytes(16).toString("hex"); - const PRIVATE_KEY = String(localStorage.getItem("PRIVATE_KEY")); - const { ciphertext, nonce } = encryptAssymmetric({ - plaintext: randomBytes, - publicKey: user.publicKey, - privateKey: PRIVATE_KEY - }); - - await uploadWsKey.mutateAsync({ - encryptedKey: ciphertext, - nonce, - userId: user?._id, - workspaceId: newWorkspaceId - }); - - if (addMembers) { - // not using hooks because need at this point only - const orgUsers = await fetchOrgUsers(currentOrg); - orgUsers.forEach(({ status, user: orgUser }) => { - // skip if status of org user is not accepted - // this orgUser is the person who created the ws - if (status !== "accepted" || user.email === orgUser.email) return; - addWsUser.mutate({ email: orgUser.email, workspaceId: newWorkspaceId }); + const onCreateProject = async ({ name, addMembers }: TAddProjectFormData) => { + // type check + if (!currentOrg) return; + try { + const { + data: { + workspace: { _id: newWorkspaceId } + } + } = await createWs.mutateAsync({ + organizationId: currentOrg, + workspaceName: name }); + + const randomBytes = crypto.randomBytes(16).toString("hex"); + const PRIVATE_KEY = String(localStorage.getItem("PRIVATE_KEY")); + const { ciphertext, nonce } = encryptAssymmetric({ + plaintext: randomBytes, + publicKey: user.publicKey, + privateKey: PRIVATE_KEY + }); + + await uploadWsKey.mutateAsync({ + encryptedKey: ciphertext, + nonce, + userId: user?._id, + workspaceId: newWorkspaceId + }); + + if (addMembers) { + // not using hooks because need at this point only + const orgUsers = await fetchOrgUsers(currentOrg); + orgUsers.forEach(({ status, user: orgUser }) => { + // skip if status of org user is not accepted + // this orgUser is the person who created the ws + if (status !== "accepted" || user.email === orgUser.email) return; + addWsUser.mutate({ email: orgUser.email, workspaceId: newWorkspaceId }); + }); + } + createNotification({ text: "Workspace created", type: "success" }); + handlePopUpClose("addNewWs"); + router.push(`/project/${newWorkspaceId}/secrets/overview`); + } catch (err) { + console.error(err); + createNotification({ text: "Failed to create workspace", type: "error" }); } - createNotification({ text: "Workspace created", type: "success" }); - handlePopUpClose("addNewWs"); - router.push(`/project/${newWorkspaceId}/secrets/overview`); - } catch (err) { - console.error(err); - createNotification({ text: "Failed to create workspace", type: "error" }); - } - }; + }; - const { subscription } = useSubscription(); + const { subscription } = useSubscription(); - const isAddingProjectsAllowed = subscription?.workspaceLimit - ? subscription.workspacesUsed < subscription.workspaceLimit - : true; + const isAddingProjectsAllowed = subscription?.workspaceLimit + ? subscription.workspacesUsed < subscription.workspaceLimit + : true; useEffect(() => { onboardingCheck({ @@ -567,18 +566,28 @@ const OrganizationPage = withPermission( {t("common.head-title", { title: t("settings.members.title") })} - {!serverDetails?.redisConfigured &&
-

Announcements

-
- - Attention: Updated versions of Infisical now require Redis for full functionality. Learn how to configure it - - - here - - . + {!serverDetails?.redisConfigured && ( +
+

Announcements

+
+ + Attention: Updated versions of Infisical now require Redis for full functionality. + Learn how to configure it + + + here + + + . +
-
} + )}

Projects

@@ -589,10 +598,7 @@ const OrganizationPage = withPermission( onChange={(e) => setSearchFilter(e.target.value)} leftIcon={} /> - + {(isAllowed) => (
); }, - { action: GeneralPermissionActions.Read, subject: OrgPermissionSubjects.SecretScanning } + { action: OrgPermissionActions.Read, subject: OrgPermissionSubjects.SecretScanning } ); Object.assign(SecretScanning, { requireAuth: true }); diff --git a/frontend/src/views/Org/MembersPage/MembersPage.tsx b/frontend/src/views/Org/MembersPage/MembersPage.tsx index a57d2f235..57b69c5b7 100644 --- a/frontend/src/views/Org/MembersPage/MembersPage.tsx +++ b/frontend/src/views/Org/MembersPage/MembersPage.tsx @@ -3,7 +3,7 @@ import { useTranslation } from "react-i18next"; import { motion } from "framer-motion"; import { Tab, TabList, TabPanel, Tabs } from "@app/components/v2"; -import { GeneralPermissionActions, OrgPermissionSubjects, useOrganization } from "@app/context"; +import { OrgPermissionActions, OrgPermissionSubjects, useOrganization } from "@app/context"; import { withPermission } from "@app/hoc"; import { useGetRoles } from "@app/hooks/api"; import { TRole } from "@app/hooks/api/roles/types"; @@ -59,5 +59,5 @@ export const MembersPage = withPermission(
); }, - { action: GeneralPermissionActions.Read, subject: OrgPermissionSubjects.Member } + { action: OrgPermissionActions.Read, subject: OrgPermissionSubjects.Member } ); diff --git a/frontend/src/views/Org/MembersPage/components/OrgMembersTable/OrgMembersTable.tsx b/frontend/src/views/Org/MembersPage/components/OrgMembersTable/OrgMembersTable.tsx index 608268de7..459d5f47a 100644 --- a/frontend/src/views/Org/MembersPage/components/OrgMembersTable/OrgMembersTable.tsx +++ b/frontend/src/views/Org/MembersPage/components/OrgMembersTable/OrgMembersTable.tsx @@ -43,7 +43,7 @@ import { UpgradePlanModal } from "@app/components/v2"; import { - GeneralPermissionActions, + OrgPermissionActions, OrgPermissionSubjects, useOrganization, useSubscription, @@ -305,7 +305,7 @@ export const OrgMembersTable = ({ roles = [] }: Props) => { placeholder="Search members..." />
- + {(isAllowed) => (