@@ -27,7 +27,6 @@ use cargo_registry::{
27
27
background_jobs:: Environment ,
28
28
db:: DieselPool ,
29
29
git:: { Credentials , RepositoryConfig } ,
30
- middleware:: current_user:: TrustedUserId ,
31
30
models:: { ApiToken , CreatedApiToken , User } ,
32
31
util:: AppResponse ,
33
32
App , Config ,
@@ -37,7 +36,8 @@ use serde_json::Value;
37
36
use std:: { marker:: PhantomData , rc:: Rc , sync:: Arc , time:: Duration } ;
38
37
use swirl:: Runner ;
39
38
40
- use conduit:: { Handler , HandlerResult , Method , RequestExt } ;
39
+ use conduit:: { Handler , HandlerResult , Method } ;
40
+ use conduit_cookie:: SessionMiddleware ;
41
41
use conduit_test:: MockRequest ;
42
42
43
43
use cargo_registry:: git:: Repository as WorkerRepository ;
@@ -46,6 +46,8 @@ use git2::Repository as UpstreamRepository;
46
46
use url:: Url ;
47
47
48
48
pub use conduit:: { header, StatusCode } ;
49
+ use cookie:: Cookie ;
50
+ use std:: collections:: HashMap ;
49
51
50
52
pub fn init_logger ( ) {
51
53
let _ = tracing_subscriber:: fmt ( )
@@ -209,6 +211,37 @@ impl TestApp {
209
211
}
210
212
}
211
213
214
+ /// This function can be used to create a `Cookie` header for mock requests that
215
+ /// include cookie-based authentication.
216
+ ///
217
+ /// ```
218
+ /// let cookie = encode_session_header(session_key, user_id);
219
+ /// request.header(header::COOKIE, &cookie);
220
+ /// ```
221
+ ///
222
+ /// The implementation matches roughly what is happening inside of the
223
+ /// `SessionMiddleware` from `conduit_cookie`.
224
+ pub fn encode_session_header ( session_key : & str , user_id : i32 ) -> String {
225
+ let cookie_name = "cargo_session" ;
226
+ let cookie_key = cookie:: Key :: derive_from ( session_key. as_bytes ( ) ) ;
227
+
228
+ // build session data map
229
+ let mut map = HashMap :: new ( ) ;
230
+ map. insert ( "user_id" . into ( ) , user_id. to_string ( ) ) ;
231
+
232
+ // encode the map into a cookie value string
233
+ let session_middleware = SessionMiddleware :: new ( cookie_name, cookie_key. clone ( ) , false ) ;
234
+ let encoded = session_middleware. encode ( & map) ;
235
+
236
+ // put the cookie into a signed cookie jar
237
+ let cookie = Cookie :: build ( cookie_name, encoded) . finish ( ) ;
238
+ let mut jar = cookie:: CookieJar :: new ( ) ;
239
+ jar. signed ( & cookie_key) . add ( cookie) ;
240
+
241
+ // read the raw cookie from the cookie jar
242
+ jar. get ( & cookie_name) . unwrap ( ) . to_string ( )
243
+ }
244
+
212
245
pub struct TestAppBuilder {
213
246
config : Config ,
214
247
proxy : Option < String > ,
@@ -463,9 +496,11 @@ pub struct MockCookieUser {
463
496
464
497
impl RequestHelper for MockCookieUser {
465
498
fn request_builder ( & self , method : Method , path : & str ) -> MockRequest {
499
+ let session_key = & self . app . as_inner ( ) . session_key ;
500
+ let cookie = encode_session_header ( session_key, self . user . id ) ;
501
+
466
502
let mut request = req ( method, path) ;
467
- let id = TrustedUserId ( self . user . id ) ;
468
- request. mut_extensions ( ) . insert ( id) ;
503
+ request. header ( header:: COOKIE , & cookie) ;
469
504
request
470
505
}
471
506
0 commit comments