v0.9.1: Onboarding wizard, security updates, packaging fix

- Onboarding wizard for new users (was missing from v0.8.1-v0.9.0)
- Settings menu label visibility improvement
- EnvironmentFile=-/opt/rustguac/env in systemd service
- russh 0.57→0.58.1 (drops vulnerable libcrux-sha3)
- aws-lc-sys 0.38→0.39 (RUSTSEC-2026-0044, 0048)
- rustls-webpki 0.103.9→0.103.10 (RUSTSEC-2026-0049)
- Removed RUSTSEC-2026-0074 ignore (no longer needed)
This commit is contained in:
Dave Kempe
2026-03-27 10:12:19 +11:00
parent d2dbfe3b2e
commit 07ebb33702
5 changed files with 217 additions and 218 deletions
+1 -1
View File
@@ -52,4 +52,4 @@ jobs:
- name: Security audit
run: |
$HOME/.cargo/bin/cargo install cargo-audit
$HOME/.cargo/bin/cargo audit --ignore RUSTSEC-2023-0071 --ignore RUSTSEC-2026-0074
$HOME/.cargo/bin/cargo audit --ignore RUSTSEC-2023-0071
Generated
+86 -213
View File
@@ -69,9 +69,9 @@ dependencies = [
[[package]]
name = "anstream"
version = "1.0.0"
version = "0.6.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -90,9 +90,9 @@ checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
[[package]]
name = "anstyle-parse"
version = "1.0.0"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
dependencies = [
"utf8parse",
]
@@ -377,7 +377,7 @@ version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be"
dependencies = [
"hybrid-array",
"hybrid-array 0.4.7",
]
[[package]]
@@ -487,9 +487,9 @@ dependencies = [
[[package]]
name = "clap"
version = "4.6.0"
version = "4.5.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351"
checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a"
dependencies = [
"clap_builder",
"clap_derive",
@@ -497,9 +497,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.6.0"
version = "4.5.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876"
dependencies = [
"anstream",
"anstyle",
@@ -509,9 +509,9 @@ dependencies = [
[[package]]
name = "clap_derive"
version = "4.6.0"
version = "4.5.55"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a"
checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5"
dependencies = [
"heck",
"proc-macro2",
@@ -575,17 +575,6 @@ version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "core-models"
version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0940496e5c83c54f3b753d5317daec82e8edac71c33aaa1f666d76f518de2444"
dependencies = [
"hax-lib",
"pastey",
"rand 0.9.2",
]
[[package]]
name = "cpufeatures"
version = "0.2.17"
@@ -651,7 +640,7 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710"
dependencies = [
"hybrid-array",
"hybrid-array 0.4.7",
]
[[package]]
@@ -1328,43 +1317,6 @@ dependencies = [
"hashbrown 0.16.1",
]
[[package]]
name = "hax-lib"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74d9ba66d1739c68e0219b2b2238b5c4145f491ebf181b9c6ab561a19352ae86"
dependencies = [
"hax-lib-macros",
"num-bigint",
"num-traits",
]
[[package]]
name = "hax-lib-macros"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24ba777a231a58d1bce1d68313fa6b6afcc7966adef23d60f45b8a2b9b688bf1"
dependencies = [
"hax-lib-macros-types",
"proc-macro-error2",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "hax-lib-macros-types"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "867e19177d7425140b417cd27c2e05320e727ee682e98368f88b7194e80ad515"
dependencies = [
"proc-macro2",
"quote",
"serde",
"serde_json",
"uuid",
]
[[package]]
name = "heck"
version = "0.5.0"
@@ -1452,6 +1404,15 @@ version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
name = "hybrid-array"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2d35805454dc9f8662a98d6d61886ffe26bd465f5960e0e55345c70d5c0d2a9"
dependencies = [
"typenum",
]
[[package]]
name = "hybrid-array"
version = "0.4.7"
@@ -1802,6 +1763,25 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "keccak"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653"
dependencies = [
"cpufeatures",
]
[[package]]
name = "kem"
version = "0.3.0-pre.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b8645470337db67b01a7f966decf7d0bafedbae74147d33e641c67a91df239f"
dependencies = [
"rand_core 0.6.4",
"zeroize",
]
[[package]]
name = "lazy_static"
version = "1.5.0"
@@ -1819,75 +1799,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
[[package]]
name = "libc"
version = "0.2.183"
version = "0.2.182"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d"
[[package]]
name = "libcrux-intrinsics"
version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc9ee7ef66569dd7516454fe26de4e401c0c62073929803486b96744594b9632"
dependencies = [
"core-models",
"hax-lib",
]
[[package]]
name = "libcrux-ml-kem"
version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bb6a88086bf11bd2ec90926c749c4a427f2e59841437dbdede8cde8a96334ab"
dependencies = [
"hax-lib",
"libcrux-intrinsics",
"libcrux-platform",
"libcrux-secrets",
"libcrux-sha3",
"libcrux-traits",
"rand 0.9.2",
"tls_codec",
]
[[package]]
name = "libcrux-platform"
version = "0.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db82d058aa76ea315a3b2092f69dfbd67ddb0e462038a206e1dcd73f058c0778"
dependencies = [
"libc",
]
[[package]]
name = "libcrux-secrets"
version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e4dbbf6bc9f2bc0f20dc3bea3e5c99adff3bdccf6d2a40488963da69e2ec307"
dependencies = [
"hax-lib",
]
[[package]]
name = "libcrux-sha3"
version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2400bec764d1c75b8a496d5747cffe32f1fb864a12577f0aca2f55a92021c962"
dependencies = [
"hax-lib",
"libcrux-intrinsics",
"libcrux-platform",
"libcrux-traits",
]
[[package]]
name = "libcrux-traits"
version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9adfd58e79d860f6b9e40e35127bfae9e5bd3ade33201d1347459011a2add034"
dependencies = [
"libcrux-secrets",
"rand 0.9.2",
]
checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112"
[[package]]
name = "libm"
@@ -1897,9 +1811,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
[[package]]
name = "libsqlite3-sys"
version = "0.37.0"
version = "0.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1f111c8c41e7c61a49cd34e44c7619462967221a6443b0ec299e0ac30cfb9b1"
checksum = "95b4103cffefa72eb8428cb6b47d6627161e51c2739fc5e3b734584157bc642a"
dependencies = [
"cc",
"pkg-config",
@@ -2003,6 +1917,18 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "ml-kem"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8de49b3df74c35498c0232031bb7e85f9389f913e2796169c8ab47a53993a18f"
dependencies = [
"hybrid-array 0.2.3",
"kem",
"rand_core 0.6.4",
"sha3",
]
[[package]]
name = "nix"
version = "0.29.0"
@@ -2288,12 +2214,6 @@ dependencies = [
"subtle",
]
[[package]]
name = "pastey"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec"
[[package]]
name = "pbkdf2"
version = "0.12.2"
@@ -2506,28 +2426,6 @@ dependencies = [
"elliptic-curve",
]
[[package]]
name = "proc-macro-error-attr2"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5"
dependencies = [
"proc-macro2",
"quote",
]
[[package]]
name = "proc-macro-error2"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802"
dependencies = [
"proc-macro-error-attr2",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "proc-macro2"
version = "1.0.106"
@@ -2628,9 +2526,9 @@ dependencies = [
[[package]]
name = "quote"
version = "1.0.45"
version = "1.0.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
dependencies = [
"proc-macro2",
]
@@ -2889,9 +2787,9 @@ dependencies = [
[[package]]
name = "rusqlite"
version = "0.39.0"
version = "0.38.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0d2b0146dd9661bf67bb107c0bb2a55064d556eeb3fc314151b957f313bcd4e"
checksum = "f1c93dd1c9683b438c392c492109cb702b8090b2bfc8fed6f6e4eb4523f17af3"
dependencies = [
"bitflags",
"fallible-iterator",
@@ -2904,9 +2802,9 @@ dependencies = [
[[package]]
name = "russh"
version = "0.58.0"
version = "0.58.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30f6ce4f5d5105b934cfb4b8b3028aab4d5dcdff863cb8dda9edd06d39b8c4e8"
checksum = "68d53bd2e1d6c49e32ae183c09bdc710ace41e7c8c564cc8a2286aad3bffe10d"
dependencies = [
"aes",
"aws-lc-rs",
@@ -2933,9 +2831,9 @@ dependencies = [
"hmac",
"inout",
"internal-russh-forked-ssh-key",
"libcrux-ml-kem",
"log",
"md5",
"ml-kem",
"num-bigint",
"p256",
"p384",
@@ -3004,7 +2902,7 @@ dependencies = [
[[package]]
name = "rustguac"
version = "0.9.0"
version = "0.9.1"
dependencies = [
"aes",
"axum",
@@ -3368,6 +3266,16 @@ dependencies = [
"digest 0.11.1",
]
[[package]]
name = "sha3"
version = "0.10.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60"
dependencies = [
"digest 0.10.7",
"keccak",
]
[[package]]
name = "sharded-slab"
version = "0.1.7"
@@ -3692,27 +3600,6 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tls_codec"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0de2e01245e2bb89d6f05801c564fa27624dbd7b1846859876c7dad82e90bf6b"
dependencies = [
"tls_codec_derive",
"zeroize",
]
[[package]]
name = "tls_codec_derive"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d2e76690929402faae40aebdda620a2c0e25dd6d3b9afe48867dfd95991f4bd"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tokio"
version = "1.50.0"
@@ -3789,9 +3676,9 @@ dependencies = [
[[package]]
name = "toml"
version = "1.0.7+spec-1.1.0"
version = "1.0.4+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd28d57d8a6f6e458bc0b8784f8fdcc4b99a437936056fa122cb234f18656a96"
checksum = "c94c3321114413476740df133f0d8862c61d87c8d26f04c6841e033c8c80db47"
dependencies = [
"indexmap 2.13.0",
"serde_core",
@@ -3804,27 +3691,27 @@ dependencies = [
[[package]]
name = "toml_datetime"
version = "1.0.1+spec-1.1.0"
version = "1.0.0+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9"
checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e"
dependencies = [
"serde_core",
]
[[package]]
name = "toml_parser"
version = "1.0.10+spec-1.1.0"
version = "1.0.9+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420"
checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4"
dependencies = [
"winnow",
]
[[package]]
name = "toml_writer"
version = "1.0.7+spec-1.1.0"
version = "1.0.6+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f17aaa1c6e3dc22b1da4b6bba97d066e354c7945cac2f7852d4e4e7ca7a6b56d"
checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607"
[[package]]
name = "tonic"
@@ -3993,9 +3880,9 @@ dependencies = [
[[package]]
name = "tracing-subscriber"
version = "0.3.23"
version = "0.3.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319"
checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e"
dependencies = [
"matchers",
"nu-ansi-term",
@@ -4605,9 +4492,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
[[package]]
name = "winnow"
version = "1.0.0"
version = "0.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8"
checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829"
[[package]]
name = "wit-bindgen"
@@ -4799,20 +4686,6 @@ name = "zeroize"
version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
dependencies = [
"zeroize_derive",
]
[[package]]
name = "zeroize_derive"
version = "1.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "zerotrie"
+2 -2
View File
@@ -1,6 +1,6 @@
[package]
name = "rustguac"
version = "0.9.0"
version = "0.9.1"
edition = "2021"
description = "Lightweight Rust replacement for Apache Guacamole client"
@@ -42,7 +42,7 @@ hmac = "0.12"
sha1 = "0.10"
# Database
rusqlite = { version = "0.39", features = ["bundled"] }
rusqlite = { version = "0.38", features = ["bundled"] }
# CLI
clap = { version = "4", features = ["derive"] }
+1
View File
@@ -11,6 +11,7 @@ ExecStart=/opt/rustguac/bin/rustguac --config /opt/rustguac/config.toml serve
Restart=on-failure
RestartSec=5
Environment=RUST_LOG=info
EnvironmentFile=-/opt/rustguac/env
[Install]
WantedBy=multi-user.target
+127 -2
View File
@@ -13,7 +13,7 @@
nav a:hover { text-decoration: underline; }
nav .active { color: var(--primary); font-weight: bold; }
#user-menu-wrapper { position: relative; float: right; }
#user-menu-btn { cursor: pointer; font-size: 1.3em; color: var(--text-muted); }
#user-menu-btn { cursor: pointer; font-size: 0.95em; color: var(--text-muted); }
#user-menu-btn:hover { color: var(--text); }
#user-menu { display:none; position:absolute; right:0; top:1.8em; background:var(--surface); border:1px solid var(--border); border-radius:6px; min-width:220px; z-index:50; padding:0.4em 0; }
.um-section-label { padding:0.4em 0.9em; font-size:0.8em; color:var(--text-dim); text-transform:uppercase; letter-spacing:0.05em; }
@@ -153,6 +153,9 @@
.modal-actions { margin-top: 1.2em; display: flex; gap: 0.8em; }
.modal-actions .btn-cancel { background: var(--border); }
.modal-actions .btn-cancel:hover { background: #444; }
#onboard-body code { background: var(--input); padding: 0.1em 0.4em; border-radius: 3px; font-size: 0.9em; }
.onboard-key { display:inline-block; background:var(--surface); border:1px solid var(--border); border-radius:3px; padding:0.1em 0.45em; font-size:0.85em; color:var(--text); }
.onboard-hl { color: var(--accent); font-weight: bold; }
.field-hint { font-size: 0.8em; color: var(--text-dim); margin-top: 0.2em; }
.pw-wrap { position: relative; }
@@ -259,7 +262,7 @@
<a href="/docs.html">Docs</a>
<a href="/tokens.html" id="tokens-link" style="display:none">Tokens</a>
<a href="/admin.html" id="admin-link" style="display:none">Admin</a>
<span id="user-menu-wrapper"><span id="user-menu-btn" title="Preferences">&#9881;</span><div id="user-menu"><div class="um-section-label">Theme</div><div id="um-theme-list"></div><div class="um-divider"></div><div class="um-item" id="my-creds-item">&#128273; My Credentials</div><div class="um-divider"></div><div class="um-item um-logout" id="logout-item">Logout</div></div></span>
<span id="user-menu-wrapper"><span id="user-menu-btn" title="Preferences">&#9881; Settings</span><div id="user-menu"><div class="um-section-label">Theme</div><div id="um-theme-list"></div><div class="um-divider"></div><div class="um-item" id="my-creds-item">&#128273; My Credentials</div><div class="um-item" id="show-tour-item">&#9432; Welcome Tour</div><div class="um-divider"></div><div class="um-item um-logout" id="logout-item">Logout</div></div></span>
</nav>
<div id="global-error"></div>
@@ -612,6 +615,25 @@
</div>
</div>
<!-- Onboarding wizard -->
<div class="modal-overlay" id="onboarding-modal">
<div class="modal" style="max-width:520px;min-width:380px">
<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:0.3em">
<h3 id="onboard-title" style="margin:0"></h3>
<span id="onboard-step-indicator" style="color:var(--text-dim);font-size:0.85em"></span>
</div>
<div id="onboard-body" style="color:var(--text);font-size:0.92em;line-height:1.65;min-height:80px"></div>
<div style="display:flex;align-items:center;gap:0.6em;margin-top:1.2em">
<button id="onboard-back" class="btn-cancel">Back</button>
<button id="onboard-next" class="btn-connect">Next</button>
<span style="flex:1"></span>
<label style="color:var(--text-dim);font-size:0.8em;cursor:pointer;white-space:nowrap">
<input type="checkbox" id="onboard-dismiss" style="display:inline;width:auto;margin-right:0.3em"> Don't show again
</label>
</div>
</div>
</div>
<div class="modal-overlay" id="cred-modal">
<div class="modal">
<h3 id="cred-modal-title">Enter Credentials</h3>
@@ -675,6 +697,7 @@
var roleLevel = { admin: 4, poweruser: 3, operator: 2, viewer: 1 };
var isAdmin = false;
var currentUserRole = 'viewer';
var selectedFolder = null; // { name, scope, description }
var folders = [];
var folderEntryCounts = {}; // "scope/name" -> count
@@ -728,6 +751,7 @@
.then(function(data) {
if (!data) return;
isAdmin = data.role === 'admin';
currentUserRole = data.role || 'viewer';
var level = roleLevel[data.role] || 0;
if (level < 3) {
document.getElementById('sessions-link').style.display = 'none';
@@ -763,6 +787,7 @@
return;
}
loadFolders();
startOnboarding(currentUserRole);
})
.catch(function(err) {
showError('Failed to check authentication: ' + err.message);
@@ -2236,6 +2261,106 @@
});
}
// ── Onboarding Wizard ──
var onboardSteps = [
{ title: 'Welcome to rustguac', minRole: 1, body:
'This is your remote access gateway. Browse connection entries organised by folder, then click <span class="onboard-hl">Connect</span> to launch a session in a new browser tab.' +
'<br><br>This quick tour covers the essentials &mdash; you can dismiss it at any time.'
},
{ title: 'Navigation', minRole: 1, body:
'The nav bar at the top links to:' +
'<br>&bull; <span class="onboard-hl">Address Book</span> &mdash; your connection entries' +
'<br>&bull; <span class="onboard-hl">Sessions</span> &mdash; active and recent sessions' +
'<br>&bull; <span class="onboard-hl">Recordings</span> &mdash; session playback' +
'<br>&bull; <span class="onboard-hl">Docs</span> &mdash; built-in documentation' +
'<br><br>The <span class="onboard-hl">Settings</span> menu (top right) has theme selection, credential management, and this tour.'
},
{ title: 'My Credentials', minRole: 2, body:
'Some entries use credential variables like <code>$domain_username</code>. Before connecting, set your personal credentials:' +
'<br><br>Click <span class="onboard-hl">Settings</span> &rarr; <span class="onboard-hl">My Credentials</span> to fill in your values. They are stored securely in Vault and applied automatically when you connect.'
},
{ title: 'Connect vs Login', minRole: 2, body:
'Address book entries have two connection modes:' +
'<br><br>&bull; <span class="onboard-hl">Connect</span> &mdash; launches the session directly using the saved settings.' +
'<br>&bull; <span class="onboard-hl">Login</span> &mdash; runs an automated login script after connecting (e.g. filling in a web login form). If an entry shows Login, the admin has configured an auto-login workflow for it.'
},
{ title: 'Clipboard', minRole: 2, body:
'<span class="onboard-key">Ctrl</span>+<span class="onboard-key">V</span> pastes from your browser clipboard into the remote session automatically.' +
'<br><br>For advanced use (copy from remote, send arbitrary text), press <span class="onboard-key">Ctrl</span>+<span class="onboard-key">Alt</span>+<span class="onboard-key">Shift</span> or click the <span class="onboard-hl">Clipboard</span> tab on the left edge of the session window.'
},
{ title: 'File Transfer', minRole: 2, body:
'RDP sessions with drive redirection enabled show a <span class="onboard-hl">Files</span> tab on the right edge of the session window.' +
'<br><br>Use it to upload and download files via a shared virtual drive. SSH sessions support SFTP file transfer instead.' +
'<br><br>Toggle the file panel with <span class="onboard-key">Ctrl</span>+<span class="onboard-key">Alt</span>+<span class="onboard-key">F</span>.'
},
{ title: 'Ad-hoc Sessions', minRole: 3, body:
'As a power user, you can create one-off sessions from the <span class="onboard-hl">Sessions</span> page &mdash; useful for quick connections that aren\'t in the address book.' +
'<br><br>Choose SSH, RDP, VNC, or Web and enter connection details directly.'
},
{ title: 'Managing the Address Book', minRole: 4, body:
'As an admin, you can:' +
'<br>&bull; Create and edit <span class="onboard-hl">folders</span> with OIDC group permissions' +
'<br>&bull; Add, edit, clone, and delete <span class="onboard-hl">entries</span>' +
'<br>&bull; Configure credential variables, login scripts, and recording overrides per entry' +
'<br>&bull; Manage users and API tokens from the <span class="onboard-hl">Admin</span> page'
}
];
var onboardCurrent = 0;
var onboardFiltered = [];
function startOnboarding(role) {
if (localStorage.getItem('rustguac_onboarding_dismissed')) return;
var level = roleLevel[role] || 1;
onboardFiltered = onboardSteps.filter(function(s) { return s.minRole <= level; });
if (onboardFiltered.length === 0) return;
onboardCurrent = 0;
renderOnboardStep();
document.getElementById('onboard-dismiss').checked = false;
document.getElementById('onboarding-modal').classList.add('active');
}
function renderOnboardStep() {
var step = onboardFiltered[onboardCurrent];
document.getElementById('onboard-title').textContent = step.title;
document.getElementById('onboard-body').innerHTML = step.body;
document.getElementById('onboard-step-indicator').textContent = (onboardCurrent + 1) + ' / ' + onboardFiltered.length;
document.getElementById('onboard-back').style.display = onboardCurrent === 0 ? 'none' : '';
var nextBtn = document.getElementById('onboard-next');
nextBtn.textContent = (onboardCurrent === onboardFiltered.length - 1) ? 'Done' : 'Next';
}
function closeOnboarding() {
document.getElementById('onboarding-modal').classList.remove('active');
if (document.getElementById('onboard-dismiss').checked) {
localStorage.setItem('rustguac_onboarding_dismissed', '1');
}
}
document.getElementById('onboard-next').addEventListener('click', function() {
if (onboardCurrent < onboardFiltered.length - 1) {
onboardCurrent++;
renderOnboardStep();
} else {
localStorage.setItem('rustguac_onboarding_dismissed', '1');
closeOnboarding();
}
});
document.getElementById('onboard-back').addEventListener('click', function() {
if (onboardCurrent > 0) {
onboardCurrent--;
renderOnboardStep();
}
});
document.getElementById('onboarding-modal').addEventListener('click', function(e) {
if (e.target === this) closeOnboarding();
});
document.getElementById('show-tour-item').addEventListener('click', function() {
document.getElementById('user-menu').style.display = 'none';
localStorage.removeItem('rustguac_onboarding_dismissed');
startOnboarding(currentUserRole);
});
init();
</script>
</body>