Skip to content

Commit 3f6d9e4

Browse files
committed
chore: store provenance as String type
Signed-off-by: Ben Selwyn-Smith <[email protected]>
1 parent f327d20 commit 3f6d9e4

File tree

2 files changed

+33
-27
lines changed

2 files changed

+33
-27
lines changed

src/macaron/database/db_custom_types.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"""This module implements SQLAlchemy type for converting date format to RFC3339 string representation."""
55

66
import datetime
7+
import json
78
from typing import Any
89

910
from sqlalchemy import JSON, String, TypeDecorator
@@ -105,16 +106,16 @@ class ProvenancePayload(TypeDecorator): # pylint: disable=W0223
105106
"""SQLAlchemy column type to serialize InTotoProvenance."""
106107

107108
# It is stored in the database as a json value.
108-
impl = JSON
109+
impl = String
109110

110111
# To prevent Sphinx from rendering the docstrings for `cache_ok`, make this docstring private.
111112
#: :meta private:
112113
cache_ok = True
113114

114-
def process_bind_param(self, value: None | InTotoPayload, dialect: Any) -> None | dict:
115+
def process_bind_param(self, value: None | InTotoPayload, dialect: Any) -> str | None:
115116
"""Process when storing an InTotoPayload object to the SQLite db.
116117
117-
value: None | InTotoPayload
118+
value: InTotoPayload | None
118119
The value being stored.
119120
"""
120121
if value is None:
@@ -124,27 +125,33 @@ def process_bind_param(self, value: None | InTotoPayload, dialect: Any) -> None
124125
raise TypeError("ProvenancePayload type expects an InTotoPayload.")
125126

126127
payload_type = value.__class__.__name__
127-
return {"payload_type": payload_type, "payload": value.statement}
128+
payload_dict = {"payload_type": payload_type, "payload": value.statement}
129+
return json.dumps(payload_dict)
128130

129-
def process_result_value(self, value: None | dict, dialect: Any) -> None | InTotoPayload:
131+
def process_result_value(self, value: str | None, dialect: Any) -> InTotoPayload | None:
130132
"""Process when loading an InTotoPayload object from the SQLite db.
131133
132-
value: None | dict
134+
value: str | None
133135
The value being loaded.
134136
"""
135137
if value is None:
136138
return None
137139

138-
if not isinstance(value, dict):
139-
raise TypeError("ProvenancePayload type expects a dict.")
140+
try:
141+
payload_dict = json.loads(value)
142+
except ValueError as error:
143+
raise TypeError(f"Error parsing str as JSON: {error}") from error
144+
145+
if not isinstance(payload_dict, dict):
146+
raise TypeError("Parsed data is not a dict.")
140147

141-
if "payload_type" not in value or "payload" not in value:
148+
if "payload_type" not in payload_dict or "payload" not in payload_dict:
142149
raise TypeError("Missing keys in dict for ProvenancePayload type.")
143150

144-
payload = value["payload"]
145-
if value["payload_type"] == "InTotoV01Payload":
151+
payload = payload_dict["payload"]
152+
if payload["payload_type"] == "InTotoV01Payload":
146153
return InTotoV01Payload(statement=payload)
147-
if value["payload_type"] == "InTotoV1Payload":
154+
if payload["payload_type"] == "InTotoV1Payload":
148155
return InTotoV1Payload(statement=payload)
149156

150-
return validate_intoto_payload(value)
157+
return validate_intoto_payload(payload)

src/macaron/slsa_analyzer/analyzer.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -485,25 +485,24 @@ def run_single(
485485
if verified and all(verified):
486486
provenance_l3_verified = True
487487

488-
slsa_version = None
489488
if provenance_payload:
490489
analyze_ctx.dynamic_data["is_inferred_prov"] = False
491490
slsa_version = extract_predicate_version(provenance_payload)
492491

493-
slsa_level = determine_provenance_slsa_level(
494-
analyze_ctx, provenance_payload, provenance_is_verified, provenance_l3_verified
495-
)
492+
slsa_level = determine_provenance_slsa_level(
493+
analyze_ctx, provenance_payload, provenance_is_verified, provenance_l3_verified
494+
)
496495

497-
analyze_ctx.dynamic_data["provenance_info"] = table_definitions.Provenance(
498-
component=component,
499-
repository_url=provenance_repo_url,
500-
commit_sha=provenance_commit_digest,
501-
verified=provenance_is_verified,
502-
provenance_payload=provenance_payload,
503-
slsa_level=slsa_level,
504-
slsa_version=slsa_version,
505-
# TODO Add release tag, release digest.
506-
)
496+
analyze_ctx.dynamic_data["provenance_info"] = table_definitions.Provenance(
497+
component=component,
498+
repository_url=provenance_repo_url,
499+
commit_sha=provenance_commit_digest,
500+
verified=provenance_is_verified,
501+
provenance_payload=provenance_payload,
502+
slsa_level=slsa_level,
503+
slsa_version=slsa_version,
504+
# TODO Add release tag, release digest.
505+
)
507506

508507
analyze_ctx.dynamic_data["validate_malware_switch"] = validate_malware_switch
509508

0 commit comments

Comments
 (0)