Skip to content

Commit df51191

Browse files
Merge pull request #2 from kaspth/extend-parameters
Expose `params.signed` and `params.sign`
2 parents b12fa9d + 0daffb7 commit df51191

File tree

11 files changed

+251
-69
lines changed

11 files changed

+251
-69
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
*.gem
2+
tmp/

Gemfile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
source "https://rubygems.org"
2+
3+
gemspec
4+
5+
gem "debug"
6+
gem "railties"

Gemfile.lock

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
PATH
2+
remote: .
3+
specs:
4+
signed_params (0.1.0)
5+
actionpack (>= 6.1)
6+
7+
GEM
8+
remote: https://rubygems.org/
9+
specs:
10+
actionpack (8.0.2)
11+
actionview (= 8.0.2)
12+
activesupport (= 8.0.2)
13+
nokogiri (>= 1.8.5)
14+
rack (>= 2.2.4)
15+
rack-session (>= 1.0.1)
16+
rack-test (>= 0.6.3)
17+
rails-dom-testing (~> 2.2)
18+
rails-html-sanitizer (~> 1.6)
19+
useragent (~> 0.16)
20+
actionview (8.0.2)
21+
activesupport (= 8.0.2)
22+
builder (~> 3.1)
23+
erubi (~> 1.11)
24+
rails-dom-testing (~> 2.2)
25+
rails-html-sanitizer (~> 1.6)
26+
activesupport (8.0.2)
27+
base64
28+
benchmark (>= 0.3)
29+
bigdecimal
30+
concurrent-ruby (~> 1.0, >= 1.3.1)
31+
connection_pool (>= 2.2.5)
32+
drb
33+
i18n (>= 1.6, < 2)
34+
logger (>= 1.4.2)
35+
minitest (>= 5.1)
36+
securerandom (>= 0.3)
37+
tzinfo (~> 2.0, >= 2.0.5)
38+
uri (>= 0.13.1)
39+
base64 (0.3.0)
40+
benchmark (0.4.1)
41+
bigdecimal (3.2.0)
42+
builder (3.3.0)
43+
concurrent-ruby (1.3.5)
44+
connection_pool (2.5.3)
45+
crass (1.0.6)
46+
date (3.4.1)
47+
debug (1.10.0)
48+
irb (~> 1.10)
49+
reline (>= 0.3.8)
50+
drb (2.2.3)
51+
erb (5.0.1)
52+
erubi (1.13.1)
53+
i18n (1.14.7)
54+
concurrent-ruby (~> 1.0)
55+
io-console (0.8.0)
56+
irb (1.15.2)
57+
pp (>= 0.6.0)
58+
rdoc (>= 4.0.0)
59+
reline (>= 0.4.2)
60+
logger (1.7.0)
61+
loofah (2.24.1)
62+
crass (~> 1.0.2)
63+
nokogiri (>= 1.12.0)
64+
minitest (5.25.5)
65+
nokogiri (1.18.8-aarch64-linux-gnu)
66+
racc (~> 1.4)
67+
nokogiri (1.18.8-aarch64-linux-musl)
68+
racc (~> 1.4)
69+
nokogiri (1.18.8-arm-linux-gnu)
70+
racc (~> 1.4)
71+
nokogiri (1.18.8-arm-linux-musl)
72+
racc (~> 1.4)
73+
nokogiri (1.18.8-arm64-darwin)
74+
racc (~> 1.4)
75+
nokogiri (1.18.8-x86_64-darwin)
76+
racc (~> 1.4)
77+
nokogiri (1.18.8-x86_64-linux-gnu)
78+
racc (~> 1.4)
79+
nokogiri (1.18.8-x86_64-linux-musl)
80+
racc (~> 1.4)
81+
pp (0.6.2)
82+
prettyprint
83+
prettyprint (0.2.0)
84+
psych (5.2.6)
85+
date
86+
stringio
87+
racc (1.8.1)
88+
rack (3.1.15)
89+
rack-session (2.1.1)
90+
base64 (>= 0.1.0)
91+
rack (>= 3.0.0)
92+
rack-test (2.2.0)
93+
rack (>= 1.3)
94+
rackup (2.2.1)
95+
rack (>= 3)
96+
rails-dom-testing (2.3.0)
97+
activesupport (>= 5.0.0)
98+
minitest
99+
nokogiri (>= 1.6)
100+
rails-html-sanitizer (1.6.2)
101+
loofah (~> 2.21)
102+
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
103+
railties (8.0.2)
104+
actionpack (= 8.0.2)
105+
activesupport (= 8.0.2)
106+
irb (~> 1.13)
107+
rackup (>= 1.0.0)
108+
rake (>= 12.2)
109+
thor (~> 1.0, >= 1.2.2)
110+
zeitwerk (~> 2.6)
111+
rake (13.3.0)
112+
rdoc (6.14.0)
113+
erb
114+
psych (>= 4.0.0)
115+
reline (0.6.1)
116+
io-console (~> 0.5)
117+
securerandom (0.4.1)
118+
stringio (3.1.7)
119+
thor (1.3.2)
120+
tzinfo (2.0.6)
121+
concurrent-ruby (~> 1.0)
122+
uri (1.0.3)
123+
useragent (0.16.11)
124+
zeitwerk (2.7.3)
125+
126+
PLATFORMS
127+
aarch64-linux-gnu
128+
aarch64-linux-musl
129+
arm-linux-gnu
130+
arm-linux-musl
131+
arm64-darwin
132+
x86_64-darwin
133+
x86_64-linux-gnu
134+
x86_64-linux-musl
135+
136+
DEPENDENCIES
137+
debug
138+
railties
139+
signed_params!
140+
141+
BUNDLED WITH
142+
2.6.9

bin/test

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/usr/bin/env ruby
2+
$: << File.expand_path("../test", __dir__)
3+
4+
require "bundler/setup"
5+
require "rails/plugin/test"

lib/signed_params.rb

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,29 @@
1-
require "signed_params/concern"
2-
require "signed_params/configuration"
31
require "signed_params/version"
2+
require "action_controller/metal/strong_parameters"
43

5-
module SignedParams
6-
class << self
7-
def configuration
8-
@configuration ||= Configuration.new
9-
end
4+
class ActionController::Parameters::Signed < Data.define(:verifier, :params)
5+
ActionController::Parameters::InvalidSignature = Class.new StandardError
106

11-
def configure
12-
yield configuration
13-
end
7+
def [](key)
8+
verifier.verified(params[key])
149
end
10+
11+
def fetch(key)
12+
verifier.verify(params[key])
13+
rescue ActiveSupport::MessageVerifier::InvalidSignature
14+
raise ActionController::Parameters::InvalidSignature
15+
end
16+
end
17+
18+
module ActionController::Parameters::Signed::Integration
19+
def self.included(parameters)
20+
parameters.mattr_accessor :verifier
21+
end
22+
23+
def sign(**params)
24+
params.transform_values { verifier.generate _1 }
25+
end
26+
def signed = @signed ||= ActionController::Parameters::Signed.new(verifier, self)
1527
end
28+
29+
require_relative "signed_params/railtie" if defined?(Rails::Railtie)

lib/signed_params/concern.rb

Lines changed: 0 additions & 38 deletions
This file was deleted.

lib/signed_params/configuration.rb

Lines changed: 0 additions & 21 deletions
This file was deleted.

lib/signed_params/railtie.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class SignedParams::Railtie < Rails::Railtie
2+
initializer "parameters.signed.set_verifier" do |app|
3+
ActionController::Parameters.include ActionController::Parameters::Signed::Integration
4+
ActionController::Parameters.verifier = app.message_verifier :signed_parameters
5+
end
6+
end

signed_params.gemspec

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,6 @@ Gem::Specification.new do |spec|
1818
spec.files = Dir.chdir(File.expand_path(__dir__)) do
1919
Dir["{lib}/**/*", "LICENCE", "Rakefile", "README.md"]
2020
end
21+
22+
spec.add_dependency "actionpack", ">= 6.1"
2123
end

test/signed_params_test.rb

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
require "test_helper"
2+
3+
class SignedParamsTest < ActionDispatch::IntegrationTest
4+
test "with nil id" do
5+
assert_nil params.signed[:id]
6+
assert_raises ActionController::Parameters::InvalidSignature do
7+
params.signed.fetch(:id)
8+
end
9+
end
10+
11+
test "with signed parameter id" do
12+
signed = params.sign(id: 1)
13+
assert_includes signed[:id], "==--"
14+
15+
params = ActionController::Parameters.new(**signed)
16+
assert_equal 1, params.signed[:id]
17+
assert_equal 1, params.signed.fetch(:id)
18+
end
19+
20+
test "pass signed params to URLs" do
21+
uri = URI post_url params.sign(id: 1, first_query_param: true, second_query_param: false)
22+
assert_match(/posts\/.*?==--/, uri.path)
23+
24+
query = Rack::Utils.parse_query uri.query
25+
assert_equal 2, query.keys.size
26+
assert_match "--", query.fetch("first_query_param")
27+
assert_match "--", query.fetch("second_query_param")
28+
end
29+
30+
test "extract signed params from controller" do
31+
get post_url(params.sign(id: 1))
32+
assert_equal 1, response.body.to_i
33+
end
34+
35+
private
36+
def params = ActionController::Parameters.new
37+
end

0 commit comments

Comments
 (0)