1
//! Representations for types of required RPC connections.
2

            
3
use std::sync::Arc;
4

            
5
pub mod cookie;
6

            
7
/// A type of authentication required on an RPC connection.
8
#[derive(Clone, Debug)]
9
#[non_exhaustive]
10
pub enum RpcAuth {
11
    /// No authentication is expected on the connection:
12
    /// just being able to make the connection proves that the client is authorized.
13
    Inherent,
14
    /// RPC cookie authentication is expected on the connection.
15
    Cookie {
16
        /// A secret cookie to use for authentication.
17
        secret: RpcCookieSource,
18
        /// The address that the server is listening on,
19
        /// encoded as a string.
20
        server_address: String,
21
    },
22
}
23

            
24
/// A way to get an RPC cookie: Either in-memory, or by loading it from disk.
25
///
26
/// (We defer loading cookies when running as a client,
27
/// since clients should not actually load cookies from disk
28
/// until they have received the server's banner message.)
29
#[derive(Clone, Debug)]
30
#[non_exhaustive]
31
pub enum RpcCookieSource {
32
    /// A cookie that is already loaded.
33
    Loaded(Arc<cookie::Cookie>),
34
    /// A cookie that's stored on disk and needs to be loaded.
35
    Unloaded(cookie::CookieLocation),
36
}
37

            
38
impl RpcCookieSource {
39
    /// Try to load this cookie from disk, if it is not already loaded.
40
    pub fn load(&self) -> Result<Arc<cookie::Cookie>, cookie::CookieAccessError> {
41
        match self {
42
            RpcCookieSource::Loaded(cookie) => Ok(Arc::clone(cookie)),
43
            RpcCookieSource::Unloaded(cookie_location) => Ok(Arc::new(cookie_location.load()?)),
44
        }
45
    }
46
}