🗝
summary refs log tree commit diff
path: root/src/server/account.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/account.rs')
-rw-r--r--src/server/account.rs32
1 files changed, 26 insertions, 6 deletions
diff --git a/src/server/account.rs b/src/server/account.rs
index b2c294f..8f9ae61 100644
--- a/src/server/account.rs
+++ b/src/server/account.rs
@@ -2,7 +2,7 @@ use std::time::SystemTime;
 
 use axum::{
     body::Body,
-    extract::State,
+    extract::{Path, State},
     http::{HeaderMap, StatusCode, Uri},
     response::{IntoResponse, Response},
     routing::get,
@@ -18,7 +18,7 @@ use super::{account_auth, render_html, ApiState};
 
 pub fn bind(app: Router<ApiState>) -> Router<ApiState> {
     app.route("/", get(get_panel))
-        .route("/scopes", get(get_scopes))
+        .route("/scopes/:token", get(get_scopes))
         .route("/handoff", get(get_handoff))
 }
 
@@ -41,10 +41,30 @@ fn render_normal_panel(name: String) -> Response {
 }
 
 #[axum::debug_handler(state = ApiState)]
-async fn get_scopes(jar: CookieJar, State(store): State<Store>) -> Result<Response, Response> {
-    let name = account_auth(&jar, &store).await.prompt_login()?;
-    let account = store.get_account(&name).await.prompt_logout()?;
-    let body = account.scopes.join(" ");
+async fn get_scopes(
+    Path(token): Path<String>,
+    State(store): State<Store>,
+) -> Result<Response, Response> {
+    let error_response = || {
+        Response::builder()
+            .status(StatusCode::BAD_REQUEST)
+            .body(Body::empty())
+            .unwrap()
+    };
+    let mut parts = Vec::new();
+    let (name, expires) = store.check_token(&token).await.ok_or_else(error_response)?;
+    parts.push(
+        expires
+            .duration_since(SystemTime::UNIX_EPOCH)
+            .unwrap()
+            .as_secs()
+            .to_string(),
+    );
+    {
+        let account = store.get_account(&name).await.ok_or_else(error_response)?;
+        parts.extend(account.scopes.iter().cloned());
+    };
+    let body = parts.join("\n");
 
     Ok(Response::builder()
         .status(StatusCode::OK)