Complete enroll route

This commit is contained in:
2024-07-02 22:55:51 +02:00
parent e64a444bd0
commit 01ffe085d7
8 changed files with 121 additions and 23 deletions

View File

@ -1,7 +1,17 @@
use crate::app_config::AppConfig;
use crate::devices::device::{Device, DeviceId};
use crate::devices::device::{Device, DeviceId, DeviceInfo};
use crate::utils::time_utils::time_secs;
use openssl::x509::X509Req;
use std::collections::HashMap;
#[derive(thiserror::Error, Debug)]
pub enum DevicesListError {
#[error("Enrollment failed: a device with the same ID was already registered!")]
EnrollFailedDeviceAlreadyExists,
#[error("Persist device config failed: the configuration of the device was not found!")]
PersistFailedDeviceNotFound,
}
pub struct DevicesList(HashMap<DeviceId, Device>);
impl DevicesList {
@ -33,4 +43,51 @@ impl DevicesList {
pub fn exists(&self, id: &DeviceId) -> bool {
self.0.contains_key(id)
}
/// Enroll a new device
pub fn enroll(
&mut self,
id: &DeviceId,
info: &DeviceInfo,
csr: &X509Req,
) -> anyhow::Result<()> {
if self.exists(id) {
return Err(DevicesListError::EnrollFailedDeviceAlreadyExists.into());
}
let device = Device {
id: id.clone(),
info: info.clone(),
time_create: time_secs(),
time_update: time_secs(),
name: id.0.to_string(),
description: "".to_string(),
validated: false,
enabled: false,
relays: vec![],
};
// First, write CSR
std::fs::write(AppConfig::get().device_csr_path(id), csr.to_pem()?)?;
self.0.insert(id.clone(), device);
self.persist_dev_config(id)?;
Ok(())
}
/// Persist a device configuration on the filesystem
fn persist_dev_config(&self, id: &DeviceId) -> anyhow::Result<()> {
let dev = self
.0
.get(id)
.ok_or_else(|| DevicesListError::PersistFailedDeviceNotFound)?;
std::fs::write(
AppConfig::get().device_config_path(id),
serde_json::to_string_pretty(dev)?,
)?;
Ok(())
}
}