field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

commit 8f73d3c4cafce0e1ffbce2a966da1e3be475c7a4
parent 5749689f41e469bfea73e0ab78c689da193f05c5
Author: triesap <tyson@radroots.org>
Date:   Mon, 10 Aug 2026 21:59:13 +0000

mobile: expose verified media bytes to native hosts

Diffstat:
Mcore/crates/tera_ffi/src/operations.rs | 37++++++++++++++++++++++++++++++++++++-
1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/core/crates/tera_ffi/src/operations.rs b/core/crates/tera_ffi/src/operations.rs @@ -620,17 +620,34 @@ impl FfiMediaOperation { } } -#[derive(Clone, Debug, Eq, PartialEq, uniffi::Record)] +#[derive(Clone, Eq, PartialEq, uniffi::Record)] pub struct FfiVerifiedMediaArtifactRecord { pub schema_version: u16, pub operation_id: Option<String>, pub artifact_id: String, + pub bytes: Vec<u8>, pub byte_size: u64, pub media_type: String, pub width: u32, pub height: u32, } +impl std::fmt::Debug for FfiVerifiedMediaArtifactRecord { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter + .debug_struct("FfiVerifiedMediaArtifactRecord") + .field("schema_version", &self.schema_version) + .field("operation_id", &self.operation_id) + .field("artifact_id", &self.artifact_id) + .field("bytes", &"<redacted>") + .field("byte_size", &self.byte_size) + .field("media_type", &self.media_type) + .field("width", &self.width) + .field("height", &self.height) + .finish() + } +} + impl FfiVerifiedMediaArtifactRecord { pub(crate) fn from_artifact( value: Phase1LocalMediaArtifact, @@ -640,6 +657,7 @@ impl FfiVerifiedMediaArtifactRecord { schema_version: MOBILE_FFI_SCHEMA_VERSION, operation_id, artifact_id: value.artifact_id().to_hex(), + bytes: value.bytes().to_vec(), byte_size: value.byte_size(), media_type: value.media_type().to_owned(), width: value.width(), @@ -723,6 +741,23 @@ mod tests { } #[test] + fn verified_media_artifact_debug_never_exposes_renderable_bytes() { + let artifact = FfiVerifiedMediaArtifactRecord { + schema_version: MOBILE_FFI_SCHEMA_VERSION, + operation_id: None, + artifact_id: "11".repeat(32), + bytes: b"private farm image".to_vec(), + byte_size: 18, + media_type: "image/png".to_owned(), + width: 1, + height: 1, + }; + let debug = format!("{artifact:?}"); + assert!(debug.contains("<redacted>")); + assert!(!debug.contains("private farm image")); + } + + #[test] fn identity_commands_reject_fields_outside_the_selected_variant() { let error = IdentityCommand::try_from(FfiIdentityCommandRecord { schema_version: MOBILE_FFI_SCHEMA_VERSION,