use super::role::Role;
use super::Report;
use crate::{object, wrap, AuditOption, Client};
use failure::Error;
use std::time::Duration;
pub const DEFAULT_SETUP_KEY_ID: object::Id = 0xFFFE;
pub const DEFAULT_REPORT_OBJECT_ID: object::Id = 0xFFFE;
#[derive(Clone, Debug)]
pub struct Profile {
pub(super) setup_auth_key_id: Option<object::Id>,
pub(super) delete_setup_auth_key: bool,
pub(super) audit_option: AuditOption,
pub(super) roles: Vec<Role>,
pub(super) wrap_keys: Vec<wrap::Key>,
pub(super) report_object_id: Option<object::Id>,
pub(super) reset_device_timeout: Duration,
}
impl Default for Profile {
fn default() -> Self {
Profile {
setup_auth_key_id: Some(DEFAULT_SETUP_KEY_ID),
delete_setup_auth_key: true,
audit_option: AuditOption::Off,
roles: Vec::new(),
wrap_keys: Vec::new(),
report_object_id: Some(DEFAULT_REPORT_OBJECT_ID),
reset_device_timeout: Duration::from_secs(10),
}
}
}
impl Profile {
pub fn new() -> Self {
Self::default()
}
pub fn setup_auth_key_id(mut self, key_id: Option<object::Id>) -> Self {
self.setup_auth_key_id = key_id;
self
}
pub fn audit_option(mut self, value: AuditOption) -> Self {
self.audit_option = value;
self
}
pub fn roles<I>(mut self, roles: I) -> Self
where
I: IntoIterator<Item = Role>,
{
self.roles = roles.into_iter().collect();
self
}
pub fn wrap_keys<I>(mut self, keys: I) -> Self
where
I: IntoIterator<Item = wrap::Key>,
{
self.wrap_keys = keys.into_iter().collect();
self
}
pub fn provision(&self, client: &Client) -> Result<Report, Error> {
for role in &self.roles {
info!("installing role: {}", role.authentication_key_label);
role.create(client)?;
}
for wrap_key in &self.wrap_keys {
info!("installing wrap key: {}", &wrap_key.import_params.label);
wrap_key.create(client)?;
}
if self.audit_option != AuditOption::Off {
info!("setting force audit to: {:?}", self.audit_option);
client.set_force_audit_option(self.audit_option)?;
}
let report = Report::new(client.device_info()?.serial_number);
if let Some(report_object_id) = self.report_object_id {
info!(
"storing provisioning report in opaque object 0x{:x}",
report_object_id
);
report.store(client, report_object_id)?;
}
Ok(report)
}
}