1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
#![allow(clippy::unnecessary_wraps, clippy::extra_unused_type_parameters)]
//! A dummy key manager implementation.
//!
//! This key manager implementation is only used when the `keymgr` feature is disabled.
//!
//! The implementations from this module ignore their arguments. The unused arguments can't be
//! removed, because the dummy implementations must have the same API as their fully-featured
//! counterparts.
use crate::{KeystoreError, KeystoreSelector, Result};
use tor_error::HasKind;
use fs_mistrust::Mistrust;
use std::any::Any;
use std::path::Path;
/// A dummy key manager implementation.
///
/// This implementation has the same API as the key manager exposed when the `keymgr` feature is
/// enabled, except all its read operations return `None` and all its write operations will fail.
///
/// For operations that normally involve updating the state of the key manager and/or its
/// underlying storage, such as `insert` or `remove`, this `KeyMgr` always returns an error.
#[derive(Copy, Clone, Debug)]
#[non_exhaustive]
pub struct KeyMgr;
/// A dummy key store trait.
pub trait Keystore {
// TODO(gabi): Add the missing functions and impls
}
/// A dummy `ArtiNativeKeystore`.
#[non_exhaustive]
pub struct ArtiNativeKeystore;
/// A dummy `KeyType`.
#[non_exhaustive]
pub struct KeyType;
impl KeyType {
/// The file extension for a key of this type.
//
// TODO HSS: maybe this function should return an error instead
pub fn arti_extension(&self) -> &'static str {
"dummy_extension"
}
}
/// A dummy `Error` indicating that key manager support is disabled in cargo features.
#[non_exhaustive]
#[derive(Debug, Clone, thiserror::Error)]
#[error("Key manager support disabled in cargo features")]
struct Error;
impl KeystoreError for Error {}
impl HasKind for Error {
fn kind(&self) -> tor_error::ErrorKind {
tor_error::ErrorKind::Other
}
}
impl ArtiNativeKeystore {
/// Create a new [`ArtiNativeKeystore`].
#[allow(clippy::unnecessary_wraps)]
pub fn from_path_and_mistrust(_: impl AsRef<Path>, _: &Mistrust) -> Result<Self> {
Ok(Self)
}
}
impl Keystore for ArtiNativeKeystore {}
impl KeyMgr {
/// Create a new [`KeyMgr`].
pub fn new(_: impl Keystore, _: Vec<Box<dyn Keystore>>) -> Self {
Self
}
/// A dummy `get` implementation that always behaves like the requested key is not found.
///
/// This function always returns `Ok(None)`.
pub fn get<K>(&self, _: &dyn Any) -> Result<Option<K>> {
Ok(None)
}
/// A dummy `insert` implementation that always fails.
///
/// This function always returns an error.
pub fn insert<K>(&self, _: K, _: &dyn Any, _: KeystoreSelector) -> Result<()> {
Err(Box::new(Error))
}
/// A dummy `remove` implementation that always fails.
///
/// This function always returns an error.
pub fn remove<K>(&self, _: &dyn Any) -> Result<Option<()>> {
Err(Box::new(Error))
}
}
|