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
//! Build script: Tauri ACL for every Core command and build identity.2
//!3
//! Each command gets its own `allow-<command>` permission (app manifest). Capabilities4
//! grant them per window class, so a module window cannot even reach a Core command5
//! through Tauri; the Rust Core additionally checks the calling window and the module6
//! manifest permissions at runtime (defence in depth).8
const SHARED: &[&str] = &["window_control", "window_is_maximized", "window_activity"];9
/// Registered only with the `smoke` cargo feature (test builds); absent from release handlers.10
const SMOKE: &[&str] = &["smoke_report", "smoke_snapshot"];12
const CORE: &[&str] = &[13
"core_get_info", "core_legal_open", "core_open_external", "core_config_get", "core_config_update", "core_i18n_languages",14
"core_vault_status", "core_vault_create", "core_vault_unlock", "core_vault_lock", "core_vault_reset",15
"core_biometrics_status", "core_biometrics_enable", "core_biometrics_disable", "core_biometrics_unlock",16
"core_biometrics_auto_unlock", "core_biometrics_authenticate",17
"core_profiles_list", "core_profiles_save", "core_profiles_delete", "core_profiles_select_private_key",18
"core_profiles_export", "core_profiles_preview_import", "core_profiles_commit_import", "core_profiles_cancel_import",19
"core_availability_list", "core_availability_refresh",20
"core_ssh_list", "core_ssh_connect", "core_ssh_trust_host_key", "core_ssh_disconnect", "core_ssh_resize", "core_ssh_input",21
"core_diagnostics_resolve", "core_diagnostics_start", "core_diagnostics_cancel", "core_diagnostics_get",22
"core_diagnostics_history", "core_diagnostics_remove_history", "core_diagnostics_export", "core_diagnostics_copy",23
"core_diagnostics_import",24
"core_updates_get_state", "core_updates_check", "core_updates_select", "core_updates_download", "core_updates_install",25
"core_updates_reveal",26
"core_modules_list", "core_modules_get_state", "core_modules_check_catalog", "core_modules_install",27
"core_modules_uninstall", "core_modules_open",28
];30
const MODULE: &[&str] = &[31
"module_get_info", "module_ui_get_language", "module_close", "module_window_minimize", "module_sessions_list",32
"module_system_metrics", "module_system_virtual_memory", "module_system_manage_virtual_memory",33
"module_disks_inspect", "module_disks_smart", "module_disks_plan", "module_disks_auto_expand", "module_disks_cancel_plan",34
"module_disks_apply", "module_disks_jobs", "module_disks_job_status",35
"module_keys_generate", "module_keys_save", "module_keys_password", "module_keys_copy_password", "module_logs_read",36
"module_users_list", "module_users_manage", "module_users_privileges", "module_users_inventory", "module_users_detail",37
"module_users_keys", "module_users_ssh_policy",38
"module_nginx_inspect", "module_nginx_read_config", "module_nginx_dump_config", "module_nginx_test_config",39
"module_nginx_save_config", "module_nginx_reload",40
"module_files_list", "module_files_privileges", "module_files_read_text", "module_files_write_text", "module_files_save_text",41
"module_files_list_recovery", "module_files_read_recovery", "module_files_cleanup_recovery", "module_files_close_text",42
"module_files_create_file", "module_files_mkdir", "module_files_rename", "module_files_remove", "module_files_remove_many",43
"module_files_upload", "module_files_download", "module_files_download_many", "module_files_download_archive",44
"module_transfers_list", "module_transfers_plan_upload", "module_transfers_plan_download", "module_transfers_start",45
"module_transfers_pause", "module_transfers_resume", "module_transfers_retry", "module_transfers_cancel",46
"module_transfers_remove", "module_transfers_settings", "module_transfers_plan_copy",47
"module_local_places", "module_local_list", "module_local_mkdir", "module_local_create_file", "module_local_rename", "module_local_remove",48
"module_hashing_algorithms", "module_hashing_select_files", "module_hashing_select_directory", "module_hashing_select_manifest",49
"module_hashing_select_manifest_destination", "module_hashing_start", "module_hashing_verify", "module_hashing_compare",50
"module_hashing_generate_manifest", "module_hashing_verify_manifest", "module_hashing_export_results",51
"module_hashing_copy_result", "module_hashing_status", "module_hashing_cancel",52
];54
const LICENSE: &[&str] = &["license_read", "license_show", "license_accept", "license_decline"];56
fn permission(command: &str) -> String {57
format!("\"allow-{}\"", command.replace('_', "-"))58
}60
fn capability(identifier: &str, description: &str, windows: &[&str], commands: &[&[&str]]) -> String {61
let mut permissions: Vec<String> = vec!["\"core:event:allow-listen\"".into(), "\"core:event:allow-unlisten\"".into()];62
for group in commands {63
permissions.extend(group.iter().map(|c| permission(c)));64
}65
format!(66
"{{\n \"identifier\": \"{identifier}\",\n \"description\": \"{description} (generated by build.rs, do not edit)\",\n \"local\": true,\n \"windows\": [{}],\n \"permissions\": [\n {}\n ]\n}}\n",67
windows.iter().map(|w| format!("\"{w}\"")).collect::<Vec<_>>().join(", "),68
permissions.join(",\n ")69
)70
}72
fn write_if_changed(path: &std::path::Path, content: &str) {73
if std::fs::read_to_string(path).ok().as_deref() != Some(content) {74
std::fs::write(path, content).expect("write capability");75
}76
}78
/// UTC timestamp without external crates (YYYY-MM-DDTHH:MM:SS.000Z).79
fn utc_now() -> String {80
let secs = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).map(|d| d.as_secs()).unwrap_or(0) as i64;81
let days = secs.div_euclid(86_400);82
let rem = secs.rem_euclid(86_400);83
let (h, m, s) = (rem / 3600, (rem % 3600) / 60, rem % 60);84
let z = days + 719_468;85
let era = z.div_euclid(146_097);86
let doe = z - era * 146_097;87
let yoe = (doe - doe / 1460 + doe / 36_524 - doe / 146_096) / 365;88
let doy = doe - (365 * yoe + yoe / 4 - yoe / 100);89
let mp = (5 * doy + 2) / 153;90
let d = doy - (153 * mp + 2) / 5 + 1;91
let mo = if mp < 10 { mp + 3 } else { mp - 9 };92
let y = yoe + era * 400 + if mo <= 2 { 1 } else { 0 };93
format!("{y:04}-{mo:02}-{d:02}T{h:02}:{m:02}:{s:02}.000Z")94
}96
fn stamp_build_identity() {97
println!("cargo:rerun-if-env-changed=CHJ_BUILD_ID");98
let built_at = utc_now();99
let build_id = match std::env::var("CHJ_BUILD_ID") {100
_ if std::env::var("PROFILE").as_deref() != Ok("release") => "core-development-build".to_string(),101
Ok(id) => {102
if id.len() < 8 || id.len() > 128 || !id.chars().all(|c| c.is_ascii_alphanumeric() || "._-".contains(c)) {103
panic!("CHJ_BUILD_ID must be 8-128 characters of [A-Za-z0-9._-]");104
}105
id106
}107
Err(_) if std::env::var("PROFILE").as_deref() == Ok("release") => {108
let nanos = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).expect("system clock").as_nanos();109
format!("release-{nanos}-{}", std::process::id())110
}111
Err(_) => "core-development-build".to_string(),112
};113
{114
let resources = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("resources");115
if std::env::var("PROFILE").as_deref() != Ok("release") {116
// tauri-build requires the bundled directory; only release preparation fills it with the helper.117
for platform in ["darwin-arm64", "linux-x64", "win32-x64"] {118
std::fs::create_dir_all(resources.join("biometrics").join(platform)).expect("biometrics resource directory");119
}120
write_if_changed(&resources.join("release-inventory.json"), "{\"buildId\":\"core-development-build\",\"files\":{}}\n");121
}122
let stamp = format!("{{\n \"version\": \"{}\",\n \"buildId\": \"{build_id}\"\n}}\n", env!("CARGO_PKG_VERSION"));123
write_if_changed(&resources.join("build-info.json"), &stamp);124
}125
println!("cargo:rustc-env=CHJ_BUILD_ID={build_id}");126
println!("cargo:rustc-env=CHJ_BUILT_AT={built_at}");127
}129
fn main() {130
let dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("capabilities");131
std::fs::create_dir_all(&dir).expect("capabilities dir");132
write_if_changed(&dir.join("main.json"), &capability("main-window", "Main window: Core API", &["main"], &[CORE, SHARED, SMOKE]));133
write_if_changed(&dir.join("modules.json"), &capability("module-windows", "Module windows: public Module API only", &["module-*"], &[MODULE, SHARED, SMOKE]));134
write_if_changed(&dir.join("license.json"), &capability("license-window", "License window: license API only", &["license"], &[LICENSE, SHARED, SMOKE]));135
stamp_build_identity();136
for bridge in ["core-bridge.js", "module-bridge.js", "license-bridge.js"] {137
println!("cargo:rerun-if-changed=bridges/{bridge}");138
}139
let all: &'static [&'static str] = Box::leak(SHARED.iter().chain(SMOKE).chain(CORE).chain(MODULE).chain(LICENSE).copied().collect::<Vec<_>>().into_boxed_slice());140
tauri_build::try_build(tauri_build::Attributes::new().app_manifest(tauri_build::AppManifest::new().commands(all)))141
.expect("failed to run tauri-build");142
}SHA-256
accb91ce5ea94926fbaf08ec121ddd4cc44963e3aa865f76226b2b3a8465b102CH-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