From 9534fd9ebe0905f8a7c7704c51db8d0662344f93 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Fri, 29 Aug 2025 12:30:38 -0700 Subject: [PATCH 1/4] fix: Builder state --- src/c2pa/c2pa.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/c2pa/c2pa.py b/src/c2pa/c2pa.py index 629498f..c97321f 100644 --- a/src/c2pa/c2pa.py +++ b/src/c2pa/c2pa.py @@ -2079,6 +2079,7 @@ def __init__(self, manifest_json: Any): C2paError.Json: If the manifest JSON cannot be serialized """ self._closed = False + self._initialized = False self._builder = None if not isinstance(manifest_json, str): @@ -2108,6 +2109,9 @@ def __init__(self, manifest_json: Any): ) ) + # Mark as initialized only after successful creation + self._initialized = True + @classmethod def from_json(cls, manifest_json: Any) -> 'Builder': """Create a new Builder from a JSON manifest. @@ -2150,16 +2154,20 @@ def from_archive(cls, stream: Any) -> 'Builder': raise C2paError(error) raise C2paError("Failed to create builder from archive") + # Mark as initialized after successful creation from archive + builder._initialized = True return builder def _ensure_valid_state(self): """Ensure the builder is in a valid state for operations. Raises: - C2paError: If the builder is closed or invalid + C2paError: If the builder is closed, not initialized, or invalid """ if self._closed: raise C2paError(Builder._ERROR_MESSAGES['closed_error']) + if not self._initialized: + raise C2paError("Builder is not properly initialized") if not self._builder: raise C2paError(Builder._ERROR_MESSAGES['closed_error']) @@ -2187,6 +2195,9 @@ def _cleanup_resources(self): pass finally: self._builder = None + + # Reset initialized state after cleanup + self._initialized = False except Exception: # Ensure we don't raise exceptions during cleanup pass @@ -2219,10 +2230,6 @@ def close(self): def __enter__(self): self._ensure_valid_state() - - if not self._builder: - raise C2paError("Invalid Builder when entering context") - return self def __exit__(self, exc_type, exc_val, exc_tb): @@ -2327,8 +2334,7 @@ def add_ingredient_from_stream( C2paError.Encoding: If the ingredient JSON or format contains invalid UTF-8 characters """ - if not self._builder: - raise C2paError(Builder._ERROR_MESSAGES['closed_error']) + self._ensure_valid_state() try: ingredient_str = ingredient_json.encode('utf-8') @@ -2413,8 +2419,7 @@ def to_archive(self, stream: Any) -> None: Raises: C2paError: If there was an error writing the archive """ - if not self._builder: - raise C2paError(Builder._ERROR_MESSAGES['closed_error']) + self._ensure_valid_state() with Stream(stream) as stream_obj: result = _lib.c2pa_builder_to_archive( @@ -2452,8 +2457,7 @@ def _sign_internal( Raises: C2paError: If there was an error during signing """ - if not self._builder: - raise C2paError(Builder._ERROR_MESSAGES['closed_error']) + self._ensure_valid_state() # Validate signer pointer before use if not signer or not hasattr(signer, '_signer') or not signer._signer: From 618fd42afa68b0fdef034f77772dd98ff242b3bb Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Fri, 29 Aug 2025 13:05:11 -0700 Subject: [PATCH 2/4] fix: reader state --- src/c2pa/c2pa.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/c2pa/c2pa.py b/src/c2pa/c2pa.py index c97321f..1833063 100644 --- a/src/c2pa/c2pa.py +++ b/src/c2pa/c2pa.py @@ -1344,6 +1344,7 @@ def __init__(self, """ self._closed = False + self._initialized = False self._reader = None self._own_stream = None @@ -1398,6 +1399,9 @@ def __init__(self, # Store the file to close it later self._backing_file = file + + # Mark as initialized after successful creation + self._initialized = True except Exception as e: if self._own_stream: @@ -1458,6 +1462,9 @@ def __init__(self, ) self._backing_file = file + + # Mark as initialized after successful creation + self._initialized = True except Exception as e: if self._own_stream: self._own_stream.close() @@ -1509,12 +1516,11 @@ def __init__(self, ) ) + # Mark as initialized after successful creation + self._initialized = True + def __enter__(self): self._ensure_valid_state() - - if not self._reader: - raise C2paError("Invalid Reader when entering context") - return self def __exit__(self, exc_type, exc_val, exc_tb): @@ -1532,10 +1538,12 @@ def _ensure_valid_state(self): """Ensure the reader is in a valid state for operations. Raises: - C2paError: If the reader is closed or invalid + C2paError: If the reader is closed, not initialized, or invalid """ if self._closed: raise C2paError(Reader._ERROR_MESSAGES['closed_error']) + if not self._initialized: + raise C2paError("Reader is not properly initialized") if not self._reader: raise C2paError(Reader._ERROR_MESSAGES['closed_error']) @@ -1585,6 +1593,9 @@ def _cleanup_resources(self): finally: self._backing_file = None + # Reset initialized state after cleanup + self._initialized = False + except Exception: # Ensure we don't raise exceptions during cleanup pass From 519282a15b2266fad7ec1a6067be84240b9e4106 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Fri, 29 Aug 2025 13:08:57 -0700 Subject: [PATCH 3/4] fix: Clean up states --- src/c2pa/c2pa.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/c2pa/c2pa.py b/src/c2pa/c2pa.py index 1833063..cb9d0e1 100644 --- a/src/c2pa/c2pa.py +++ b/src/c2pa/c2pa.py @@ -1399,8 +1399,7 @@ def __init__(self, # Store the file to close it later self._backing_file = file - - # Mark as initialized after successful creation + self._initialized = True except Exception as e: @@ -1462,8 +1461,7 @@ def __init__(self, ) self._backing_file = file - - # Mark as initialized after successful creation + self._initialized = True except Exception as e: if self._own_stream: @@ -2165,7 +2163,6 @@ def from_archive(cls, stream: Any) -> 'Builder': raise C2paError(error) raise C2paError("Failed to create builder from archive") - # Mark as initialized after successful creation from archive builder._initialized = True return builder From f08eea2bf2454061c09248a3f733c34353bded85 Mon Sep 17 00:00:00 2001 From: Tania Mathern Date: Fri, 29 Aug 2025 13:10:33 -0700 Subject: [PATCH 4/4] fix: Comment clean up --- src/c2pa/c2pa.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/c2pa/c2pa.py b/src/c2pa/c2pa.py index cb9d0e1..7a6344e 100644 --- a/src/c2pa/c2pa.py +++ b/src/c2pa/c2pa.py @@ -1514,7 +1514,6 @@ def __init__(self, ) ) - # Mark as initialized after successful creation self._initialized = True def __enter__(self): @@ -2118,7 +2117,6 @@ def __init__(self, manifest_json: Any): ) ) - # Mark as initialized only after successful creation self._initialized = True @classmethod