ruma_common/api/
auth_scheme.rs1#![allow(clippy::exhaustive_structs)]
5
6use http::{header, HeaderName, HeaderValue};
7
8use crate::api::{error::IntoHttpError, SendAccessToken};
9
10pub trait AuthScheme: Sized {
12 fn authorization_header(
20 access_token: SendAccessToken<'_>,
21 ) -> Result<Option<(HeaderName, HeaderValue)>, IntoHttpError>;
22}
23
24#[derive(Debug, Clone, Copy, Default)]
26pub struct NoAuthentication;
27
28impl AuthScheme for NoAuthentication {
29 fn authorization_header(
30 access_token: SendAccessToken<'_>,
31 ) -> Result<Option<(HeaderName, HeaderValue)>, IntoHttpError> {
32 access_token
33 .get_not_required_for_endpoint()
34 .map(access_token_to_authorization_header)
35 .transpose()
36 }
37}
38
39#[derive(Debug, Clone, Copy, Default)]
44pub struct AccessToken;
45
46impl AuthScheme for AccessToken {
47 fn authorization_header(
48 access_token: SendAccessToken<'_>,
49 ) -> Result<Option<(HeaderName, HeaderValue)>, IntoHttpError> {
50 let token =
51 access_token.get_required_for_endpoint().ok_or(IntoHttpError::NeedsAuthentication)?;
52 access_token_to_authorization_header(token).map(Some)
53 }
54}
55
56#[derive(Debug, Clone, Copy, Default)]
61pub struct AccessTokenOptional;
62
63impl AuthScheme for AccessTokenOptional {
64 fn authorization_header(
65 access_token: SendAccessToken<'_>,
66 ) -> Result<Option<(HeaderName, HeaderValue)>, IntoHttpError> {
67 access_token
68 .get_required_for_endpoint()
69 .map(access_token_to_authorization_header)
70 .transpose()
71 }
72}
73
74#[derive(Debug, Clone, Copy, Default)]
80pub struct AppserviceToken;
81
82impl AuthScheme for AppserviceToken {
83 fn authorization_header(
84 access_token: SendAccessToken<'_>,
85 ) -> Result<Option<(HeaderName, HeaderValue)>, IntoHttpError> {
86 let token =
87 access_token.get_required_for_appservice().ok_or(IntoHttpError::NeedsAuthentication)?;
88 access_token_to_authorization_header(token).map(Some)
89 }
90}
91
92#[derive(Debug, Clone, Copy, Default)]
98pub struct AppserviceTokenOptional;
99
100impl AuthScheme for AppserviceTokenOptional {
101 fn authorization_header(
102 access_token: SendAccessToken<'_>,
103 ) -> Result<Option<(HeaderName, HeaderValue)>, IntoHttpError> {
104 access_token
105 .get_required_for_appservice()
106 .map(access_token_to_authorization_header)
107 .transpose()
108 }
109}
110
111#[derive(Debug, Clone, Copy, Default)]
114pub struct ServerSignatures;
115
116impl AuthScheme for ServerSignatures {
117 fn authorization_header(
118 _access_token: SendAccessToken<'_>,
119 ) -> Result<Option<(HeaderName, HeaderValue)>, IntoHttpError> {
120 Ok(None)
121 }
122}
123
124fn access_token_to_authorization_header(
126 token: &str,
127) -> Result<(HeaderName, HeaderValue), IntoHttpError> {
128 Ok((header::AUTHORIZATION, format!("Bearer {token}").try_into()?))
129}