use aitp_core::{Aid, Timestamp};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(deny_unknown_fields)]
pub struct SessionTrustBundle {
pub version: String,
pub session_id: Uuid,
pub coordinator: Aid,
pub issued_at: Timestamp,
pub expires_at: Timestamp,
pub participants: Vec<ParticipantEntry>,
pub signature: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(deny_unknown_fields)]
pub struct ParticipantEntry {
pub aid: Aid,
pub tct: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(deny_unknown_fields)]
pub struct SessionBundleEnvelope {
pub session_bundle: SessionTrustBundle,
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn rejects_unknown_top_field() {
let v = json!({
"version": "aitp/0.2",
"session_id": "00000000-0000-4000-8000-000000000000",
"coordinator": "aid:pubkey:O2onvM62pC1io6jQKm8Nc2UyFXcd4kOmOsBIoYtZ2ik",
"issued_at": 1_700_000_000,
"expires_at": 1_700_010_000,
"participants": [],
"signature": "A".repeat(86),
"rogue": 1,
});
assert!(serde_json::from_value::<SessionTrustBundle>(v).is_err());
}
}