Skip to main content

secret_service/
error.rs

1use zbus::zvariant;
2
3/// An error that could occur interacting with the secret service dbus interface.
4#[derive(Debug)]
5#[non_exhaustive]
6pub enum Error {
7    /// An error occured decrypting a response message.
8    Crypto(&'static str),
9    /// A call into the secret service provider failed.
10    Zbus(zbus::Error),
11    /// A call into a standard dbus interface failed.
12    ZbusFdo(zbus::fdo::Error),
13    /// Serializing or deserializing a dbus message failed.
14    Zvariant(zvariant::Error),
15    /// A secret service interface was locked and can't return any
16    /// information about its contents.
17    Locked,
18    /// No object was found in the object for the request.
19    NoResult,
20    /// An authorization prompt was dismissed, but is required to continue.
21    Prompt,
22    /// The connection to the secret service provider was closed while waiting
23    /// for an authorization prompt to complete, so its outcome is unknown.
24    PromptDisconnected,
25    /// A secret service provider, or a session to connect to one, was found
26    /// on the system.
27    Unavailable,
28}
29
30impl std::fmt::Display for Error {
31    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
32        match self {
33            Error::Crypto(err) => write!(f, "Crypto error: {err}"),
34            Error::Zbus(err) => write!(f, "zbus error: {err}"),
35            Error::ZbusFdo(err) => write!(f, "zbus fdo error: {err}"),
36            Error::Zvariant(err) => write!(f, "zbus serde error: {err}"),
37            Error::Locked => f.write_str("SS Error: object locked"),
38            Error::NoResult => f.write_str("SS error: result not returned from SS API"),
39            Error::Prompt => f.write_str("SS error: prompt dismissed"),
40            Error::PromptDisconnected => {
41                f.write_str("SS error: connection closed before prompt completed")
42            }
43            Error::Unavailable => f.write_str("no secret service provider or dbus session found"),
44        }
45    }
46}
47
48impl std::error::Error for Error {
49    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
50        match *self {
51            Error::Zbus(ref err) => Some(err),
52            Error::ZbusFdo(ref err) => Some(err),
53            Error::Zvariant(ref err) => Some(err),
54            _ => None,
55        }
56    }
57}
58
59impl From<zbus::Error> for Error {
60    fn from(err: zbus::Error) -> Error {
61        Error::Zbus(err)
62    }
63}
64
65impl From<zbus::fdo::Error> for Error {
66    fn from(err: zbus::fdo::Error) -> Error {
67        Error::ZbusFdo(err)
68    }
69}
70
71impl From<zvariant::Error> for Error {
72    fn from(err: zvariant::Error) -> Error {
73        Error::Zvariant(err)
74    }
75}