use crate::security::hsm::config::BitcoinNetworkType;
use crate::security::hsm::error::HsmAuditEvent as ErrorHsmAuditEvent;
use crate::security::hsm::types::HsmAuditEvent as TypesHsmAuditEvent;
use bitcoin::Network;
impl From<BitcoinNetworkType> for Network {
fn from(network_type: BitcoinNetworkType) -> Self {
match network_type {
BitcoinNetworkType::Mainnet => Network::Bitcoin,
BitcoinNetworkType::Testnet => Network::Testnet,
BitcoinNetworkType::Regtest => Network::Regtest,
BitcoinNetworkType::Signet => Network::Signet,
}
}
}
impl From<Network> for BitcoinNetworkType {
fn from(network: Network) -> Self {
match network {
Network::Bitcoin => BitcoinNetworkType::Mainnet,
Network::Testnet => BitcoinNetworkType::Testnet,
Network::Regtest => BitcoinNetworkType::Regtest,
Network::Signet => BitcoinNetworkType::Signet,
_ => BitcoinNetworkType::Testnet, }
}
}
impl From<&ErrorHsmAuditEvent> for TypesHsmAuditEvent {
fn from(event: &ErrorHsmAuditEvent) -> Self {
TypesHsmAuditEvent {
event_type: event.event_type.to_string(),
provider: format!("{:?}", event.result), status: format!("{:?}", event.result), details: event.error.clone(), operation_id: event.key_id.clone(), }
}
}
impl From<&TypesHsmAuditEvent>
for Result<ErrorHsmAuditEvent, crate::security::hsm::error::HsmError>
{
fn from(event: &TypesHsmAuditEvent) -> Self {
use crate::security::hsm::error::{AuditEventResult, AuditEventSeverity, AuditEventType};
let event_type = match event.event_type.as_str() {
"hsm.initialize" => AuditEventType::HsmInitialize,
"hsm.operation" => AuditEventType::HsmOperation,
"health_check" => AuditEventType::HealthCheck,
"key.generate" => AuditEventType::KeyGeneration,
"key.delete" => AuditEventType::KeyDeletion,
_ => AuditEventType::Custom(event.event_type.clone()),
};
let result = match event.status.as_str() {
"success" | "completed" => AuditEventResult::Success,
"failed" | "error" => AuditEventResult::Failure,
_ => AuditEventResult::Unknown,
};
let severity = if result == AuditEventResult::Success {
AuditEventSeverity::Info
} else {
AuditEventSeverity::Error
};
let mut audit_event = ErrorHsmAuditEvent::new(event_type, result, severity);
if let Some(details) = &event.details {
if let Ok(event_with_metadata) = audit_event
.clone()
.with_metadata(&serde_json::json!({ "details": details }))
{
audit_event = event_with_metadata;
}
}
if let Some(op_id) = &event.operation_id {
if let Ok(event_with_params) = audit_event
.clone()
.with_parameters(&serde_json::json!({ "operation_id": op_id }))
{
audit_event = event_with_params;
}
}
Ok(audit_event)
}
}