mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-23 15:08:16 +02:00
Façade Rust, lot 2 : interface, authentification et /api/ping
L'interface (index, marked, service worker, manifeste, polices) est désormais servie par loki-rs, embarquée par build.rs depuis la même source que le go:embed — les deux binaires d'un build servent la même UI. Mêmes en-têtes de cache que le Go, gzip à la première demande puis gardé en mémoire, jamais sur les polices ni en HEAD. L'authentification de pilotage est portée à l'identique (requireWebAuth, crossSiteReject, localHostName, Bearer en temps constant, mêmes messages, mêmes codes) ; les cas de TestCrossSiteReject sont repris un pour un. La clé est demandée à l'API interne du Go à chaque requête ; si elle ne répond pas proprement, la façade ferme (503). /api/ping est la première route authentifiée servie par Rust. Le jeton de l'API interne est tiré au hasard à chaque démarrage et passé au Go par l'environnement. La façade rend 404 sur /internal/* venu de l'extérieur et efface X-Loki-Internal entrant avant tout relais. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
a99d988e70
commit
d4fa4488cc
13 files changed
+1023
-18
No files matched your search
@@ -0,0 +1,47 @@
|
||||
//! Embarque l'UI web dans le binaire, depuis la MÊME source que le `go:embed`
|
||||
//! du serveur Go (`internal/loki/ui/`) : les deux binaires d'un build servent
|
||||
//! donc toujours la même interface. Génère `$OUT_DIR/ui_assets.rs`.
|
||||
|
||||
use std::fmt::Write as _;
|
||||
use std::path::PathBuf;
|
||||
|
||||
fn main() {
|
||||
let manifest = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
|
||||
let ui = manifest.join("../../internal/loki/ui");
|
||||
let ui = ui
|
||||
.canonicalize()
|
||||
.unwrap_or_else(|e| panic!("UI introuvable ({}) : {e}", ui.display()));
|
||||
println!("cargo:rerun-if-changed={}", ui.display());
|
||||
|
||||
let mut out = String::new();
|
||||
for name in [
|
||||
"index.html",
|
||||
"marked.min.js",
|
||||
"sw.js",
|
||||
"manifest.webmanifest",
|
||||
] {
|
||||
let p = ui.join(name);
|
||||
assert!(p.is_file(), "fichier d'UI manquant : {}", p.display());
|
||||
println!("cargo:rerun-if-changed={}", p.display());
|
||||
let ident = name.replace(['.', '-'], "_").to_uppercase();
|
||||
writeln!(out, "pub static {ident}: &[u8] = include_bytes!({:?});", p).unwrap();
|
||||
}
|
||||
|
||||
let fonts_dir = ui.join("fonts");
|
||||
println!("cargo:rerun-if-changed={}", fonts_dir.display());
|
||||
let mut fonts: Vec<PathBuf> = std::fs::read_dir(&fonts_dir)
|
||||
.unwrap_or_else(|e| panic!("{} : {e}", fonts_dir.display()))
|
||||
.filter_map(|e| e.ok().map(|e| e.path()))
|
||||
.filter(|p| p.extension().is_some_and(|x| x == "woff2"))
|
||||
.collect();
|
||||
fonts.sort();
|
||||
out.push_str("pub static FONTS: &[(&str, &[u8])] = &[\n");
|
||||
for p in &fonts {
|
||||
let name = p.file_name().unwrap().to_str().unwrap();
|
||||
writeln!(out, " ({name:?}, include_bytes!({p:?})),").unwrap();
|
||||
}
|
||||
out.push_str("];\n");
|
||||
|
||||
let dst = PathBuf::from(std::env::var("OUT_DIR").unwrap()).join("ui_assets.rs");
|
||||
std::fs::write(dst, out).unwrap();
|
||||
}
|
||||
Reference in new issue
Block a user