Vydané zdroje
Stáhnout zdroje ZIP
CH-J Tools
Procházejte adresáře a soubory konkrétního vydání aplikace.
CH-J / Server Manager
872 souborů
core-20261030T220507Z-61e4558d889f
Přidáno: · Sestaveno:
1
//! Vault lock controller (port of `security/vaultLockController.js`): inactivity2
//! auto-lock, optional lock on focus loss, and the ordered lock sequence (key wiped3
//! synchronously first, then module windows, diagnostics and SSH sessions).5
use crate::core::app::Core;6
use crate::core::vault::VaultStatus;7
use parking_lot::Mutex;8
use serde_json::{json, Value};9
use std::time::{Duration, Instant};11
pub struct LockController {12
last_activity: Mutex<Instant>,13
locking: tokio::sync::Mutex<()>,14
}16
impl Default for LockController {17
fn default() -> Self {18
Self { last_activity: Mutex::new(Instant::now()), locking: tokio::sync::Mutex::new(()) }19
}20
}22
impl LockController {23
pub fn activity(&self) {24
*self.last_activity.lock() = Instant::now();25
}27
pub fn idle_for(&self) -> Duration {28
self.last_activity.lock().elapsed()29
}31
pub async fn check(&self, core: &Core) {32
let minutes = core.config.get()["security"]["autoLockMinutes"].as_u64().unwrap_or(0);33
if minutes > 0 && core.vault.is_unlocked() && self.idle_for() >= Duration::from_secs(minutes * 60) {34
self.lock(core, "inactivity").await;35
}36
}38
pub async fn lost_focus(&self, core: &Core) {39
if core.config.get()["security"]["lockOnBlur"].as_bool() == Some(true) && core.vault.is_unlocked() {40
self.lock(core, "focus-loss").await;41
}42
}44
pub async fn lock(&self, core: &Core, reason: &str) -> VaultStatus {45
let _guard = self.locking.lock().await;46
core.services.biometrics.cancel();47
if reason != "manual" {48
core.services.biometrics.arm_auto_unlock();49
}50
// Clear the key synchronously, before waiting for potentially slow SSH cleanup.51
let status = core.vault.lock();52
core.services.modules.close_all(core);53
core.services.diagnostics.stop_all();54
core.services.sessions.disconnect_all(&format!("vault-{reason}")).await;55
let mut payload: Value = serde_json::to_value(&status).unwrap_or_else(|_| json!({}));56
payload["reason"] = Value::String(reason.to_string());57
core.emit_main("vault:locked", payload);58
status59
}60
}SHA-256
f1c8d4e9ccf09b9a9a88ebf2807a7a5d5a425dc18eea3f016c7bff072974a913CH-J Proprietary Software License 1.14 · Zdroje jsou zveřejněny pod CH-J Proprietary Software License 1.14. Jejich dostupnost nemění licenční podmínky ani neposkytuje další oprávnění.
SHA-256 archivu
77380d4805485ffa4027fbe7858b5836f197a4aa9d52358a43e2d12d018744df