Skip to content

Commit 6f52d7c

Browse files
ramonpetgrave64jku
andauthored
improve KindVersion compatibility (#1370)
* no trailing slash for post to /entries Signed-off-by: Ramon Petgrave <ramon.petgrave64@gmail.com> * parse kind_version earlier Signed-off-by: Ramon Petgrave <ramon.petgrave64@gmail.com> * Revert "no trailing slash for post to /entries" This reverts commit 79a6d31. Signed-off-by: Ramon Petgrave <ramon.petgrave64@gmail.com> * lint Signed-off-by: Ramon Petgrave <ramon.petgrave64@gmail.com> * add PR link Signed-off-by: Ramon Petgrave <32398091+ramonpetgrave64@users.noreply.github.com> * private .__kind_version Signed-off-by: Ramon Petgrave <ramon.petgrave64@gmail.com> * update to ._kind_version Signed-off-by: Ramon Petgrave <32398091+ramonpetgrave64@users.noreply.github.com> --------- Signed-off-by: Ramon Petgrave <ramon.petgrave64@gmail.com> Signed-off-by: Ramon Petgrave <32398091+ramonpetgrave64@users.noreply.github.com> Co-authored-by: Jussi Kukkonen <jkukkonen@google.com>
1 parent 4b388c3 commit 6f52d7c

File tree

2 files changed

+23
-15
lines changed

2 files changed

+23
-15
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ All versions prior to 0.9.0 are untracked.
1010

1111
### Added
1212

13+
* Added `LogEntry._kind_version`, which is now parsed earlier upon receipt from the rekor API,
14+
either from the root of the response, or from the reponse's inner base64-encoded JSON `body`.
15+
[#1370](https://github.com/sigstore/sigstore-python/pull/1370)
16+
1317
* Added support for ed25519 keys.
1418
[#1377](https://github.com/sigstore/sigstore-python/pull/1377)
1519

sigstore/models.py

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@
5858
from sigstore_protobuf_specs.dev.sigstore.common import v1 as common_v1
5959
from sigstore_protobuf_specs.dev.sigstore.common.v1 import Rfc3161SignedTimestamp
6060
from sigstore_protobuf_specs.dev.sigstore.rekor import v1 as rekor_v1
61-
from sigstore_protobuf_specs.dev.sigstore.rekor.v1 import (
62-
InclusionProof,
63-
)
61+
from sigstore_protobuf_specs.dev.sigstore.rekor.v1 import InclusionProof, KindVersion
6462

6563
from sigstore import dsse
6664
from sigstore._internal.merkle import verify_merkle_inclusion
@@ -173,6 +171,11 @@ class LogEntry:
173171
log entry.
174172
"""
175173

174+
_kind_version: KindVersion
175+
"""
176+
The kind and version of the log entry.
177+
"""
178+
176179
@classmethod
177180
def _from_response(cls, dict_: dict[str, Any]) -> LogEntry:
178181
"""
@@ -183,8 +186,15 @@ def _from_response(cls, dict_: dict[str, Any]) -> LogEntry:
183186
entries = list(dict_.items())
184187
if len(entries) != 1:
185188
raise ValueError("Received multiple entries in response")
186-
187189
uuid, entry = entries[0]
190+
191+
# Fill in the appropriate kind
192+
body_entry: ProposedEntry = TypeAdapter(ProposedEntry).validate_json(
193+
base64.b64decode(entry["body"])
194+
)
195+
if not isinstance(body_entry, (Hashedrekord, Dsse)):
196+
raise InvalidBundle("log entry is not of expected type")
197+
188198
return LogEntry(
189199
uuid=uuid,
190200
body=entry["body"],
@@ -195,6 +205,9 @@ def _from_response(cls, dict_: dict[str, Any]) -> LogEntry:
195205
entry["verification"]["inclusionProof"]
196206
),
197207
inclusion_promise=entry["verification"]["signedEntryTimestamp"],
208+
_kind_version=KindVersion(
209+
kind=body_entry.kind, version=body_entry.api_version
210+
),
198211
)
199212

200213
@classmethod
@@ -234,6 +247,7 @@ def _from_dict_rekor(cls, dict_: dict[str, Any]) -> LogEntry:
234247
log_id=tlog_entry.log_id.key_id.hex(),
235248
log_index=tlog_entry.log_index,
236249
inclusion_proof=parsed_inclusion_proof,
250+
_kind_version=tlog_entry.kind_version,
237251
inclusion_promise=inclusion_promise,
238252
)
239253

@@ -256,6 +270,7 @@ def _to_rekor(self) -> rekor_v1.TransparencyLogEntry:
256270
log_id=common_v1.LogId(key_id=bytes.fromhex(self.log_id)),
257271
integrated_time=self.integrated_time,
258272
inclusion_proof=inclusion_proof,
273+
kind_version=self._kind_version,
259274
canonicalized_body=base64.b64decode(self.body),
260275
)
261276
if self.inclusion_promise:
@@ -264,17 +279,6 @@ def _to_rekor(self) -> rekor_v1.TransparencyLogEntry:
264279
)
265280
tlog_entry.inclusion_promise = inclusion_promise
266281

267-
# Fill in the appropriate kind
268-
body_entry: ProposedEntry = TypeAdapter(ProposedEntry).validate_json(
269-
tlog_entry.canonicalized_body
270-
)
271-
if not isinstance(body_entry, (Hashedrekord, Dsse)):
272-
raise InvalidBundle("log entry is not of expected type")
273-
274-
tlog_entry.kind_version = rekor_v1.KindVersion(
275-
kind=body_entry.kind, version=body_entry.api_version
276-
)
277-
278282
return tlog_entry
279283

280284
def encode_canonical(self) -> bytes:

0 commit comments

Comments
 (0)