From 605101062a62c28ba02f7e49527e0a08b2ec1a22 Mon Sep 17 00:00:00 2001 From: mdecimus Date: Fri, 6 Jun 2025 08:11:50 +0200 Subject: [PATCH] Allow unauthenticated access to JMAP session object --- crates/http/src/request.rs | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/crates/http/src/request.rs b/crates/http/src/request.rs index 3c4102ed..8f5e7e18 100644 --- a/crates/http/src/request.rs +++ b/crates/http/src/request.rs @@ -37,7 +37,7 @@ use jmap::{ websocket::upgrade::WebSocketUpgrade, }; use jmap_proto::{ - request::Request, + request::{Request, capability::Session}, types::{blob::BlobId, id::Id}, }; use store::dispatch::lookup::KeyValue; @@ -199,6 +199,26 @@ impl ParseHttp for Server { .upgrade_websocket_connection(req, access_token, session) .await; } + ("session", &Method::GET) => { + return if req.headers().contains_key(header::AUTHORIZATION) { + // Authenticate request + let (_in_flight, access_token) = + self.authenticate_headers(&req, &session, false).await?; + + self.handle_session_resource( + ctx.resolve_response_url(self).await, + access_token, + ) + .await + .map(|s| s.into_http_response()) + } else { + Ok(Session::new( + ctx.resolve_response_url(self).await, + &self.core.jmap.capabilities, + ) + .into_http_response()) + }; + } (_, &Method::OPTIONS) => { return Ok(JsonProblemResponse(StatusCode::NO_CONTENT).into_http_response()); } @@ -241,14 +261,9 @@ impl ParseHttp for Server { } ".well-known" => match (path.next().unwrap_or_default(), req.method()) { ("jmap", &Method::GET) => { - // Authenticate request - let (_in_flight, access_token) = - self.authenticate_headers(&req, &session, false).await?; - - return self - .handle_session_resource(ctx.resolve_response_url(self).await, access_token) - .await - .map(|s| s.into_http_response()); + return Ok(HttpResponse::new(StatusCode::TEMPORARY_REDIRECT) + .with_no_cache() + .with_location("/jmap/session")); } ("caldav", _) => { return Ok(HttpResponse::new(StatusCode::TEMPORARY_REDIRECT)