Complete private authentication, server integrations and activity reporting

Add Fabric/Forge version builds and Paper integration, preserve permanent player identities across renames, harden session authorization, and surface privacy-conscious launcher/server activity in the panel.
This commit is contained in:
SCOPEDD committed 2026-09-28 13:31:17 -04:00
commit a1f19e86c6
74 files changed
+2108 -95

No files matched your search

+10 -2
View File
@@ -17,6 +17,7 @@ pub fn test_keys() -> Arc<Keys> {
pub struct TestApp {
pub router: axum::Router,
pub db: sqlx::SqlitePool,
_dir: tempfile::TempDir,
}
@@ -32,14 +33,18 @@ pub async fn setup() -> TestApp {
curseforge_api_key: None,
max_upload_mb: 64,
public_url: Some("https://panel.test".into()),
trusted_proxies: vec!["127.0.0.1".parse().unwrap()],
};
let pool = db::connect_memory().await.unwrap();
let state = build_state_with_keys(cfg, pool, test_keys()).await.unwrap();
bootstrap_admin(&state).await.unwrap();
TestApp { router: app(state), _dir: dir }
TestApp { db: state.db.clone(), router: app(state), _dir: dir }
}
impl TestApp {
pub async fn uuid(&self, name: &str) -> String {
sqlx::query_scalar("SELECT uuid FROM users WHERE username = ?").bind(name).fetch_one(&self.db).await.unwrap()
}
pub async fn call(&self, method: &str, uri: &str, token: Option<&str>, body: Option<Value>) -> (StatusCode, Value) {
let mut req = Request::builder().method(method).uri(uri);
if let Some(t) = token {
@@ -52,7 +57,10 @@ impl TestApp {
self.send(req).await
}
pub async fn send(&self, req: Request<Body>) -> (StatusCode, Value) {
pub async fn send(&self, mut req: Request<Body>) -> (StatusCode, Value) {
if req.extensions().get::<axum::extract::ConnectInfo<std::net::SocketAddr>>().is_none() {
req.extensions_mut().insert(axum::extract::ConnectInfo("127.0.0.1:12345".parse::<std::net::SocketAddr>().unwrap()));
}
let resp = self.router.clone().oneshot(req).await.unwrap();
let status = resp.status();
let bytes = axum::body::to_bytes(resp.into_body(), usize::MAX).await.unwrap();