Skip to main content

Mountain/Binary/Build/TlsCommands/
tls_check_cert_status.rs

1
2//! `tls_check_cert_status` Tauri command - parse a cached
3//! cert's `valid_until` (RFC3339), compare against now, and
4//! flag whether renewal is due (within
5//! `CertificateManager::RENEWAL_THRESHOLD_DAYS`).
6
7use std::sync::{Arc, Mutex};
8
9use tauri::{AppHandle, Manager};
10
11use crate::{
12	Binary::Build::{CertificateManager::CertificateManager, TlsCommands::CertificateStatus::CertificateStatus},
13	dev_log,
14};
15
16#[tauri::command]
17pub async fn tls_check_cert_status(app_handle:AppHandle, hostname:String) -> Result<CertificateStatus, String> {
18	dev_log!("security", "checking certificate status for {}", hostname);
19
20	let state = app_handle
21		.try_state::<Arc<Mutex<CertificateManager>>>()
22		.ok_or("Certificate manager not found")?;
23
24	let cert_manager = state.clone();
25
26	let manager = cert_manager.lock().map_err(|e| format!("Failed to acquire lock: {}", e))?;
27
28	if let Some(cert_info) = manager.get_server_cert_info(&hostname) {
29		let valid_until = chrono::DateTime::parse_from_rfc3339(&cert_info.valid_until)
30			.map_err(|e| format!("Invalid certificate expiry time: {}", e))?
31			.with_timezone(&chrono::Utc);
32
33		let now = chrono::Utc::now();
34
35		let days_until_expiry = (valid_until - now).num_days();
36
37		let needs_renewal = days_until_expiry <= CertificateManager::RENEWAL_THRESHOLD_DAYS;
38
39		Ok(CertificateStatus {
40			exists:true,
41			is_valid:now <= valid_until,
42			days_until_expiry,
43			needs_renewal,
44			valid_until:cert_info.valid_until,
45		})
46	} else {
47		Ok(CertificateStatus {
48			exists:false,
49			is_valid:false,
50			days_until_expiry:0,
51			needs_renewal:true,
52			valid_until:String::new(),
53		})
54	}
55}