v0.0.15: unalias, admin alias removal, /reply, web version fix
Aliases: - /unalias — remove your own alias - /admin-unalias <alias> <password> — admin removes any alias - Admin password via WARZONE_ADMIN_PASSWORD env var (default: "admin") - POST /v1/alias/unregister + POST /v1/alias/admin-remove Reply: - /r or /reply — switches peer to whoever last DM'd you - lastDmPeer tracked on both web and TUI - Then type normally to reply Web: - Version bumped to 0.0.15 (was stuck at 0.0.10) - WASM rebuilt with latest protocol Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -21,6 +21,8 @@ pub fn routes() -> Router<AppState> {
|
||||
.route("/alias/resolve/:name", get(resolve_alias))
|
||||
.route("/alias/list", get(list_aliases))
|
||||
.route("/alias/whois/:fingerprint", get(reverse_lookup))
|
||||
.route("/alias/unregister", post(unregister_alias))
|
||||
.route("/alias/admin-remove", post(admin_remove_alias))
|
||||
}
|
||||
|
||||
fn normalize_fp(fp: &str) -> String {
|
||||
@@ -337,3 +339,61 @@ async fn list_aliases(
|
||||
|
||||
Ok(Json(serde_json::json!({ "aliases": aliases, "count": aliases.len() })))
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct UnregisterRequest {
|
||||
fingerprint: String,
|
||||
}
|
||||
|
||||
/// Remove your own alias.
|
||||
async fn unregister_alias(
|
||||
State(state): State<AppState>,
|
||||
Json(req): Json<UnregisterRequest>,
|
||||
) -> AppResult<Json<serde_json::Value>> {
|
||||
let fp = normalize_fp(&req.fingerprint);
|
||||
|
||||
let alias = match state.db.aliases.get(format!("fp:{}", fp).as_bytes())? {
|
||||
Some(data) => String::from_utf8_lossy(&data).to_string(),
|
||||
None => return Ok(Json(serde_json::json!({ "error": "no alias registered" }))),
|
||||
};
|
||||
|
||||
if let Some(record) = load_alias_record(&state.db.aliases, &alias) {
|
||||
if record.fingerprint != fp {
|
||||
return Ok(Json(serde_json::json!({ "error": "not your alias" })));
|
||||
}
|
||||
delete_alias_record(&state.db.aliases, &record)?;
|
||||
tracing::info!("Alias '{}' unregistered by {}", alias, fp);
|
||||
}
|
||||
|
||||
Ok(Json(serde_json::json!({ "ok": true, "removed": alias })))
|
||||
}
|
||||
|
||||
/// Admin password (set via WARZONE_ADMIN_PASSWORD env var, defaults to "admin").
|
||||
fn admin_password() -> String {
|
||||
std::env::var("WARZONE_ADMIN_PASSWORD").unwrap_or_else(|_| "admin".to_string())
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct AdminRemoveRequest {
|
||||
alias: String,
|
||||
admin_password: String,
|
||||
}
|
||||
|
||||
/// Admin: remove any alias.
|
||||
async fn admin_remove_alias(
|
||||
State(state): State<AppState>,
|
||||
Json(req): Json<AdminRemoveRequest>,
|
||||
) -> AppResult<Json<serde_json::Value>> {
|
||||
if req.admin_password != admin_password() {
|
||||
return Ok(Json(serde_json::json!({ "error": "invalid admin password" })));
|
||||
}
|
||||
|
||||
let alias = normalize_alias(&req.alias);
|
||||
if let Some(record) = load_alias_record(&state.db.aliases, &alias) {
|
||||
delete_alias_record(&state.db.aliases, &record)?;
|
||||
tracing::info!("Alias '{}' removed by admin", alias);
|
||||
Ok(Json(serde_json::json!({ "ok": true, "removed": alias })))
|
||||
} else {
|
||||
Ok(Json(serde_json::json!({ "error": "alias not found" })))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user