Skip to main content

apm/cmd/
revoke.rs

1use anyhow::Result;
2use std::path::Path;
3
4pub fn run(
5    root: &Path,
6    username: Option<&str>,
7    device: Option<&str>,
8    all: bool,
9) -> Result<()> {
10    let config = apm_core::config::Config::load(root)?;
11    let url = format!("{}/api/auth/sessions", config.server.url);
12    let body = serde_json::json!({
13        "username": username,
14        "device": device,
15        "all": all,
16    });
17    let client = reqwest::blocking::Client::new();
18    let resp = client
19        .delete(&url)
20        .json(&body)
21        .send()
22        .map_err(|e| anyhow::anyhow!("error: cannot connect to apm-server: {e}"))?;
23    if !resp.status().is_success() {
24        let status = resp.status();
25        eprintln!("error: server returned {status}");
26        std::process::exit(1);
27    }
28    let json: serde_json::Value = resp
29        .json()
30        .map_err(|e| anyhow::anyhow!("error: invalid response from server: {e}"))?;
31    let revoked = json
32        .get("revoked")
33        .and_then(|v| v.as_u64())
34        .ok_or_else(|| anyhow::anyhow!("error: missing revoked field in response"))? as usize;
35    if revoked == 0 {
36        if let Some(u) = username {
37            println!("No sessions found for {u}.");
38        } else {
39            println!("Revoked 0 session(s).");
40        }
41    } else {
42        println!("Revoked {revoked} session(s).");
43    }
44    Ok(())
45}