@@ -6,6 +6,7 @@ use diesel::prelude::*;
66use crate :: db:: RequestTransaction ;
77use crate :: util:: errors:: { std_error, CargoResult , ChainError , Unauthorized } ;
88
9+ use crate :: models:: ApiToken ;
910use crate :: models:: User ;
1011use crate :: schema:: users;
1112
@@ -15,7 +16,11 @@ pub struct CurrentUser;
1516#[ derive( Debug , Clone , Eq , PartialEq ) ]
1617pub enum AuthenticationSource {
1718 SessionCookie ,
19+ <<<<<<< HEAD
1820 ApiToken { auth_header: String } ,
21+ =======
22+ ApiToken ( i32 ) ,
23+ >>>>>>> Holding on to the authorisation token.
1924}
2025
2126impl Middleware for CurrentUser {
@@ -42,19 +47,23 @@ impl Middleware for CurrentUser {
4247 } else {
4348 // Otherwise, look for an `Authorization` header on the request
4449 // and try to find a user in the database with a matching API token
45- let user_auth = req. headers ( ) . find ( "Authorization" ) . and_then ( |headers| {
46- let auth_header = headers[ 0 ] . to_string ( ) ;
47-
48- User :: find_by_api_token ( & conn, & auth_header)
49- . ok ( )
50- . map ( |user| ( AuthenticationSource :: ApiToken { auth_header } , user) )
51- } ) ;
50+ let user_and_token = if let Some ( headers) = req. headers( ) . find( "Authorization" ) {
51+ ApiToken :: find_by_api_token_and_revoked( & conn, headers[ 0 ] , false )
52+ . and_then( |api_token| {
53+ User :: find( & conn, api_token. user_id) . map( |user| ( user, api_token. id) )
54+ } )
55+ . optional( )
56+ . map_err( |e| Box :: new( e) as Box < dyn Error + Send > ) ?
57+ } else {
58+ None
59+ } ;
5260 drop( conn) ;
53-
54- if let Some ( ( api_token , user ) ) = user_auth {
61+
62+ if let Some ( ( user , token ) ) = user_and_token {
5563 // Attach the `User` model from the database to the request
5664 req. mut_extensions( ) . insert( user) ;
57- req. mut_extensions ( ) . insert ( api_token) ;
65+ req. mut_extensions( )
66+ . insert( AuthenticationSource :: ApiToken ( token) ) ;
5867 }
5968 }
6069
0 commit comments