Skip to main content

flatland_cli/
auth_context.rs

1//! Resolve control-plane credentials for play and CLI (session file, env tokens).
2
3use flatland_protocol::AuthCredential;
4
5use crate::config::{default_api_base, SessionConfig};
6
7/// Bearer token + metadata for HTTP and game connect.
8#[derive(Debug, Clone)]
9pub struct PlayAuth {
10    pub api_base: String,
11    pub bearer: String,
12    pub kind: PlayAuthKind,
13}
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub enum PlayAuthKind {
17    Session,
18    ApiToken,
19}
20
21impl PlayAuth {
22    #[allow(dead_code)]
23    pub fn game_credential(&self, character_id: uuid::Uuid) -> AuthCredential {
24        match self.kind {
25            PlayAuthKind::Session => AuthCredential::Session {
26                token: self.bearer.clone(),
27            },
28            PlayAuthKind::ApiToken => AuthCredential::ApiToken {
29                token: self.bearer.clone(),
30                character_id,
31            },
32        }
33    }
34}
35
36/// True when play can start without showing the in-TUI login screen.
37pub fn credentials_available() -> bool {
38    if std::env::var("FLATLAND_API_TOKEN")
39        .map(|t| !t.is_empty())
40        .unwrap_or(false)
41    {
42        return true;
43    }
44    if std::env::var("FLATLAND_SESSION_TOKEN")
45        .map(|t| !t.is_empty())
46        .unwrap_or(false)
47    {
48        return true;
49    }
50    SessionConfig::path()
51        .ok()
52        .map(|p| p.is_file())
53        .unwrap_or(false)
54}
55
56pub fn load_play_auth() -> anyhow::Result<PlayAuth> {
57    let api_base = default_api_base();
58
59    if let Ok(token) = std::env::var("FLATLAND_API_TOKEN") {
60        if !token.is_empty() {
61            return Ok(PlayAuth {
62                api_base,
63                bearer: token,
64                kind: PlayAuthKind::ApiToken,
65            });
66        }
67    }
68
69    if let Ok(token) = std::env::var("FLATLAND_SESSION_TOKEN") {
70        if !token.is_empty() {
71            return Ok(PlayAuth {
72                api_base,
73                bearer: token,
74                kind: PlayAuthKind::Session,
75            });
76        }
77    }
78
79    let session = SessionConfig::load()?;
80    Ok(PlayAuth {
81        api_base: session.api_base,
82        bearer: session.session_token,
83        kind: PlayAuthKind::Session,
84    })
85}