stored_session 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7e2fdeeb48d5eb6f3038a4e8eaa45fb12a9be202f1900f0af907f2f77b0be9cb
4
+ data.tar.gz: 3e41d710e4d7409c5be132303729ccc721994b243491c1fb5a54f42140eab556
5
+ SHA512:
6
+ metadata.gz: bc4bed114bd6254e33aee198440dcbf1fa326194b93d9eb8a9b939ce7d5134a76a27adfbf475e147d797aa90db2b50683ad8043f7a90c4bdbb89ed2e6bb6d694
7
+ data.tar.gz: 45ba948f5c61992521424cbeaba950f13aaf992a0191d78030b6e3475e648ad26f207d77805720eaf97b8838231f98944be39553cd6e234a5d8ba28390a52bd8
checksums.yaml.gz.sig ADDED
Binary file
data/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # Solid Session Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ## [0.2.0](https://github.com/tbhb/stored_session/releases/tag/v0.2.0)
6
+
7
+ - Rename gem to `stored_session` (<https://github.com/tbhb/stored_session/pull/19>)
8
+
9
+ ## [0.1.0](https://github.com/tbhb/stored_session/releases/tag/v0.1.0)
10
+
11
+ - Initial release
data/MIT-LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) Tony Burns
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,103 @@
1
+ # Stored Session
2
+
3
+ Encrypted, database-backed [session store](https://guides.rubyonrails.org/security.html#session-storage) for [Rails](https://rubyonrails.org). It is a modernization of the [activerecord-session_store](https://github.com/rails/activerecord-session_store) gem that was previously extracted from Rails. Stored Session is encrypted by default and is tested with MySQL, PostgreSQL, and SQLite against Rails 8+.
4
+
5
+ > [!WARNING]
6
+ > This gem is currently in active development and should be considered alpha software. The API and functionality are subject to change without notice until a stable 1.0 release.
7
+
8
+ ## Features and roadmap
9
+
10
+ - [x] Compact, encrypted serialization with [MessagePack](https://msgpack.org/) (inspired by [Solid Cache](https://github.com/rails/solid_cache))
11
+ - [x] Built-in [ActiveJob](https://edgeguides.rubyonrails.org/active_job_basics.html) job for trimming inactive sessions
12
+ - [x] Tested with MySQL, PostgreSQL, and SQLite
13
+ - [x] Instrumentation with [ActiveSupport::Notifications](https://guides.rubyonrails.org/active_support_instrumentation.html)
14
+ - [ ] Installation generator
15
+ - [ ] Rake tasks for session maintenance
16
+ - [ ] Support for dedicated sessions database
17
+ - [ ] Session metadata tracking (IP address, user agent, geocoding)
18
+ - [ ] Integration test helpers for Minitest and RSpec
19
+ - [ ] `mission_control-sessions` gem for monitoring and administration
20
+
21
+ ## Prerequisites
22
+
23
+ - Ruby >= 3.2.0
24
+ - Rails >= 8.0.0.rc2
25
+
26
+ ## Installation
27
+
28
+ Add Stored Session to your application by following these steps:
29
+
30
+ 1. `bundle add stored_session`
31
+ 2. `bin/rails stored_session:install:migrations`
32
+ 3. `bin/rails db:migrate`
33
+
34
+ [ActiveRecord encryption](https://guides.rubyonrails.org/active_record_encryption.html) must be enabled in order to use Stored Session. Follow the instructions in [the guide](https://guides.rubyonrails.org/active_record_encryption.html#setup) to configure.
35
+
36
+ Then, set your session store in `config/initializers/session_store.rb`:
37
+
38
+ ```ruby
39
+ Rails.application.config.session_store :stored_session_store, key: '_my_app_session`
40
+ ```
41
+
42
+ When [Solid Queue](https://github.com/rails/solid_queue) is used as your ActiveJob queue adapter, add `StoredSession::TrimSessionsJob` to `config/recurring.yml`:
43
+
44
+ ```ruby
45
+ production:
46
+ trim_sessions:
47
+ class: "StoredSession::TrimSessionsJob"
48
+ schedule: every day
49
+ ```
50
+
51
+ ## Instrumentation
52
+
53
+ Stored Session instruments session store operations with `ActiveSupport::Notifications`:
54
+
55
+ ### `session_read.stored_session`
56
+
57
+ | Key | Value |
58
+ | ------ | --------------------- |
59
+ | `:sid` | The hashed session ID |
60
+
61
+ ```ruby
62
+ {
63
+ sid: '2::350cabf53a661de4fcf3d0ba6c6c65fd560b41e9697cf000168a9f420fb5366a'
64
+ }
65
+ ```
66
+
67
+ ### `session_write.stored_session`
68
+
69
+ | Key | Value |
70
+ | ------ | --------------------- |
71
+ | `:sid` | The hashed session ID |
72
+
73
+ ```ruby
74
+ {
75
+ sid: '2::350cabf53a661de4fcf3d0ba6c6c65fd560b41e9697cf000168a9f420fb5366a'
76
+ }
77
+ ```
78
+
79
+ ### `session_delete.stored_session`
80
+
81
+ | Key | Value |
82
+ | ------ | --------------------- |
83
+ | `:sid` | The hashed session ID |
84
+
85
+ ```ruby
86
+ {
87
+ sid: '2::350cabf53a661de4fcf3d0ba6c6c65fd560b41e9697cf000168a9f420fb5366a'
88
+ }
89
+ ```
90
+
91
+ ## Acknowledgements
92
+
93
+ This gem builds upon the excellent work of many contributors in the Ruby on Rails ecosystem. Special thanks to:
94
+
95
+ - The Rails core team and contributors, whose test suites and session store implementations in Rails itself core provided a robust foundation.
96
+ - The maintainers and contributors of the original [activerecord-session_store](https://github.com/rails/activerecord-session_store) gem, whose longstanding work influenced this implementation.
97
+ - The [Solid Cache](https://github.com/rails/solid_cache) and [Solid Queue](https://github.com/rails/solid_queue) maintainers and contributors, particularly for their modern database interaction patterns.
98
+
99
+ Portions of the gem boilerplate, implementation, and test suite and gem infrastructure were adapted from these projects, each of which are also distributed under the MIT License.
100
+
101
+ ## License
102
+
103
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,9 @@
1
+ class StoredSession::TrimSessionsJob < StoredSession.config.base_job_class
2
+ queue_as StoredSession.config.trim_sessions_job_queue_as
3
+
4
+ def perform(max_created_age: nil, max_updated_age: nil)
5
+ StoredSession::Session.trim!(max_created_age:, max_updated_age:)
6
+ end
7
+
8
+ ActiveSupport.run_load_hooks(:stored_session_trim_sessions_job, self)
9
+ end
@@ -0,0 +1,7 @@
1
+ class StoredSession::Record < StoredSession.config.base_record_class
2
+ self.abstract_class = true
3
+
4
+ connects_to(**StoredSession.config.connects_to) if StoredSession.config.connects_to
5
+
6
+ ActiveSupport.run_load_hooks :stored_session_record, self
7
+ end
@@ -0,0 +1,44 @@
1
+ require "active_support/core_ext/integer/time"
2
+
3
+ class StoredSession::Session < StoredSession::Record
4
+ self.table_name = StoredSession.config.sessions_table_name
5
+
6
+ serialize :data, coder: ActiveSupport::MessagePack, type: Hash
7
+ encrypts :data, message_serializer: ActiveRecord::Encryption::MessagePackMessageSerializer.new
8
+
9
+ scope :by_sid, ->(sid) { where(sid: sid) }
10
+
11
+ class << self
12
+ def read(sid)
13
+ without_query_cache do
14
+ select(:data).find_by(sid: sid)&.data
15
+ end
16
+ end
17
+
18
+ def write(sid, data)
19
+ without_query_cache do
20
+ upsert({ sid:, data: }, unique_by: upsert_unique_by, on_duplicate: :update, update_only: %i[sid data])
21
+ end
22
+ true
23
+ rescue ActiveRecord::SerializationTypeMismatch
24
+ false
25
+ end
26
+
27
+ def trim!(max_created_age: nil, max_updated_age: nil)
28
+ max_created_threshold = (max_created_age || StoredSession.config.max_created_age).ago
29
+ max_updated_threshold = (max_updated_age || StoredSession.config.max_updated_age).ago
30
+ where(created_at: ...max_created_threshold).or(where(updated_at: ...max_updated_threshold)).in_batches.delete_all
31
+ end
32
+
33
+ private
34
+ def upsert_unique_by
35
+ connection.supports_insert_conflict_target? ? :sid : nil
36
+ end
37
+
38
+ def without_query_cache(&)
39
+ uncached(dirties: false, &)
40
+ end
41
+ end
42
+
43
+ ActiveSupport.run_load_hooks(:stored_session_session, self)
44
+ end
@@ -0,0 +1,2 @@
1
+ ---
2
+ en:
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ # StoredSession::Engine.routes.draw do
2
+ # end
@@ -0,0 +1,15 @@
1
+ class CreateStoredSessions < ActiveRecord::Migration[7.2]
2
+ def change
3
+ config = Rails.configuration.generators
4
+ primary_key_type = config.options.dig(config.orm, :primary_key_type) || :primary_key
5
+
6
+ create_table :stored_sessions, id: primary_key_type do |t|
7
+ t.timestamps
8
+ t.string :sid, null: false, index: { unique: true }
9
+ t.binary :data, limit: 536870912
10
+
11
+ t.index :created_at
12
+ t.index :updated_at
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ require "stored_session/store"
2
+
3
+ module ActionDispatch
4
+ module Session
5
+ StoredSessionStore = StoredSession::Store
6
+ end
7
+ end
@@ -0,0 +1,35 @@
1
+ class StoredSession::Configuration
2
+ include ActiveModel::Model
3
+ include ActiveModel::Attributes
4
+
5
+ attribute :base_controller_class_name, :string, default: "::ApplicationController"
6
+ attribute :base_job_class_name, :string, default: "::ApplicationJob"
7
+ attribute :base_record_class_name, :string, default: "::ApplicationRecord"
8
+
9
+ attribute :connects_to
10
+ attribute :max_created_age, default: 30.days
11
+ attribute :max_updated_age, default: 30.days
12
+
13
+ attribute :sessions_table_name, :string, default: "stored_sessions"
14
+ attribute :session_class_name, :string, default: "::StoredSession::Session"
15
+
16
+ attribute :trim_sessions_job_enabled, :boolean, default: true
17
+ attribute :trim_sessions_job_queue_as, default: :default
18
+
19
+ validates :base_controller_class_name, presence: true
20
+ validates :base_job_class_name, presence: true
21
+ validates :base_record_class_name, presence: true
22
+
23
+ validates :sessions_table_name, presence: true
24
+ validates :session_class_name, presence: true
25
+
26
+ validates :max_created_age, numericality: { greater_than: 0 }, presence: true
27
+ validates :max_updated_age, numericality: { greater_than: 0 }, presence: true
28
+
29
+ validates :trim_sessions_job_queue_as, presence: true
30
+
31
+ def base_controller_class = base_controller_class_name.constantize
32
+ def base_job_class = base_job_class_name.constantize
33
+ def base_record_class = base_record_class_name.constantize
34
+ def session_class = session_class_name.constantize
35
+ end
@@ -0,0 +1,5 @@
1
+ module StoredSession
2
+ def self.deprecator
3
+ @deprecator ||= ActiveSupport::Deprecation.new
4
+ end
5
+ end
@@ -0,0 +1,37 @@
1
+ require "action_dispatch/session/stored_session_store"
2
+
3
+ require "active_support"
4
+ require "action_dispatch"
5
+ require "action_controller"
6
+ require "active_record"
7
+
8
+ module StoredSession
9
+ class Engine < ::Rails::Engine
10
+ isolate_namespace StoredSession
11
+
12
+ config.stored_session = ActiveSupport::OrderedOptions.new
13
+
14
+ initializer "stored_session.deprecator", before: :load_environment_config do |app|
15
+ app.deprecators[:stored_session] = StoredSession.deprecator
16
+ end
17
+
18
+ initializer "stored_session.config" do |app|
19
+ StoredSession.config = StoredSession::Configuration.new(app.config.stored_session)
20
+ end
21
+
22
+ initializer "stored_session.logger" do
23
+ ActiveSupport.on_load(:stored_session) { self.logger ||= ::Rails.logger }
24
+ StoredSession::LogSubscriber.attach_to :stored_session
25
+ end
26
+
27
+ config.after_initialize do |app|
28
+ unless app.config.eager_load
29
+ StoredSession.config.base_controller_class
30
+ StoredSession.config.base_job_class
31
+ StoredSession.config.base_record_class
32
+ end
33
+
34
+ StoredSession.config.validate!
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,17 @@
1
+ # :markup: markdown
2
+
3
+ module StoredSession
4
+ # Returns the currently loaded version of Stored Session as a `Gem::Version`.
5
+ def self.gem_version
6
+ Gem::Version.new VERSION::STRING
7
+ end
8
+
9
+ module VERSION
10
+ MAJOR = 0
11
+ MINOR = 2
12
+ TINY = 0
13
+ PRE = "".freeze
14
+
15
+ STRING = [ MAJOR, MINOR, TINY, PRE ].compact.join(".")
16
+ end
17
+ end
@@ -0,0 +1,2 @@
1
+ class StoredSession::LogSubscriber < ActiveSupport::LogSubscriber
2
+ end
@@ -0,0 +1,16 @@
1
+ module StoredSession
2
+ class Store < ActionDispatch::Session::AbstractSecureStore
3
+ module Instrumentation
4
+ extend ActiveSupport::Concern
5
+
6
+ def instrument(operation, sid, **options, &blk)
7
+ payload = { sid: sid&.private_id, **options }
8
+ ActiveSupport::Notifications.instrument("session_#{operation}.stored_session", payload) do
9
+ blk&.call(payload)
10
+ end
11
+ end
12
+
13
+ ActiveSupport.run_load_hooks(:stored_session_store_instrumentation, self)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,57 @@
1
+ require_relative "store/instrumentation"
2
+
3
+ class StoredSession::Store < ActionDispatch::Session::AbstractSecureStore
4
+ include ActiveSupport::Configurable
5
+ include StoredSession::Store::Instrumentation
6
+
7
+ delegate :logger, to: :StoredSession
8
+
9
+ attr_reader :silence
10
+ alias :silence? :silence
11
+
12
+ attr_reader :session_class
13
+
14
+ def initialize(app, options = {})
15
+ super
16
+
17
+ @session_class = options.fetch(:session_class) { StoredSession.config.session_class }
18
+ @silence = true unless options.key?(:silence)
19
+ end
20
+
21
+ def find_session(env, sid)
22
+ silence do
23
+ instrument(:read, sid) do |payload|
24
+ if sid && (data = session_class.read(sid.private_id))
25
+ [ sid, data || {} ]
26
+ else
27
+ [ generate_sid, {} ]
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ def write_session(req, sid, session, options)
34
+ silence do
35
+ instrument(:write, sid) do |payload|
36
+ return false unless session_class.write(sid.private_id, session)
37
+
38
+ sid
39
+ end
40
+ end
41
+ end
42
+
43
+ def delete_session(req, sid, options)
44
+ silence do
45
+ instrument(:delete, sid) do |payload|
46
+ session_class.by_sid(sid.private_id).delete_all
47
+ generate_sid
48
+ end
49
+ end
50
+ end
51
+
52
+ def silence(&)
53
+ @silence ? logger.silence(&) : yield
54
+ end
55
+
56
+ ActiveSupport.run_load_hooks(:stored_session_store, self)
57
+ end
File without changes
@@ -0,0 +1,3 @@
1
+ module StoredSession
2
+ VERSION = "0.2.0".freeze
3
+ end
@@ -0,0 +1,47 @@
1
+ require "stored_session/version"
2
+ require "stored_session/deprecator"
3
+ require "stored_session/engine"
4
+
5
+ require "action_dispatch"
6
+ require "action_dispatch/middleware/session/abstract_store"
7
+
8
+ require "active_job"
9
+
10
+ require "active_record/encryption/message_pack_message_serializer"
11
+
12
+ require "active_support"
13
+ require "active_support/core_ext/integer/time"
14
+ require "active_support/log_subscriber"
15
+ require "active_support/message_pack"
16
+ require "active_support/notifications"
17
+
18
+ require "zeitwerk"
19
+
20
+ loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
21
+ loader.ignore(
22
+ "#{__dir__}/stored_session/deprecator.rb",
23
+ "#{__dir__}/stored_session/gem_version.rb",
24
+ "#{__dir__}/stored_session/version.rb",
25
+ "#{__dir__}/generators",
26
+ "#{__dir__}/tasks"
27
+ )
28
+ loader.do_not_eager_load(
29
+ "#{__dir__}/stored_session/test_helper.rb"
30
+ )
31
+ loader.setup
32
+
33
+ module StoredSession
34
+ mattr_accessor :config, default: StoredSession::Configuration.new
35
+ mattr_accessor :logger
36
+
37
+ def self.configure
38
+ yield config
39
+ validate_config!
40
+ end
41
+
42
+ def self.validate_config!
43
+ config.validate!
44
+ end
45
+
46
+ ActiveSupport.run_load_hooks(:stored_session, self)
47
+ end
File without changes
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,181 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stored_session
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Tony Burns
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MQ0wCwYDVQQDDAR0b255
14
+ MRkwFwYKCZImiZPyLGQBGRYJdG9ueWJ1cm5zMRMwEQYKCZImiZPyLGQBGRYDbmV0
15
+ MB4XDTI0MDcxNDAxMDg0OVoXDTI1MDcxNDAxMDg0OVowPzENMAsGA1UEAwwEdG9u
16
+ eTEZMBcGCgmSJomT8ixkARkWCXRvbnlidXJuczETMBEGCgmSJomT8ixkARkWA25l
17
+ dDCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKggfvyjaYMtMwan119S
18
+ oOKyXi6ES6fn92c4jsiNowr15QR5VUlqI53RBowrLZzVTAYs7duxLT1jd6H58vpC
19
+ bJEkTtFWmJj8tL4+XozzESDnytcdLiT51fb7fmq9LUUwF+iJbotP7EOuzdp58p4O
20
+ qAIhL9HTPSgV02xqgoLV/9qBfMGMp2OIg8LxeY4j6tsu/NWxf19vBYI++ETr8vce
21
+ NjafoEa3zuVhB7aasnURf5nuhl+Rlp/CZ3DunXLsfCRil1Lu5FD53YDmozEVlWb0
22
+ wBbcbg/v73x2TV5jyIzxW6HOde2LhC/eI1sNitCflLZ0Q7kWAKMbx82RMTuNHNVa
23
+ JJRB2D6A64V+IJ9GAsYgyrkZ63sTlABylI2IXasif5Y4gsHLzr8m8f+6bKoKmKxo
24
+ qPs+sLlD3PbeWeNuxYnd2VP55NqTHSpFyytYjuFP0PErdChini435Zrxedq4UuRx
25
+ 0Bhq4cVlspDqbVhJoFqL27ZVyJWVpwMPXbN8sWZCJgWaAQIDAQABo3cwdTAJBgNV
26
+ HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUJWq36v7uqFV7BcGsCCpzg+r7
27
+ OVQwHQYDVR0RBBYwFIESdG9ueUB0b255YnVybnMubmV0MB0GA1UdEgQWMBSBEnRv
28
+ bnlAdG9ueWJ1cm5zLm5ldDANBgkqhkiG9w0BAQsFAAOCAYEAhCrMM1e7kL5MtTRy
29
+ 9kOU48uTLtLuyvUxFkdN/b/iMh+MKYRButfY35SxqRzs76Lta58V6cgRpRNb/WZv
30
+ Y5613dW/XF3oPOjaSyjYTGT/RyVobT5BydDIZ5uN/l38cd4fM++PEyIyP0D/CyNY
31
+ EVs+WvSSCAWzjO5PRgQDBU0+VrQaA2sp/qohi9kjxEFllkqi9eC2Py1rSndlXv0s
32
+ UW1jECxYZ56EHfypdqGjb9FRheRcEB6FtUzgjN8+IFsq1KyKDTproT3qVYFPT7IU
33
+ VSYwGC6ZO8B+/FxtebityYd+WuwSIcGoZVdbnl/GUPzT/O+5VdEmOFfn9lG3RbL2
34
+ xZax49uLQDvhfCrzISFszjYMMzfBhgpR+j9kq0HvZhrhZJRvlu8r7KP9EDvWrkXG
35
+ Gso2iuR/JK+nlYYHnXZSMQgPTNEv7urC3s3YBLkEeZAyKSzTub/yFiZ0f1rZECNq
36
+ RdwSWsf01XE0bKBtz4/dixrX45mIFrPmGp1gobRN/q4Tq3lU
37
+ -----END CERTIFICATE-----
38
+ date: 2024-11-05 00:00:00.000000000 Z
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: actionpack
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 8.0.0.rc2
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 8.0.0.rc2
54
+ - !ruby/object:Gem::Dependency
55
+ name: activejob
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 8.0.0.rc2
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 8.0.0.rc2
68
+ - !ruby/object:Gem::Dependency
69
+ name: activerecord
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 8.0.0.rc2
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 8.0.0.rc2
82
+ - !ruby/object:Gem::Dependency
83
+ name: railties
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 8.0.0.rc2
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: 8.0.0.rc2
96
+ - !ruby/object:Gem::Dependency
97
+ name: zeitwerk
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '2.6'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '2.6'
110
+ - !ruby/object:Gem::Dependency
111
+ name: bundler
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 1.15.0
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: 1.15.0
124
+ description: Encrypted, database-backed session store for Rails.
125
+ email:
126
+ - tony@tonyburns.net
127
+ executables: []
128
+ extensions: []
129
+ extra_rdoc_files: []
130
+ files:
131
+ - CHANGELOG.md
132
+ - MIT-LICENSE
133
+ - README.md
134
+ - app/jobs/stored_session/trim_sessions_job.rb
135
+ - app/models/stored_session/record.rb
136
+ - app/models/stored_session/session.rb
137
+ - config/locales/stored_session.en.yml
138
+ - config/routes.rb
139
+ - db/migrate/20241103224006_create_stored_sessions.rb
140
+ - lib/action_dispatch/session/stored_session_store.rb
141
+ - lib/stored_session.rb
142
+ - lib/stored_session/configuration.rb
143
+ - lib/stored_session/deprecator.rb
144
+ - lib/stored_session/engine.rb
145
+ - lib/stored_session/gem_version.rb
146
+ - lib/stored_session/log_subscriber.rb
147
+ - lib/stored_session/store.rb
148
+ - lib/stored_session/store/instrumentation.rb
149
+ - lib/stored_session/test_helper.rb
150
+ - lib/stored_session/version.rb
151
+ - lib/tasks/stored_session_tasks.rake
152
+ homepage: https://github.com/tbhb/stored_session
153
+ licenses:
154
+ - MIT
155
+ metadata:
156
+ bug_tracker_uri: https://github.com/tbhb/stored_session/issues
157
+ changelog_uri: https://github.com/tbhb/stored_session/blob/v0.2.0/CHANGELOG.md
158
+ documentation_uri: https://github.com/tbhb/stored_session
159
+ mailing_list_uri: https://github.com/tbhb/stored_session/discussions
160
+ source_code_uri: https://github.com/tbhb/stored_session/tree/v0.2.0
161
+ rubygems_mfa_required: 'true'
162
+ post_install_message:
163
+ rdoc_options: []
164
+ require_paths:
165
+ - lib
166
+ required_ruby_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: 3.2.0
171
+ required_rubygems_version: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ requirements: []
177
+ rubygems_version: 3.4.19
178
+ signing_key:
179
+ specification_version: 4
180
+ summary: Encrypted, database-backed session store for Rails.
181
+ test_files: []
metadata.gz.sig ADDED
Binary file