11use std:: pin:: Pin ;
22
3+ use actix_web:: http:: header:: HeaderMap ;
34use actix_web:: { web, FromRequest , HttpRequest } ;
45use futures:: Future ;
56use uuid:: Uuid ;
@@ -41,68 +42,44 @@ impl FromRequest for Auth {
4142 let data = req. app_data :: < web:: Data < AppData > > ( ) . unwrap ( ) . clone ( ) ;
4243 let headers = req. headers ( ) . clone ( ) ;
4344 Box :: pin ( async move {
44- let token = match headers. get ( "Authorization" ) {
45+ let token = match parse_token ( & headers) {
46+ Some ( t) => t,
4547 None => {
4648 return Ok ( Auth {
4749 developer : None ,
4850 token : None ,
49- } )
51+ } ) ;
5052 }
51- Some ( t) => match t. to_str ( ) {
52- Err ( e) => {
53- log:: error!( "Failed to parse auth token: {}" , e) ;
54- return Ok ( Auth {
55- developer : None ,
56- token : None ,
57- } ) ;
58- }
59- Ok ( str) => {
60- let split = str. split ( ' ' ) . collect :: < Vec < & str > > ( ) ;
61- if split. len ( ) != 2 || split[ 0 ] != "Bearer" {
62- return Ok ( Auth {
63- developer : None ,
64- token : None ,
65- } ) ;
66- }
67- match Uuid :: try_parse ( split[ 1 ] ) {
68- Err ( e) => {
69- log:: error!( "Failed to parse auth token {}, error: {}" , str , e) ;
70- return Ok ( Auth {
71- developer : None ,
72- token : None ,
73- } ) ;
74- }
75- Ok ( token) => token,
76- }
77- }
78- } ,
7953 } ;
8054
8155 let mut pool = data. db . acquire ( ) . await . or ( Err ( ApiError :: DbAcquireError ) ) ?;
8256 let hash = sha256:: digest ( token. to_string ( ) ) ;
83- let developer = sqlx:: query_as!(
57+ let developer = match sqlx:: query_as!(
8458 FetchedDeveloper ,
85- "SELECT d.id, d.username, d.display_name, d.verified, d.admin FROM developers d
59+ "SELECT
60+ d.id,
61+ d.username,
62+ d.display_name,
63+ d.verified,
64+ d.admin
65+ FROM developers d
8666 INNER JOIN auth_tokens a ON d.id = a.developer_id
8767 WHERE a.token = $1" ,
8868 hash
8969 )
9070 . fetch_optional ( & mut * pool)
91- . await ;
92- let developer = match developer {
93- Err ( e) => {
94- log:: error!( "{}" , e) ;
95- return Err ( ApiError :: DbError ) ;
71+ . await
72+ . map_err ( |e| {
73+ log:: error!( "Failed to lookup developer for auth: {}" , e) ;
74+ ApiError :: DbError
75+ } ) ? {
76+ None => {
77+ return Ok ( Auth {
78+ developer : None ,
79+ token : None ,
80+ } )
9681 }
97- Ok ( d) => match d {
98- None => {
99- return Ok ( Auth {
100- developer : None ,
101- token : None ,
102- } )
103- }
104- Some ( data) => data,
105- } ,
82+ Some ( d) => d,
10683 } ;
10784
10885 Ok ( Auth {
@@ -112,3 +89,20 @@ impl FromRequest for Auth {
11289 } )
11390 }
11491}
92+
93+ fn parse_token ( map : & HeaderMap ) -> Option < Uuid > {
94+ map. get ( "Authorization" )
95+ . map ( |header| header. to_str ( ) . ok ( ) )
96+ . flatten ( )
97+ . map ( |str| -> Option < & str > {
98+ let split = str. split ( ' ' ) . collect :: < Vec < & str > > ( ) ;
99+ if split. len ( ) != 2 || split[ 0 ] != "Bearer" {
100+ None
101+ } else {
102+ Some [ 1 ]
103+ }
104+ } )
105+ . flatten ( )
106+ . map ( |str| Uuid :: try_parse ( str) . ok ( ) )
107+ . flatten ( )
108+ }
0 commit comments