From 4f4764dfcdf723e522603b890b2864dcab280066 Mon Sep 17 00:00:00 2001 From: carlosmonastyrski Date: Fri, 14 Mar 2025 08:54:14 -0300 Subject: [PATCH] Fix rebase issue with deleted files --- ...d-share-to-anyone-setting-to-organizations.ts | 14 ++++++++++---- backend/src/db/schemas/organizations.ts | 2 +- .../src/server/routes/v1/organization-router.ts | 2 +- backend/src/services/org/org-service.ts | 16 +++++++++++++--- backend/src/services/org/org-types.ts | 2 +- .../secret-sharing/secret-sharing-service.ts | 7 +++++++ frontend/src/hooks/api/organization/queries.tsx | 4 ++-- frontend/src/hooks/api/organization/types.ts | 4 ++-- .../RolePermissionsSection.tsx | 2 -- .../SecretSharingAllowShareToAnyone.tsx | 4 ++-- .../components/ShareSecretForm.tsx | 2 +- 11 files changed, 40 insertions(+), 19 deletions(-) diff --git a/backend/src/db/migrations/20250311105617_add-share-to-anyone-setting-to-organizations.ts b/backend/src/db/migrations/20250311105617_add-share-to-anyone-setting-to-organizations.ts index 8c0ccae3b..8f767c748 100644 --- a/backend/src/db/migrations/20250311105617_add-share-to-anyone-setting-to-organizations.ts +++ b/backend/src/db/migrations/20250311105617_add-share-to-anyone-setting-to-organizations.ts @@ -4,11 +4,14 @@ import { TableName } from "../schemas"; export async function up(knex: Knex): Promise { if (await knex.schema.hasTable(TableName.Organization)) { - const hasSecretShareToAnyoneCol = await knex.schema.hasColumn(TableName.Organization, "secretShareSendToAnyone"); + const hasSecretShareToAnyoneCol = await knex.schema.hasColumn( + TableName.Organization, + "allowSecretSharingOutsideOrganization" + ); if (!hasSecretShareToAnyoneCol) { await knex.schema.alterTable(TableName.Organization, (t) => { - t.boolean("secretShareSendToAnyone").defaultTo(true); + t.boolean("allowSecretSharingOutsideOrganization").defaultTo(true); }); } } @@ -16,10 +19,13 @@ export async function up(knex: Knex): Promise { export async function down(knex: Knex): Promise { if (await knex.schema.hasTable(TableName.Organization)) { - const hasSecretShareToAnyoneCol = await knex.schema.hasColumn(TableName.Organization, "secretShareSendToAnyone"); + const hasSecretShareToAnyoneCol = await knex.schema.hasColumn( + TableName.Organization, + "allowSecretSharingOutsideOrganization" + ); if (hasSecretShareToAnyoneCol) { await knex.schema.alterTable(TableName.Organization, (t) => { - t.dropColumn("secretShareSendToAnyone"); + t.dropColumn("allowSecretSharingOutsideOrganization"); }); } } diff --git a/backend/src/db/schemas/organizations.ts b/backend/src/db/schemas/organizations.ts index 284ad8d58..6639528a0 100644 --- a/backend/src/db/schemas/organizations.ts +++ b/backend/src/db/schemas/organizations.ts @@ -23,7 +23,7 @@ export const OrganizationsSchema = z.object({ defaultMembershipRole: z.string().default("member"), enforceMfa: z.boolean().default(false), selectedMfaMethod: z.string().nullable().optional(), - secretShareSendToAnyone: z.boolean().default(true).nullable().optional() + allowSecretSharingOutsideOrganization: z.boolean().default(true).nullable().optional() }); export type TOrganizations = z.infer; diff --git a/backend/src/server/routes/v1/organization-router.ts b/backend/src/server/routes/v1/organization-router.ts index 3cc17a3d8..21723ef58 100644 --- a/backend/src/server/routes/v1/organization-router.ts +++ b/backend/src/server/routes/v1/organization-router.ts @@ -258,7 +258,7 @@ export const registerOrgRouter = async (server: FastifyZodProvider) => { defaultMembershipRoleSlug: slugSchema({ max: 64, field: "Default Membership Role" }).optional(), enforceMfa: z.boolean().optional(), selectedMfaMethod: z.nativeEnum(MfaMethod).optional(), - secretShareSendToAnyone: z.boolean().optional() + allowSecretSharingOutsideOrganization: z.boolean().optional() }), response: { 200: z.object({ diff --git a/backend/src/services/org/org-service.ts b/backend/src/services/org/org-service.ts index 12b5a7505..4ef52a551 100644 --- a/backend/src/services/org/org-service.ts +++ b/backend/src/services/org/org-service.ts @@ -19,7 +19,11 @@ import { import { TGroupDALFactory } from "@app/ee/services/group/group-dal"; import { TLicenseServiceFactory } from "@app/ee/services/license/license-service"; import { TOidcConfigDALFactory } from "@app/ee/services/oidc/oidc-config-dal"; -import { OrgPermissionActions, OrgPermissionSubjects } from "@app/ee/services/permission/org-permission"; +import { + OrgPermissionActions, + OrgPermissionSecretShareAction, + OrgPermissionSubjects +} from "@app/ee/services/permission/org-permission"; import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service"; import { ProjectPermissionActions, ProjectPermissionSub } from "@app/ee/services/permission/project-permission"; import { TProjectUserAdditionalPrivilegeDALFactory } from "@app/ee/services/project-user-additional-privilege/project-user-additional-privilege-dal"; @@ -294,13 +298,19 @@ export const orgServiceFactory = ({ defaultMembershipRoleSlug, enforceMfa, selectedMfaMethod, - secretShareSendToAnyone + allowSecretSharingOutsideOrganization } }: TUpdateOrgDTO) => { const appCfg = getConfig(); const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Edit, OrgPermissionSubjects.Settings); + if (allowSecretSharingOutsideOrganization !== undefined) { + ForbiddenError.from(permission).throwUnlessCan( + OrgPermissionSecretShareAction.ManageSettings, + OrgPermissionSubjects.SecretShare + ); + } const plan = await licenseService.getPlan(orgId); const currentOrg = await orgDAL.findOrgById(actorOrgId); @@ -368,7 +378,7 @@ export const orgServiceFactory = ({ defaultMembershipRole, enforceMfa, selectedMfaMethod, - secretShareSendToAnyone + allowSecretSharingOutsideOrganization }); if (!org) throw new NotFoundError({ message: `Organization with ID '${orgId}' not found` }); return org; diff --git a/backend/src/services/org/org-types.ts b/backend/src/services/org/org-types.ts index b6dabe121..3c6faeae9 100644 --- a/backend/src/services/org/org-types.ts +++ b/backend/src/services/org/org-types.ts @@ -72,7 +72,7 @@ export type TUpdateOrgDTO = { defaultMembershipRoleSlug: string; enforceMfa: boolean; selectedMfaMethod: MfaMethod; - secretShareSendToAnyone: boolean; + allowSecretSharingOutsideOrganization: boolean; }>; } & TOrgPermission; diff --git a/backend/src/services/secret-sharing/secret-sharing-service.ts b/backend/src/services/secret-sharing/secret-sharing-service.ts index 1ce7acf44..9649be722 100644 --- a/backend/src/services/secret-sharing/secret-sharing-service.ts +++ b/backend/src/services/secret-sharing/secret-sharing-service.ts @@ -82,6 +82,13 @@ export const secretSharingServiceFactory = ({ if (!permission) throw new ForbiddenRequestError({ name: "User is not a part of the specified organization" }); $validateSharedSecretExpiry(expiresAt); + const org = await orgDAL.findOrgById(orgId); + if (!org.allowSecretSharingOutsideOrganization && accessType === SecretSharingAccessType.Anyone) { + throw new BadRequestError({ + message: "Organization does not allow sharing secrets to members outside of this organization" + }); + } + if (secretValue.length > 10_000) { throw new BadRequestError({ message: "Shared secret value too long" }); } diff --git a/frontend/src/hooks/api/organization/queries.tsx b/frontend/src/hooks/api/organization/queries.tsx index 64f8f2eb1..d3e925dca 100644 --- a/frontend/src/hooks/api/organization/queries.tsx +++ b/frontend/src/hooks/api/organization/queries.tsx @@ -110,7 +110,7 @@ export const useUpdateOrg = () => { defaultMembershipRoleSlug, enforceMfa, selectedMfaMethod, - secretShareSendToAnyone + allowSecretSharingOutsideOrganization }) => { return apiRequest.patch(`/api/v1/organization/${orgId}`, { name, @@ -120,7 +120,7 @@ export const useUpdateOrg = () => { defaultMembershipRoleSlug, enforceMfa, selectedMfaMethod, - secretShareSendToAnyone + allowSecretSharingOutsideOrganization }); }, onSuccess: () => { diff --git a/frontend/src/hooks/api/organization/types.ts b/frontend/src/hooks/api/organization/types.ts index 6ef32ff7e..2e082f408 100644 --- a/frontend/src/hooks/api/organization/types.ts +++ b/frontend/src/hooks/api/organization/types.ts @@ -15,7 +15,7 @@ export type Organization = { defaultMembershipRole: string; enforceMfa: boolean; selectedMfaMethod?: MfaMethod; - secretShareSendToAnyone?: boolean; + allowSecretSharingOutsideOrganization?: boolean; }; export type UpdateOrgDTO = { @@ -27,7 +27,7 @@ export type UpdateOrgDTO = { defaultMembershipRoleSlug?: string; enforceMfa?: boolean; selectedMfaMethod?: MfaMethod; - secretShareSendToAnyone?: boolean; + allowSecretSharingOutsideOrganization?: boolean; }; export type BillingDetails = { diff --git a/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/RolePermissionsSection.tsx b/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/RolePermissionsSection.tsx index 8d0a3d7d9..7a2feba36 100644 --- a/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/RolePermissionsSection.tsx +++ b/frontend/src/pages/organization/RoleByIDPage/components/RolePermissionsSection/RolePermissionsSection.tsx @@ -101,8 +101,6 @@ export const RolePermissionsSection = ({ roleId }: Props) => { const onSubmit = async (el: TFormSchema) => { try { - console.log(el.permissions); - console.log(formRolePermission2API(el.permissions)); await updateRole({ orgId, id: roleId, diff --git a/frontend/src/pages/organization/SecretSharingSettingsPage/components/SecretSharingAllowShareToAnyone/SecretSharingAllowShareToAnyone.tsx b/frontend/src/pages/organization/SecretSharingSettingsPage/components/SecretSharingAllowShareToAnyone/SecretSharingAllowShareToAnyone.tsx index 71fa8fa77..1ea62c187 100644 --- a/frontend/src/pages/organization/SecretSharingSettingsPage/components/SecretSharingAllowShareToAnyone/SecretSharingAllowShareToAnyone.tsx +++ b/frontend/src/pages/organization/SecretSharingSettingsPage/components/SecretSharingAllowShareToAnyone/SecretSharingAllowShareToAnyone.tsx @@ -14,7 +14,7 @@ export const SecretSharingAllowShareToAnyone = () => { await mutateAsync({ orgId: currentOrg.id, - secretShareSendToAnyone: value + allowSecretSharingOutsideOrganization: value }); createNotification({ @@ -42,7 +42,7 @@ export const SecretSharingAllowShareToAnyone = () => { handleSecretSharingToggle(value)} - isChecked={currentOrg?.secretShareSendToAnyone ?? false} + isChecked={currentOrg?.allowSecretSharingOutsideOrganization ?? false} isDisabled={!isAllowed} /> )} diff --git a/frontend/src/pages/public/ShareSecretPage/components/ShareSecretForm.tsx b/frontend/src/pages/public/ShareSecretPage/components/ShareSecretForm.tsx index 8357c5db1..07a6336fa 100644 --- a/frontend/src/pages/public/ShareSecretPage/components/ShareSecretForm.tsx +++ b/frontend/src/pages/public/ShareSecretPage/components/ShareSecretForm.tsx @@ -232,7 +232,7 @@ export const ShareSecretForm = ({ isPublic, value }: Props) => { onValueChange={(e) => onChange(e)} className="w-full" > - {currentOrg?.secretShareSendToAnyone && ( + {currentOrg?.allowSecretSharingOutsideOrganization && ( Anyone )}