Skip to content

Commit

Permalink
Tidy error variants.
Browse files Browse the repository at this point in the history
  • Loading branch information
tmpfs committed Feb 5, 2025
1 parent 032e7ee commit 98afcc1
Show file tree
Hide file tree
Showing 14 changed files with 76 additions and 53 deletions.
9 changes: 7 additions & 2 deletions crates/account/src/error.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//! Errors generated by the account library.
use sos_core::{ErrorExt, VaultId};
use sos_core::{AuthenticationError, ErrorExt, VaultId};
use std::path::PathBuf;
use thiserror::Error;

Expand Down Expand Up @@ -174,6 +174,11 @@ impl ErrorExt for Error {
}

fn is_permission_denied(&self) -> bool {
matches!(self, Error::Vault(sos_vault::Error::PassphraseVerification))
matches!(
self,
Error::Vault(sos_vault::Error::Authentication(
AuthenticationError::PasswordVerification
))
)
}
}
8 changes: 4 additions & 4 deletions crates/account/src/local_account.rs
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ impl LocalAccount {
.storage
.folders()
.get(folder.id())
.ok_or(StorageError::CacheNotAvailable(*folder.id()))?
.ok_or(StorageError::FolderNotFound(*folder.id()))?
.commit_state()
.await?;

Expand Down Expand Up @@ -760,7 +760,7 @@ impl Account for LocalAccount {
.storage
.folders()
.get(folder_id)
.ok_or(StorageError::CacheNotAvailable(*folder_id))?
.ok_or(StorageError::FolderNotFound(*folder_id))?
.clone())
}

Expand Down Expand Up @@ -1215,7 +1215,7 @@ impl Account for LocalAccount {
async fn root_commit(&self, summary: &Summary) -> Result<CommitHash> {
let folder =
self.storage.folders().get(summary.id()).ok_or_else(|| {
StorageError::CacheNotAvailable(*summary.id())
StorageError::FolderNotFound(*summary.id())
})?;
let event_log = folder.event_log();
let log_file = event_log.read().await;
Expand Down Expand Up @@ -1339,7 +1339,7 @@ impl Account for LocalAccount {

let folder =
self.storage.folders().get(summary.id()).ok_or_else(|| {
StorageError::CacheNotAvailable(*summary.id())
StorageError::FolderNotFound(*summary.id())
})?;

let event_log = folder.event_log();
Expand Down
16 changes: 13 additions & 3 deletions crates/core/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ pub enum Error {
#[error(transparent)]
Io(#[from] std::io::Error),

/// Authentication errors.
#[error(transparent)]
Authentication(#[from] AuthenticationError),

/// Error generated by the JSON library.
#[error(transparent)]
Json(#[from] serde_json::Error),
Expand Down Expand Up @@ -151,13 +155,13 @@ pub trait ErrorExt {
fn is_permission_denied(&self) -> bool;
}

/// Generic storage error shared between the client and server.
/// Storage error shared between the client and server.
#[derive(Debug, Error)]
pub enum StorageError {
/// Error generated attempting to access a folder
/// that is not available in-memory.
#[error("cache not available for {0}")]
CacheNotAvailable(VaultId),
#[error("folder not found '{0}'")]
FolderNotFound(VaultId),
}

/// Authentication errors.
Expand All @@ -167,4 +171,10 @@ pub enum AuthenticationError {
/// authenticated when authentication is required.
#[error("account not authenticated, sign in required")]
NotAuthenticated,

/// Error generated when attempting to verify a password fails.
///
/// This can happen when unlocking a vault or verifying a password.
#[error("password verification failed")]
PasswordVerification,
}
11 changes: 8 additions & 3 deletions crates/net/src/error.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//! Error type for the client module.
use sos_core::Origin;
//! Error type for network accounts.
use sos_core::{AuthenticationError, Origin};
use sos_core::{ErrorExt, VaultId};
use sos_protocol::{transfer::CancelReason, AsConflict, ConflictError};
use std::error::Error as StdError;
Expand Down Expand Up @@ -160,7 +160,12 @@ impl ErrorExt for Error {
}

fn is_permission_denied(&self) -> bool {
matches!(self, Error::Vault(sos_vault::Error::PassphraseVerification))
matches!(
self,
Error::Vault(sos_vault::Error::Authentication(
AuthenticationError::PasswordVerification
))
)
}
}

Expand Down
2 changes: 1 addition & 1 deletion crates/protocol/src/sync/primitives.rs
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ impl SyncComparison {
for (id, folder) in &self.folders {
let commit_state =
self.remote_status.folders.get(id).ok_or(
sos_backend::StorageError::CacheNotAvailable(*id),
sos_backend::StorageError::FolderNotFound(*id),
)?;

match folder {
Expand Down
2 changes: 1 addition & 1 deletion crates/server/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ impl Error {
Self::Forbidden => StatusCode::FORBIDDEN,
Self::Conflict => StatusCode::CONFLICT,
Self::BackendStorage(
sos_backend::StorageError::CacheNotAvailable(_),
sos_backend::StorageError::FolderNotFound(_),
) => StatusCode::NOT_FOUND,
_ => StatusCode::INTERNAL_SERVER_ERROR,
}
Expand Down
1 change: 1 addition & 0 deletions crates/storage/client/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ audit = ["sos-audit", "sos-backend/audit"]
files = [
"sos-external-files",
"sos-sync/files",
"sos-reducers/files",
"dep:tokio-util",
"dep:age",
"dep:binary-stream",
Expand Down
34 changes: 17 additions & 17 deletions crates/storage/client/src/filesystem/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -611,7 +611,7 @@ impl ClientFileSystemStorage {
let folder = self
.folders
.get_mut(summary.id())
.ok_or(StorageError::CacheNotAvailable(*summary.id()))?;
.ok_or(StorageError::FolderNotFound(*summary.id()))?;
folder.clear().await?;
folder.apply(events.iter().collect()).await?;

Expand All @@ -623,7 +623,7 @@ impl ClientFileSystemStorage {
let folder = self
.folders
.get_mut(summary.id())
.ok_or(StorageError::CacheNotAvailable(*summary.id()))?;
.ok_or(StorageError::FolderNotFound(*summary.id()))?;
let event_log = folder.event_log();
let log_file = event_log.read().await;
Ok(FolderReducer::new()
Expand Down Expand Up @@ -682,7 +682,7 @@ impl ClientSecretStorage for ClientFileSystemStorage {
let folder = self
.folders
.get_mut(summary.id())
.ok_or(StorageError::CacheNotAvailable(*summary.id()))?;
.ok_or(StorageError::FolderNotFound(*summary.id()))?;
folder.create_secret(&secret_data).await?
};

Expand Down Expand Up @@ -734,7 +734,7 @@ impl ClientSecretStorage for ClientFileSystemStorage {
let folder = self
.folders
.get(folder_id)
.ok_or(StorageError::CacheNotAvailable(*folder_id))?;
.ok_or(StorageError::FolderNotFound(*folder_id))?;
Ok(folder.raw_secret(secret_id).await?)
}

Expand All @@ -746,7 +746,7 @@ impl ClientSecretStorage for ClientFileSystemStorage {
let folder = self
.folders
.get(summary.id())
.ok_or(StorageError::CacheNotAvailable(*summary.id()))?;
.ok_or(StorageError::FolderNotFound(*summary.id()))?;
let result = folder
.read_secret(id)
.await?
Expand Down Expand Up @@ -851,7 +851,7 @@ impl ClientSecretStorage for ClientFileSystemStorage {
let folder = self
.folders
.get_mut(summary.id())
.ok_or(StorageError::CacheNotAvailable(*summary.id()))?;
.ok_or(StorageError::FolderNotFound(*summary.id()))?;
let (_, meta, secret) = secret_data.into();
folder
.update_secret(id, meta, secret)
Expand Down Expand Up @@ -915,7 +915,7 @@ impl ClientSecretStorage for ClientFileSystemStorage {
let folder = self
.folders
.get_mut(summary.id())
.ok_or(StorageError::CacheNotAvailable(*summary.id()))?;
.ok_or(StorageError::FolderNotFound(*summary.id()))?;
folder
.delete_secret(id)
.await?
Expand Down Expand Up @@ -1106,7 +1106,7 @@ impl ClientFolderStorage for ClientFileSystemStorage {
fn open_folder(&self, folder_id: &VaultId) -> Result<ReadEvent> {
let summary = self
.find(|s| s.id() == folder_id)
.ok_or(StorageError::CacheNotAvailable(*folder_id))?;
.ok_or(StorageError::FolderNotFound(*folder_id))?;

let mut current = self.current.lock();
*current = Some(summary.clone());
Expand Down Expand Up @@ -1153,7 +1153,7 @@ impl ClientFolderStorage for ClientFileSystemStorage {
let folder = self
.folders
.get_mut(summary.id())
.ok_or(StorageError::CacheNotAvailable(*summary.id()))?;
.ok_or(StorageError::FolderNotFound(*summary.id()))?;
let event_log = folder.event_log();
let mut log_file = event_log.write().await;

Expand Down Expand Up @@ -1208,7 +1208,7 @@ impl ClientFolderStorage for ClientFileSystemStorage {
let folder = self
.folders
.get_mut(summary.id())
.ok_or(StorageError::CacheNotAvailable(*summary.id()))?;
.ok_or(StorageError::FolderNotFound(*summary.id()))?;

folder.rename_folder(name.as_ref()).await?;

Expand Down Expand Up @@ -1241,7 +1241,7 @@ impl ClientFolderStorage for ClientFileSystemStorage {
let folder = self
.folders
.get_mut(summary.id())
.ok_or(StorageError::CacheNotAvailable(*summary.id()))?;
.ok_or(StorageError::FolderNotFound(*summary.id()))?;

let event = folder.update_folder_flags(flags).await?;
let event = Event::Write(*summary.id(), event);
Expand Down Expand Up @@ -1288,7 +1288,7 @@ impl ClientFolderStorage for ClientFileSystemStorage {
if let Some(folder) = self.folders.get(summary.id()) {
Ok(folder.description().await?)
} else {
Err(StorageError::CacheNotAvailable(*summary.id()).into())
Err(StorageError::FolderNotFound(*summary.id()).into())
}
}

Expand All @@ -1300,7 +1300,7 @@ impl ClientFolderStorage for ClientFileSystemStorage {
if let Some(folder) = self.folders.get_mut(summary.id()) {
Ok(folder.set_description(description).await?)
} else {
Err(StorageError::CacheNotAvailable(*summary.id()).into())
Err(StorageError::FolderNotFound(*summary.id()).into())
}
}

Expand Down Expand Up @@ -1501,7 +1501,7 @@ impl ClientAccountStorage for ClientFileSystemStorage {
let folder = self
.folders
.get_mut(id)
.ok_or(StorageError::CacheNotAvailable(*id))?;
.ok_or(StorageError::FolderNotFound(*id))?;
folder.unlock(key).await?;
Ok(())
}
Expand All @@ -1510,7 +1510,7 @@ impl ClientAccountStorage for ClientFileSystemStorage {
let folder = self
.folders
.get_mut(id)
.ok_or(StorageError::CacheNotAvailable(*id))?;
.ok_or(StorageError::FolderNotFound(*id))?;
folder.lock().await;
Ok(())
}
Expand Down Expand Up @@ -1560,7 +1560,7 @@ impl ClientAccountStorage for ClientFileSystemStorage {
let folder = self
.folders
.get(folder_id)
.ok_or(StorageError::CacheNotAvailable(*folder_id))?;
.ok_or(StorageError::FolderNotFound(*folder_id))?;
let event_log = folder.event_log();
let log_file = event_log.read().await;
let mut records = Vec::new();
Expand Down Expand Up @@ -1591,7 +1591,7 @@ impl ClientAccountStorage for ClientFileSystemStorage {
let folder = self
.folders
.get(summary.id())
.ok_or_else(|| StorageError::CacheNotAvailable(*summary.id()))?;
.ok_or_else(|| StorageError::FolderNotFound(*summary.id()))?;
let event_log = folder.event_log();
let log_file = event_log.read().await;
Ok(log_file.tree().commit_state()?)
Expand Down
6 changes: 3 additions & 3 deletions crates/storage/client/src/filesystem/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ impl StorageEventLogs for ClientFileSystemStorage {
let folder = self
.folders
.get(id)
.ok_or(StorageError::CacheNotAvailable(*id))?;
.ok_or(StorageError::FolderNotFound(*id))?;
Ok(folder.event_log())
}
}
Expand Down Expand Up @@ -112,7 +112,7 @@ impl ForceMerge for ClientFileSystemStorage {
let folder = self
.folders
.get_mut(folder_id)
.ok_or_else(|| StorageError::CacheNotAvailable(*folder_id))?;
.ok_or_else(|| StorageError::FolderNotFound(*folder_id))?;
folder.force_merge(&diff).await?;

outcome.changes += len;
Expand Down Expand Up @@ -362,7 +362,7 @@ impl Merge for ClientFileSystemStorage {
let folder = self
.folders
.get_mut(folder_id)
.ok_or_else(|| StorageError::CacheNotAvailable(*folder_id))?;
.ok_or_else(|| StorageError::FolderNotFound(*folder_id))?;

#[cfg(feature = "search")]
{
Expand Down
4 changes: 2 additions & 2 deletions crates/storage/server/src/database/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,7 @@ impl Merge for ServerDatabaseStorage {
);

let log = self.folders.get_mut(folder_id).ok_or_else(|| {
sos_backend::StorageError::CacheNotAvailable(*folder_id)
sos_backend::StorageError::FolderNotFound(*folder_id)
})?;
let mut log = log.write().await;

Expand Down Expand Up @@ -429,7 +429,7 @@ impl StorageEventLogs for ServerDatabaseStorage {
id: &VaultId,
) -> Result<Arc<RwLock<FolderEventLog>>> {
Ok(Arc::clone(self.folders.get(id).ok_or(
sos_backend::StorageError::CacheNotAvailable(*id),
sos_backend::StorageError::FolderNotFound(*id),
)?))
}
}
Expand Down
4 changes: 2 additions & 2 deletions crates/storage/server/src/filesystem/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ impl Merge for ServerFileStorage {
);

let log = self.folders.get_mut(folder_id).ok_or_else(|| {
sos_backend::StorageError::CacheNotAvailable(*folder_id)
sos_backend::StorageError::FolderNotFound(*folder_id)
})?;
let mut log = log.write().await;

Expand Down Expand Up @@ -382,7 +382,7 @@ impl StorageEventLogs for ServerFileStorage {
id: &VaultId,
) -> Result<Arc<RwLock<FolderEventLog>>> {
Ok(Arc::clone(self.folders.get(id).ok_or(
sos_backend::StorageError::CacheNotAvailable(*id),
sos_backend::StorageError::FolderNotFound(*id),
)?))
}
}
Expand Down
16 changes: 10 additions & 6 deletions crates/vault/src/access_point.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ use sos_core::{
crypto::{AccessKey, AeadPack, KeyDerivation, PrivateKey},
decode, encode,
events::{ReadEvent, WriteEvent},
SecretId, VaultCommit, VaultEntry, VaultFlags, VaultId,
AuthenticationError, SecretId, VaultCommit, VaultEntry, VaultFlags,
VaultId,
};
use sos_vfs as vfs;
use std::path::Path;
Expand Down Expand Up @@ -345,11 +346,14 @@ where
) -> Result<VaultMeta, E> {
let private_key =
self.private_key.as_ref().ok_or(Error::VaultLocked)?;
let meta_blob = self
.vault
.decrypt(private_key, meta_aead)
.await
.map_err(|_| Error::PassphraseVerification)?;
let meta_blob =
self.vault.decrypt(private_key, meta_aead).await.map_err(
|_| {
sos_core::Error::from(
AuthenticationError::PasswordVerification,
)
},
)?;
Ok(decode(&meta_blob).await?)
}

Expand Down
Loading

0 comments on commit 98afcc1

Please sign in to comment.