feat: govern legacy archive encryption
This commit is contained in:
@@ -40,6 +40,10 @@ from govoplan_campaign.backend.db.models import (
|
||||
JobSendStatus,
|
||||
JobValidationStatus,
|
||||
)
|
||||
from govoplan_campaign.backend.archive_encryption import (
|
||||
CampaignArchiveEncryptionError,
|
||||
assert_archive_encryption_allowed,
|
||||
)
|
||||
from govoplan_campaign.backend.campaign.loader import (
|
||||
load_campaign_json,
|
||||
validate_against_schema,
|
||||
@@ -657,6 +661,15 @@ def validate_campaign_version(
|
||||
raise CampaignPersistenceError(
|
||||
"Campaign version is not accessible for this tenant"
|
||||
)
|
||||
try:
|
||||
archive_policy = assert_archive_encryption_allowed(
|
||||
session,
|
||||
campaign,
|
||||
version.raw_json if isinstance(version.raw_json, dict) else {},
|
||||
principal=principal,
|
||||
)
|
||||
except CampaignArchiveEncryptionError as exc:
|
||||
raise CampaignPersistenceError(str(exc)) from exc
|
||||
_ensure_current_campaign_version(campaign, version, action="validate")
|
||||
if _version_is_user_locked(version) or version.workflow_state in {
|
||||
CampaignVersionWorkflowState.QUEUED.value,
|
||||
@@ -734,6 +747,7 @@ def validate_campaign_version(
|
||||
"warning_count": report.warning_count,
|
||||
"validated_at": datetime.now(UTC).isoformat(),
|
||||
"validated_by_user_id": user_id,
|
||||
"archive_encryption_policy": archive_policy.to_dict(),
|
||||
}
|
||||
)
|
||||
version.validation_summary = report_json
|
||||
@@ -1430,6 +1444,11 @@ def _store_execution_snapshot(
|
||||
delivery=config.delivery,
|
||||
jobs=jobs,
|
||||
build_summary=build_summary,
|
||||
archive_encryption=(
|
||||
build_summary.get("archive_encryption")
|
||||
if isinstance(build_summary.get("archive_encryption"), dict)
|
||||
else None
|
||||
),
|
||||
)
|
||||
version.execution_snapshot = snapshot
|
||||
version.execution_snapshot_hash = snapshot_hash
|
||||
@@ -1615,6 +1634,15 @@ def build_campaign_version(
|
||||
raise CampaignPersistenceError(
|
||||
"Campaign version is not accessible for this tenant"
|
||||
)
|
||||
try:
|
||||
archive_policy = assert_archive_encryption_allowed(
|
||||
session,
|
||||
campaign,
|
||||
version.raw_json if isinstance(version.raw_json, dict) else {},
|
||||
principal=principal,
|
||||
)
|
||||
except CampaignArchiveEncryptionError as exc:
|
||||
raise CampaignPersistenceError(str(exc)) from exc
|
||||
_ensure_current_campaign_version(campaign, version, action="build")
|
||||
if version.workflow_state == CampaignVersionWorkflowState.COMPLETED.value:
|
||||
raise CampaignPersistenceError("Sent campaign versions cannot be rebuilt")
|
||||
@@ -1749,6 +1777,25 @@ def build_campaign_version(
|
||||
)
|
||||
report_json = _campaign_build_report(result, files)
|
||||
report_json["built_by_user_id"] = user_id
|
||||
archive_records = [
|
||||
{
|
||||
**archive,
|
||||
"campaign_id": campaign.id,
|
||||
"campaign_version_id": version.id,
|
||||
"build_token": report_json["build_token"],
|
||||
"built_at": report_json["built_at"],
|
||||
"policy_hash": archive_policy.policy_hash,
|
||||
"policy_source_path": [
|
||||
dict(item) for item in archive_policy.source_path
|
||||
],
|
||||
}
|
||||
for message in result.report.messages
|
||||
for archive in message.archive_evidence
|
||||
]
|
||||
report_json["archive_encryption"] = {
|
||||
"policy": archive_policy.to_dict(),
|
||||
"archives": archive_records,
|
||||
}
|
||||
if resolved_print_outputs_by_index:
|
||||
first_output = next(iter(resolved_print_outputs_by_index.values()))
|
||||
report_json["print_output"] = {
|
||||
|
||||
Reference in New Issue
Block a user