use tracing::{debug, warn};
use crate::{
DIDWebVHError, DIDWebVHState,
log_entry_state::{LogEntryState, LogEntryValidationStatus},
};
impl DIDWebVHState {
pub fn validate(&mut self) -> Result<(), DIDWebVHError> {
let mut previous_entry: Option<&LogEntryState> = None;
let mut deactivated_flag = false;
for entry in self.log_entries.iter_mut() {
match entry.verify_log_entry(previous_entry) {
Ok(()) => (),
Err(e) => {
warn!(
"There was an issue with LogEntry: {}! Reason: {e}",
entry.log_entry.version_id
);
warn!("Falling back to last known good LogEntry!");
if previous_entry.is_some() {
break;
}
return Err(DIDWebVHError::ValidationError(format!(
"No valid LogEntry found! Reason: {e}",
)));
}
}
if entry.metadata.deactivated {
deactivated_flag = true;
}
previous_entry = Some(entry);
if deactivated_flag {
break;
}
}
self.log_entries
.retain(|entry| entry.validation_status == LogEntryValidationStatus::LogEntryOnly);
if self.log_entries.is_empty() {
return Err(DIDWebVHError::ValidationError(
"No validated LogEntries exist".to_string(),
));
}
let highest_version_number = self.log_entries.last().unwrap().get_version_number();
debug!("Latest LogEntry ID = ({})", highest_version_number);
self.witness_proofs
.generate_proof_state(highest_version_number)?;
for log_entry in self.log_entries.iter_mut() {
debug!(
"Witness Proof Validating: {}",
log_entry.log_entry.version_id
);
self.witness_proofs
.validate_log_entry(log_entry, highest_version_number)?;
log_entry.validation_status = LogEntryValidationStatus::Ok;
}
Ok(())
}
}