Files
gitlabhq/lib/gitlab/sessions/cache_store.rb
2025-04-11 15:09:56 +00:00

47 lines
1.4 KiB
Ruby

# frozen_string_literal: true
module Gitlab
module Sessions
class CacheStore < ActionDispatch::Session::CacheStore
DELIMITER = '-'
attr_reader :session_cookie_token_prefix
def initialize(app, options = {})
super
@default_options[:redis_expiry] = @cache.options[:expires_in]
@default_options[:expire_after] = nil
@session_cookie_token_prefix = options.fetch(:session_cookie_token_prefix, "") || ""
end
# Overrides https://github.com/rails/rails/blob/v7.2.2.1/actionpack/lib/action_dispatch/middleware/session/cache_store.rb#L37-L46
# The only difference is the `expires_in` value is now based on the new option that we set in the intializer above
def write_session(_env, sid, session, options)
key = cache_key(sid.private_id)
if session
@cache.write(key, session, expires_in: options[:redis_expiry])
else
@cache.delete(key)
end
sid
end
def generate_sid
delimiter = session_cookie_token_prefix.empty? ? '' : DELIMITER
Rack::Session::SessionId.new(session_cookie_token_prefix + delimiter + super.public_id)
end
private
# ActionDispatch::Session::CacheStore (superclass) prepends
# hardcoded "_session_id:" to the cache key which doesn't match
# the previous implementation of Gitlab::Sessions::RedisStore.
def cache_key(id)
id
end
end
end
end