use crate::{attestation::api::get_pck, node_info::errors::GetInfoError, AppState};
use axum::{extract::State, Json};
use entropy_shared::types::{HashingAlgorithm, TssPublicKeys};
use serde::{Deserialize, Serialize};
use strum::IntoEnumIterator;
#[derive(Serialize, Deserialize, PartialEq, Debug)]
pub struct VersionDetails {
pub cargo_package_version: String,
pub git_tag_commit: String,
pub build: BuildDetails,
}
impl VersionDetails {
fn new() -> Self {
Self {
cargo_package_version: env!("CARGO_PKG_VERSION").to_string(),
git_tag_commit: env!("VERGEN_GIT_DESCRIBE").to_string(),
build: BuildDetails::new(),
}
}
}
#[derive(Serialize, Deserialize, PartialEq, Debug)]
pub enum BuildDetails {
ProductionWithMeasurementValue(String),
NonProduction,
}
impl BuildDetails {
#[cfg(not(feature = "production"))]
fn new() -> Self {
BuildDetails::NonProduction
}
#[cfg(feature = "production")]
fn new() -> Self {
BuildDetails::ProductionWithMeasurementValue(
match crate::attestation::api::get_measurement_value() {
Ok(value) => hex::encode(value),
Err(error) => format!("Failed to get measurement value {:?}", error),
},
)
}
}
#[tracing::instrument]
pub async fn version() -> Json<VersionDetails> {
Json(VersionDetails::new())
}
#[tracing::instrument]
pub async fn hashes() -> Json<Vec<HashingAlgorithm>> {
let hashing_algos = HashingAlgorithm::iter().collect::<Vec<_>>();
Json(hashing_algos)
}
#[tracing::instrument(skip_all)]
pub async fn info(State(app_state): State<AppState>) -> Result<Json<TssPublicKeys>, GetInfoError> {
Ok(Json(TssPublicKeys {
ready: app_state.cache.is_ready(),
x25519_public_key: app_state.x25519_public_key(),
tss_account: app_state.subxt_account_id().0.into(),
provisioning_certification_key: get_pck(app_state.subxt_account_id())?,
}))
}