proofmode 0.9.0

Capture, share, and preserve verifiable photos and videos
Documentation
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[cfg(feature = "wasm")]
use wasm_bindgen::prelude::*;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProofData {
    pub file_hash_sha256: String,
    pub metadata: HashMap<String, String>,
    pub location: Option<LocationData>,
    pub device: Option<DeviceData>,
    pub network: Option<NetworkData>,
    pub timestamps: TimestampData,
    pub signature: Option<String>,
    pub notarization: Option<NotarizationData>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
pub struct LocationData {
    pub latitude: f64,
    pub longitude: f64,
    pub altitude: Option<f64>,
    pub accuracy: Option<f64>,
    pub provider: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
pub struct DeviceData {
    pub manufacturer: String,
    pub model: String,
    pub os_version: String,
    pub device_id: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
pub struct NetworkData {
    pub network_type: String,
    pub wifi_ssid: Option<String>,
    pub cell_info: Option<CellInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
pub struct CellInfo {
    pub carrier: String,
    pub cell_id: Option<String>,
    pub lac: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimestampData {
    pub created_at: DateTime<Utc>,
    pub modified_at: Option<DateTime<Utc>>,
    pub proof_generated_at: DateTime<Utc>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NotarizationData {
    pub provider: String,
    pub timestamp: DateTime<Utc>,
    pub hash: String,
    pub proof: String,
}

#[derive(Debug, Clone)]
#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
pub struct ProofModeConfig {
    pub auto_notarize: bool,
    pub track_location: bool,
    pub track_device_id: bool,
    pub track_network: bool,
    pub add_credentials: bool,
    pub embed_c2pa: bool,
}

impl Default for ProofModeConfig {
    fn default() -> Self {
        Self {
            auto_notarize: true,
            track_location: true,
            track_device_id: false,
            track_network: true,
            add_credentials: true,
            embed_c2pa: true,
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Metadata {
    pub description: Option<String>,
    pub location: Option<String>,
    pub event_type: Option<String>,
    pub tags: Option<String>,
}

pub const PROOF_FILE_TAG: &str = ".proof.csv";
pub const PROOF_FILE_JSON_TAG: &str = ".proof.json";
pub const OPENPGP_FILE_TAG: &str = ".asc";
pub const C2PA_FILE_TAG: &str = ".c2pa";