v0.8.0: dep prune, memtest introspection fix, concurrent uploads, x-api-key

Dependency cleanup (ponytail audit):
- Drop 14 unused dependency declarations across 7 crates; quick-xml and
  x509-parser leave the tree entirely (SAML cert/XML work is handled by
  bergshamra + roxmltree).

Fixes:
- introspect: drop the over-broad "microsoft" UTF-16 bulk-scan marker that
  mislabeled Secure-Boot-signed non-Windows bootables (memtest86, signed
  BSDs, firmware tools) as Windows — the string lives in their MS-signed
  EFI loader's FAT long-filename entries. INTROSPECT_REV 3 -> 4 re-probes
  existing local ISOs on startup so the bogus label clears on upgrade.
- upload: begin_upload now reclaims an abandoned <id>.partial instead of
  rejecting the re-upload with "already uploading". Robust against browser
  refresh, tab close, and dropped connections (the chunked protocol can't
  resume a dead session anyway).

Features:
- Storage upload: multi-file + concurrent. Each dropped/selected .iso gets
  its own progress row and uploads independently; a single page-leave guard
  plus a pagehide keepalive-abort replace the old shared singletons.
- Operator API key (x-api-key): a persisted key authenticates /api/* exactly
  like an operator session, for Postman/scripts. New core ApiKeyStore
  (generated on first run, regenerable), accepted in require_auth alongside
  the session cookie, surfaced in Settings -> Advanced with copy + regenerate
  and a usage reference. GET /api/api-key + POST /api/api-key/regenerate.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
This commit is contained in:
Miles Ward
2026-06-21 23:35:42 -04:00
co-authored by Claude Opus 4.8
parent 27703c437a
commit 1c262a6d61
19 changed files with 495 additions and 221 deletions
Generated
+9 -136
View File
@@ -175,45 +175,6 @@ dependencies = [
"password-hash",
]
[[package]]
name = "asn1-rs"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7f43a50ac4fdca5df8e885c21b835997f0a1cdee65494a6847694a98652d9d8"
dependencies = [
"asn1-rs-derive",
"asn1-rs-impl",
"displaydoc",
"nom 7.1.3",
"num-traits",
"rusticata-macros",
"thiserror",
"time",
]
[[package]]
name = "asn1-rs-derive"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c"
dependencies = [
"proc-macro2",
"quote",
"syn",
"synstructure",
]
[[package]]
name = "asn1-rs-impl"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "assert-json-diff"
version = "2.0.2"
@@ -1144,20 +1105,6 @@ dependencies = [
"zeroize",
]
[[package]]
name = "der-parser"
version = "10.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6"
dependencies = [
"asn1-rs",
"displaydoc",
"nom 7.1.3",
"num-bigint",
"num-traits",
"rusticata-macros",
]
[[package]]
name = "der_derive"
version = "0.7.3"
@@ -2445,7 +2392,7 @@ dependencies = [
"httpdate",
"idna",
"mime",
"nom 8.0.0",
"nom",
"percent-encoding",
"quoted_printable",
"rustls",
@@ -2564,12 +2511,6 @@ dependencies = [
"unicase",
]
[[package]]
name = "minimal-lexical"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
version = "0.8.9"
@@ -2702,16 +2643,6 @@ dependencies = [
"libc",
]
[[package]]
name = "nom"
version = "7.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
dependencies = [
"memchr",
"minimal-lexical",
]
[[package]]
name = "nom"
version = "8.0.0"
@@ -2803,15 +2734,6 @@ dependencies = [
"libc",
]
[[package]]
name = "oid-registry"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7"
dependencies = [
"asn1-rs",
]
[[package]]
name = "once_cell"
version = "1.21.4"
@@ -2836,7 +2758,7 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]]
name = "openpxe"
version = "0.7.5"
version = "0.8.0"
dependencies = [
"anyhow",
"axum",
@@ -2848,17 +2770,15 @@ dependencies = [
"openpxe-ipxe-assets",
"openpxe-iso-store",
"openpxe-tftp",
"serde",
"time",
"tokio",
"toml",
"tracing",
"tracing-subscriber",
]
[[package]]
name = "openpxe-core"
version = "0.7.5"
version = "0.8.0"
dependencies = [
"anyhow",
"base64",
@@ -2867,7 +2787,6 @@ dependencies = [
"figment",
"flate2",
"parking_lot",
"quick-xml",
"rcgen",
"roxmltree",
"serde",
@@ -2880,29 +2799,26 @@ dependencies = [
"tracing",
"tracing-subscriber",
"uuid",
"x509-parser",
]
[[package]]
name = "openpxe-dhcp-proxy"
version = "0.7.5"
version = "0.8.0"
dependencies = [
"anyhow",
"bytes",
"dhcproto",
"openpxe-core",
"parking_lot",
"serde_json",
"socket2",
"tempfile",
"thiserror",
"tokio",
"tracing",
]
[[package]]
name = "openpxe-http-api"
version = "0.7.5"
version = "0.8.0"
dependencies = [
"anyhow",
"axum",
@@ -2910,7 +2826,6 @@ dependencies = [
"bergshamra",
"bytes",
"futures",
"hyper",
"image",
"insta",
"lettre",
@@ -2924,7 +2839,6 @@ dependencies = [
"serde",
"serde_json",
"tempfile",
"thiserror",
"time",
"tokio",
"tokio-stream",
@@ -2938,17 +2852,16 @@ dependencies = [
[[package]]
name = "openpxe-ipxe-assets"
version = "0.7.5"
version = "0.8.0"
dependencies = [
"openpxe-core",
"rust-embed",
"thiserror",
"tracing",
]
[[package]]
name = "openpxe-iso-store"
version = "0.7.5"
version = "0.8.0"
dependencies = [
"anyhow",
"bcrypt",
@@ -2967,31 +2880,26 @@ dependencies = [
"serde_json",
"sha2 0.10.9",
"tempfile",
"thiserror",
"time",
"tokio",
"tokio-util",
"tracing",
"uuid",
]
[[package]]
name = "openpxe-tftp"
version = "0.7.5"
version = "0.8.0"
dependencies = [
"anyhow",
"bytes",
"openpxe-core",
"openpxe-ipxe-assets",
"socket2",
"thiserror",
"tokio",
"tracing",
]
[[package]]
name = "openpxe-webui"
version = "0.7.5"
version = "0.8.0"
[[package]]
name = "p256"
@@ -3438,15 +3346,6 @@ version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
[[package]]
name = "quick-xml"
version = "0.40.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2474bd2e5029e7ccb6abb2ba48cf2383a333851dedf495901544281590c7da7f"
dependencies = [
"memchr",
]
[[package]]
name = "quinn"
version = "0.11.9"
@@ -3933,15 +3832,6 @@ dependencies = [
"semver",
]
[[package]]
name = "rusticata-macros"
version = "4.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632"
dependencies = [
"nom 7.1.3",
]
[[package]]
name = "rustix"
version = "1.1.4"
@@ -5644,23 +5534,6 @@ dependencies = [
"tls_codec",
]
[[package]]
name = "x509-parser"
version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202"
dependencies = [
"asn1-rs",
"data-encoding",
"der-parser",
"lazy_static",
"nom 7.1.3",
"oid-registry",
"rusticata-macros",
"thiserror",
"time",
]
[[package]]
name = "yansi"
version = "1.0.1"