class SameSiteCookieFix::Middleware

Public Class Methods

chromium_based?(sniffer) click to toggle source
# File lib/same_site_cookie_fix/middleware.rb, line 43
def self.chromium_based?(sniffer)
  sniffer.browser_name.downcase =~ /chrom(e|ium)/
end
drops_unrecognized_same_site_cookies?(sniffer) click to toggle source
# File lib/same_site_cookie_fix/middleware.rb, line 38
def self.drops_unrecognized_same_site_cookies?(sniffer)
  (chromium_based?(sniffer) && sniffer.major_browser_version >= 51 && sniffer.major_browser_version <= 66) ||
    (uc_browser?(sniffer) && !uc_browser_version_at_least?(sniffer: sniffer, major: 12, minor: 13, build: 2))
end
new(app) click to toggle source
# File lib/same_site_cookie_fix/middleware.rb, line 5
def initialize(app)
  @app = app
end
same_site_none_incompatible?(user_agent) click to toggle source
# File lib/same_site_cookie_fix/middleware.rb, line 25
def self.same_site_none_incompatible?(user_agent)
  sniffer = BrowserSniffer.new(user_agent)

  webkit_same_site_bug?(sniffer) || drops_unrecognized_same_site_cookies?(sniffer)
rescue
  true
end
uc_browser?(sniffer) click to toggle source
# File lib/same_site_cookie_fix/middleware.rb, line 47
def self.uc_browser?(sniffer)
  sniffer.user_agent.downcase =~ /uc\s?browser/
end
uc_browser_version_at_least?(sniffer:, major:, minor:, build:) click to toggle source
# File lib/same_site_cookie_fix/middleware.rb, line 51
def self.uc_browser_version_at_least?(sniffer:, major:, minor:, build:)
  digits = sniffer.browser_version.split('.').map(&:to_i)
  return false unless digits.count >= 3

  return digits[0] > major if digits[0] != major
  return digits[1] > minor if digits[1] != minor
  digits[2] >= build
end
webkit_same_site_bug?(sniffer) click to toggle source
# File lib/same_site_cookie_fix/middleware.rb, line 33
def self.webkit_same_site_bug?(sniffer)
  (sniffer.os == :ios && sniffer.os_version.match?(/^([0-9]|1[12])[\.\_]/)) ||
    (sniffer.os == :mac && sniffer.browser == :safari && sniffer.os_version.match?(/^10[\.\_]14/))
end

Public Instance Methods

call(env) click to toggle source
# File lib/same_site_cookie_fix/middleware.rb, line 9
def call(env)
  _status, headers, _body = @app.call(env)
ensure
  user_agent = env['HTTP_USER_AGENT']

  if headers && headers['Set-Cookie'] && !SameSiteCookieFix::Middleware.same_site_none_incompatible?(user_agent)
    cookies = headers['Set-Cookie'].split("\n").compact

    cookies.each do |cookie|
      unless cookie.include?("; SameSite")
        headers['Set-Cookie'] = headers['Set-Cookie'].gsub("#{cookie}", "#{cookie}; secure; SameSite=None")
      end
    end
  end
end