Skip to content

Commit db340b2

Browse files
dbus/item: Ensure we fail with Deleted error if item was deleted
1 parent b00bbde commit db340b2

1 file changed

Lines changed: 65 additions & 9 deletions

File tree

client/src/dbus/item.rs

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -151,15 +151,19 @@ impl<'a> Item<'a> {
151151
/// * `secret` - The secret to store.
152152
#[doc(alias = "SetSecret")]
153153
pub async fn set_secret(&self, secret: impl Into<Secret>) -> Result<(), Error> {
154-
let secret = match self.algorithm {
155-
Algorithm::Plain => api::DBusSecret::new(Arc::clone(&self.session), secret),
156-
Algorithm::Encrypted => {
157-
let aes_key = self.aes_key.as_ref().unwrap();
158-
api::DBusSecret::new_encrypted(Arc::clone(&self.session), secret, aes_key)?
159-
}
160-
};
161-
self.inner.set_secret(&secret).await?;
162-
Ok(())
154+
if !self.is_available().await {
155+
Err(Error::Deleted)
156+
} else {
157+
let secret = match self.algorithm {
158+
Algorithm::Plain => api::DBusSecret::new(Arc::clone(&self.session), secret),
159+
Algorithm::Encrypted => {
160+
let aes_key = self.aes_key.as_ref().unwrap();
161+
api::DBusSecret::new_encrypted(Arc::clone(&self.session), secret, aes_key)?
162+
}
163+
};
164+
self.inner.set_secret(&secret).await?;
165+
Ok(())
166+
}
163167
}
164168

165169
/// Unlock the item.
@@ -367,4 +371,56 @@ mod tests {
367371

368372
item.delete(None).await.unwrap();
369373
}
374+
375+
#[tokio::test]
376+
async fn deleted_error() {
377+
let service = Service::plain().await.unwrap();
378+
let collection = service.default_collection().await.unwrap();
379+
380+
let attributes = HashMap::from([("test", "deleted-error")]);
381+
let secret = crate::Secret::text("delete test");
382+
383+
let item = collection
384+
.create_item("Delete Test", &attributes, secret, true, None)
385+
.await
386+
.unwrap();
387+
388+
// Verify item works before deletion
389+
assert!(item.label().await.is_ok());
390+
391+
// Delete the item
392+
item.delete(None).await.unwrap();
393+
394+
// All operations should now return Error::Deleted
395+
assert!(matches!(item.label().await, Err(super::Error::Deleted)));
396+
assert!(matches!(
397+
item.set_label("New").await,
398+
Err(super::Error::Deleted)
399+
));
400+
assert!(matches!(item.secret().await, Err(super::Error::Deleted)));
401+
assert!(matches!(
402+
item.set_secret("new secret").await,
403+
Err(super::Error::Deleted)
404+
));
405+
assert!(matches!(
406+
item.attributes().await,
407+
Err(super::Error::Deleted)
408+
));
409+
assert!(matches!(
410+
item.set_attributes(&attributes).await,
411+
Err(super::Error::Deleted)
412+
));
413+
assert!(matches!(item.created().await, Err(super::Error::Deleted)));
414+
assert!(matches!(item.modified().await, Err(super::Error::Deleted)));
415+
assert!(matches!(item.is_locked().await, Err(super::Error::Deleted)));
416+
assert!(matches!(item.lock(None).await, Err(super::Error::Deleted)));
417+
assert!(matches!(
418+
item.unlock(None).await,
419+
Err(super::Error::Deleted)
420+
));
421+
assert!(matches!(
422+
item.delete(None).await,
423+
Err(super::Error::Deleted)
424+
));
425+
}
370426
}

0 commit comments

Comments
 (0)