Fix SOA permissions handling + add scope conditions
Signed-off-by: Émile Ré <emile@getprobo.com>
This commit is contained in:
@@ -264,7 +264,8 @@ SET
|
||||
name = @name,
|
||||
owner_id = @owner_id,
|
||||
updated_at = @updated_at
|
||||
WHERE %s
|
||||
WHERE
|
||||
%s
|
||||
AND id = @state_of_applicability_id
|
||||
`
|
||||
|
||||
@@ -303,7 +304,8 @@ func (s *StateOfApplicability) Delete(
|
||||
) error {
|
||||
q := `
|
||||
DELETE FROM states_of_applicability
|
||||
WHERE %s
|
||||
WHERE
|
||||
%s
|
||||
AND id = @state_of_applicability_id
|
||||
`
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
@@ -346,31 +348,32 @@ func (soas StatesOfApplicability) insertStateOfApplicabilitySnapshots(
|
||||
) error {
|
||||
query := `
|
||||
INSERT INTO states_of_applicability (
|
||||
id,
|
||||
tenant_id,
|
||||
organization_id,
|
||||
name,
|
||||
source_id,
|
||||
snapshot_id,
|
||||
owner_id,
|
||||
created_at,
|
||||
updated_at
|
||||
id,
|
||||
tenant_id,
|
||||
organization_id,
|
||||
name,
|
||||
source_id,
|
||||
snapshot_id,
|
||||
owner_id,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
SELECT
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @state_of_applicability_entity_type),
|
||||
@tenant_id,
|
||||
soa.organization_id,
|
||||
soa.name,
|
||||
soa.id,
|
||||
@snapshot_id,
|
||||
soa.owner_id,
|
||||
soa.created_at,
|
||||
soa.updated_at
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @state_of_applicability_entity_type),
|
||||
@tenant_id,
|
||||
soa.organization_id,
|
||||
soa.name,
|
||||
soa.id,
|
||||
@snapshot_id,
|
||||
soa.owner_id,
|
||||
soa.created_at,
|
||||
soa.updated_at
|
||||
FROM states_of_applicability soa
|
||||
WHERE %s
|
||||
AND soa.organization_id = @organization_id
|
||||
AND soa.snapshot_id IS NULL
|
||||
`
|
||||
WHERE
|
||||
%s
|
||||
AND soa.organization_id = @organization_id
|
||||
AND soa.snapshot_id IS NULL
|
||||
`
|
||||
|
||||
query = fmt.Sprintf(query, scope.SQLFragment())
|
||||
|
||||
@@ -399,47 +402,48 @@ func (soas StatesOfApplicability) insertStateOfApplicabilityControlSnapshots(
|
||||
) error {
|
||||
query := `
|
||||
WITH source_soa AS (
|
||||
SELECT id, organization_id
|
||||
FROM states_of_applicability
|
||||
WHERE %s
|
||||
AND organization_id = @organization_id
|
||||
AND snapshot_id IS NULL
|
||||
SELECT id, organization_id
|
||||
FROM states_of_applicability
|
||||
WHERE
|
||||
%s
|
||||
AND organization_id = @organization_id
|
||||
AND snapshot_id IS NULL
|
||||
),
|
||||
snapshot_soa AS (
|
||||
SELECT id, source_id
|
||||
FROM states_of_applicability
|
||||
WHERE snapshot_id = @snapshot_id
|
||||
SELECT id, source_id
|
||||
FROM states_of_applicability
|
||||
WHERE snapshot_id = @snapshot_id
|
||||
)
|
||||
INSERT INTO states_of_applicability_controls (
|
||||
id,
|
||||
state_of_applicability_id,
|
||||
control_id,
|
||||
organization_id,
|
||||
tenant_id,
|
||||
snapshot_id,
|
||||
applicability,
|
||||
justification,
|
||||
created_at,
|
||||
updated_at
|
||||
id,
|
||||
state_of_applicability_id,
|
||||
control_id,
|
||||
organization_id,
|
||||
tenant_id,
|
||||
snapshot_id,
|
||||
applicability,
|
||||
justification,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
SELECT
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @state_of_applicability_control_entity_type),
|
||||
snapshot_soa.id,
|
||||
soac.control_id,
|
||||
soac.organization_id,
|
||||
@tenant_id,
|
||||
@snapshot_id,
|
||||
soac.applicability,
|
||||
soac.justification,
|
||||
soac.created_at,
|
||||
soac.updated_at
|
||||
generate_gid(decode_base64_unpadded(@tenant_id), @state_of_applicability_control_entity_type),
|
||||
snapshot_soa.id,
|
||||
soac.control_id,
|
||||
soac.organization_id,
|
||||
@tenant_id,
|
||||
@snapshot_id,
|
||||
soac.applicability,
|
||||
soac.justification,
|
||||
soac.created_at,
|
||||
soac.updated_at
|
||||
FROM states_of_applicability_controls soac
|
||||
INNER JOIN source_soa
|
||||
ON soac.state_of_applicability_id = source_soa.id
|
||||
ON soac.state_of_applicability_id = source_soa.id
|
||||
INNER JOIN snapshot_soa
|
||||
ON snapshot_soa.source_id = source_soa.id
|
||||
ON snapshot_soa.source_id = source_soa.id
|
||||
WHERE soac.snapshot_id IS NULL
|
||||
`
|
||||
`
|
||||
|
||||
query = fmt.Sprintf(query, scope.SQLFragment())
|
||||
|
||||
|
||||
@@ -96,28 +96,29 @@ func (sac *StateOfApplicabilityControl) LoadByStateOfApplicabilityIDAndControlID
|
||||
) error {
|
||||
q := `
|
||||
WITH current_soa AS (
|
||||
SELECT id
|
||||
FROM states_of_applicability
|
||||
WHERE %s
|
||||
AND id = @state_of_applicability_id
|
||||
AND snapshot_id IS NULL
|
||||
SELECT id
|
||||
FROM states_of_applicability
|
||||
WHERE
|
||||
%s
|
||||
AND id = @state_of_applicability_id
|
||||
AND snapshot_id IS NULL
|
||||
)
|
||||
SELECT
|
||||
soac.id,
|
||||
soac.state_of_applicability_id,
|
||||
soac.control_id,
|
||||
soac.organization_id,
|
||||
soac.snapshot_id,
|
||||
soac.applicability,
|
||||
soac.justification,
|
||||
soac.created_at,
|
||||
soac.updated_at
|
||||
soac.id,
|
||||
soac.state_of_applicability_id,
|
||||
soac.control_id,
|
||||
soac.organization_id,
|
||||
soac.snapshot_id,
|
||||
soac.applicability,
|
||||
soac.justification,
|
||||
soac.created_at,
|
||||
soac.updated_at
|
||||
FROM
|
||||
states_of_applicability_controls soac
|
||||
states_of_applicability_controls soac
|
||||
INNER JOIN
|
||||
current_soa ON soac.state_of_applicability_id = current_soa.id
|
||||
current_soa ON soac.state_of_applicability_id = current_soa.id
|
||||
WHERE
|
||||
soac.control_id = @control_id
|
||||
soac.control_id = @control_id
|
||||
LIMIT 1;
|
||||
`
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
@@ -217,7 +218,8 @@ SET
|
||||
applicability = @applicability,
|
||||
justification = @justification,
|
||||
updated_at = @updated_at
|
||||
WHERE %s
|
||||
WHERE
|
||||
%s
|
||||
AND state_of_applicability_id = @state_of_applicability_id
|
||||
AND control_id = @control_id
|
||||
`
|
||||
@@ -304,15 +306,16 @@ func (sac *StateOfApplicabilityControl) Delete(
|
||||
) error {
|
||||
q := `
|
||||
WITH current_soa AS (
|
||||
SELECT id
|
||||
FROM states_of_applicability
|
||||
WHERE %s
|
||||
AND id = @state_of_applicability_id
|
||||
AND snapshot_id IS NULL
|
||||
SELECT id
|
||||
FROM states_of_applicability
|
||||
WHERE
|
||||
%s
|
||||
AND id = @state_of_applicability_id
|
||||
AND snapshot_id IS NULL
|
||||
)
|
||||
DELETE FROM states_of_applicability_controls
|
||||
WHERE state_of_applicability_id IN (SELECT id FROM current_soa)
|
||||
AND control_id = @control_id;
|
||||
AND control_id = @control_id;
|
||||
`
|
||||
|
||||
args := pgx.StrictNamedArgs{
|
||||
@@ -380,39 +383,41 @@ func (sacs *StateOfApplicabilityControls) LoadByControlID(
|
||||
) error {
|
||||
q := `
|
||||
WITH soac_ctrl AS (
|
||||
SELECT
|
||||
soac.id,
|
||||
soac.state_of_applicability_id,
|
||||
soac.control_id,
|
||||
soac.organization_id,
|
||||
soac.snapshot_id,
|
||||
soac.applicability,
|
||||
soac.justification,
|
||||
soac.created_at,
|
||||
soac.updated_at,
|
||||
soac.tenant_id
|
||||
FROM
|
||||
states_of_applicability_controls soac
|
||||
INNER JOIN
|
||||
states_of_applicability soa ON soac.state_of_applicability_id = soa.id
|
||||
WHERE
|
||||
soac.control_id = @control_id
|
||||
AND soa.snapshot_id IS NULL
|
||||
SELECT
|
||||
soac.id,
|
||||
soac.state_of_applicability_id,
|
||||
soac.control_id,
|
||||
soac.organization_id,
|
||||
soac.snapshot_id,
|
||||
soac.applicability,
|
||||
soac.justification,
|
||||
soac.created_at,
|
||||
soac.updated_at,
|
||||
soac.tenant_id
|
||||
FROM
|
||||
states_of_applicability_controls soac
|
||||
INNER JOIN
|
||||
states_of_applicability soa ON soac.state_of_applicability_id = soa.id
|
||||
WHERE
|
||||
soac.%[1]s
|
||||
AND soac.control_id = @control_id
|
||||
AND soa.snapshot_id IS NULL
|
||||
)
|
||||
SELECT
|
||||
id,
|
||||
state_of_applicability_id,
|
||||
control_id,
|
||||
organization_id,
|
||||
snapshot_id,
|
||||
applicability,
|
||||
justification,
|
||||
created_at,
|
||||
updated_at
|
||||
id,
|
||||
state_of_applicability_id,
|
||||
control_id,
|
||||
organization_id,
|
||||
snapshot_id,
|
||||
applicability,
|
||||
justification,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
soac_ctrl
|
||||
WHERE %s
|
||||
AND %s
|
||||
soac_ctrl
|
||||
WHERE
|
||||
%[1]s
|
||||
AND %[2]s
|
||||
`
|
||||
q = fmt.Sprintf(q, scope.SQLFragment(), cursor.SQLFragment())
|
||||
|
||||
@@ -442,21 +447,25 @@ func (sacs *StateOfApplicabilityControls) CountByControlID(
|
||||
) (int, error) {
|
||||
q := `
|
||||
WITH soac_ctrl AS (
|
||||
SELECT
|
||||
soac.id,
|
||||
soac.organization_id,
|
||||
soac.tenant_id
|
||||
FROM
|
||||
states_of_applicability_controls soac
|
||||
WHERE
|
||||
soac.control_id = @control_id
|
||||
SELECT
|
||||
soac.id,
|
||||
soac.organization_id,
|
||||
soac.tenant_id
|
||||
FROM
|
||||
states_of_applicability_controls soac
|
||||
INNER JOIN
|
||||
states_of_applicability soa ON soac.state_of_applicability_id = soa.id
|
||||
WHERE
|
||||
soac.%[1]s
|
||||
AND soac.control_id = @control_id
|
||||
AND soa.snapshot_id IS NULL
|
||||
)
|
||||
SELECT
|
||||
COUNT(id)
|
||||
COUNT(id)
|
||||
FROM
|
||||
soac_ctrl
|
||||
soac_ctrl
|
||||
WHERE
|
||||
%s;
|
||||
%[1]s;
|
||||
`
|
||||
|
||||
q = fmt.Sprintf(q, scope.SQLFragment())
|
||||
@@ -499,7 +508,8 @@ filtered_controls AS (
|
||||
c.tenant_id,
|
||||
c.best_practice
|
||||
FROM controls c
|
||||
WHERE %s
|
||||
WHERE
|
||||
%s
|
||||
),
|
||||
all_controls AS (
|
||||
SELECT
|
||||
|
||||
Reference in New Issue
Block a user