rails_multisite 2.4.0 → 4.0.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 +4 -4
- data/README.md +2 -2
- data/lib/rails_multisite/connection_management/rails_60_compat.rb +29 -0
- data/lib/rails_multisite/connection_management/rails_61_compat.rb +37 -0
- data/lib/rails_multisite/connection_management.rb +20 -30
- data/lib/rails_multisite/cookie_salt.rb +16 -0
- data/lib/rails_multisite/middleware.rb +1 -0
- data/lib/rails_multisite/railtie.rb +7 -2
- data/lib/rails_multisite/version.rb +1 -1
- data/lib/rails_multisite.rb +1 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c629d2dc8da503bfa856a639b4462108d15f776554dca35dd2d02545bc0e2793
|
4
|
+
data.tar.gz: a8199f54a9af9b8fea60e9c772d845944925499067d3ce29d362ab4ad68f13fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14ea81350cad5b028a1d6558525d350b1dac376168249cb2fdcce148055fe7b86a53b3e4472815567f626025420dfd40156b84a0f6eb80ff714725df3a20d4bc
|
7
|
+
data.tar.gz: b68b07d983452e6b1d785f6e927450cfe761983123408fcc0e7cb4589c4be2d4855a0351964ce497a278c17c5ffcc378a57bbfb55bfdf8a4059466f438d03646
|
data/README.md
CHANGED
@@ -95,7 +95,7 @@ RAILS_DB=db_one rails console
|
|
95
95
|
|
96
96
|
### CDN origin support
|
97
97
|
|
98
|
-
To avoid needing to configure many origins you can consider using `RailsMultisite::ConnectionManagement.
|
98
|
+
To avoid needing to configure many origins you can consider using `RailsMultisite::ConnectionManagement.asset_hostnames`
|
99
99
|
|
100
100
|
When configured, requests to `asset_hostname`?__ws=another.host.name will be re-routed to the correct site. Cookies will
|
101
101
|
be stripped on all incoming requests.
|
@@ -103,7 +103,7 @@ be stripped on all incoming requests.
|
|
103
103
|
Example:
|
104
104
|
|
105
105
|
- Multisite serves `sub.example.com` and `assets.example.com`
|
106
|
-
- `RailsMultisite::ConnectionManagement.
|
106
|
+
- `RailsMultisite::ConnectionManagement.asset_hostnames = ['assets.example.com']`
|
107
107
|
- Requests to `https://assets.example.com/route/?__ws=sub.example.com` will be routed to the `sub.example.com`
|
108
108
|
|
109
109
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RailsMultisite
|
4
|
+
class ConnectionManagement
|
5
|
+
class ConnectionSpecification
|
6
|
+
class << self
|
7
|
+
def current
|
8
|
+
ActiveRecord::Base.connection_pool.spec
|
9
|
+
end
|
10
|
+
|
11
|
+
def db_spec_cache(configs)
|
12
|
+
resolve_configs = configs
|
13
|
+
# rails 6 needs to use a proper object for the resolver
|
14
|
+
if defined?(ActiveRecord::DatabaseConfigurations)
|
15
|
+
resolve_configs = ActiveRecord::DatabaseConfigurations.new(configs)
|
16
|
+
end
|
17
|
+
resolver = ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver.new(resolve_configs)
|
18
|
+
configs.map { |k, _| [k, resolver.spec(k.to_sym)] }.to_h
|
19
|
+
end
|
20
|
+
|
21
|
+
def default
|
22
|
+
ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver
|
23
|
+
.new(ActiveRecord::Base.configurations)
|
24
|
+
.spec(Rails.env.to_sym)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RailsMultisite
|
4
|
+
class ConnectionManagement
|
5
|
+
class ConnectionSpecification
|
6
|
+
class << self
|
7
|
+
def current
|
8
|
+
new(ActiveRecord::Base.connection_pool.db_config)
|
9
|
+
end
|
10
|
+
|
11
|
+
def db_spec_cache(configs)
|
12
|
+
resolve_configs = ActiveRecord::DatabaseConfigurations.new(configs)
|
13
|
+
configs.map { |k, _| [k, new(resolve_configs.resolve(k.to_sym))] }.to_h
|
14
|
+
end
|
15
|
+
|
16
|
+
def default
|
17
|
+
new(ActiveRecord::Base.configurations.resolve(Rails.env.to_sym))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_reader :spec
|
22
|
+
|
23
|
+
def initialize(spec)
|
24
|
+
@spec = spec
|
25
|
+
end
|
26
|
+
|
27
|
+
def name
|
28
|
+
spec.env_name
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_hash
|
32
|
+
spec.configuration_hash
|
33
|
+
end
|
34
|
+
alias config to_hash
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,10 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
|
3
|
+
if Rails.version >= '6.1'
|
4
|
+
require 'rails_multisite/connection_management/rails_61_compat'
|
5
|
+
else
|
6
|
+
require 'rails_multisite/connection_management/rails_60_compat'
|
7
|
+
end
|
8
|
+
|
3
9
|
module RailsMultisite
|
4
10
|
class ConnectionManagement
|
5
|
-
|
6
11
|
DEFAULT = 'default'
|
7
|
-
SPEC_KLASS = ActiveRecord::ConnectionAdapters::ConnectionSpecification
|
8
12
|
|
9
13
|
def self.default_config_filename
|
10
14
|
File.absolute_path(Rails.root.to_s + "/config/multisite.yml")
|
@@ -35,12 +39,12 @@ module RailsMultisite
|
|
35
39
|
end
|
36
40
|
end
|
37
41
|
|
38
|
-
def self.
|
39
|
-
@
|
42
|
+
def self.asset_hostnames
|
43
|
+
@asset_hostnames
|
40
44
|
end
|
41
45
|
|
42
|
-
def self.
|
43
|
-
@
|
46
|
+
def self.asset_hostnames=(h)
|
47
|
+
@asset_hostnames = h
|
44
48
|
end
|
45
49
|
|
46
50
|
def self.config_filename
|
@@ -104,16 +108,11 @@ module RailsMultisite
|
|
104
108
|
end
|
105
109
|
|
106
110
|
def self.current_hostname
|
107
|
-
|
108
|
-
spec ||= ActiveRecord::Base.connection_pool.spec
|
109
|
-
config = spec.config
|
110
|
-
config[:host_names].nil? ? config[:host] : config[:host_names].first
|
111
|
+
current_db_hostnames.first
|
111
112
|
end
|
112
113
|
|
113
114
|
def self.current_db_hostnames
|
114
|
-
|
115
|
-
spec ||= ActiveRecord::Base.connection_pool.spec
|
116
|
-
config = spec.config
|
115
|
+
config = (@instance&.connection_spec(db: current_db) || ConnectionSpecification.current).config
|
117
116
|
config[:host_names].nil? ? [config[:host]] : config[:host_names]
|
118
117
|
end
|
119
118
|
|
@@ -121,7 +120,7 @@ module RailsMultisite
|
|
121
120
|
if @instance
|
122
121
|
@instance.connection_spec(opts)
|
123
122
|
else
|
124
|
-
|
123
|
+
ConnectionSpecification.current
|
125
124
|
end
|
126
125
|
end
|
127
126
|
|
@@ -170,7 +169,7 @@ module RailsMultisite
|
|
170
169
|
end
|
171
170
|
|
172
171
|
@db_spec_cache = {}
|
173
|
-
@default_spec =
|
172
|
+
@default_spec = ConnectionSpecification.default
|
174
173
|
@default_connection_handler = ActiveRecord::Base.connection_handler
|
175
174
|
|
176
175
|
@reload_mutex = Mutex.new
|
@@ -181,7 +180,7 @@ module RailsMultisite
|
|
181
180
|
def load_config!
|
182
181
|
configs = YAML::load(File.open(@config_filename))
|
183
182
|
|
184
|
-
no_prepared_statements =
|
183
|
+
no_prepared_statements = @default_spec.config[:prepared_statements] == false
|
185
184
|
|
186
185
|
configs.each do |k, v|
|
187
186
|
raise ArgumentError.new("Please do not name any db default!") if k == DEFAULT
|
@@ -189,17 +188,8 @@ module RailsMultisite
|
|
189
188
|
v[:prepared_statements] = false if no_prepared_statements
|
190
189
|
end
|
191
190
|
|
192
|
-
resolve_configs = configs
|
193
|
-
|
194
|
-
# rails 6 needs to use a proper object for the resolver
|
195
|
-
if defined?(ActiveRecord::DatabaseConfigurations)
|
196
|
-
resolve_configs = ActiveRecord::DatabaseConfigurations.new(configs)
|
197
|
-
end
|
198
|
-
|
199
|
-
resolver = SPEC_KLASS::Resolver.new(resolve_configs)
|
200
|
-
|
201
191
|
# Build a hash of db name => spec
|
202
|
-
new_db_spec_cache =
|
192
|
+
new_db_spec_cache = ConnectionSpecification.db_spec_cache(configs)
|
203
193
|
new_db_spec_cache.each do |k, v|
|
204
194
|
# If spec already existed, use the old version
|
205
195
|
if v&.to_hash == @db_spec_cache[k]&.to_hash
|
@@ -217,7 +207,7 @@ module RailsMultisite
|
|
217
207
|
end
|
218
208
|
|
219
209
|
# Add the default hostnames as well
|
220
|
-
|
210
|
+
@default_spec.config[:host_names].each do |host|
|
221
211
|
new_host_spec_cache[host] = @default_spec
|
222
212
|
end
|
223
213
|
|
@@ -365,7 +355,7 @@ module RailsMultisite
|
|
365
355
|
end
|
366
356
|
|
367
357
|
def current_db
|
368
|
-
|
358
|
+
ConnectionSpecification.current.config[:db_key] || DEFAULT
|
369
359
|
end
|
370
360
|
|
371
361
|
def current_hostname
|
@@ -380,7 +370,7 @@ module RailsMultisite
|
|
380
370
|
request = Rack::Request.new(env)
|
381
371
|
|
382
372
|
host =
|
383
|
-
if request['__ws'] &&
|
373
|
+
if request['__ws'] && self.class.asset_hostnames&.include?(request.host)
|
384
374
|
request.cookies.clear
|
385
375
|
request['__ws']
|
386
376
|
else
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RailsMultisite
|
4
|
+
class CookieSalt
|
5
|
+
COOKIE_SALT_KEYS = [
|
6
|
+
"action_dispatch.signed_cookie_salt",
|
7
|
+
"action_dispatch.encrypted_cookie_salt",
|
8
|
+
"action_dispatch.encrypted_signed_cookie_salt",
|
9
|
+
"action_dispatch.authenticated_encrypted_cookie_salt"
|
10
|
+
]
|
11
|
+
|
12
|
+
def self.update_cookie_salts(env:, host:)
|
13
|
+
COOKIE_SALT_KEYS.each { |key| env[key] = "#{env[key]} #{host}" }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -22,6 +22,7 @@ module RailsMultisite
|
|
22
22
|
|
23
23
|
ActiveRecord::Base.connection_handler.clear_active_connections!
|
24
24
|
ConnectionManagement.establish_connection(host: host, db: db)
|
25
|
+
CookieSalt.update_cookie_salts(env: env, host: host)
|
25
26
|
@app.call(env)
|
26
27
|
ensure
|
27
28
|
ActiveRecord::Base.connection_handler.clear_active_connections!
|
@@ -9,9 +9,14 @@ module RailsMultisite
|
|
9
9
|
initializer "RailsMultisite.init" do |app|
|
10
10
|
app.config.multisite = false
|
11
11
|
|
12
|
-
config_file =
|
12
|
+
config_file =
|
13
|
+
app.config.respond_to?(:multisite_config_path) &&
|
14
|
+
app.config.multisite_config_path.presence
|
15
|
+
|
16
|
+
config_file ||= ConnectionManagement.default_config_filename
|
17
|
+
|
13
18
|
if File.exist?(config_file)
|
14
|
-
ConnectionManagement.config_filename =
|
19
|
+
ConnectionManagement.config_filename = config_file
|
15
20
|
app.config.multisite = true
|
16
21
|
Rails.logger.formatter = RailsMultisite::Formatter.new
|
17
22
|
|
data/lib/rails_multisite.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_multisite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -61,6 +61,9 @@ files:
|
|
61
61
|
- README.md
|
62
62
|
- lib/rails_multisite.rb
|
63
63
|
- lib/rails_multisite/connection_management.rb
|
64
|
+
- lib/rails_multisite/connection_management/rails_60_compat.rb
|
65
|
+
- lib/rails_multisite/connection_management/rails_61_compat.rb
|
66
|
+
- lib/rails_multisite/cookie_salt.rb
|
64
67
|
- lib/rails_multisite/formatter.rb
|
65
68
|
- lib/rails_multisite/middleware.rb
|
66
69
|
- lib/rails_multisite/railtie.rb
|
@@ -85,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
88
|
- !ruby/object:Gem::Version
|
86
89
|
version: '0'
|
87
90
|
requirements: []
|
88
|
-
rubygems_version: 3.
|
91
|
+
rubygems_version: 3.1.6
|
89
92
|
signing_key:
|
90
93
|
specification_version: 4
|
91
94
|
summary: Multi tenancy support for Rails
|