Skip to content

Commit 9231ef5

Browse files
committed
Update refactor to remove storage access.
1 parent 21f7b13 commit 9231ef5

File tree

10 files changed

+93
-64
lines changed

10 files changed

+93
-64
lines changed

crates/account/src/account.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ use sos_core::{
1717
device::{DevicePublicKey, TrustedDevice},
1818
encode,
1919
events::{
20-
AccountEvent, Event, EventKind, EventLog, EventRecord, ReadEvent,
21-
WriteEvent,
20+
AccountEvent, DeviceEvent, Event, EventKind, EventLog, EventRecord,
21+
ReadEvent, WriteEvent,
2222
},
2323
AccountId, Paths, SecretId, UtcDateTime, VaultCommit, VaultId,
2424
};
@@ -283,6 +283,12 @@ pub trait Account {
283283
&self,
284284
) -> std::result::Result<DevicePublicKey, Self::Error>;
285285

286+
/// Patch the devices event log.
287+
async fn patch_devices_unchecked(
288+
&mut self,
289+
events: Vec<DeviceEvent>,
290+
) -> std::result::Result<(), Self::Error>;
291+
286292
/// Current device information.
287293
async fn current_device(
288294
&self,
@@ -770,6 +776,12 @@ pub trait Account {
770776
summary: &Summary,
771777
) -> std::result::Result<FolderDelete<Self::NetworkResult>, Self::Error>;
772778

779+
/// Forget a folder from in-memory collections.
780+
async fn forget_folder(
781+
&mut self,
782+
folder_id: &VaultId,
783+
) -> std::result::Result<bool, Self::Error>;
784+
773785
/// Try to load an avatar JPEG image for a contact.
774786
///
775787
/// Looks in the current open folder if no specified folder is given.
@@ -1671,6 +1683,13 @@ impl Account for LocalAccount {
16711683
Ok(authenticated_user.identity()?.device().public_key())
16721684
}
16731685

1686+
async fn patch_devices_unchecked(
1687+
&mut self,
1688+
events: Vec<DeviceEvent>,
1689+
) -> Result<()> {
1690+
Ok(self.storage.patch_devices_unchecked(events).await?)
1691+
}
1692+
16741693
async fn current_device(&self) -> Result<TrustedDevice> {
16751694
let authenticated_user = self.storage.authenticated_user()?;
16761695
Ok(authenticated_user.devices()?.current_device(None))
@@ -2845,6 +2864,10 @@ impl Account for LocalAccount {
28452864
})
28462865
}
28472866

2867+
async fn forget_folder(&mut self, folder_id: &VaultId) -> Result<bool> {
2868+
Ok(self.storage.remove_folder(folder_id).await?)
2869+
}
2870+
28482871
#[cfg(feature = "contacts")]
28492872
async fn load_avatar(
28502873
&self,

crates/ipc/src/web_service/web_accounts.rs

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -310,10 +310,8 @@ where
310310
// Now the storage should have the folder so
311311
// we can access the access point and add it to
312312
// the search index
313-
let storage = account.storage().await;
314-
let storage = storage.read().await;
315313
if let Some(folder) =
316-
storage.folders().get(&folder_id)
314+
account.folder(&folder_id).await.ok()
317315
{
318316
let access_point = folder.access_point();
319317
let access_point = access_point.lock().await;
@@ -330,11 +328,7 @@ where
330328
}
331329
}
332330
ChangeRecords::Folder(folder_id, events) => {
333-
let storage = account.storage().await;
334-
let mut storage = storage.write().await;
335-
if let Some(folder) =
336-
storage.folders_mut().get_mut(&folder_id)
337-
{
331+
if let Some(folder) = account.folder(&folder_id).await.ok() {
338332
let access_point = folder.access_point();
339333
let mut access_point = access_point.lock().await;
340334

@@ -482,15 +476,13 @@ where
482476
}
483477

484478
{
485-
let accounts = accounts.read().await;
479+
let mut accounts = accounts.write().await;
486480
let account = accounts
487-
.iter()
481+
.iter_mut()
488482
.find(|a| a.account_id() == &account_id)
489483
.ok_or(FileEventError::NoAccount(account_id))?;
490484

491-
let storage = account.storage().await;
492-
let mut storage = storage.write().await;
493-
storage.remove_folder(&folder_id).await?;
485+
account.forget_folder(&folder_id).await.ok();
494486
}
495487
ChangeRecords::Folder(folder_id, vec![])
496488
} else {
@@ -500,11 +492,10 @@ where
500492
.find(|a| a.account_id() == &account_id)
501493
.ok_or(FileEventError::NoAccount(account_id))?;
502494

503-
let storage = account.storage().await;
504-
let storage = storage.read().await;
505-
let folder = storage
506-
.folders()
507-
.get(&folder_id)
495+
let folder = account
496+
.folder(&folder_id)
497+
.await
498+
.ok()
508499
.ok_or(FileEventError::NoFolder(folder_id))?;
509500

510501
let event_log = folder.event_log();
@@ -575,10 +566,8 @@ where
575566
+ Sync
576567
+ 'static,
577568
{
578-
let storage = account.storage().await;
579-
let storage = storage.read().await;
580-
581-
let account_log = storage.account_log().await?;
569+
// FIXME: update the error handling to avoid the unwrap
570+
let account_log = account.account_log().await.unwrap();
582571
let mut event_log = account_log.write().await;
583572
let commit = event_log.tree().last_commit();
584573

crates/login/src/identity_folder.rs

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
//! Login identity vault management.
1+
//! Login identity folder management.
22
//!
3-
//! Provides access to an identity vault containing
4-
//! the account signing key and delegated passwords used
5-
//! for folders managed by an account.
6-
//!
7-
//! This enables user interfaces to protect both the signing
8-
//! key and folder passwords using a single primary password.
3+
//! Provides access to an identity folder containing
4+
//! delegated passwords used to decrypt folders managed
5+
//! by an account.
96
use crate::device::{DeviceManager, DeviceSigner};
107
use crate::{Error, PrivateIdentity, Result, UrnLookup};
118
use secrecy::{ExposeSecret, SecretBox, SecretString};
@@ -593,6 +590,8 @@ impl IdentityFolder {
593590
account_id: AccountId,
594591
keeper: &AccessPoint,
595592
) -> Result<(UrnLookup, PrivateIdentity)> {
593+
println!("doing login private identity...");
594+
596595
let (index, identity_secret) =
597596
Self::lookup_identity_secrets(keeper).await?;
598597

@@ -771,15 +770,18 @@ impl IdentityFolder {
771770
) -> Result<Self> {
772771
let mut folder = Folder::new_fs(path).await?;
773772

774-
let access_point = folder.access_point();
775-
let access_point = access_point.lock().await;
776-
777-
if !access_point.vault().flags().contains(VaultFlags::IDENTITY) {
778-
return Err(Error::NotIdentityFolder);
773+
{
774+
let access_point = folder.access_point();
775+
let access_point = access_point.lock().await;
776+
if !access_point.vault().flags().contains(VaultFlags::IDENTITY) {
777+
return Err(Error::NotIdentityFolder);
778+
}
779779
}
780780

781781
folder.unlock(key).await?;
782782

783+
let access_point = folder.access_point();
784+
let access_point = access_point.lock().await;
783785
let (index, private_identity) =
784786
Self::login_private_identity(*account_id, &*access_point).await?;
785787

@@ -816,15 +818,18 @@ impl IdentityFolder {
816818
)
817819
.await?;
818820

819-
let access_point = folder.access_point();
820-
let access_point = access_point.lock().await;
821-
822-
if !access_point.vault().flags().contains(VaultFlags::IDENTITY) {
823-
return Err(Error::NotIdentityFolder);
821+
{
822+
let access_point = folder.access_point();
823+
let access_point = access_point.lock().await;
824+
if !access_point.vault().flags().contains(VaultFlags::IDENTITY) {
825+
return Err(Error::NotIdentityFolder);
826+
}
824827
}
825828

826829
folder.unlock(key).await?;
827830

831+
let access_point = folder.access_point();
832+
let access_point = access_point.lock().await;
828833
let (index, private_identity) =
829834
Self::login_private_identity(*account_id, &*access_point).await?;
830835

crates/net/src/account/network_account.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use sos_protocol::{
2525
AccountSync, DiffRequest, RemoteSync, RemoteSyncHandler, SyncClient,
2626
SyncOptions, SyncResult,
2727
};
28-
use sos_sdk::events::WriteEvent;
28+
use sos_sdk::events::{DeviceEvent, WriteEvent};
2929
use sos_sdk::UtcDateTime;
3030
use sos_sync::{CreateSet, StorageEventLogs, UpdateSet};
3131
use sos_vault::{
@@ -744,6 +744,14 @@ impl Account for NetworkAccount {
744744
Ok(account.device_public_key().await?)
745745
}
746746

747+
async fn patch_devices_unchecked(
748+
&mut self,
749+
events: Vec<DeviceEvent>,
750+
) -> Result<()> {
751+
let mut account = self.account.lock().await;
752+
Ok(account.patch_devices_unchecked(events).await?)
753+
}
754+
747755
async fn current_device(&self) -> Result<TrustedDevice> {
748756
let account = self.account.lock().await;
749757
Ok(account.current_device().await?)
@@ -1695,6 +1703,11 @@ impl Account for NetworkAccount {
16951703
Ok(result)
16961704
}
16971705

1706+
async fn forget_folder(&mut self, folder_id: &VaultId) -> Result<bool> {
1707+
let mut account = self.account.lock().await;
1708+
Ok(account.forget_folder(folder_id).await?)
1709+
}
1710+
16981711
#[cfg(feature = "contacts")]
16991712
async fn load_avatar(
17001713
&self,

crates/net/src/pairing/websocket.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use futures::{
99
use prost::bytes::Bytes;
1010
use snow::{Builder, HandshakeState, Keypair, TransportState};
1111
use sos_account::Account;
12-
use sos_client_storage::ClientDeviceStorage;
1312
use sos_core::events::DeviceEvent;
1413
use sos_core::{AccountId, Origin};
1514
use sos_protocol::{
@@ -442,9 +441,7 @@ impl<'a> OfferPairing<'a> {
442441
let events: Vec<DeviceEvent> =
443442
vec![DeviceEvent::Trust(trusted_device)];
444443
{
445-
let storage = self.account.storage().await;
446-
let mut writer = storage.write().await;
447-
writer.patch_devices_unchecked(events).await?;
444+
self.account.patch_devices_unchecked(events).await?;
448445
}
449446

450447
// Send the patch to the remote server.

crates/storage/client/src/traits.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ pub trait ClientFolderStorage {
9999
apply_event: bool,
100100
) -> Result<Vec<Event>>;
101101

102-
/// Remove a folder from the cache.
102+
/// Remove a folder from memory.
103103
async fn remove_folder(&mut self, folder_id: &VaultId) -> Result<bool>;
104104

105105
/// List the in-memory folders.

crates/web/src/linked_account.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use sos_protocol::{
2323
RemoteSyncHandler, SyncClient, SyncOptions,
2424
};
2525
use sos_sdk::{
26+
events::DeviceEvent,
2627
prelude::{
2728
AccessKey, AccountEvent, Cipher, DeviceManager, DevicePublicKey,
2829
DeviceSigner, EventRecord, KeyDerivation, Paths, PublicIdentity,
@@ -172,6 +173,14 @@ impl Account for LinkedAccount {
172173
Ok(account.device_public_key().await?)
173174
}
174175

176+
async fn patch_devices_unchecked(
177+
&mut self,
178+
events: Vec<DeviceEvent>,
179+
) -> Result<()> {
180+
let mut account = self.account.lock().await;
181+
Ok(account.patch_devices_unchecked(events).await?)
182+
}
183+
175184
async fn current_device(&self) -> Result<TrustedDevice> {
176185
let account = self.account.lock().await;
177186
Ok(account.current_device().await?)
@@ -918,6 +927,11 @@ impl Account for LinkedAccount {
918927
Ok(result)
919928
}
920929

930+
async fn forget_folder(&mut self, folder_id: &VaultId) -> Result<bool> {
931+
let mut account = self.account.lock().await;
932+
Ok(account.forget_folder(folder_id).await?)
933+
}
934+
921935
#[cfg(feature = "contacts")]
922936
async fn load_avatar(
923937
&self,

tests/integration/tests/network_account/listen_folder_delete.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,8 @@ async fn network_sync_listen_folder_delete() -> Result<()> {
7171

7272
wait_for_cond(move || wait_files.iter().all(|p| !p.exists())).await;
7373

74-
let updated_summaries: Vec<Summary> = {
75-
let storage = device1.owner.storage().await;
76-
let reader = storage.read().await;
77-
reader.list_folders().to_vec()
78-
};
74+
let updated_summaries: Vec<Summary> =
75+
device1.owner.list_folders().await?;
7976
assert_eq!(folders.len(), updated_summaries.len());
8077

8178
assert!(!vfs::try_exists(server_files.remove(0)).await?);

tests/integration/tests/network_account/send_folder_delete.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,7 @@ async fn network_sync_folder_delete() -> Result<()> {
4949
device.owner.delete_folder(&new_folder).await?;
5050
assert!(sync_result.first_error().is_none());
5151

52-
let updated_summaries: Vec<Summary> = {
53-
let storage = device.owner.storage().await;
54-
let reader = storage.read().await;
55-
reader.list_folders().to_vec()
56-
};
52+
let updated_summaries: Vec<Summary> = device.owner.list_folders().await?;
5753

5854
assert_eq!(folders.len(), updated_summaries.len());
5955

tests/utils/src/network.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,7 @@ pub async fn num_events(
212212
owner: &mut NetworkAccount,
213213
folder_id: &VaultId,
214214
) -> usize {
215-
let storage = owner.storage().await;
216-
let reader = storage.read().await;
217-
let folder = reader.folders().get(folder_id).unwrap();
215+
let folder = owner.folder(folder_id).await.unwrap();
218216
let events = folder.event_log();
219217
let events = events.read().await;
220218
events.tree().len()
@@ -234,14 +232,11 @@ pub async fn assert_local_remote_vaults_eq(
234232
owner: &mut NetworkAccount,
235233
_provider: &mut RemoteBridge,
236234
) -> Result<()> {
237-
let storage = owner.storage().await;
238-
let reader = storage.read().await;
239-
240235
// Compare vault buffers
241236
for summary in expected_summaries {
242237
tracing::debug!(id = %summary.id(), "assert_local_remote_vaults_eq");
243238

244-
let local_folder = reader.paths().vault_path(summary.id());
239+
let local_folder = owner.paths().vault_path(summary.id());
245240
let remote_folder = server_path.join("vaults").join(format!(
246241
"{}.{}",
247242
summary.id(),

0 commit comments

Comments
 (0)