|
288 | 288 | res = Rack::MockRequest.new(app).get("/") |
289 | 289 | res["Set-Cookie"].must_be_nil |
290 | 290 | end |
| 291 | + |
| 292 | + user_id_session = Rack::Lint.new(lambda do |env| |
| 293 | + session = env["rack.session"] |
| 294 | + |
| 295 | + case env["PATH_INFO"] |
| 296 | + when "/login" |
| 297 | + session[:user_id] = 1 |
| 298 | + when "/logout" |
| 299 | + if session[:user_id].nil? |
| 300 | + raise "User not logged in" |
| 301 | + end |
| 302 | + |
| 303 | + session.delete(:user_id) |
| 304 | + session.options[:renew] = true |
| 305 | + when "/slow" |
| 306 | + Fiber.yield |
| 307 | + end |
| 308 | + |
| 309 | + Rack::Response.new(session.inspect).to_a |
| 310 | + end) |
| 311 | + |
| 312 | + it "doesn't allow session id to be reused" do |
| 313 | + app = Rack::Session::Pool.new(user_id_session) |
| 314 | + |
| 315 | + login_response = Rack::MockRequest.new(app).get("/login") |
| 316 | + login_cookie = login_response["Set-Cookie"] |
| 317 | + |
| 318 | + slow_request = Fiber.new do |
| 319 | + Rack::MockRequest.new(app).get("/slow", "HTTP_COOKIE" => login_cookie) |
| 320 | + end |
| 321 | + slow_request.resume |
| 322 | + |
| 323 | + # Check that the session is valid: |
| 324 | + response = Rack::MockRequest.new(app).get("/", "HTTP_COOKIE" => login_cookie) |
| 325 | + response.body.must_equal({"user_id" => 1}.to_s) |
| 326 | + |
| 327 | + logout_response = Rack::MockRequest.new(app).get("/logout", "HTTP_COOKIE" => login_cookie) |
| 328 | + logout_cookie = logout_response["Set-Cookie"] |
| 329 | + |
| 330 | + # Check that the session id is different after logout: |
| 331 | + login_cookie[session_match].wont_equal logout_cookie[session_match] |
| 332 | + |
| 333 | + slow_response = slow_request.resume |
| 334 | + |
| 335 | + # Check that the cookie can't be reused: |
| 336 | + response = Rack::MockRequest.new(app).get("/", "HTTP_COOKIE" => login_cookie) |
| 337 | + response.body.must_equal "{}" |
| 338 | + end |
291 | 339 | end |
0 commit comments