1
1
use chrono:: Utc ;
2
- use conduit_cookie:: RequestSession ;
2
+ use conduit_cookie:: RequestCookies ;
3
3
4
4
use super :: prelude:: * ;
5
-
5
+ use crate :: controllers :: user :: session :: SESSION_COOKIE_NAME ;
6
6
use crate :: middleware:: log_request;
7
- use crate :: models:: { ApiToken , User } ;
7
+ use crate :: models:: { ApiToken , PersistentSession , User } ;
8
8
use crate :: util:: errors:: {
9
9
account_locked, forbidden, internal, AppError , AppResult , InsecurelyGeneratedTokenRevoked ,
10
10
} ;
11
+ use conduit_cookie:: RequestSession ;
11
12
12
13
#[ derive( Debug ) ]
13
14
pub struct AuthenticatedUser {
@@ -67,6 +68,7 @@ fn verify_origin(req: &dyn RequestExt) -> AppResult<()> {
67
68
fn authenticate_user ( req : & dyn RequestExt ) -> AppResult < AuthenticatedUser > {
68
69
let conn = req. db_conn ( ) ?;
69
70
71
+ // TODO(adsnaider): Remove this.
70
72
let session = req. session ( ) ;
71
73
let user_id_from_session = session. get ( "user_id" ) . and_then ( |s| s. parse :: < i32 > ( ) . ok ( ) ) ;
72
74
@@ -80,6 +82,34 @@ fn authenticate_user(req: &dyn RequestExt) -> AppResult<AuthenticatedUser> {
80
82
} ) ;
81
83
}
82
84
85
+ if let Some ( session_token) = req
86
+ . cookies ( )
87
+ . get ( SESSION_COOKIE_NAME )
88
+ . map ( |cookie| cookie. value ( ) )
89
+ {
90
+ let ip_addr = req. remote_addr ( ) . ip ( ) ;
91
+
92
+ let user_agent = req
93
+ . headers ( )
94
+ . get ( header:: USER_AGENT )
95
+ . and_then ( |value| value. to_str ( ) . ok ( ) )
96
+ . unwrap_or_default ( ) ;
97
+
98
+ if let Some ( session) = PersistentSession :: find_from_token_and_update (
99
+ & conn,
100
+ session_token,
101
+ ip_addr,
102
+ user_agent,
103
+ ) ? {
104
+ let user = User :: find ( & conn, session. user_id )
105
+ . map_err ( |e| e. chain ( internal ( "user_id from session not found in the database" ) ) ) ?;
106
+ return Ok ( AuthenticatedUser {
107
+ user,
108
+ token_id : None ,
109
+ } ) ;
110
+ }
111
+ }
112
+
83
113
// Otherwise, look for an `Authorization` header on the request
84
114
let maybe_authorization = req
85
115
. headers ( )
0 commit comments