Source code for aeat.adapters.persistence.storage.sql._secure_object_schema
"""Schema and row-shape helpers for SQL secure-object persistence."""from__future__importannotationsimportjsonfromtypingimportFinalfromsqlalchemyimportEngine,textfrom.....core.external_constantsimportUTF_8_ENCODINGfrom.....core.timeimportnowas_utc_nowfrom..errorsimportStorageValidationErrorVARCHAR_64:Final[str]="VARCHAR(64)"
[docs]defensure_quarantine_table(engine:Engine)->None:"""Create the quarantine archive table with the secure-object metadata shape."""withengine.begin()asconnection:connection.execute(# Static bootstrap DDL; no user-controlled SQL reaches this statement.text(# nosemgrep"CREATE TABLE IF NOT EXISTS secure_objects_quarantine ("" id INTEGER PRIMARY KEY AUTOINCREMENT,"" source_id INTEGER NOT NULL,"" namespace VARCHAR(128) NOT NULL,"" object_key BLOB NOT NULL,"" classification VARCHAR(32) NOT NULL,"" schema_version INTEGER NOT NULL,"" written_at DATETIME NOT NULL,"f" revision_id {VARCHAR_64},"f" previous_revision_id {VARCHAR_64},"" revision_ancestor_ids TEXT,"f" previous_payload_hash {VARCHAR_64},"f" payload_hash {VARCHAR_64},"f" ciphertext_hash {VARCHAR_64},"" revision_written_at DATETIME,"" write_provenance VARCHAR(255),"" source_event_id VARCHAR(128),"" conflict_policy VARCHAR(32),"" payload BLOB NOT NULL,"" quarantined_at DATETIME NOT NULL"")",),)
[docs]defcoerce_raw_bytes(value:object)->bytes:"""Coerce SQLite BLOB/TEXT return values into bytes."""ifisinstance(value,bytes|bytearray|memoryview):returnbytes(value)ifisinstance(value,str):returnvalue.encode(UTF_8_ENCODING)raiseStorageValidationError(context={"value_type":type(value).__name__},translated_message="errors.integrity.integrity_storage_secure_object_raw_bytes",)
[docs]defbuild_revision_ancestor_ids(previous_revision_id:str|None,previous_revision_ancestor_ids:tuple[str,...],)->tuple[str,...]:"""Prepend the direct parent revision to the ancestry chain."""ifprevious_revision_idisNone:return()return(previous_revision_id,*tuple(itemforiteminprevious_revision_ancestor_idsifitem!=previous_revision_id),)
[docs]defdatabase_bytes(value:object)->bytes:"""Normalise SQLite bytes-ish values returned through text queries."""ifisinstance(value,bytes|bytearray|memoryview):returnbytes(value)ifisinstance(value,str):returnvalue.encode(UTF_8_ENCODING)raiseTypeError(f"database_bytes: expected bytes-like or str, found {type(value).__name__}")
[docs]defquarantine_timestamp()->str:"""Return the timestamp format used by secure-object quarantine rows."""return_utc_now().isoformat()