CH-J ToolsSerververwaltung über SSH
Menü
Veröffentlichte Quellen

CH-J Tools

Durchsuchen Sie Verzeichnisse und Dateien einer bestimmten Anwendungsausgabe.

Quellen als ZIP herunterladen
CH-J / Server Manager 872 Dateien
core-20261030T220507Z-61e4558d889f Hinzugefügt: · Erstellt:
build.rs Hinzugefügt: Datum nicht erfasst 9,0 KB · 142 Zeilen
Code Datei herunterladen
1//! Build script: Tauri ACL for every Core command and build identity.
2//!
3//! Each command gets its own `allow-<command>` permission (app manifest). Capabilities
4//! grant them per window class, so a module window cannot even reach a Core command
5//! through Tauri; the Rust Core additionally checks the calling window and the module
6//! manifest permissions at runtime (defence in depth).
8const SHARED: &[&str] = &["window_control", "window_is_maximized", "window_activity"];
9/// Registered only with the `smoke` cargo feature (test builds); absent from release handlers.
10const SMOKE: &[&str] = &["smoke_report", "smoke_snapshot"];
12const 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];
30const 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];
54const LICENSE: &[&str] = &["license_read", "license_show", "license_accept", "license_decline"];
56fn permission(command: &str) -> String {
57 format!("\"allow-{}\"", command.replace('_', "-"))
60fn 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 )
72fn 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 }
78/// UTC timestamp without external crates (YYYY-MM-DDTHH:MM:SS.000Z).
79fn 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")
96fn 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 id
106 }
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}");
129fn 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");
SHA-256accb91ce5ea94926fbaf08ec121ddd4cc44963e3aa865f76226b2b3a8465b102

CH-J Proprietary Software License 1.14 · Die Quellen werden unter der CH-J Proprietary Software License 1.14 bereitgestellt. Ihre Verfügbarkeit ändert die Lizenzbedingungen nicht und gewährt keine zusätzlichen Rechte.

SHA-256 des Archivs77380d4805485ffa4027fbe7858b5836f197a4aa9d52358a43e2d12d018744df
Dateien