use bacnet_encoding::npdu::NpduAddress;
use bacnet_services::audit::AuditNotificationRequest;
use bacnet_transport::port::TransportProvenance;
use bacnet_types::MacAddr;
use bacnet_types::primitives::ObjectIdentifier;
pub const MAX_AUDIT_NOTIFICATION_BYTES: usize = 64 * 1024;
pub const MAX_AUDIT_NOTIFICATIONS: usize = 256;
#[derive(Clone, PartialEq)]
pub struct AuditNotificationAuthorizationContext {
pub source_mac: MacAddr,
pub source_network: Option<NpduAddress>,
pub provenance: TransportProvenance,
pub invoke_id: u8,
pub audit_log_sink: ObjectIdentifier,
pub request: AuditNotificationRequest,
}
impl AuditNotificationAuthorizationContext {
pub fn principal(&self) -> Option<bacnet_transport::port::ScPrincipal> {
crate::policy::originating_principal(&self.provenance, self.source_network.as_ref())
}
pub fn forwarding_peer_principal(&self) -> Option<bacnet_transport::port::ScPrincipal> {
self.provenance.principal()
}
crate::policy::certificate_accessors!();
}
#[derive(Clone, PartialEq)]
pub struct UnconfirmedAuditNotificationAuthorizationContext {
pub source_mac: MacAddr,
pub source_network: Option<NpduAddress>,
pub provenance: TransportProvenance,
pub audit_log_sink: ObjectIdentifier,
pub request: AuditNotificationRequest,
}
impl UnconfirmedAuditNotificationAuthorizationContext {
pub fn principal(&self) -> Option<bacnet_transport::port::ScPrincipal> {
crate::policy::originating_principal(&self.provenance, self.source_network.as_ref())
}
pub fn forwarding_peer_principal(&self) -> Option<bacnet_transport::port::ScPrincipal> {
self.provenance.principal()
}
crate::policy::certificate_accessors!();
}
impl std::fmt::Debug for AuditNotificationAuthorizationContext {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("AuditNotificationAuthorizationContext")
.field("source_mac_len", &self.source_mac.len())
.field(
"source_network",
&self
.source_network
.as_ref()
.map(|source| (source.network, source.mac_address.len())),
)
.field("provenance", &self.provenance)
.field("principal", &self.principal().is_some())
.field("invoke_id", &self.invoke_id)
.field("audit_log_sink", &self.audit_log_sink)
.field("notifications", &self.request.notifications.len())
.finish_non_exhaustive()
}
}
impl std::fmt::Debug for UnconfirmedAuditNotificationAuthorizationContext {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("UnconfirmedAuditNotificationAuthorizationContext")
.field("source_mac_len", &self.source_mac.len())
.field(
"source_network",
&self
.source_network
.as_ref()
.map(|source| (source.network, source.mac_address.len())),
)
.field("provenance", &self.provenance)
.field("principal", &self.principal().is_some())
.field("audit_log_sink", &self.audit_log_sink)
.field("notifications", &self.request.notifications.len())
.finish_non_exhaustive()
}
}