Skip to content

Commit 814c7ed

Browse files
committed
Completely remove access to client storage via accounts.
The client storage backend is now considered to be an implementation detail and callers are expected to use the functions in the Account trait.
1 parent 9231ef5 commit 814c7ed

File tree

18 files changed

+77
-105
lines changed

18 files changed

+77
-105
lines changed

crates/account/src/account.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,12 @@ pub trait Account {
289289
events: Vec<DeviceEvent>,
290290
) -> std::result::Result<(), Self::Error>;
291291

292+
/// Revoke a device.
293+
async fn revoke_device(
294+
&mut self,
295+
device_key: &DevicePublicKey,
296+
) -> std::result::Result<(), Self::Error>;
297+
292298
/// Current device information.
293299
async fn current_device(
294300
&self,
@@ -448,10 +454,6 @@ pub trait Account {
448454
&mut self,
449455
) -> std::result::Result<(), Self::Error>;
450456

451-
/// Storage provider.
452-
#[deprecated]
453-
async fn storage(&self) -> Arc<RwLock<ClientStorage>>;
454-
455457
/// Read the secret identifiers in a vault.
456458
async fn secret_ids(
457459
&self,
@@ -1690,6 +1692,13 @@ impl Account for LocalAccount {
16901692
Ok(self.storage.patch_devices_unchecked(events).await?)
16911693
}
16921694

1695+
async fn revoke_device(
1696+
&mut self,
1697+
device_key: &DevicePublicKey,
1698+
) -> Result<()> {
1699+
Ok(self.storage.revoke_device(device_key).await?)
1700+
}
1701+
16931702
async fn current_device(&self) -> Result<TrustedDevice> {
16941703
let authenticated_user = self.storage.authenticated_user()?;
16951704
Ok(authenticated_user.devices()?.current_device(None))
@@ -1988,11 +1997,6 @@ impl Account for LocalAccount {
19881997
self.storage.find_folder(vault).cloned()
19891998
}
19901999

1991-
async fn storage(&self) -> Arc<RwLock<ClientStorage>> {
1992-
todo!("restore storage getter for debug_assertions");
1993-
// self.storage.clone()
1994-
}
1995-
19962000
async fn secret_ids(&self, summary: &Summary) -> Result<Vec<SecretId>> {
19972001
let vault: Vault = self.storage.read_vault(summary.id()).await?;
19982002
Ok(vault.keys().cloned().collect())

crates/ipc/src/web_service/web_accounts.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@ use notify::{
55
use parking_lot::Mutex;
66
use serde::{Deserialize, Serialize};
77
use sos_account::{Account, AccountSwitcher};
8-
use sos_client_storage::ClientFolderStorage;
98
use sos_core::{
109
events::{AccountEvent, EventLog, WriteEvent},
1110
AccountId, ErrorExt, Paths, VaultId,
1211
};
13-
use sos_sync::{StorageEventLogs, SyncStorage};
12+
use sos_sync::SyncStorage;
1413
use sos_vault::SecretAccess;
1514
use std::{collections::HashMap, sync::Arc};
1615
use tokio::sync::{broadcast, RwLock};

crates/login/src/identity_folder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ use sos_core::{
2222
};
2323
use sos_password::diceware::generate_passphrase_words;
2424
use sos_signer::ed25519;
25+
use sos_vault::Summary;
2526
use sos_vault::{
2627
secret::{Secret, SecretId, SecretMeta, SecretRow, SecretSigner},
2728
BuilderCredentials, SecretAccess, Vault, VaultBuilder, VaultFlags,
2829
VaultId,
2930
};
30-
use sos_vault::{EncryptedEntry, Summary};
3131
use sos_vfs as vfs;
3232
use std::{
3333
path::{Path, PathBuf},

crates/net/src/account/network_account.rs

Lines changed: 36 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ use sos_account::{
99
SecretDelete, SecretInsert, SecretMove,
1010
};
1111
use sos_backend::{Folder, ServerOrigins};
12-
use sos_client_storage::{
13-
AccessOptions, ClientDeviceStorage, ClientStorage, NewFolderOptions,
14-
};
12+
use sos_client_storage::{AccessOptions, NewFolderOptions};
1513
use sos_core::{
1614
commit::{CommitHash, CommitState},
1715
crypto::{AccessKey, Cipher, KeyDerivation},
@@ -237,44 +235,6 @@ impl NetworkAccount {
237235
Ok(())
238236
}
239237

240-
/// Revoke a device.
241-
pub async fn revoke_device(
242-
&mut self,
243-
device_key: &sos_sdk::device::DevicePublicKey,
244-
) -> Result<()> {
245-
let current_device = self.current_device().await?;
246-
if current_device.public_key() == device_key {
247-
return Err(Error::RevokeDeviceSelf);
248-
}
249-
250-
// Update the local device event log
251-
{
252-
let account = self.account.lock().await;
253-
let storage = account.storage().await;
254-
let mut storage = storage.write().await;
255-
storage.revoke_device(device_key).await?;
256-
}
257-
258-
#[cfg(feature = "audit")]
259-
{
260-
let audit_event = AuditEvent::new(
261-
Default::default(),
262-
EventKind::RevokeDevice,
263-
*self.account_id(),
264-
Some(AuditData::Device(*device_key)),
265-
);
266-
append_audit_events(&[audit_event]).await?;
267-
}
268-
269-
// Send the device event logs to the remote servers
270-
if let Some(e) = self.sync().await.first_error() {
271-
tracing::error!(error = ?e);
272-
return Err(Error::RevokeDeviceSync(Box::new(e)));
273-
}
274-
275-
Ok(())
276-
}
277-
278238
/// Set the connection identifier.
279239
pub fn set_connection_id(&mut self, value: Option<String>) {
280240
self.connection_id = value;
@@ -752,6 +712,41 @@ impl Account for NetworkAccount {
752712
Ok(account.patch_devices_unchecked(events).await?)
753713
}
754714

715+
async fn revoke_device(
716+
&mut self,
717+
device_key: &DevicePublicKey,
718+
) -> Result<()> {
719+
let current_device = self.current_device().await?;
720+
if current_device.public_key() == device_key {
721+
return Err(Error::RevokeDeviceSelf);
722+
}
723+
724+
// Update the local device event log
725+
{
726+
let mut account = self.account.lock().await;
727+
account.revoke_device(device_key).await?;
728+
}
729+
730+
#[cfg(feature = "audit")]
731+
{
732+
let audit_event = AuditEvent::new(
733+
Default::default(),
734+
EventKind::RevokeDevice,
735+
*self.account_id(),
736+
Some(AuditData::Device(*device_key)),
737+
);
738+
append_audit_events(&[audit_event]).await?;
739+
}
740+
741+
// Send the device event logs to the remote servers
742+
if let Some(e) = self.sync().await.first_error() {
743+
tracing::error!(error = ?e);
744+
return Err(Error::RevokeDeviceSync(Box::new(e)));
745+
}
746+
747+
Ok(())
748+
}
749+
755750
async fn current_device(&self) -> Result<TrustedDevice> {
756751
let account = self.account.lock().await;
757752
Ok(account.current_device().await?)
@@ -1013,11 +1008,6 @@ impl Account for NetworkAccount {
10131008
account.find_folder(vault).await
10141009
}
10151010

1016-
async fn storage(&self) -> Arc<RwLock<ClientStorage>> {
1017-
let account = self.account.lock().await;
1018-
account.storage().await
1019-
}
1020-
10211011
async fn load_folders(&mut self) -> Result<Vec<Summary>> {
10221012
let mut account = self.account.lock().await;
10231013
Ok(account.load_folders().await?)

crates/security_report/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use secrecy::ExposeSecret;
44
use serde::{Deserialize, Serialize};
55
use sos_account::Account;
66
use sos_backend::AccessPoint;
7-
use sos_client_storage::ClientFolderStorage;
87
use sos_password::generator::measure_entropy;
98
use sos_vault::{
109
secret::{Secret, SecretId, SecretType},

crates/sos/src/commands/tools/authenticator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::{
66
};
77
use clap::Subcommand;
88
use sos_account::{Account, FolderCreate};
9-
use sos_client_storage::{ClientFolderStorage, NewFolderOptions};
9+
use sos_client_storage::NewFolderOptions;
1010
use sos_migrate::{export_authenticator, import_authenticator};
1111
use sos_sdk::prelude::{AccountRef, VaultFlags};
1212
use std::path::PathBuf;

crates/storage/client/src/filesystem/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use sos_vault::{
3434
Summary, Vault, VaultBuilder, VaultCommit, VaultFlags,
3535
};
3636
use sos_vfs as vfs;
37-
use std::{borrow::Cow, collections::HashMap, sync::Arc};
37+
use std::{collections::HashMap, sync::Arc};
3838
use tokio::sync::RwLock;
3939

4040
#[cfg(feature = "archive")]
@@ -1482,7 +1482,7 @@ impl ClientAccountStorage for ClientFileSystemStorage {
14821482

14831483
async fn lock(&mut self) {
14841484
for (_, folder) in self.folders.iter_mut() {
1485-
folder.lock();
1485+
folder.lock().await;
14861486
}
14871487
}
14881488

@@ -1504,7 +1504,7 @@ impl ClientAccountStorage for ClientFileSystemStorage {
15041504
.folders
15051505
.get_mut(id)
15061506
.ok_or(StorageError::CacheNotAvailable(*id))?;
1507-
folder.lock();
1507+
folder.lock().await;
15081508
Ok(())
15091509
}
15101510

crates/storage/client/src/storage.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ use sos_vault::{
3333
secret::{Secret, SecretMeta, SecretRow},
3434
FolderRef, Summary, Vault, VaultCommit, VaultFlags,
3535
};
36-
use std::collections::HashSet;
37-
use std::{borrow::Cow, collections::HashMap, sync::Arc};
36+
use std::{
37+
collections::{HashMap, HashSet},
38+
sync::Arc,
39+
};
3840
use tokio::sync::RwLock;
3941

4042
#[cfg(feature = "archive")]

crates/storage/client/src/traits.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use sos_vault::{
2323
secret::{Secret, SecretMeta, SecretRow},
2424
FolderRef, Summary, Vault,
2525
};
26-
use std::{borrow::Cow, collections::HashMap, sync::Arc};
26+
use std::{collections::HashMap, sync::Arc};
2727

2828
#[cfg(feature = "archive")]
2929
use sos_filesystem::archive::RestoreTargets;

crates/vault/src/access_point.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use sos_core::{
1111
SecretId, VaultCommit, VaultEntry, VaultFlags, VaultId,
1212
};
1313
use sos_vfs as vfs;
14-
use std::{borrow::Cow, path::Path};
14+
use std::path::Path;
1515

1616
pub type VaultMirror<E> =
1717
Box<dyn EncryptedEntry<Error = E> + Send + Sync + 'static>;

crates/web/src/linked_account.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use sos_account::{
99
SecretDelete, SecretInsert, SecretMove,
1010
};
1111
use sos_backend::{AccountEventLog, DeviceEventLog, Folder, FolderEventLog};
12-
use sos_client_storage::{AccessOptions, ClientStorage, NewFolderOptions};
12+
use sos_client_storage::{AccessOptions, NewFolderOptions};
1313
use sos_core::{
1414
commit::{CommitHash, CommitState, Comparison},
1515
events::{
@@ -181,6 +181,14 @@ impl Account for LinkedAccount {
181181
Ok(account.patch_devices_unchecked(events).await?)
182182
}
183183

184+
async fn revoke_device(
185+
&mut self,
186+
device_key: &DevicePublicKey,
187+
) -> Result<()> {
188+
let mut account = self.account.lock().await;
189+
Ok(account.revoke_device(device_key).await?)
190+
}
191+
184192
async fn current_device(&self) -> Result<TrustedDevice> {
185193
let account = self.account.lock().await;
186194
Ok(account.current_device().await?)
@@ -345,12 +353,6 @@ impl Account for LinkedAccount {
345353
Ok(account.delete_account().await?)
346354
}
347355

348-
#[cfg(debug_assertions)]
349-
async fn storage(&self) -> Arc<RwLock<ClientStorage>> {
350-
let account = self.account.lock().await;
351-
account.storage().await
352-
}
353-
354356
async fn secret_ids(&self, summary: &Summary) -> Result<Vec<SecretId>> {
355357
let account = self.account.lock().await;
356358
Ok(account.secret_ids(summary).await?)

tests/integration/tests/event_log/compact_events.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use crate::test_utils::{mock, setup, teardown};
33
use anyhow::Result;
44
use sos_account::{Account, LocalAccount};
55
use sos_backend::{AccountEventLog, FolderEventLog};
6-
use sos_client_storage::ClientFolderStorage;
76
use sos_sdk::prelude::*;
87

98
/// Tests compacting a folder event log.
@@ -61,9 +60,7 @@ async fn event_log_compact() -> Result<()> {
6160

6261
// Check the in-memory commit tree
6362
let new_root = {
64-
let storage = account.storage().await;
65-
let reader = storage.read().await;
66-
let folder = reader.folders().get(default_folder.id()).unwrap();
63+
let folder = account.folder(default_folder.id()).await?;
6764
let event_log = folder.event_log();
6865
let event_log = event_log.read().await;
6966
let tree = event_log.tree();

tests/integration/tests/network_account/listen_folder_delete.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use crate::test_utils::{simulate_device, spawn, teardown, wait_for_cond};
22
use anyhow::Result;
33
use sos_account::{Account, FolderCreate, FolderDelete};
4-
use sos_client_storage::ClientFolderStorage;
54
use sos_sdk::prelude::*;
65

76
/// Tests syncing delete folder events between two clients

tests/integration/tests/network_account/listen_folder_import.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use crate::test_utils::{
44
};
55
use anyhow::Result;
66
use sos_account::{Account, FolderCreate};
7-
use sos_client_storage::ClientFolderStorage;
87
use sos_sdk::prelude::*;
98
use sos_vault::SecretAccess;
109

@@ -44,9 +43,7 @@ async fn network_sync_listen_folder_import() -> Result<()> {
4443
// path when sync happens
4544
device1.owner.open_folder(new_folder.id()).await?;
4645
let mut vault = {
47-
let storage = device1.owner.storage().await;
48-
let reader = storage.read().await;
49-
let folder = reader.folders().get(new_folder.id()).unwrap();
46+
let folder = device1.owner.folder(new_folder.id()).await?;
5047
let access_point = folder.access_point();
5148
let access_point = access_point.lock().await;
5249
access_point.vault().clone()
@@ -89,11 +86,8 @@ async fn network_sync_listen_folder_import() -> Result<()> {
8986

9087
// Expected folders on the local account must be computed
9188
// again after creating the new folder for the assertions
92-
let expected_summaries: Vec<Summary> = {
93-
let storage = device1.owner.storage().await;
94-
let reader = storage.read().await;
95-
reader.list_folders().to_vec()
96-
};
89+
let expected_summaries: Vec<Summary> =
90+
device1.owner.list_folders().await?;
9791

9892
// Assert first device
9993
let mut bridge = device1.owner.remove_server(&origin).await?.unwrap();

tests/integration/tests/network_account/send_folder_create.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use crate::test_utils::{
44
};
55
use anyhow::Result;
66
use sos_account::{Account, FolderCreate};
7-
use sos_client_storage::ClientFolderStorage;
87
use sos_sdk::prelude::*;
98

109
/// Tests sending create folder events to a remote.
@@ -39,11 +38,7 @@ async fn network_sync_folder_create() -> Result<()> {
3938

4039
// Expected folders on the local account must be computed
4140
// again after creating the new folder for the assertions
42-
let folders: Vec<Summary> = {
43-
let storage = device.owner.storage().await;
44-
let reader = storage.read().await;
45-
reader.list_folders().to_vec()
46-
};
41+
let folders: Vec<Summary> = device.owner.list_folders().await?;
4742

4843
// Ensure we have the extra folder summary in memory
4944
assert_eq!(original_folders_len + 1, folders.len());

tests/integration/tests/network_account/send_folder_delete.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use crate::test_utils::{
44
};
55
use anyhow::Result;
66
use sos_account::{Account, FolderCreate, FolderDelete};
7-
use sos_client_storage::ClientFolderStorage;
87
use sos_core::ExternalFile;
98
use sos_sdk::prelude::*;
109

0 commit comments

Comments
 (0)