Sha256: 87c1e62033b9cd3e6f56e56f17acde059056bc07df41708401c34e8b4615a6d5

Contents?: true

Size: 1.95 KB

Versions: 2

Compression:

Stored size: 1.95 KB

Contents

# frozen_string_literal: true

require "base64"

require "pakyow/support/indifferentize"
require "pakyow/support/message_verifier"

require "pakyow/app/connection/session/base"

module Pakyow
  class App
    class Connection
      module Session
        class Cookie < Base
          def initialize(connection, options)
            if (cookie = connection.cookies[options.name]) && cookie.is_a?(Support::IndifferentHash)
              super(connection, options, Support::IndifferentHash.new(cookie[:value].to_h))
              connection.cookies[options.name][:value] = self
            else
              super(connection, options, deserialize(connection, options))
              connection.cookies[options.name] = Support::IndifferentHash.new(
                domain: options.domain,
                path: options.path,
                max_age: options.max_age,
                expires: options.expires,
                secure: options.secure,
                http_only: options.http_only,
                same_site: options.same_site,
                value: self
              )

              # Update the original cookie value so we can compare for changes.
              #
              connection.update_request_cookie(options.name, self.dup)
            end
          end

          def to_s
            Base64.urlsafe_encode64(
              Pakyow.verifier.sign(
                Marshal.dump(to_h)
              )
            )
          end

          private

          def deserialize(connection, options)
            if value = connection.cookies[options.name]
              Support::IndifferentHash.deep(
                Marshal.load(
                  Pakyow.verifier.verify(
                    Base64.urlsafe_decode64(value)
                  )
                )
              )
            else
              Support::IndifferentHash.new
            end
          rescue StandardError
            Support::IndifferentHash.new
          end
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
pakyow-core-1.0.0.rc5 lib/pakyow/app/connection/session/cookie.rb
pakyow-core-1.0.0.rc4 lib/pakyow/app/connection/session/cookie.rb