stored_session 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +11 -0
- data/MIT-LICENSE +22 -0
- data/README.md +103 -0
- data/app/jobs/stored_session/trim_sessions_job.rb +9 -0
- data/app/models/stored_session/record.rb +7 -0
- data/app/models/stored_session/session.rb +44 -0
- data/config/locales/stored_session.en.yml +2 -0
- data/config/routes.rb +2 -0
- data/db/migrate/20241103224006_create_stored_sessions.rb +15 -0
- data/lib/action_dispatch/session/stored_session_store.rb +7 -0
- data/lib/stored_session/configuration.rb +35 -0
- data/lib/stored_session/deprecator.rb +5 -0
- data/lib/stored_session/engine.rb +37 -0
- data/lib/stored_session/gem_version.rb +17 -0
- data/lib/stored_session/log_subscriber.rb +2 -0
- data/lib/stored_session/store/instrumentation.rb +16 -0
- data/lib/stored_session/store.rb +57 -0
- data/lib/stored_session/test_helper.rb +0 -0
- data/lib/stored_session/version.rb +3 -0
- data/lib/stored_session.rb +47 -0
- data/lib/tasks/stored_session_tasks.rake +0 -0
- data.tar.gz.sig +0 -0
- metadata +181 -0
- metadata.gz.sig +0 -0
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,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
|
data/config/routes.rb
ADDED
|
@@ -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,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,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,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,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
|