Skip to content

Commit a5553f5

Browse files
committed
server: Stop using ServiceManager to store sessions.
Although it was easier to keep the sessions stored in ServiceManager, storing them inside the Service makes more sense. Because, the Service is responsible for handling the sessions just like the collections. Signed-off-by: Dhanuka Warusadura <dhanuka@gnome.org>
1 parent 7f8d6d9 commit a5553f5

File tree

5 files changed

+57
-22
lines changed

5 files changed

+57
-22
lines changed

server/src/error.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use std::fmt;
22

3+
use oo7::dbus::ServiceError;
4+
35
#[derive(Debug)]
46
pub enum Error {
57
// File backend error
@@ -12,6 +14,8 @@ pub enum Error {
1214
EmptyPassword,
1315
// Invalid item error
1416
InvalidItem(oo7::portal::InvalidItemError),
17+
// ServiceError
18+
Service(ServiceError),
1519
}
1620

1721
impl From<zbus::Error> for Error {
@@ -32,6 +36,12 @@ impl From<std::io::Error> for Error {
3236
}
3337
}
3438

39+
impl From<ServiceError> for Error {
40+
fn from(err: ServiceError) -> Self {
41+
Self::Service(err)
42+
}
43+
}
44+
3545
impl fmt::Display for Error {
3646
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3747
match self {
@@ -40,6 +50,7 @@ impl fmt::Display for Error {
4050
Self::IO(err) => write!(f, "IO error {err}"),
4151
Self::EmptyPassword => write!(f, "Login password can't be empty"),
4252
Self::InvalidItem(err) => write!(f, "Item cannot be decrypted {err}"),
53+
Self::Service(err) => write!(f, "Service error {err}"),
4354
}
4455
}
4556
}

server/src/item.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ impl Item {
3737
&self,
3838
session: OwnedObjectPath,
3939
) -> Result<(SecretInner,), ServiceError> {
40-
let manager = self.manager.lock().await;
40+
let service = self.manager.lock().await.service()?;
4141

42-
let Some(session) = manager.session(&session) else {
42+
let Some(session) = service.session(&session).await else {
4343
tracing::error!("The session `{}` does not exist.", session);
4444
return Err(ServiceError::NoSession(format!(
4545
"The session `{}` does not exist.",
@@ -83,9 +83,9 @@ impl Item {
8383

8484
pub async fn set_secret(&self, secret: SecretInner) -> Result<(), ServiceError> {
8585
let SecretInner(session, iv, secret, _content_type) = secret;
86-
let manager = self.manager.lock().await;
86+
let service = self.manager.lock().await.service()?;
8787

88-
let Some(session) = manager.session(&session) else {
88+
let Some(session) = service.session(&session).await else {
8989
tracing::error!("The session `{}` does not exist.", session);
9090
return Err(ServiceError::NoSession(format!(
9191
"The session `{}` does not exist.",

server/src/service.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ pub struct Service {
2727
// Properties
2828
collections: Arc<Mutex<Vec<Collection>>>,
2929
// Other attributes
30+
// sessions mapped to their corresponding object path on the bus
31+
sessions: Arc<Mutex<HashMap<OwnedObjectPath, Arc<Session>>>>,
3032
manager: Arc<Mutex<ServiceManager>>,
3133
}
3234

@@ -56,10 +58,10 @@ impl Service {
5658

5759
{
5860
let session = Arc::new(session.clone());
59-
self.manager
61+
self.sessions
6062
.lock()
6163
.await
62-
.insert_session(path.clone(), Arc::clone(&session));
64+
.insert(path.clone(), Arc::clone(&session));
6365
}
6466

6567
object_server.at(&path, session).await?;
@@ -256,9 +258,19 @@ impl Service {
256258
let object_server = connection.object_server();
257259
let service = Self {
258260
collections: Default::default(),
261+
sessions: Default::default(),
259262
manager: Arc::new(Mutex::new(ServiceManager::new(connection.clone()))),
260263
};
261264

265+
{
266+
let service_clone = Arc::new(service.clone());
267+
service
268+
.manager
269+
.lock()
270+
.await
271+
.set_service(Arc::clone(&service_clone));
272+
}
273+
262274
object_server
263275
.at(
264276
oo7::dbus::api::Service::PATH.as_deref().unwrap(),
@@ -350,4 +362,12 @@ impl Service {
350362

351363
Ok((without_prompt, with_prompt))
352364
}
365+
366+
pub async fn session(&self, path: &OwnedObjectPath) -> Option<Arc<Session>> {
367+
self.sessions.lock().await.get(path).map(Arc::clone)
368+
}
369+
370+
pub async fn remove_session(&self, path: &OwnedObjectPath) {
371+
self.sessions.lock().await.remove(path);
372+
}
353373
}

server/src/service_manager.rs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
// Secret Service Manager
22

3-
use std::{collections::HashMap, sync::Arc};
3+
use std::sync::Arc;
44

5+
use oo7::dbus::ServiceError;
56
use tokio::sync::RwLock;
6-
use zbus::zvariant::{ObjectPath, OwnedObjectPath};
7+
use zbus::zvariant::ObjectPath;
78

8-
use crate::session::Session;
9+
use crate::Service;
910

1011
#[derive(Debug)]
1112
pub struct ServiceManager {
1213
connection: zbus::Connection,
13-
// sessions mapped to their corresponding object path on the bus
14-
sessions: HashMap<OwnedObjectPath, Arc<Session>>,
14+
service: Option<Arc<Service>>,
1515
session_index: Arc<RwLock<u32>>,
1616
}
1717

1818
impl ServiceManager {
1919
pub fn new(connection: zbus::Connection) -> Self {
2020
Self {
21-
sessions: Default::default(),
21+
service: Default::default(),
2222
session_index: Default::default(),
2323
connection,
2424
}
@@ -28,22 +28,24 @@ impl ServiceManager {
2828
self.connection.object_server()
2929
}
3030

31-
pub fn session(&self, path: &OwnedObjectPath) -> Option<Arc<Session>> {
32-
self.sessions.get(path).map(Arc::clone)
33-
}
34-
35-
pub fn insert_session(&mut self, path: OwnedObjectPath, session: Arc<Session>) {
36-
self.sessions.insert(path, session);
31+
pub fn service(&self) -> Result<Arc<Service>, ServiceError> {
32+
if let Some(service) = &self.service {
33+
Ok(Arc::clone(service))
34+
} else {
35+
Err(ServiceError::ZBus(zbus::Error::FDO(Box::new(
36+
zbus::fdo::Error::Failed("Service isn't initialized yet.".to_string()),
37+
))))
38+
}
3739
}
3840

39-
pub fn remove_session(&mut self, path: &OwnedObjectPath) {
40-
self.sessions.remove(path);
41+
pub fn set_service(&mut self, service: Arc<Service>) {
42+
self.service = Some(service);
4143
}
4244

4345
pub fn signal_emitter<'a, P>(
4446
&self,
4547
path: P,
46-
) -> Result<zbus::object_server::SignalEmitter<'a>, oo7::dbus::ServiceError>
48+
) -> Result<zbus::object_server::SignalEmitter<'a>, ServiceError>
4749
where
4850
P: TryInto<ObjectPath<'a>>,
4951
P::Error: Into<zbus::Error>,

server/src/session.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ impl Session {
2121
&self,
2222
#[zbus(object_server)] object_server: &zbus::ObjectServer,
2323
) -> Result<(), ServiceError> {
24-
self.manager.lock().await.remove_session(&self.path);
24+
let service = self.manager.lock().await.service()?;
25+
26+
service.remove_session(&self.path).await;
2527
object_server.remove::<Self, _>(&self.path).await?;
2628

2729
Ok(())

0 commit comments

Comments
 (0)