1
1
use std:: pin:: Pin ;
2
2
3
+ use actix_web:: http:: header:: HeaderMap ;
3
4
use actix_web:: { web, FromRequest , HttpRequest } ;
4
5
use futures:: Future ;
5
6
use uuid:: Uuid ;
@@ -41,68 +42,44 @@ impl FromRequest for Auth {
41
42
let data = req. app_data :: < web:: Data < AppData > > ( ) . unwrap ( ) . clone ( ) ;
42
43
let headers = req. headers ( ) . clone ( ) ;
43
44
Box :: pin ( async move {
44
- let token = match headers. get ( "Authorization" ) {
45
+ let token = match parse_token ( & headers) {
46
+ Some ( t) => t,
45
47
None => {
46
48
return Ok ( Auth {
47
49
developer : None ,
48
50
token : None ,
49
- } )
51
+ } ) ;
50
52
}
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
- } ,
79
53
} ;
80
54
81
55
let mut pool = data. db . acquire ( ) . await . or ( Err ( ApiError :: DbAcquireError ) ) ?;
82
56
let hash = sha256:: digest ( token. to_string ( ) ) ;
83
- let developer = sqlx:: query_as!(
57
+ let developer = match sqlx:: query_as!(
84
58
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
86
66
INNER JOIN auth_tokens a ON d.id = a.developer_id
87
67
WHERE a.token = $1" ,
88
68
hash
89
69
)
90
70
. 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
+ } )
96
81
}
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,
106
83
} ;
107
84
108
85
Ok ( Auth {
@@ -112,3 +89,20 @@ impl FromRequest for Auth {
112
89
} )
113
90
}
114
91
}
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