use super::header;
use super::header_fields;
use crate::crypto;
use crate::stream::random::InnerStreamError;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum OpenError {
#[error("Unsupported file type - not a keepass database")]
NonKeepassFormat,
#[error("Unsupported file type - not kdbx")]
UnsupportedFileFormat,
#[error("Unsupported kdbx version {0}")]
UnsupportedMajorVersion(u16),
#[error("Error reading database header - {0}")]
InvalidHeader(#[from] HeaderError),
#[error("IO error reading file - {0}")]
Io(#[from] std::io::Error),
}
#[derive(Debug, Error)]
pub enum UnlockError {
#[error("Header HMAC validation failed - wrong password or corrupt database")]
HmacInvalid,
#[error("Header start validation failed - wrong password or corrupt database")]
StartBytesInvalid,
#[error("Key generation failed - {0}")]
KeyGen(#[from] crypto::KeyGenerationError),
#[error("Decryption failed - {0}")]
Decrypt(#[from] std::io::Error),
#[error("Inner header invalid - {0}")]
InvalidInnerHeader(#[from] HeaderError),
#[error("Cannot create inner stream to read protected values - {0}")]
InnerStream(#[from] InnerStreamError),
#[error("Corrupt database. XML data is invald - {0}")]
InvalidXml(#[from] crate::errors::XmlReadError),
}
#[derive(Debug, Error)]
pub enum HeaderError {
#[error("Error reading database header - {0}")]
Io(#[from] std::io::Error),
#[error("Incompatible database - Malformed field of type {0:?}: {1}")]
MalformedField(header::OuterHeaderId, String),
#[error("Incompatible database - Missing required field of type {0:?}")]
MissingRequiredField(header::OuterHeaderId),
#[error("Incompatible database - Missing required inner field of type {0:?}")]
MissingRequiredInnerField(header::InnerHeaderId),
#[error("Incompatible database - Missing paramater {0:?} for KDF {1:?}")]
MissingKdfParam(String, header_fields::KdfAlgorithm),
#[error("Corrupt database - Header Checksum failed")]
ChecksumFailed,
#[error("Incompatible database - Unknown cipher {0:?}")]
UnknownCipher(uuid::Uuid),
}
#[derive(Debug, Error)]
pub enum WriteError {
#[error("Error reading database header - {0}")]
Io(#[from] std::io::Error),
#[error("Error serializing database to XML - {0}")]
XmlWrite(#[from] crate::xml::serialize::Error),
#[error("No key to write database with")]
MissingKeys,
#[error("Cannot create inner stream to write protected values - {0}")]
InnerStream(#[from] InnerStreamError),
}