Fix insert conflict between field permission and RLS (#19244)
Insert operations blocked by field-level update permissions on non-editable fields The insert code path in permissions.utils.ts fell through to the update case (no break), causing validateUpdateFieldPermissionOrThrow to reject inserts when any field had "Edit disabled" which could conflict with RLS predicates (used for insertion of new records) Fixes https://github.com/twentyhq/twenty/issues/19201 We will keep checking update permissions for insertion (until we decide to have a separate permission flag for insertion) but to fix the issue we will skip this part if it conflicts with an RLS predicate
This commit is contained in:
@@ -139,6 +139,40 @@ export const validateOperationIsPermittedOrThrow = ({
|
||||
});
|
||||
break;
|
||||
case 'insert':
|
||||
if (!permissionsForEntity?.canUpdateObjectRecords) {
|
||||
throw new PermissionsException(
|
||||
PermissionsExceptionMessage.PERMISSION_DENIED,
|
||||
PermissionsExceptionCode.PERMISSION_DENIED,
|
||||
);
|
||||
}
|
||||
|
||||
validateReadFieldPermissionOrThrow({
|
||||
restrictedFields: permissionsForEntity.restrictedFields,
|
||||
selectedColumns,
|
||||
columnNameToFieldMetadataIdMap,
|
||||
});
|
||||
|
||||
if (updatedColumns.length > 0) {
|
||||
const rlsFieldMetadataIds = new Set(
|
||||
permissionsForEntity.rowLevelPermissionPredicates.map(
|
||||
(predicate) => predicate.fieldMetadataId,
|
||||
),
|
||||
);
|
||||
|
||||
const updatedColumnsWithoutRlsFields = updatedColumns.filter(
|
||||
(column) =>
|
||||
!rlsFieldMetadataIds.has(columnNameToFieldMetadataIdMap[column]),
|
||||
);
|
||||
|
||||
if (updatedColumnsWithoutRlsFields.length > 0) {
|
||||
validateUpdateFieldPermissionOrThrow({
|
||||
restrictedFields: permissionsForEntity.restrictedFields,
|
||||
updatedColumns: updatedColumnsWithoutRlsFields,
|
||||
columnNameToFieldMetadataIdMap,
|
||||
});
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'update':
|
||||
if (!permissionsForEntity?.canUpdateObjectRecords) {
|
||||
throw new PermissionsException(
|
||||
|
||||
Reference in New Issue
Block a user