Skip to content

Commit b7312dc

Browse files
authored
Merge pull request #76 from hug-dev/features-fix
Make sure Cargo features work
2 parents 4ed6b8a + 77bdb9d commit b7312dc

File tree

5 files changed

+63
-32
lines changed

5 files changed

+63
-32
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,6 @@ serde = { version = "1.0", features = ["derive"] }
4444
mbed-crypto-version = "mbedcrypto-2.0.0"
4545

4646
[features]
47-
default = ["mbed", "pkcs11-provider"]
48-
mbed = []
47+
default = ["mbed-crypto-provider", "pkcs11-provider"]
48+
mbed-crypto-provider = []
4949
pkcs11-provider = ["pkcs11", "serde_asn1_der"]

build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ fn main() {
165165
.expect("Cargo.toml does not contain package metadata.");
166166
let parsec_config = get_value_from_table(&metadata, CONFIG_TABLE_NAME);
167167

168-
if cfg!(feature = "mbed") {
168+
if cfg!(feature = "mbed-crypto-provider") {
169169
let mbed_config = config.mbed_config.expect(&format!(
170170
"Could not find mbed_config table in the {} file.",
171171
BUILD_CONFIG_FILE_PATH

src/bin/main.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use log::info;
1616
use parsec::utils::{ServiceBuilder, ServiceConfig};
1717
use signal_hook::{flag, SIGHUP, SIGTERM};
18-
use std::io::Error;
18+
use std::io::{Error, ErrorKind};
1919
use std::sync::{
2020
atomic::{AtomicBool, Ordering},
2121
Arc,
@@ -42,10 +42,12 @@ fn main() -> Result<(), Error> {
4242

4343
info!("Parsec started. Configuring the service...");
4444

45+
let front_end_handler = ServiceBuilder::build_service(&config)
46+
.ok_or_else(|| Error::new(ErrorKind::Other, "Parsec can not be configured."))?;
4547
// Multiple threads can not just have a reference of the front end handler because they could
4648
// outlive the run function. It is needed to give them all ownership of the front end handler
4749
// through an Arc.
48-
let mut front_end_handler = Arc::from(ServiceBuilder::build_service(&config));
50+
let mut front_end_handler = Arc::from(front_end_handler);
4951
let mut listener = ServiceBuilder::start_listener(&config.listener);
5052
let mut threadpool = ServiceBuilder::build_threadpool(config.core_settings.thread_pool_size);
5153

@@ -71,7 +73,10 @@ fn main() -> Result<(), Error> {
7173
config_file = ::std::fs::read_to_string(CONFIG_FILE_PATH)
7274
.expect("Failed to read configuration file");
7375
config = toml::from_str(&config_file).expect("Failed to parse service configuration");
74-
front_end_handler = Arc::from(ServiceBuilder::build_service(&config));
76+
front_end_handler =
77+
Arc::from(ServiceBuilder::build_service(&config).ok_or_else(|| {
78+
Error::new(ErrorKind::Other, "Parsec can not be configured.")
79+
})?);
7580
listener = ServiceBuilder::start_listener(&config.listener);
7681
threadpool = ServiceBuilder::build_threadpool(config.core_settings.thread_pool_size);
7782

src/providers/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub mod core_provider;
2020
#[cfg(feature = "pkcs11-provider")]
2121
pub mod pkcs11_provider;
2222

23-
#[cfg(feature = "mbed")]
23+
#[cfg(feature = "mbed-crypto-provider")]
2424
pub mod mbed_provider;
2525

2626
#[derive(Deserialize, Debug)]

src/utils/service_builder.rs

Lines changed: 51 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,8 @@ use crate::front::{
2424
};
2525
use crate::key_id_managers::on_disk_manager::{OnDiskKeyIDManagerBuilder, DEFAULT_MAPPINGS_PATH};
2626
use crate::key_id_managers::{KeyIdManagerConfig, KeyIdManagerType, ManageKeyIDs};
27-
use crate::providers::{
28-
core_provider::CoreProviderBuilder, mbed_provider::MbedProviderBuilder,
29-
pkcs11_provider::Pkcs11ProviderBuilder, Provide, ProviderConfig, ProviderType,
30-
};
31-
use log::{info, LevelFilter};
27+
use crate::providers::{core_provider::CoreProviderBuilder, Provide, ProviderConfig};
28+
use log::{error, LevelFilter};
3229
use parsec_interface::operations_protobuf::ProtobufConverter;
3330
use parsec_interface::requests::AuthType;
3431
use parsec_interface::requests::{BodyType, ProviderID};
@@ -40,6 +37,15 @@ use std::sync::RwLock;
4037
use std::time::Duration;
4138
use threadpool::{Builder as ThreadPoolBuilder, ThreadPool};
4239

40+
#[cfg(feature = "mbed-crypto-provider")]
41+
use crate::providers::mbed_provider::MbedProviderBuilder;
42+
#[cfg(feature = "pkcs11-provider")]
43+
use crate::providers::pkcs11_provider::Pkcs11ProviderBuilder;
44+
#[cfg(not(all(feature = "mbed-crypto-provider", feature = "pkcs11-provider")))]
45+
use log::warn;
46+
#[cfg(any(feature = "mbed-crypto-provider", feature = "pkcs11-provider"))]
47+
use {crate::providers::ProviderType, log::info};
48+
4349
const VERSION_MINOR: u8 = 0;
4450
const VERSION_MAJOR: u8 = 1;
4551

@@ -65,11 +71,16 @@ pub struct ServiceConfig {
6571
pub struct ServiceBuilder;
6672

6773
impl ServiceBuilder {
68-
pub fn build_service(config: &ServiceConfig) -> FrontEndHandler {
74+
pub fn build_service(config: &ServiceConfig) -> Option<FrontEndHandler> {
6975
let key_id_managers = build_key_id_managers(&config.key_manager);
7076

7177
let providers = build_providers(&config.provider, key_id_managers);
7278

79+
if providers.is_empty() {
80+
error!("Parsec needs at least one provider to start. No valid provider could be created from the configuration.");
81+
return None;
82+
}
83+
7384
let backend_handlers = build_backend_handlers(providers);
7485

7586
let dispatcher = DispatcherBuilder::new()
@@ -78,10 +89,12 @@ impl ServiceBuilder {
7889

7990
let simple_authenticator = Box::from(SimpleAuthenticator {});
8091

81-
FrontEndHandlerBuilder::new()
82-
.with_dispatcher(dispatcher)
83-
.with_authenticator(AuthType::Simple, simple_authenticator)
84-
.build()
92+
Some(
93+
FrontEndHandlerBuilder::new()
94+
.with_dispatcher(dispatcher)
95+
.with_authenticator(AuthType::Simple, simple_authenticator)
96+
.build(),
97+
)
8598
}
8699

87100
pub fn start_listener(config: &ListenerConfig) -> Box<dyn Listen> {
@@ -145,36 +158,41 @@ fn build_providers(
145158
) -> HashMap<ProviderID, Provider> {
146159
let mut map = HashMap::new();
147160
for config in configs {
148-
let key_id_manager = key_id_managers
149-
.get(&config.key_id_manager)
150-
.unwrap_or_else(|| {
151-
panic!(
161+
let key_id_manager = match key_id_managers.get(&config.key_id_manager) {
162+
Some(key_id_manager) => key_id_manager,
163+
None => {
164+
error!(
152165
"Key ID manager with specified name was not found ({})",
153166
config.key_id_manager
154-
)
155-
});
156-
map.insert(
157-
config.provider_type.to_provider_id(),
158-
get_provider(config, key_id_manager.clone()),
159-
);
167+
);
168+
continue;
169+
}
170+
};
171+
let provider = match get_provider(config, key_id_manager.clone()) {
172+
Some(provider) => provider,
173+
None => continue,
174+
};
175+
map.insert(config.provider_type.to_provider_id(), provider);
160176
}
161177

162178
map
163179
}
164180

165-
fn get_provider(config: &ProviderConfig, key_id_manager: KeyIdManager) -> Provider {
181+
fn get_provider(config: &ProviderConfig, key_id_manager: KeyIdManager) -> Option<Provider> {
166182
match config.provider_type {
183+
#[cfg(feature = "mbed-crypto-provider")]
167184
ProviderType::MbedProvider => {
168185
info!("Creating a Mbed Crypto Provider.");
169-
Box::from(
186+
Some(Box::from(
170187
MbedProviderBuilder::new()
171188
.with_key_id_store(key_id_manager)
172189
.build(),
173-
)
190+
))
174191
}
192+
#[cfg(feature = "pkcs11-provider")]
175193
ProviderType::Pkcs11Provider => {
176194
info!("Creating a PKCS 11 Provider.");
177-
Box::from(
195+
Some(Box::from(
178196
Pkcs11ProviderBuilder::new()
179197
.with_key_id_store(key_id_manager)
180198
.with_pkcs11_library_path(config.library_path.clone().expect(
@@ -185,7 +203,15 @@ fn get_provider(config: &ProviderConfig, key_id_manager: KeyIdManager) -> Provid
185203
))
186204
.with_user_pin(config.user_pin.clone())
187205
.build()
188-
)
206+
))
207+
}
208+
#[cfg(not(all(feature = "mbed-crypto-provider", feature = "pkcs11-provider")))]
209+
_ => {
210+
warn!(
211+
"Provider \"{:?}\" chosen in the configuration was not compiled in Parsec binary.",
212+
config.provider_type
213+
);
214+
None
189215
}
190216
}
191217
}

0 commit comments

Comments
 (0)