use axum::body::Bytes;
use axum::extract::{Path, State};
use axum::http::{HeaderMap, StatusCode};
use axum::Json;
use serde::{Deserialize, Serialize};
use super::auth::{auth_user, constant_time_eq, generate_token, sha256_hex, AppState};
use super::helpers::internal_error;
const MAX_PUBLISH_PER_HOUR: i64 = 20;
const MAX_BODY_BYTES: usize = 8 * 1024;
const MAX_TOP_COMMANDS: usize = 12;
const MAX_NAME_LEN: usize = 40;
const MAX_LABEL_LEN: usize = 60;
type ApiResult<T> = Result<T, (StatusCode, String)>;
fn err(status: StatusCode, code: &str) -> (StatusCode, String) {
(status, format!(r#"{{"error":"{code}"}}"#))
}
fn bad_payload() -> (StatusCode, String) {
err(StatusCode::BAD_REQUEST, "invalid_payload")
}
#[derive(Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub(super) struct TopCommand {
pub name: String,
pub pct: f64,
}
#[derive(Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub(super) struct PublishPayload {
pub period: String,
pub tokens_saved: i64,
pub cost_avoided_usd: f64,
pub pricing_estimated: bool,
pub compression_rate_pct: f64,
#[serde(default)]
pub total_commands: i64,
#[serde(default)]
pub sessions_count: i64,
#[serde(default)]
pub files_touched: i64,
#[serde(default)]
pub top_commands: Vec<TopCommand>,
#[serde(default)]
pub model_key: Option<String>,
#[serde(default)]
pub display_name: Option<String>,
#[serde(default)]
pub leaderboard_opt_in: bool,
}
impl PublishPayload {
fn validate(&self) -> ApiResult<()> {
if !matches!(self.period.as_str(), "day" | "week" | "month" | "all") {
return Err(bad_payload());
}
if self.tokens_saved < 0 || self.total_commands < 0 {
return Err(bad_payload());
}
if self.sessions_count < 0 || self.files_touched < 0 {
return Err(bad_payload());
}
if !finite_nonneg(self.cost_avoided_usd) {
return Err(bad_payload());
}
if !in_pct(self.compression_rate_pct) {
return Err(bad_payload());
}
if self.top_commands.len() > MAX_TOP_COMMANDS {
return Err(bad_payload());
}
for c in &self.top_commands {
let len = c.name.chars().count();
if len == 0 || len > MAX_NAME_LEN || has_markup(&c.name) || !in_pct(c.pct) {
return Err(bad_payload());
}
}
if let Some(m) = &self.model_key {
if m.chars().count() > MAX_LABEL_LEN || has_markup(m) {
return Err(bad_payload());
}
}
if let Some(name) = &self.display_name {
let len = name.chars().count();
if len == 0 || len > MAX_LABEL_LEN || has_markup(name) {
return Err(bad_payload());
}
}
Ok(())
}
fn to_report(&self) -> crate::core::wrapped::WrappedReport {
crate::core::wrapped::WrappedReport {
period: self.period.clone(),
tokens_saved: u64::try_from(self.tokens_saved).unwrap_or(0),
tokens_input: 0,
cost_avoided_usd: self.cost_avoided_usd,
total_commands: u64::try_from(self.total_commands).unwrap_or(0),
sessions_count: usize::try_from(self.sessions_count).unwrap_or(0),
top_commands: self
.top_commands
.iter()
.map(|c| (c.name.clone(), 0u64, c.pct))
.collect(),
compression_rate_pct: self.compression_rate_pct,
files_touched: u64::try_from(self.files_touched).unwrap_or(0),
daily_savings: Vec::new(),
bounce_tokens: 0,
model_key: self.model_key.clone().unwrap_or_default(),
pricing_estimated: self.pricing_estimated,
}
}
}
fn finite_nonneg(v: f64) -> bool {
v.is_finite() && v >= 0.0
}
fn in_pct(v: f64) -> bool {
v.is_finite() && (0.0..=100.0).contains(&v)
}
fn has_markup(s: &str) -> bool {
s.chars()
.any(|c| c == '<' || c == '>' || (c.is_control() && c != '\t'))
}
const PUBLISHER_ID_HEX_LEN: usize = 32;
#[derive(Deserialize)]
struct SignedEnvelope {
payload_json: String,
public_key: Option<String>,
signature: Option<String>,
}
fn verify_signed_envelope(env: &SignedEnvelope) -> ApiResult<(PublishPayload, String)> {
use crate::core::agent_identity::{hex_decode, verify_signature};
let (Some(pk_hex), Some(sig_hex)) = (&env.public_key, &env.signature) else {
return Err(bad_payload());
};
let pk_bytes = hex_decode(pk_hex).map_err(|_| bad_payload())?;
let sig_bytes = hex_decode(sig_hex).map_err(|_| bad_payload())?;
if !verify_signature(&pk_bytes, env.payload_json.as_bytes(), &sig_bytes) {
return Err(err(StatusCode::UNAUTHORIZED, "invalid_signature"));
}
let payload: PublishPayload =
serde_json::from_str(&env.payload_json).map_err(|_| bad_payload())?;
let publisher_id = sha256_hex(pk_hex)
.get(..PUBLISHER_ID_HEX_LEN)
.ok_or_else(internal_error_str)?
.to_string();
Ok((payload, publisher_id))
}
fn internal_error_str() -> (StatusCode, String) {
err(StatusCode::INTERNAL_SERVER_ERROR, "internal_error")
}
pub(super) async fn publish(
State(state): State<AppState>,
headers: HeaderMap,
body: Bytes,
) -> ApiResult<(StatusCode, Json<serde_json::Value>)> {
if body.len() > MAX_BODY_BYTES {
return Err(err(StatusCode::PAYLOAD_TOO_LARGE, "payload_too_large"));
}
let (payload, payload_json, publisher_id) = if let Ok(env) =
serde_json::from_slice::<SignedEnvelope>(&body)
{
let (payload, pid) = verify_signed_envelope(&env)?;
(payload, env.payload_json, Some(pid))
} else {
let payload: PublishPayload = serde_json::from_slice(&body).map_err(|_| bad_payload())?;
let json = serde_json::to_string(&payload).map_err(internal_error)?;
(payload, json, None)
};
payload.validate()?;
let client = state.pool.get().await.map_err(internal_error)?;
let ip_hash = client_ip_hash(&headers, &state.cfg.ip_hash_salt);
if let Some(h) = &ip_hash {
let row = client
.query_one(
"SELECT count(*) FROM wrapped_cards \
WHERE ip_hash = $1 AND created_at > now() - interval '1 hour'",
&[h],
)
.await
.map_err(internal_error)?;
let recent: i64 = row.get(0);
if recent >= MAX_PUBLISH_PER_HOUR {
return Err(err(StatusCode::TOO_MANY_REQUESTS, "rate_limited"));
}
}
let id = generate_card_id();
let edit_token = generate_token();
let edit_token_hash = sha256_hex(&edit_token);
let base = state.cfg.public_base_url.trim_end_matches('/');
if let Some(pid) = &publisher_id {
let row = client
.query_one(
"INSERT INTO wrapped_cards \
(id, edit_token_hash, payload_json, ip_hash, leaderboard_opt_in, tokens_saved, publisher_id, period) \
VALUES ($1, $2, $3, $4, $5, $6, $7, $8) \
ON CONFLICT (publisher_id, period) WHERE publisher_id IS NOT NULL \
DO UPDATE SET payload_json = EXCLUDED.payload_json, \
leaderboard_opt_in = EXCLUDED.leaderboard_opt_in, \
tokens_saved = EXCLUDED.tokens_saved \
RETURNING id, (xmax = 0) AS inserted",
&[
&id,
&edit_token_hash,
&payload_json,
&ip_hash,
&payload.leaderboard_opt_in,
&payload.tokens_saved,
pid,
&payload.period,
],
)
.await
.map_err(internal_error)?;
let final_id: String = row.get(0);
let inserted: bool = row.get(1);
let url = format!("{base}/w/{final_id}");
let mut out = serde_json::json!({ "id": final_id, "url": url });
if inserted {
out["edit_token"] = serde_json::Value::String(edit_token);
Ok((StatusCode::CREATED, Json(out)))
} else {
Ok((StatusCode::OK, Json(out)))
}
} else {
client
.execute(
"INSERT INTO wrapped_cards \
(id, edit_token_hash, payload_json, ip_hash, leaderboard_opt_in, tokens_saved, period) \
VALUES ($1, $2, $3, $4, $5, $6, $7)",
&[
&id,
&edit_token_hash,
&payload_json,
&ip_hash,
&payload.leaderboard_opt_in,
&payload.tokens_saved,
&payload.period,
],
)
.await
.map_err(internal_error)?;
let url = format!("{base}/w/{id}");
Ok((
StatusCode::CREATED,
Json(serde_json::json!({ "id": id, "edit_token": edit_token, "url": url })),
))
}
}
pub(super) async fn get_card(
State(state): State<AppState>,
Path(id): Path<String>,
) -> ApiResult<Json<serde_json::Value>> {
let client = state.pool.get().await.map_err(internal_error)?;
let row = client
.query_opt(
"UPDATE wrapped_cards SET view_count = view_count + 1 \
WHERE id = $1 RETURNING payload_json, created_at, view_count",
&[&id],
)
.await
.map_err(internal_error)?;
let Some(row) = row else {
return Err(err(StatusCode::NOT_FOUND, "not_found"));
};
let payload_json: String = row.get(0);
let created_at: chrono::DateTime<chrono::Utc> = row.get(1);
let view_count: i64 = row.get(2);
let card: serde_json::Value = serde_json::from_str(&payload_json).map_err(internal_error)?;
Ok(Json(serde_json::json!({
"id": id,
"created_at": created_at.to_rfc3339(),
"view_count": view_count,
"card": card,
})))
}
pub(super) async fn get_card_svg(
State(state): State<AppState>,
Path(id): Path<String>,
) -> ApiResult<axum::response::Response> {
let svg = fetch_card_svg(&state, &id).await?;
use axum::http::header::{CACHE_CONTROL, CONTENT_TYPE};
use axum::response::IntoResponse;
Ok((
[
(CONTENT_TYPE, "image/svg+xml; charset=utf-8"),
(CACHE_CONTROL, "public, max-age=86400"),
],
svg,
)
.into_response())
}
pub(super) async fn get_card_png(
State(state): State<AppState>,
Path(id): Path<String>,
) -> ApiResult<axum::response::Response> {
let svg = fetch_card_svg(&state, &id).await?;
let png = svg_to_png(&svg).map_err(internal_error)?;
use axum::http::header::{CACHE_CONTROL, CONTENT_TYPE};
use axum::response::IntoResponse;
Ok((
[
(CONTENT_TYPE, "image/png"),
(CACHE_CONTROL, "public, max-age=86400"),
],
png,
)
.into_response())
}
pub(super) async fn get_permalink_page(
State(state): State<AppState>,
Path(id): Path<String>,
) -> ApiResult<axum::response::Response> {
let client = state.pool.get().await.map_err(internal_error)?;
let row = client
.query_opt(
"UPDATE wrapped_cards SET view_count = view_count + 1 \
WHERE id = $1 RETURNING payload_json",
&[&id],
)
.await
.map_err(internal_error)?;
let Some(row) = row else {
return Err(err(StatusCode::NOT_FOUND, "not_found"));
};
let payload_json: String = row.get(0);
let payload: PublishPayload = serde_json::from_str(&payload_json).map_err(internal_error)?;
let html = render_permalink_html(
&id,
&payload,
&state.cfg.public_base_url,
&state.cfg.api_base_url,
);
use axum::http::header::CONTENT_TYPE;
use axum::response::IntoResponse;
Ok(([(CONTENT_TYPE, "text/html; charset=utf-8")], html).into_response())
}
#[derive(Serialize)]
pub(super) struct LeaderRow {
rank: usize,
id: String,
url: String,
display_name: Option<String>,
tokens_saved: i64,
cost_avoided_usd: f64,
compression_rate_pct: f64,
period: String,
pricing_estimated: bool,
}
#[derive(Serialize)]
pub(super) struct Leaderboard {
entries: Vec<LeaderRow>,
}
const LEADERBOARD_LIMIT: i64 = 50;
pub(super) async fn leaderboard(State(state): State<AppState>) -> ApiResult<Json<Leaderboard>> {
Ok(Json(Leaderboard {
entries: top_cards(&state).await?,
}))
}
pub(super) async fn get_leaderboard_page(
State(state): State<AppState>,
) -> ApiResult<axum::response::Response> {
let rows = top_cards(&state).await?;
let html = render_leaderboard_html(&rows, &state.cfg.public_base_url);
use axum::http::header::CONTENT_TYPE;
use axum::response::IntoResponse;
Ok(([(CONTENT_TYPE, "text/html; charset=utf-8")], html).into_response())
}
async fn top_cards(state: &AppState) -> ApiResult<Vec<LeaderRow>> {
let client = state.pool.get().await.map_err(internal_error)?;
let rows = client
.query(
"SELECT id, payload_json FROM ( \
SELECT DISTINCT ON (COALESCE(publisher_id, id)) \
id, payload_json, tokens_saved, created_at \
FROM wrapped_cards \
WHERE leaderboard_opt_in = TRUE \
ORDER BY COALESCE(publisher_id, id), tokens_saved DESC, created_at DESC \
) t \
ORDER BY tokens_saved DESC, created_at DESC LIMIT $1",
&[&LEADERBOARD_LIMIT],
)
.await
.map_err(internal_error)?;
let base = state.cfg.public_base_url.trim_end_matches('/');
let entries = rows
.iter()
.enumerate()
.filter_map(|(i, r)| {
let id: String = r.get(0);
let payload_json: String = r.get(1);
let p: PublishPayload = serde_json::from_str(&payload_json).ok()?;
Some(LeaderRow {
rank: i + 1,
url: format!("{base}/w/{id}"),
id,
display_name: p.display_name,
tokens_saved: p.tokens_saved,
cost_avoided_usd: p.cost_avoided_usd,
compression_rate_pct: p.compression_rate_pct,
period: p.period,
pricing_estimated: p.pricing_estimated,
})
})
.collect();
Ok(entries)
}
fn render_leaderboard_html(rows: &[LeaderRow], public_base: &str) -> String {
let base = public_base.trim_end_matches('/');
let mut items = String::new();
for row in rows {
let name = row
.display_name
.as_deref()
.map_or_else(|| "anonymous".to_string(), html_escape);
let tokens_u = u64::try_from(row.tokens_saved).unwrap_or(0);
let tokens = crate::core::wrapped::format_tokens(tokens_u);
let energy = crate::core::energy::format_for_tokens(tokens_u);
let comp = format!("{:.0}%", row.compression_rate_pct);
let est = if row.pricing_estimated { " est." } else { "" };
let rank_class = match row.rank {
1 => " lc-rank-1",
2 => " lc-rank-2",
3 => " lc-rank-3",
_ => "",
};
items.push_str(&format!(
r#"<li><a class="lc-row{rank_class}" href="{url}"><span class="lc-rank">#{rank}</span><span class="lc-id"><span class="lc-name">{name}</span><span class="lc-period">{period}</span></span><span class="lc-stats"><span class="lc-num">{tokens}</span><span class="lc-meta">{comp} compressed · {energy} saved</span><span class="lc-usd">${cost:.0}{est}</span></span></a></li>"#,
url = row.url,
rank = row.rank,
cost = row.cost_avoided_usd,
period = html_escape(&row.period),
));
}
let board = if items.is_empty() {
r#"<div class="lc-empty">No one has opted in yet — be the first:<br/><code>lean-ctx gain --publish --leaderboard</code></div>"#.to_string()
} else {
format!(r#"<ol class="lc-board">{items}</ol>"#)
};
let head = format!(
r#"<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>lean-ctx Leaderboard — top realized token savings</title>
<meta name="description" content="Top token savings, opted in by lean-ctx users. Open source — your AI sees only what matters."/>
<link rel="canonical" href="{base}/leaderboard"/>
{fonts}
<style>{css}</style>"#,
fonts = super::site_theme::FONT_LINKS,
css = super::site_theme::THEME_CSS,
);
format!(
r#"<!doctype html>
<html lang="en">
<head>
{head}
</head>
<body>
{header}
<main class="lc-container">
<section class="lc-hero">
<span class="lc-label">Verified savings</span>
<h1>Leaderboard</h1>
<p>The most realized token savings, opted in by lean-ctx users. Every number comes from each user's tamper-evident local ledger.</p>
</section>
{board}
<section class="lc-cta-section">
<h2>Put your savings on the board</h2>
<p>Install lean-ctx, then publish your Wrapped recap.</p>
<a class="lc-cta" href="{base}/docs/getting-started/">Install lean-ctx</a>
</section>
</main>
{footer}
</body>
</html>"#,
header = super::site_theme::header(base),
footer = super::site_theme::footer(base),
)
}
async fn fetch_card_svg(state: &AppState, id: &str) -> ApiResult<String> {
let client = state.pool.get().await.map_err(internal_error)?;
let row = client
.query_opt(
"SELECT payload_json FROM wrapped_cards WHERE id = $1",
&[&id],
)
.await
.map_err(internal_error)?;
let Some(row) = row else {
return Err(err(StatusCode::NOT_FOUND, "not_found"));
};
let payload_json: String = row.get(0);
let payload: PublishPayload = serde_json::from_str(&payload_json).map_err(internal_error)?;
Ok(payload.to_report().to_svg())
}
fn svg_to_png(svg: &str) -> Result<Vec<u8>, String> {
use resvg::{tiny_skia, usvg};
let mut opt = usvg::Options::default();
{
let db = opt.fontdb_mut();
db.load_system_fonts();
db.set_serif_family("DejaVu Serif");
db.set_sans_serif_family("DejaVu Sans");
db.set_monospace_family("DejaVu Sans Mono");
}
opt.font_family = "DejaVu Sans".to_string();
let tree = usvg::Tree::from_str(svg, &opt).map_err(|e| format!("svg parse: {e}"))?;
let size = tree.size().to_int_size();
let mut pixmap = tiny_skia::Pixmap::new(size.width(), size.height())
.ok_or_else(|| "pixmap alloc failed".to_string())?;
resvg::render(&tree, tiny_skia::Transform::default(), &mut pixmap.as_mut());
pixmap.encode_png().map_err(|e| format!("png encode: {e}"))
}
fn html_escape(s: &str) -> String {
s.replace('&', "&")
.replace('<', "<")
.replace('>', ">")
.replace('"', """)
.replace('\'', "'")
}
fn render_permalink_html(
id: &str,
p: &PublishPayload,
public_base: &str,
api_base: &str,
) -> String {
let report = p.to_report();
let svg = report.to_svg();
let tokens = crate::core::wrapped::format_tokens(report.tokens_saved);
let cost = format!("${:.2}", report.cost_avoided_usd);
let est = if report.pricing_estimated {
" (est.)"
} else {
""
};
let who = p.display_name.as_deref().map(html_escape);
let title = match &who {
Some(n) => format!("{n}'s lean-ctx Wrapped"),
None => "lean-ctx Wrapped".to_string(),
};
let description = format!(
"Saved {tokens} tokens (~{cost}{est}) with lean-ctx — my AI saw only what mattered."
);
let page_url = format!("{}/w/{}", public_base.trim_end_matches('/'), id);
let img_url = format!(
"{}/api/wrapped/{}/card.png",
api_base.trim_end_matches('/'),
id
);
let base = public_base.trim_end_matches('/');
format!(
r#"<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>{title}</title>
<meta name="description" content="{description}"/>
<link rel="canonical" href="{page_url}"/>
<meta property="og:type" content="website"/>
<meta property="og:site_name" content="lean-ctx"/>
<meta property="og:title" content="{title}"/>
<meta property="og:description" content="{description}"/>
<meta property="og:url" content="{page_url}"/>
<meta property="og:image" content="{img_url}"/>
<meta property="og:image:width" content="1200"/>
<meta property="og:image:height" content="630"/>
<meta name="twitter:card" content="summary_large_image"/>
<meta name="twitter:title" content="{title}"/>
<meta name="twitter:description" content="{description}"/>
<meta name="twitter:image" content="{img_url}"/>
{fonts}
<style>{css}</style>
</head>
<body>
{header}
<main class="lc-container">
<section class="lc-card-wrap">
{svg}
</section>
<section class="lc-cta-section">
<h2>Make your own Wrapped</h2>
<p>Install lean-ctx — your AI sees only what matters.</p>
<a class="lc-cta" href="{base}/docs/getting-started/">Install lean-ctx</a>
</section>
</main>
{footer}
</body>
</html>"#,
fonts = super::site_theme::FONT_LINKS,
css = super::site_theme::THEME_CSS,
header = super::site_theme::header(base),
footer = super::site_theme::footer(base),
)
}
pub(super) async fn delete_card(
State(state): State<AppState>,
headers: HeaderMap,
Path(id): Path<String>,
) -> ApiResult<Json<serde_json::Value>> {
let token =
edit_token_header(&headers).ok_or_else(|| err(StatusCode::FORBIDDEN, "forbidden"))?;
let client = state.pool.get().await.map_err(internal_error)?;
let stored = fetch_token_hash(&client, &id).await?;
require_token(&token, &stored)?;
client
.execute("DELETE FROM wrapped_cards WHERE id = $1", &[&id])
.await
.map_err(internal_error)?;
Ok(Json(serde_json::json!({ "deleted": true })))
}
pub(super) async fn claim_card(
State(state): State<AppState>,
headers: HeaderMap,
Path(id): Path<String>,
) -> ApiResult<Json<serde_json::Value>> {
let (user_id, _) = auth_user(&state, &headers).await?;
let token =
edit_token_header(&headers).ok_or_else(|| err(StatusCode::FORBIDDEN, "forbidden"))?;
let client = state.pool.get().await.map_err(internal_error)?;
let stored = fetch_token_hash(&client, &id).await?;
require_token(&token, &stored)?;
client
.execute(
"UPDATE wrapped_cards SET user_id = $1 WHERE id = $2",
&[&user_id, &id],
)
.await
.map_err(internal_error)?;
Ok(Json(serde_json::json!({ "claimed": true })))
}
async fn fetch_token_hash(client: &tokio_postgres::Client, id: &str) -> ApiResult<String> {
let row = client
.query_opt(
"SELECT edit_token_hash FROM wrapped_cards WHERE id = $1",
&[&id],
)
.await
.map_err(internal_error)?;
match row {
Some(r) => Ok(r.get(0)),
None => Err(err(StatusCode::NOT_FOUND, "not_found")),
}
}
fn require_token(presented: &str, stored_hash: &str) -> ApiResult<()> {
if constant_time_eq(sha256_hex(presented).as_bytes(), stored_hash.as_bytes()) {
Ok(())
} else {
Err(err(StatusCode::FORBIDDEN, "forbidden"))
}
}
fn edit_token_header(headers: &HeaderMap) -> Option<String> {
let v = headers.get("x-edit-token")?.to_str().ok()?.trim();
(!v.is_empty()).then(|| v.to_string())
}
fn generate_card_id() -> String {
let bytes: [u8; 16] = rand::random();
hex::encode(bytes)
}
fn client_ip_hash(headers: &HeaderMap, salt: &str) -> Option<String> {
let ip = headers
.get("x-forwarded-for")
.and_then(|v| v.to_str().ok())
.and_then(|s| s.split(',').next())
.map(str::trim)
.filter(|s| !s.is_empty())
.or_else(|| {
headers
.get("x-real-ip")
.and_then(|v| v.to_str().ok())
.map(str::trim)
.filter(|s| !s.is_empty())
})?;
Some(sha256_hex(&format!("{salt}:{ip}")))
}
#[cfg(test)]
mod tests {
use super::*;
fn valid() -> PublishPayload {
PublishPayload {
period: "week".into(),
tokens_saved: 480_600_000,
cost_avoided_usd: 1441.79,
pricing_estimated: true,
compression_rate_pct: 91.2,
total_commands: 1234,
sessions_count: 56,
files_touched: 789,
top_commands: vec![TopCommand {
name: "ctx_search".into(),
pct: 60.0,
}],
model_key: Some("claude-opus".into()),
display_name: Some("yvesg".into()),
leaderboard_opt_in: false,
}
}
#[test]
fn accepts_a_well_formed_payload() {
assert!(valid().validate().is_ok());
}
#[test]
fn signed_envelope_roundtrips_and_rejects_tampering() {
use crate::core::agent_identity::hex_encode;
use ed25519_dalek::{Signer, SigningKey};
let key = SigningKey::from_bytes(&[7u8; 32]);
let payload_json = serde_json::to_string(&valid()).unwrap();
let pubkey_hex = hex_encode(&key.verifying_key().to_bytes());
let sig_hex = hex_encode(&key.sign(payload_json.as_bytes()).to_bytes());
let env = SignedEnvelope {
payload_json: payload_json.clone(),
public_key: Some(pubkey_hex.clone()),
signature: Some(sig_hex.clone()),
};
let (parsed, publisher_id) = verify_signed_envelope(&env).expect("valid signature");
assert_eq!(parsed.period, "week");
assert_eq!(publisher_id.len(), PUBLISHER_ID_HEX_LEN);
let again = SignedEnvelope {
payload_json: payload_json.clone(),
public_key: Some(pubkey_hex.clone()),
signature: Some(sig_hex.clone()),
};
assert_eq!(verify_signed_envelope(&again).unwrap().1, publisher_id);
let tampered = SignedEnvelope {
payload_json: payload_json.replacen("480600000", "999999999", 1),
public_key: Some(pubkey_hex.clone()),
signature: Some(sig_hex),
};
assert!(verify_signed_envelope(&tampered).is_err());
let unsigned = SignedEnvelope {
payload_json,
public_key: Some(pubkey_hex),
signature: None,
};
assert!(verify_signed_envelope(&unsigned).is_err());
}
#[test]
fn rejects_unknown_fields() {
let json = r#"{"period":"week","tokens_saved":1,"cost_avoided_usd":0.1,
"pricing_estimated":false,"compression_rate_pct":50,"total_commands":1,
"sessions_count":1,"files_touched":1,"repo_path":"/secret/path"}"#;
assert!(serde_json::from_str::<PublishPayload>(json).is_err());
}
#[test]
fn rejects_bad_period_and_ranges() {
let mut p = valid();
p.period = "year".into();
assert!(p.validate().is_err());
let mut p = valid();
p.compression_rate_pct = 150.0;
assert!(p.validate().is_err());
let mut p = valid();
p.tokens_saved = -1;
assert!(p.validate().is_err());
let mut p = valid();
p.cost_avoided_usd = f64::NAN;
assert!(p.validate().is_err());
}
#[test]
fn rejects_oversized_and_markup_text() {
let mut p = valid();
p.display_name = Some("a".repeat(MAX_LABEL_LEN + 1));
assert!(p.validate().is_err());
let mut p = valid();
p.display_name = Some("<script>".into());
assert!(p.validate().is_err());
let mut p = valid();
p.top_commands = (0..=MAX_TOP_COMMANDS)
.map(|_| TopCommand {
name: "git".into(),
pct: 1.0,
})
.collect();
assert!(p.validate().is_err());
}
#[test]
fn png_rasterizes_to_a_valid_image() {
let svg = valid().to_report().to_svg();
let png = svg_to_png(&svg).expect("rasterize");
assert!(
png.len() > 5000,
"expected a non-trivial PNG, got {} bytes",
png.len()
);
assert_eq!(&png[1..4], b"PNG", "must have a PNG signature");
let _ = std::fs::write("/tmp/lc_card_test.png", &png);
}
#[test]
fn permalink_html_carries_per_card_og_meta() {
let p = valid();
let html = render_permalink_html(
"abc123",
&p,
"https://leanctx.com",
"https://api.leanctx.com",
);
assert!(html.contains(
r#"property="og:image" content="https://api.leanctx.com/api/wrapped/abc123/card.png""#
));
assert!(html.contains(r#"property="og:url" content="https://leanctx.com/w/abc123""#));
assert!(html.contains("twitter:card"));
assert!(
html.contains("yvesg's lean-ctx Wrapped"),
"display_name personalizes the title"
);
assert!(html.contains("<svg"), "card is embedded inline");
}
#[test]
fn leaderboard_html_uses_site_theme_shell() {
let rows = vec![
LeaderRow {
rank: 1,
id: "a".into(),
url: "https://leanctx.com/w/a".into(),
display_name: Some("yvesg".into()),
tokens_saved: 486_000_000,
cost_avoided_usd: 1458.0,
compression_rate_pct: 67.7,
period: "all".into(),
pricing_estimated: true,
},
LeaderRow {
rank: 2,
id: "b".into(),
url: "https://leanctx.com/w/b".into(),
display_name: None,
tokens_saved: 12_800_000,
cost_avoided_usd: 32.0,
compression_rate_pct: 60.2,
period: "month".into(),
pricing_estimated: false,
},
LeaderRow {
rank: 3,
id: "c".into(),
url: "https://leanctx.com/w/c".into(),
display_name: Some("roland".into()),
tokens_saved: 4_200_000,
cost_avoided_usd: 11.0,
compression_rate_pct: 55.0,
period: "week".into(),
pricing_estimated: false,
},
];
let html = render_leaderboard_html(&rows, "https://leanctx.com");
assert!(
html.contains("--accent:#34d399"),
"carries the site accent token"
);
assert!(html.contains("Space Grotesk"), "loads the display font");
assert!(html.contains("lc-logo-ctx"), "renders the LeanCTX wordmark");
assert!(
html.contains(r#"class="lc-row lc-rank-1""#),
"top row is highlighted"
);
assert!(html.contains("lc-footer"), "carries the branded footer");
assert!(html.contains("yvesg"), "shows opted-in display names");
let _ = std::fs::write("/tmp/lc_leaderboard.html", &html);
}
#[test]
fn html_escape_neutralizes_markup() {
assert_eq!(
html_escape(r#"<b>&"x"</b>"#),
"<b>&"x"</b>"
);
}
#[test]
fn ip_hash_is_salted_and_omitted_without_headers() {
let mut h = HeaderMap::new();
assert!(client_ip_hash(&h, "salt").is_none());
h.insert("x-forwarded-for", "203.0.113.7, 10.0.0.1".parse().unwrap());
let a = client_ip_hash(&h, "salt-a").unwrap();
let b = client_ip_hash(&h, "salt-b").unwrap();
assert_ne!(a, b, "different salts must yield different hashes");
assert!(!a.contains("203.0.113.7"), "raw IP must never appear");
}
}