From eb27fed59dc076ae5f254e99b6149cf72f7fb703 Mon Sep 17 00:00:00 2001 From: AnnaFYZ Date: Tue, 21 Oct 2025 16:59:20 +0100 Subject: [PATCH 1/7] expects token from header --- src/endpoints.rs | 7 +++++-- src/frontend.rs | 8 +++++--- src/sheets.rs | 12 +++++++++--- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/endpoints.rs b/src/endpoints.rs index 9eff84d..6c09397 100644 --- a/src/endpoints.rs +++ b/src/endpoints.rs @@ -1,5 +1,6 @@ use std::collections::BTreeMap; +use http::HeaderMap; use ::octocrab::models::{teams::RequestedTeam, Author}; use anyhow::Context; use axum::{ @@ -193,11 +194,12 @@ pub struct Region { pub async fn get_region( session: Session, + headers: HeaderMap, State(server_state): State, OriginalUri(original_uri): OriginalUri, Path(github_login): Path, ) -> Result, Error> { - let sheets_client = sheets_client(&session, server_state.clone(), original_uri.clone()).await?; + let sheets_client = sheets_client(&session, server_state.clone(), headers, original_uri.clone()).await?; let trainees = get_trainees( sheets_client, &server_state.config.github_email_mapping_sheet_id, @@ -222,11 +224,12 @@ pub struct AttendanceResponse { pub async fn fetch_attendance( session: Session, + headers: HeaderMap, State(server_state): State, OriginalUri(original_uri): OriginalUri, ) -> Result, Error> { let all_courses = &server_state.config.courses; - let sheets_client = sheets_client(&session, server_state.clone(), original_uri.clone()).await?; + let sheets_client = sheets_client(&session, server_state.clone(), headers, original_uri.clone()).await?; let mut courses: CourseAttendance = BTreeMap::new(); let mut register_futures = Vec::new(); diff --git a/src/frontend.rs b/src/frontend.rs index 4d87fb0..b06050d 100644 --- a/src/frontend.rs +++ b/src/frontend.rs @@ -7,7 +7,7 @@ use axum::{ response::{Html, IntoResponse, Response}, }; use futures::future::join_all; -use http::{header::CONTENT_TYPE, StatusCode, Uri}; +use http::{header::{CONTENT_TYPE}, HeaderMap, StatusCode, Uri}; use serde::Deserialize; use tower_sessions::Session; @@ -95,11 +95,12 @@ struct CourseScheduleWithBatchMetadata { pub async fn get_trainee_batch( session: Session, + headers: HeaderMap, State(server_state): State, OriginalUri(original_uri): OriginalUri, Path((course, batch_github_slug)): Path<(String, String)>, ) -> Result, Error> { - let sheets_client = sheets_client(&session, server_state.clone(), original_uri.clone()).await?; + let sheets_client = sheets_client(&session, server_state.clone(), headers, original_uri.clone()).await?; let github_org = &server_state.config.github_org; let course_schedule = server_state .config @@ -182,11 +183,12 @@ impl TraineeBatchTemplate { pub async fn get_reviewers( session: Session, + headers: HeaderMap, State(server_state): State, OriginalUri(original_uri): OriginalUri, Path(course): Path, ) -> Result, Error> { - let sheets_client = sheets_client(&session, server_state.clone(), original_uri.clone()).await?; + let sheets_client = sheets_client(&session, server_state.clone(), headers, original_uri.clone()).await?; let mut is_staff = true; let mut staff_details = get_reviewer_staff_info( sheets_client, diff --git a/src/sheets.rs b/src/sheets.rs index 7f13ddd..2df231c 100644 --- a/src/sheets.rs +++ b/src/sheets.rs @@ -1,5 +1,5 @@ use anyhow::Context; -use http::Uri; +use http::{HeaderMap, Uri}; use sheets::{spreadsheets::Spreadsheets, types::CellData}; use tower_sessions::Session; @@ -35,12 +35,18 @@ pub(crate) fn cell_date(cell: &CellData) -> Result Result { - let maybe_token: Option = session + let maybe_token = if let Some(auth_header) = headers.get("x-authorization-google") { + let token = auth_header.to_str().unwrap_or_default().to_string(); + Some(token) + } else { + session .get(GoogleScope::Sheets.token_session_key()) .await - .context("Session load error")?; + .context("Session load error")? + }; let redirect_endpoint = redirect_endpoint(&server_state); From a76809d068f0e23b395d22e2e97850133afe3c7f Mon Sep 17 00:00:00 2001 From: AnnaFYZ Date: Tue, 21 Oct 2025 17:02:49 +0100 Subject: [PATCH 2/7] rmt ran --- src/endpoints.rs | 18 +++++++++++++++--- src/frontend.rs | 18 +++++++++++++++--- src/sheets.rs | 8 ++++---- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/endpoints.rs b/src/endpoints.rs index 6c09397..0e4d2a9 100644 --- a/src/endpoints.rs +++ b/src/endpoints.rs @@ -1,6 +1,5 @@ use std::collections::BTreeMap; -use http::HeaderMap; use ::octocrab::models::{teams::RequestedTeam, Author}; use anyhow::Context; use axum::{ @@ -9,6 +8,7 @@ use axum::{ Json, }; use futures::future::join_all; +use http::HeaderMap; use indexmap::IndexMap; use serde::Serialize; use tower_sessions::Session; @@ -199,7 +199,13 @@ pub async fn get_region( OriginalUri(original_uri): OriginalUri, Path(github_login): Path, ) -> Result, Error> { - let sheets_client = sheets_client(&session, server_state.clone(), headers, original_uri.clone()).await?; + let sheets_client = sheets_client( + &session, + server_state.clone(), + headers, + original_uri.clone(), + ) + .await?; let trainees = get_trainees( sheets_client, &server_state.config.github_email_mapping_sheet_id, @@ -229,7 +235,13 @@ pub async fn fetch_attendance( OriginalUri(original_uri): OriginalUri, ) -> Result, Error> { let all_courses = &server_state.config.courses; - let sheets_client = sheets_client(&session, server_state.clone(), headers, original_uri.clone()).await?; + let sheets_client = sheets_client( + &session, + server_state.clone(), + headers, + original_uri.clone(), + ) + .await?; let mut courses: CourseAttendance = BTreeMap::new(); let mut register_futures = Vec::new(); diff --git a/src/frontend.rs b/src/frontend.rs index b06050d..8681d8e 100644 --- a/src/frontend.rs +++ b/src/frontend.rs @@ -7,7 +7,7 @@ use axum::{ response::{Html, IntoResponse, Response}, }; use futures::future::join_all; -use http::{header::{CONTENT_TYPE}, HeaderMap, StatusCode, Uri}; +use http::{header::CONTENT_TYPE, HeaderMap, StatusCode, Uri}; use serde::Deserialize; use tower_sessions::Session; @@ -100,7 +100,13 @@ pub async fn get_trainee_batch( OriginalUri(original_uri): OriginalUri, Path((course, batch_github_slug)): Path<(String, String)>, ) -> Result, Error> { - let sheets_client = sheets_client(&session, server_state.clone(), headers, original_uri.clone()).await?; + let sheets_client = sheets_client( + &session, + server_state.clone(), + headers, + original_uri.clone(), + ) + .await?; let github_org = &server_state.config.github_org; let course_schedule = server_state .config @@ -188,7 +194,13 @@ pub async fn get_reviewers( OriginalUri(original_uri): OriginalUri, Path(course): Path, ) -> Result, Error> { - let sheets_client = sheets_client(&session, server_state.clone(), headers, original_uri.clone()).await?; + let sheets_client = sheets_client( + &session, + server_state.clone(), + headers, + original_uri.clone(), + ) + .await?; let mut is_staff = true; let mut staff_details = get_reviewer_staff_info( sheets_client, diff --git a/src/sheets.rs b/src/sheets.rs index 2df231c..9b279ba 100644 --- a/src/sheets.rs +++ b/src/sheets.rs @@ -43,10 +43,10 @@ pub(crate) async fn sheets_client( Some(token) } else { session - .get(GoogleScope::Sheets.token_session_key()) - .await - .context("Session load error")? - }; + .get(GoogleScope::Sheets.token_session_key()) + .await + .context("Session load error")? + }; let redirect_endpoint = redirect_endpoint(&server_state); From 44f485bbe16edad4366933411cbb34b87963ee6d Mon Sep 17 00:00:00 2001 From: AnnaFYZ Date: Wed, 22 Oct 2025 18:38:25 +0100 Subject: [PATCH 3/7] error handling refactor --- src/sheets.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/sheets.rs b/src/sheets.rs index 9b279ba..b600312 100644 --- a/src/sheets.rs +++ b/src/sheets.rs @@ -39,7 +39,15 @@ pub(crate) async fn sheets_client( original_uri: Uri, ) -> Result { let maybe_token = if let Some(auth_header) = headers.get("x-authorization-google") { - let token = auth_header.to_str().unwrap_or_default().to_string(); + let token = match auth_header.to_str() { + Ok(s) => Some(s.to_string()), + Err(e) => { + return Err(Error::UserFacing(format!( + "Invalid token in the header: {}", + e + ))) + } + }; Some(token) } else { session From 0563f191a102aa897577bd482d5fb4689f8d1634 Mon Sep 17 00:00:00 2001 From: AnnaFYZ Date: Wed, 22 Oct 2025 18:47:53 +0100 Subject: [PATCH 4/7] error handling refactor --- src/sheets.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sheets.rs b/src/sheets.rs index b600312..6221a55 100644 --- a/src/sheets.rs +++ b/src/sheets.rs @@ -48,7 +48,7 @@ pub(crate) async fn sheets_client( ))) } }; - Some(token) + token } else { session .get(GoogleScope::Sheets.token_session_key()) From 47dda48457a2fadd44230fababfa55b8678f5cd1 Mon Sep 17 00:00:00 2001 From: AnnaFYZ Date: Wed, 12 Nov 2025 09:20:36 +0000 Subject: [PATCH 5/7] tokend name added to the error message --- src/sheets.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/sheets.rs b/src/sheets.rs index 6221a55..df499b4 100644 --- a/src/sheets.rs +++ b/src/sheets.rs @@ -1,5 +1,6 @@ use anyhow::Context; use http::{HeaderMap, Uri}; +use octocrab::auth; use sheets::{spreadsheets::Spreadsheets, types::CellData}; use tower_sessions::Session; @@ -38,13 +39,14 @@ pub(crate) async fn sheets_client( headers: HeaderMap, original_uri: Uri, ) -> Result { - let maybe_token = if let Some(auth_header) = headers.get("x-authorization-google") { + const AUTHORIZATION_HEADER: &str = "x-authorization-google"; + let maybe_token = if let Some(auth_header) = headers.get(AUTHORIZATION_HEADER) { let token = match auth_header.to_str() { Ok(s) => Some(s.to_string()), Err(e) => { return Err(Error::UserFacing(format!( - "Invalid token in the header: {}", - e + "Invalid {} in the header: {}", + AUTHORIZATION_HEADER, e ))) } }; From 4d405a69c29feb7cb2afab4b0e1f083064e462f0 Mon Sep 17 00:00:00 2001 From: AnnaFYZ Date: Wed, 12 Nov 2025 09:25:44 +0000 Subject: [PATCH 6/7] removed mistery appeared octocrab --- src/sheets.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/sheets.rs b/src/sheets.rs index df499b4..aa8dd70 100644 --- a/src/sheets.rs +++ b/src/sheets.rs @@ -1,6 +1,5 @@ use anyhow::Context; use http::{HeaderMap, Uri}; -use octocrab::auth; use sheets::{spreadsheets::Spreadsheets, types::CellData}; use tower_sessions::Session; From 0b7d48f79541f19faee3696bef663fa3475d6d49 Mon Sep 17 00:00:00 2001 From: Anna <113105718+AnnaFYZ@users.noreply.github.com> Date: Wed, 12 Nov 2025 11:40:29 +0000 Subject: [PATCH 7/7] Update error message in src/sheets.rs Co-authored-by: Daniel Wagner-Hall --- src/sheets.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sheets.rs b/src/sheets.rs index aa8dd70..e52ae37 100644 --- a/src/sheets.rs +++ b/src/sheets.rs @@ -44,7 +44,7 @@ pub(crate) async fn sheets_client( Ok(s) => Some(s.to_string()), Err(e) => { return Err(Error::UserFacing(format!( - "Invalid {} in the header: {}", + "Invalid {} header: {}", AUTHORIZATION_HEADER, e ))) }