Skip to content

Commit

Permalink
don't use associated error for Decrypt*Backend traits
Browse files Browse the repository at this point in the history
  • Loading branch information
aawsome committed May 3, 2023
1 parent 8adc164 commit 48a26b6
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 63 deletions.
69 changes: 20 additions & 49 deletions crates/rustic_core/src/backend/decrypt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,9 @@ pub trait DecryptFullBackend: DecryptWriteBackend + DecryptReadBackend {}
impl<T: DecryptWriteBackend + DecryptReadBackend> DecryptFullBackend for T {}

pub trait DecryptReadBackend: ReadBackend {
type DecryptReadBackendError: Send + Sync + 'static + std::error::Error;
fn decrypt(&self, data: &[u8]) -> RusticResult<Vec<u8>>;

fn decrypt(&self, data: &[u8]) -> Result<Vec<u8>, Self::DecryptReadBackendError>;

fn read_encrypted_full(
&self,
tpe: FileType,
id: &Id,
) -> Result<Bytes, Self::DecryptReadBackendError>;
fn read_encrypted_full(&self, tpe: FileType, id: &Id) -> RusticResult<Bytes>;

fn read_encrypted_partial(
&self,
Expand All @@ -39,7 +33,7 @@ pub trait DecryptReadBackend: ReadBackend {
offset: u32,
length: u32,
uncompressed_length: Option<NonZeroU32>,
) -> Result<Bytes, Self::DecryptReadBackendError> {
) -> RusticResult<Bytes> {
let mut data = self.decrypt(
&self
.read_partial(tpe, id, cacheable, offset, length)
Expand All @@ -61,18 +55,15 @@ pub trait DecryptReadBackend: ReadBackend {
Ok(data.into())
}

fn get_file<F: RepoFile>(&self, id: &Id) -> Result<F, Self::DecryptReadBackendError> {
fn get_file<F: RepoFile>(&self, id: &Id) -> RusticResult<F> {
let data = self.read_encrypted_full(F::TYPE, id)?;
Ok(serde_json::from_slice(&data)?)
}

fn stream_all<F: RepoFile>(
&self,
p: ProgressBar,
) -> Result<
Receiver<Result<(Id, F), Self::DecryptReadBackendError>>,
Self::DecryptReadBackendError,
> {
) -> RusticResult<Receiver<RusticResult<(Id, F)>>> {
let list = self
.list(F::TYPE)
.map_err(|_| BackendCryptErrorKind::ListingIdsInDecryptionBackendFailed)?;
Expand All @@ -83,10 +74,7 @@ pub trait DecryptReadBackend: ReadBackend {
&self,
list: Vec<Id>,
p: ProgressBar,
) -> Result<
Receiver<Result<(Id, F), Self::DecryptReadBackendError>>,
Self::DecryptReadBackendError,
> {
) -> RusticResult<Receiver<RusticResult<(Id, F)>>> {
p.set_length(list.len() as u64);
let (tx, rx) = unbounded();

Expand All @@ -102,16 +90,11 @@ pub trait DecryptReadBackend: ReadBackend {

pub trait DecryptWriteBackend: WriteBackend {
type Key: CryptoKey;
type DecryptWriteBackendError: Send + Sync + 'static + std::error::Error;

fn key(&self) -> &Self::Key;
fn hash_write_full(
&self,
tpe: FileType,
data: &[u8],
) -> Result<Id, Self::DecryptWriteBackendError>;
fn hash_write_full(&self, tpe: FileType, data: &[u8]) -> RusticResult<Id>;

fn save_file<F: RepoFile>(&self, file: &F) -> Result<Id, Self::DecryptWriteBackendError> {
fn save_file<F: RepoFile>(&self, file: &F) -> RusticResult<Id> {
let data = serde_json::to_vec(file)?;
self.hash_write_full(F::TYPE, &data)
}
Expand All @@ -120,14 +103,13 @@ pub trait DecryptWriteBackend: WriteBackend {
&self,
list: I,
p: ProgressBar,
) -> Result<(), Self::DecryptWriteBackendError> {
) -> RusticResult<()> {
p.set_length(list.len() as u64);
list.par_bridge()
.try_for_each(|file| -> Result<_, Self::DecryptWriteBackendError> {
self.save_file(file)?;
p.inc(1);
Ok(())
})?;
list.par_bridge().try_for_each(|file| -> RusticResult<_> {
self.save_file(file)?;
p.inc(1);
Ok(())
})?;
p.finish();
Ok(())
}
Expand All @@ -138,7 +120,7 @@ pub trait DecryptWriteBackend: WriteBackend {
cacheable: bool,
list: I,
p: ProgressBar,
) -> Result<(), Self::DecryptWriteBackendError> {
) -> RusticResult<()> {
p.set_length(list.len() as u64);
list.par_bridge().try_for_each(|id| -> RusticResult<_> {
self.remove(tpe, id, cacheable).unwrap();
Expand Down Expand Up @@ -172,17 +154,12 @@ impl<R: ReadBackend, C: CryptoKey> DecryptBackend<R, C> {

impl<R: WriteBackend, C: CryptoKey> DecryptWriteBackend for DecryptBackend<R, C> {
type Key = C;
type DecryptWriteBackendError = RusticError;

fn key(&self) -> &Self::Key {
&self.key
}

fn hash_write_full(
&self,
tpe: FileType,
data: &[u8],
) -> Result<Id, Self::DecryptWriteBackendError> {
fn hash_write_full(&self, tpe: FileType, data: &[u8]) -> RusticResult<Id> {
let data = match self.zstd {
Some(level) => {
let mut out = vec![2_u8];
Expand All @@ -203,20 +180,14 @@ impl<R: WriteBackend, C: CryptoKey> DecryptWriteBackend for DecryptBackend<R, C>
}

impl<R: ReadBackend, C: CryptoKey> DecryptReadBackend for DecryptBackend<R, C> {
type DecryptReadBackendError = RusticError;

fn decrypt(&self, data: &[u8]) -> Result<Vec<u8>, Self::DecryptReadBackendError> {
fn decrypt(&self, data: &[u8]) -> RusticResult<Vec<u8>> {
Ok(self
.key
.decrypt_data(data)
.map_err(|_| BackendCryptErrorKind::DecryptingFromBackendFailed)?)
}

fn read_encrypted_full(
&self,
tpe: FileType,
id: &Id,
) -> Result<Bytes, Self::DecryptReadBackendError> {
fn read_encrypted_full(&self, tpe: FileType, id: &Id) -> RusticResult<Bytes> {
let decrypted = self.decrypt(
&self
.read_full(tpe, id)
Expand All @@ -233,7 +204,7 @@ impl<R: ReadBackend, C: CryptoKey> DecryptReadBackend for DecryptBackend<R, C> {
}

impl<R: ReadBackend, C: CryptoKey> ReadBackend for DecryptBackend<R, C> {
type ReadBackendError = RusticError;
type ReadBackendError = R::ReadBackendError;

fn location(&self) -> String {
self.backend.location()
Expand Down Expand Up @@ -269,7 +240,7 @@ impl<R: ReadBackend, C: CryptoKey> ReadBackend for DecryptBackend<R, C> {
}

impl<R: WriteBackend, C: CryptoKey> WriteBackend for DecryptBackend<R, C> {
type WriteBackendError = RusticError;
type WriteBackendError = R::WriteBackendError;

fn create(&self) -> Result<(), Self::WriteBackendError> {
self.backend.create()
Expand Down
18 changes: 4 additions & 14 deletions crates/rustic_core/src/backend/dry_run.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use bytes::Bytes;
use zstd::decode_all;

use crate::RusticResult;
use crate::{error::BackendErrorKind, BackendCryptErrorKind, RusticError, RusticErrorKind};

use crate::backend::{
Expand All @@ -21,9 +22,7 @@ impl<BE: DecryptFullBackend> DryRunBackend<BE> {
}

impl<BE: DecryptFullBackend> DecryptReadBackend for DryRunBackend<BE> {
type DecryptReadBackendError = RusticError;

fn decrypt(&self, data: &[u8]) -> Result<Vec<u8>, Self::DecryptReadBackendError> {
fn decrypt(&self, data: &[u8]) -> RusticResult<Vec<u8>> {
self.be.decrypt(data).map_err(|_| {
{
RusticErrorKind::BackendCryptError(
Expand All @@ -34,11 +33,7 @@ impl<BE: DecryptFullBackend> DecryptReadBackend for DryRunBackend<BE> {
})
}

fn read_encrypted_full(
&self,
tpe: FileType,
id: &Id,
) -> Result<Bytes, Self::DecryptReadBackendError> {
fn read_encrypted_full(&self, tpe: FileType, id: &Id) -> RusticResult<Bytes> {
let decrypted = self.decrypt(&self.read_full(tpe, id).map_err(|_| {
RusticErrorKind::BackendCryptError(BackendCryptErrorKind::DecryptionInFullReadFailed)
})?)?;
Expand Down Expand Up @@ -108,17 +103,12 @@ impl<BE: DecryptFullBackend> ReadBackend for DryRunBackend<BE> {

impl<BE: DecryptFullBackend> DecryptWriteBackend for DryRunBackend<BE> {
type Key = <BE as DecryptWriteBackend>::Key;
type DecryptWriteBackendError = RusticError;

fn key(&self) -> &Self::Key {
self.be.key()
}

fn hash_write_full(
&self,
tpe: FileType,
data: &[u8],
) -> Result<Id, Self::DecryptWriteBackendError> {
fn hash_write_full(&self, tpe: FileType, data: &[u8]) -> RusticResult<Id> {
if self.dry_run {
Ok(Id::default())
} else {
Expand Down

0 comments on commit 48a26b6

Please sign in to comment.