11use chrono:: Utc ;
2- use conduit_cookie:: RequestSession ;
2+ use conduit_cookie:: RequestCookies ;
33
44use super :: prelude:: * ;
5-
5+ use crate :: controllers :: user :: session :: SESSION_COOKIE_NAME ;
66use crate :: middleware:: log_request;
7- use crate :: models:: { ApiToken , User } ;
7+ use crate :: models:: { ApiToken , PersistentSession , User } ;
88use crate :: util:: errors:: {
99 account_locked, forbidden, internal, AppError , AppResult , InsecurelyGeneratedTokenRevoked ,
1010} ;
11+ use conduit_cookie:: RequestSession ;
1112
1213#[ derive( Debug ) ]
1314pub struct AuthenticatedUser {
@@ -67,6 +68,7 @@ fn verify_origin(req: &dyn RequestExt) -> AppResult<()> {
6768fn authenticate_user ( req : & dyn RequestExt ) -> AppResult < AuthenticatedUser > {
6869 let conn = req. db_conn ( ) ?;
6970
71+ // TODO(adsnaider): Remove this.
7072 let session = req. session ( ) ;
7173 let user_id_from_session = session. get ( "user_id" ) . and_then ( |s| s. parse :: < i32 > ( ) . ok ( ) ) ;
7274
@@ -80,6 +82,34 @@ fn authenticate_user(req: &dyn RequestExt) -> AppResult<AuthenticatedUser> {
8082 } ) ;
8183 }
8284
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+
83113 // Otherwise, look for an `Authorization` header on the request
84114 let maybe_authorization = req
85115 . headers ( )
0 commit comments