Skip to content

Commit d12aeb3

Browse files
committed
Prepare to support accessing Folder via Account.
The inner AccessPoint is now wrapped in an Arc<Mutex> so that Folder can be cloned cheaply.
1 parent 41f4759 commit d12aeb3

File tree

13 files changed

+183
-142
lines changed

13 files changed

+183
-142
lines changed

crates/account/src/account.rs

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1730,20 +1730,19 @@ impl Account for LocalAccount {
17301730

17311731
async fn identity_folder_summary(&self) -> Result<Summary> {
17321732
let authenticated_user = self.storage.authenticated_user()?;
1733-
Ok(authenticated_user.identity()?.vault().summary().clone())
1733+
Ok(authenticated_user.identity()?.summary().await)
17341734
}
17351735

17361736
async fn reload_identity_folder(&mut self) -> Result<()> {
17371737
let authenticated_user = self.storage.authenticated_user_mut()?;
17381738

17391739
// Reload the vault on disc
17401740
let path = self.paths.identity_vault();
1741-
authenticated_user
1742-
.identity_mut()?
1743-
.folder
1744-
.keeper_mut()
1745-
.reload_vault(path)
1746-
.await?;
1741+
1742+
let folder = authenticated_user.identity()?.folder();
1743+
let access_point = folder.access_point();
1744+
let mut access_point = access_point.lock().await;
1745+
access_point.reload_vault(path).await?;
17471746

17481747
// Reload the event log merkle tree
17491748
// TODO: we could only load commits from HEAD here
@@ -1797,10 +1796,13 @@ impl Account for LocalAccount {
17971796
let (meta, seed, keys) = {
17981797
let authenticated_user = self.storage.authenticated_user()?;
17991798
let identity = authenticated_user.identity()?;
1800-
let input = identity.keeper();
1801-
let seed = input.vault().seed().cloned();
1802-
let meta = input.vault_meta().await?;
1803-
let keys = input.vault().keys().cloned().collect::<Vec<_>>();
1799+
let folder = identity.folder();
1800+
let access_point = folder.access_point();
1801+
let access_point = access_point.lock().await;
1802+
let seed = access_point.vault().seed().cloned();
1803+
let meta = access_point.vault_meta().await?;
1804+
let keys =
1805+
access_point.vault().keys().cloned().collect::<Vec<_>>();
18041806
(meta, seed, keys)
18051807
};
18061808

@@ -1822,10 +1824,13 @@ impl Account for LocalAccount {
18221824
{
18231825
let authenticated_user = self.storage.authenticated_user()?;
18241826
let identity = authenticated_user.identity()?;
1827+
let folder = identity.folder();
1828+
let access_point = folder.access_point();
1829+
let access_point = access_point.lock().await;
18251830

18261831
for key in keys {
18271832
let (meta, secret, _) =
1828-
identity.keeper().read_secret(&key).await?.unwrap();
1833+
access_point.read_secret(&key).await?.unwrap();
18291834
let secret_data = SecretRow::new(key, meta, secret);
18301835
output.create_secret(&secret_data).await?;
18311836
}
@@ -2390,12 +2395,8 @@ impl Account for LocalAccount {
23902395
&self,
23912396
folder_id: &VaultId,
23922397
secret_id: &SecretId,
2393-
) -> std::result::Result<Option<(VaultCommit, ReadEvent)>, Self::Error>
2394-
{
2395-
Ok(match self.storage.raw_secret(folder_id, secret_id).await? {
2396-
Some((commit, event)) => Some((commit.into_owned(), event)),
2397-
None => None,
2398-
})
2398+
) -> Result<Option<(VaultCommit, ReadEvent)>> {
2399+
Ok(self.storage.raw_secret(folder_id, secret_id).await?)
23992400
}
24002401

24012402
async fn delete_secret(

crates/backend/src/access_point.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use sos_vault::{
1111
secret::{Secret, SecretMeta, SecretRow},
1212
AccessPoint, SecretAccess, Summary, Vault, VaultMeta,
1313
};
14-
use std::borrow::Cow;
1514
use std::path::Path;
1615

1716
/// Backend storage access point.
@@ -129,7 +128,7 @@ impl SecretAccess for BackendAccessPoint {
129128
async fn raw_secret(
130129
&self,
131130
id: &SecretId,
132-
) -> Result<Option<(Cow<'_, VaultCommit>, ReadEvent)>> {
131+
) -> Result<Option<(VaultCommit, ReadEvent)>> {
133132
Ok(self.0.raw_secret(id).await?)
134133
}
135134

crates/backend/src/folder.rs

Lines changed: 49 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ use sos_vault::{
2323
VaultCommit, VaultId, VaultMeta,
2424
};
2525
use sos_vfs as vfs;
26-
use std::{borrow::Cow, path::Path, sync::Arc};
27-
use tokio::sync::RwLock;
26+
use std::{path::Path, sync::Arc};
27+
use tokio::sync::{Mutex, RwLock};
2828

2929
/// Folder is a combined vault and event log.
30+
#[derive(Clone)]
3031
pub struct Folder {
31-
pub(crate) keeper: AccessPoint,
32+
pub(crate) access_point: Arc<Mutex<AccessPoint>>,
3233
events: Arc<RwLock<FolderEventLog>>,
3334
}
3435

@@ -64,10 +65,10 @@ impl Folder {
6465
};
6566

6667
let mirror = VaultFileWriter::<Error>::new(path.as_ref());
67-
let keeper =
68+
let access_point =
6869
VaultAccessPoint::<Error>::new_mirror(vault, Box::new(mirror));
6970

70-
Ok(Self::init(AccessPoint::new(keeper), event_log))
71+
Ok(Self::init(AccessPoint::new(access_point), event_log))
7172
}
7273

7374
/// Create a new folder from a database table.
@@ -126,33 +127,29 @@ impl Folder {
126127
}
127128

128129
let mirror = VaultDatabaseWriter::<Error>::new(client, folder_id);
129-
let keeper =
130+
let access_point =
130131
VaultAccessPoint::<Error>::new_mirror(vault, Box::new(mirror));
131132

132-
Ok(Self::init(AccessPoint::new(keeper), event_log))
133+
Ok(Self::init(AccessPoint::new(access_point), event_log))
133134
}
134135

135136
/// Create a new folder.
136-
fn init(keeper: AccessPoint, events: FolderEventLog) -> Self {
137+
fn init(access_point: AccessPoint, events: FolderEventLog) -> Self {
137138
Self {
138-
keeper,
139+
access_point: Arc::new(Mutex::new(access_point)),
139140
events: Arc::new(RwLock::new(events)),
140141
}
141142
}
142143

143144
/// Folder identifier.
144-
pub fn id(&self) -> &VaultId {
145-
self.keeper.id()
145+
pub async fn id(&self) -> VaultId {
146+
let access_point = self.access_point.lock().await;
147+
*access_point.id()
146148
}
147149

148-
/// AccessPoint for this folder.
149-
pub fn keeper(&self) -> &AccessPoint {
150-
&self.keeper
151-
}
152-
153-
/// Mutable access point for this folder.
154-
pub fn keeper_mut(&mut self) -> &mut AccessPoint {
155-
&mut self.keeper
150+
/// Access point for this folder.
151+
pub fn access_point(&self) -> Arc<Mutex<AccessPoint>> {
152+
self.access_point.clone()
156153
}
157154

158155
/// Clone of the event log.
@@ -165,20 +162,23 @@ impl Folder {
165162
&mut self,
166163
key: &AccessKey,
167164
) -> crate::Result<VaultMeta> {
168-
Ok(self.keeper.unlock(key).await?)
165+
let mut access_point = self.access_point.lock().await;
166+
Ok(access_point.unlock(key).await?)
169167
}
170168

171169
/// Lock the folder.
172-
pub fn lock(&mut self) {
173-
self.keeper.lock();
170+
pub async fn lock(&mut self) {
171+
let mut access_point = self.access_point.lock().await;
172+
access_point.lock();
174173
}
175174

176175
/// Create a secret.
177176
pub async fn create_secret(
178177
&mut self,
179178
secret_data: &SecretRow,
180179
) -> crate::Result<WriteEvent> {
181-
let event = self.keeper.create_secret(secret_data).await?;
180+
let mut access_point = self.access_point.lock().await;
181+
let event = access_point.create_secret(secret_data).await?;
182182
let mut events = self.events.write().await;
183183
events.apply(vec![&event]).await?;
184184
Ok(event)
@@ -189,15 +189,17 @@ impl Folder {
189189
&self,
190190
id: &SecretId,
191191
) -> crate::Result<Option<(SecretMeta, Secret, ReadEvent)>> {
192-
Ok(self.keeper.read_secret(id).await?)
192+
let access_point = self.access_point.lock().await;
193+
Ok(access_point.read_secret(id).await?)
193194
}
194195

195196
/// Read the encrypted contents of a secret.
196197
pub async fn raw_secret(
197198
&self,
198199
id: &SecretId,
199-
) -> crate::Result<Option<(Cow<'_, VaultCommit>, ReadEvent)>> {
200-
Ok(self.keeper.raw_secret(id).await?)
200+
) -> crate::Result<Option<(VaultCommit, ReadEvent)>> {
201+
let access_point = self.access_point.lock().await;
202+
Ok(access_point.raw_secret(id).await?)
201203
}
202204

203205
/// Update a secret.
@@ -207,8 +209,9 @@ impl Folder {
207209
secret_meta: SecretMeta,
208210
secret: Secret,
209211
) -> crate::Result<Option<WriteEvent>> {
212+
let mut access_point = self.access_point.lock().await;
210213
if let Some(event) =
211-
self.keeper.update_secret(id, secret_meta, secret).await?
214+
access_point.update_secret(id, secret_meta, secret).await?
212215
{
213216
let mut events = self.events.write().await;
214217
events.apply(vec![&event]).await?;
@@ -223,7 +226,8 @@ impl Folder {
223226
&mut self,
224227
id: &SecretId,
225228
) -> Result<Option<WriteEvent>> {
226-
if let Some(event) = self.keeper.delete_secret(id).await? {
229+
let mut access_point = self.access_point.lock().await;
230+
if let Some(event) = access_point.delete_secret(id).await? {
227231
let mut events = self.events.write().await;
228232
events.apply(vec![&event]).await?;
229233
Ok(Some(event))
@@ -237,7 +241,10 @@ impl Folder {
237241
&mut self,
238242
name: impl AsRef<str>,
239243
) -> Result<WriteEvent> {
240-
self.keeper.set_vault_name(name.as_ref().to_owned()).await?;
244+
let mut access_point = self.access_point.lock().await;
245+
access_point
246+
.set_vault_name(name.as_ref().to_owned())
247+
.await?;
241248
let event = WriteEvent::SetVaultName(name.as_ref().to_owned());
242249
let mut events = self.events.write().await;
243250
events.apply(vec![&event]).await?;
@@ -249,7 +256,8 @@ impl Folder {
249256
&mut self,
250257
flags: VaultFlags,
251258
) -> Result<WriteEvent> {
252-
self.keeper.set_vault_flags(flags.clone()).await?;
259+
let mut access_point = self.access_point.lock().await;
260+
access_point.set_vault_flags(flags.clone()).await?;
253261
let event = WriteEvent::SetVaultFlags(flags);
254262
let mut events = self.events.write().await;
255263
events.apply(vec![&event]).await?;
@@ -258,7 +266,8 @@ impl Folder {
258266

259267
/// Description of this folder.
260268
pub async fn description(&self) -> Result<String> {
261-
let meta = self.keeper.vault_meta().await?;
269+
let access_point = self.access_point.lock().await;
270+
let meta = access_point.vault_meta().await?;
262271
Ok(meta.description().to_owned())
263272
}
264273

@@ -267,14 +276,18 @@ impl Folder {
267276
&mut self,
268277
description: impl AsRef<str>,
269278
) -> Result<WriteEvent> {
270-
let mut meta = self.keeper.vault_meta().await?;
279+
let mut meta = {
280+
let access_point = self.access_point.lock().await;
281+
access_point.vault_meta().await?
282+
};
271283
meta.set_description(description.as_ref().to_owned());
272284
self.set_meta(&meta).await
273285
}
274286

275287
/// Set the folder meta data.
276288
pub async fn set_meta(&mut self, meta: &VaultMeta) -> Result<WriteEvent> {
277-
let event = self.keeper.set_vault_meta(meta).await?;
289+
let mut access_point = self.access_point.lock().await;
290+
let event = access_point.set_vault_meta(meta).await?;
278291
let mut events = self.events.write().await;
279292
events.apply(vec![&event]).await?;
280293
Ok(event)
@@ -322,6 +335,8 @@ impl Folder {
322335

323336
impl From<Folder> for Vault {
324337
fn from(value: Folder) -> Self {
325-
value.keeper.into()
338+
let mutex = Arc::into_inner(value.access_point).unwrap();
339+
let access_point = mutex.into_inner();
340+
access_point.into()
326341
}
327342
}

crates/ipc/src/web_service/web_accounts.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -315,9 +315,10 @@ where
315315
if let Some(folder) =
316316
storage.folders().get(&folder_id)
317317
{
318-
let keeper = folder.keeper();
318+
let access_point = folder.access_point();
319+
let access_point = access_point.lock().await;
319320
let mut index = index.write().await;
320-
index.add_folder(keeper).await?;
321+
index.add_folder(&*access_point).await?;
321322
}
322323
}
323324
AccountEvent::DeleteFolder(_) => {
@@ -334,18 +335,20 @@ where
334335
if let Some(folder) =
335336
storage.folders_mut().get_mut(&folder_id)
336337
{
337-
let keeper = folder.keeper_mut();
338+
let access_point = folder.access_point();
339+
let mut access_point = access_point.lock().await;
338340

339341
// Must reload the vault before updating the
340342
// search index
341343
let path = paths.vault_path(folder_id);
342-
keeper.reload_vault(path).await?;
344+
access_point.reload_vault(path).await?;
343345

344346
for event in events {
345347
match event {
346348
WriteEvent::CreateSecret(secret_id, _) => {
347-
if let Some((meta, secret, _)) =
348-
keeper.read_secret(secret_id).await?
349+
if let Some((meta, secret, _)) = access_point
350+
.read_secret(secret_id)
351+
.await?
349352
{
350353
let mut index = index.write().await;
351354
index.add(
@@ -354,8 +357,9 @@ where
354357
}
355358
}
356359
WriteEvent::UpdateSecret(secret_id, _) => {
357-
if let Some((meta, secret, _)) =
358-
keeper.read_secret(secret_id).await?
360+
if let Some((meta, secret, _)) = access_point
361+
.read_secret(secret_id)
362+
.await?
359363
{
360364
let mut index = index.write().await;
361365
index.update(

0 commit comments

Comments
 (0)