go_to_param 0.2.0 → 1.1.2
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 +5 -5
- data/CHANGELOG.md +13 -0
- data/README.md +10 -1
- data/go_to_param.gemspec +1 -1
- data/lib/go_to_param.rb +35 -5
- data/lib/go_to_param/version.rb +1 -1
- data/spec/go_to_param_spec.rb +55 -18
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9a103b9617231ac26d4b5e82ca46dea4bcfd961cbda378476113d3dcd5ab7303
|
4
|
+
data.tar.gz: 0d805e34c66359b35775edc1e77ac9246b8f5d3b9838755d748f4c3acd1ae44b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04434b980320f4f2ed8522e9e059973b31b1eb2f5bacb9ad3be482a8e72ddafa859f3974a4385702f973111e25b005377c3865c2696f57f85f0399c1ddf4e1d0
|
7
|
+
data.tar.gz: c7d4929d8f99b889b6680fe3c3383c5bad5d092ddb6d64e0dd704882062360c78f15331a8d4e5764e8731b89f73e3fd32229b5ff90dd9a82bdc5d1e012fe000a
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## 1.1.2
|
4
|
+
|
5
|
+
- Fix keyword parameter warning. Thanks to @olleolleolle!
|
6
|
+
|
7
|
+
## 1.1.1
|
8
|
+
|
9
|
+
- Don't raise exceptions if given hash params from hack attempts, such as: `go_to[foo]=bar`.
|
10
|
+
|
11
|
+
## Earlier
|
12
|
+
|
13
|
+
Sorry, no changelog available for earlier versions.
|
data/README.md
CHANGED
@@ -55,6 +55,8 @@ You can pass additional query parameters to include, which could be suitable if
|
|
55
55
|
|
56
56
|
Note that these parameters always become transformed into a query string: if you're using Ruby on Rails, they won't be interpreted through your route definitions.
|
57
57
|
|
58
|
+
You can, however, pass a Rails-style `anchor: "foo"` parameter to set the URL fragment (`/example#foo`).
|
59
|
+
|
58
60
|
|
59
61
|
### hidden_go_to_tag
|
60
62
|
|
@@ -114,7 +116,13 @@ class SessionsController < ActionController::Base
|
|
114
116
|
end
|
115
117
|
```
|
116
118
|
|
117
|
-
Returns nil if the parameter value is not a relative path, to counter phishing attempts like `/login?go_to=http://evil.com/success_now_give_me_your_cc_details`.
|
119
|
+
Returns `nil` if the parameter value is not a relative path, to counter phishing attempts like `/login?go_to=http://evil.com/success_now_give_me_your_cc_details`.
|
120
|
+
|
121
|
+
If you need to allow some external URLs, that can be configured. You could do this in e.g. a `config/initializers/go_to.rb` file:
|
122
|
+
|
123
|
+
``` ruby
|
124
|
+
GoToParam.allow_redirect_prefix("myapp://")
|
125
|
+
```
|
118
126
|
|
119
127
|
### go_to_path_or
|
120
128
|
|
@@ -139,6 +147,7 @@ Or install it yourself as:
|
|
139
147
|
|
140
148
|
$ gem install go_to_param
|
141
149
|
|
150
|
+
|
142
151
|
## License
|
143
152
|
|
144
153
|
Copyright (c) 2013 Henrik Nyh
|
data/go_to_param.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
17
|
spec.require_paths = ["lib"]
|
18
18
|
|
19
|
-
spec.add_development_dependency "bundler", "
|
19
|
+
spec.add_development_dependency "bundler", ">= 1.3"
|
20
20
|
spec.add_development_dependency "rake"
|
21
21
|
spec.add_development_dependency "rspec"
|
22
22
|
end
|
data/lib/go_to_param.rb
CHANGED
@@ -2,6 +2,20 @@ require "cgi"
|
|
2
2
|
require "go_to_param/version"
|
3
3
|
|
4
4
|
module GoToParam
|
5
|
+
def self.allow_redirect_prefix(prefix)
|
6
|
+
allowed_redirect_prefixes << prefix
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.allowed_redirect_prefixes
|
10
|
+
reset_allowed_redirect_prefixes unless @allowed_redirect_prefixes
|
11
|
+
@allowed_redirect_prefixes
|
12
|
+
end
|
13
|
+
|
14
|
+
# Mostly for tests…
|
15
|
+
def self.reset_allowed_redirect_prefixes
|
16
|
+
@allowed_redirect_prefixes = [ "/" ]
|
17
|
+
end
|
18
|
+
|
5
19
|
def self.included(klass)
|
6
20
|
klass.helper_method :hidden_go_to_tag, :hidden_go_to_here_tag,
|
7
21
|
:go_to_params, :go_to_here_params,
|
@@ -21,7 +35,7 @@ module GoToParam
|
|
21
35
|
end
|
22
36
|
|
23
37
|
def go_to_here_params(additional_query_params = {})
|
24
|
-
path = go_to_here_path(additional_query_params)
|
38
|
+
path = go_to_here_path(**additional_query_params)
|
25
39
|
|
26
40
|
if path
|
27
41
|
{ go_to: path }
|
@@ -31,8 +45,10 @@ module GoToParam
|
|
31
45
|
end
|
32
46
|
|
33
47
|
def go_to_path
|
48
|
+
return nil if go_to_param_value.nil?
|
49
|
+
|
34
50
|
# Avoid phishing redirects.
|
35
|
-
if
|
51
|
+
if matches_allowed_redirect_prefixes?
|
36
52
|
go_to_param_value
|
37
53
|
else
|
38
54
|
nil
|
@@ -45,16 +61,23 @@ module GoToParam
|
|
45
61
|
|
46
62
|
private
|
47
63
|
|
48
|
-
def
|
64
|
+
def matches_allowed_redirect_prefixes?
|
65
|
+
GoToParam.allowed_redirect_prefixes.any? { |prefix| go_to_param_value.start_with?(prefix) }
|
66
|
+
end
|
67
|
+
|
68
|
+
def go_to_here_path(anchor: nil, **additional_query_params)
|
49
69
|
if request.get?
|
50
|
-
_go_to_add_query_string_from_hash(
|
70
|
+
path_without_anchor = _go_to_add_query_string_from_hash(_go_to_fullpath, additional_query_params)
|
71
|
+
anchor ? path_without_anchor + "#" + anchor : path_without_anchor
|
51
72
|
else
|
52
73
|
nil
|
53
74
|
end
|
54
75
|
end
|
55
76
|
|
56
77
|
def go_to_param_value
|
57
|
-
|
78
|
+
# We use `to_s` to avoid "not a string" type errors from hack attempts where a hash is passed, e.g. "go_to[foo]=bar".
|
79
|
+
value = params[:go_to].to_s
|
80
|
+
value == "" ? nil : value
|
58
81
|
end
|
59
82
|
|
60
83
|
# Named this way to avoid conflicts. TODO: http://thepugautomatic.com/2014/02/private-api/
|
@@ -67,4 +90,11 @@ module GoToParam
|
|
67
90
|
[ path, separator, query_string ].join
|
68
91
|
end
|
69
92
|
end
|
93
|
+
|
94
|
+
# Prevent encoding errors ("incompatible character encodings: UTF-8 and ASCII-8BIT") for certain malformed requests.
|
95
|
+
# Inspired by https://github.com/discourse/discourse/commit/090dc80f8a23dbb3ad703efbac990aa917c06505
|
96
|
+
def _go_to_fullpath
|
97
|
+
path = request.fullpath
|
98
|
+
path.dup.force_encoding("UTF-8").scrub
|
99
|
+
end
|
70
100
|
end
|
data/lib/go_to_param/version.rb
CHANGED
data/spec/go_to_param_spec.rb
CHANGED
@@ -1,25 +1,29 @@
|
|
1
1
|
require_relative "../lib/go_to_param"
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
describe GoToParam do
|
4
|
+
let(:controller_klass) do
|
5
|
+
Class.new do
|
6
|
+
attr_accessor :params, :view_context, :request
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
|
8
|
+
def self.helper_method(*methods)
|
9
|
+
@helper_methods = methods
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.helper_methods
|
13
|
+
@helper_methods
|
14
|
+
end
|
9
15
|
|
10
|
-
|
11
|
-
|
16
|
+
include GoToParam
|
17
|
+
end
|
12
18
|
end
|
13
19
|
|
14
|
-
|
15
|
-
end
|
20
|
+
after { GoToParam.reset_allowed_redirect_prefixes }
|
16
21
|
|
17
|
-
|
18
|
-
let(:controller) { FakeController.new }
|
22
|
+
let(:controller) { controller_klass.new }
|
19
23
|
|
20
24
|
describe "#hidden_go_to_tag" do
|
21
25
|
it "becomes a helper method" do
|
22
|
-
expect(
|
26
|
+
expect(controller_klass.helper_methods).to include :hidden_go_to_tag
|
23
27
|
end
|
24
28
|
|
25
29
|
it "adds a hidden field tag" do
|
@@ -34,7 +38,7 @@ describe GoToParam do
|
|
34
38
|
|
35
39
|
describe "#hidden_go_to_here_tag" do
|
36
40
|
it "becomes a helper method" do
|
37
|
-
expect(
|
41
|
+
expect(controller_klass.helper_methods).to include :hidden_go_to_here_tag
|
38
42
|
end
|
39
43
|
|
40
44
|
it "adds a hidden field tag" do
|
@@ -59,7 +63,7 @@ describe GoToParam do
|
|
59
63
|
|
60
64
|
describe "#go_to_params" do
|
61
65
|
it "becomes a helper method" do
|
62
|
-
expect(
|
66
|
+
expect(controller_klass.helper_methods).to include :go_to_params
|
63
67
|
end
|
64
68
|
|
65
69
|
it "includes the go_to parameter" do
|
@@ -77,7 +81,7 @@ describe GoToParam do
|
|
77
81
|
|
78
82
|
describe "#go_to_here_params" do
|
79
83
|
it "becomes a helper method" do
|
80
|
-
expect(
|
84
|
+
expect(controller_klass.helper_methods).to include :go_to_here_params
|
81
85
|
end
|
82
86
|
|
83
87
|
it "gets the request path as the go_to parameter" do
|
@@ -99,11 +103,27 @@ describe GoToParam do
|
|
99
103
|
expect(controller.go_to_here_params(bar: 3)).to eq({ go_to: "/example?foo&bar=3" })
|
100
104
|
end
|
101
105
|
|
106
|
+
it "accepts an anchor parameter" do
|
107
|
+
controller.request = double(get?: true, fullpath: "/example")
|
108
|
+
expect(controller.go_to_here_params(foo: "foo", anchor: "bar")).to eq({ go_to: "/example?foo=foo#bar" })
|
109
|
+
end
|
110
|
+
|
111
|
+
it "makes sure the go_to path is valid UTF-8" do
|
112
|
+
weird_path = "\xE0\x80\x80weird\330stuff".force_encoding("ASCII-8BIT")
|
113
|
+
replacement = "\uFFFD" # The Unicode "Replacement Character".
|
114
|
+
|
115
|
+
controller.request = double(get?: true, fullpath: weird_path)
|
116
|
+
|
117
|
+
go_to_value = controller.go_to_here_params[:go_to]
|
118
|
+
|
119
|
+
expect(go_to_value.encoding).to eq(Encoding::UTF_8)
|
120
|
+
expect(go_to_value).to eq("#{replacement}#{replacement}#{replacement}weird#{replacement}stuff")
|
121
|
+
end
|
102
122
|
end
|
103
123
|
|
104
124
|
describe "#go_to_path" do
|
105
125
|
it "becomes a helper method" do
|
106
|
-
expect(
|
126
|
+
expect(controller_klass.helper_methods).to include :go_to_path
|
107
127
|
end
|
108
128
|
|
109
129
|
it "is the go_to parameter value" do
|
@@ -115,11 +135,23 @@ describe GoToParam do
|
|
115
135
|
controller.params = { go_to: "http://evil.com", id: "1" }
|
116
136
|
expect(controller.go_to_path).to be_nil
|
117
137
|
end
|
138
|
+
|
139
|
+
it "is nil when given a hash" do
|
140
|
+
controller.params = { go_to: { evil: "true" }, id: "1" }
|
141
|
+
expect(controller.go_to_path).to be_nil
|
142
|
+
end
|
143
|
+
|
144
|
+
it "respects custom allowed redirect prefixes" do
|
145
|
+
GoToParam.allow_redirect_prefix("myapp://")
|
146
|
+
|
147
|
+
controller.params = { go_to: "myapp://", id: "1" }
|
148
|
+
expect(controller.go_to_path).to eq("myapp://")
|
149
|
+
end
|
118
150
|
end
|
119
151
|
|
120
152
|
describe "#go_to_path_or" do
|
121
153
|
it "becomes a helper method" do
|
122
|
-
expect(
|
154
|
+
expect(controller_klass.helper_methods).to include :go_to_path_or
|
123
155
|
end
|
124
156
|
|
125
157
|
it "is the go_to parameter value" do
|
@@ -127,7 +159,12 @@ describe GoToParam do
|
|
127
159
|
expect(controller.go_to_path_or("/default")).to eq("/example")
|
128
160
|
end
|
129
161
|
|
130
|
-
it "
|
162
|
+
it "falls back if the go_to param is blank" do
|
163
|
+
controller.params = { go_to: "", id: "1" }
|
164
|
+
expect(controller.go_to_path_or("/default")).to eq("/default")
|
165
|
+
end
|
166
|
+
|
167
|
+
it "falls back if the go_to param is not allowed" do
|
131
168
|
controller.params = { go_to: "http://evil.com", id: "1" }
|
132
169
|
expect(controller.go_to_path_or("/default")).to eq("/default")
|
133
170
|
end
|
metadata
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: go_to_param
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henrik N
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
-
description:
|
55
|
+
description:
|
56
56
|
email:
|
57
57
|
- henrik@nyh.se
|
58
58
|
executables: []
|
@@ -60,6 +60,7 @@ extensions: []
|
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
62
|
- ".gitignore"
|
63
|
+
- CHANGELOG.md
|
63
64
|
- Gemfile
|
64
65
|
- README.md
|
65
66
|
- Rakefile
|
@@ -71,7 +72,7 @@ homepage: ''
|
|
71
72
|
licenses:
|
72
73
|
- MIT
|
73
74
|
metadata: {}
|
74
|
-
post_install_message:
|
75
|
+
post_install_message:
|
75
76
|
rdoc_options: []
|
76
77
|
require_paths:
|
77
78
|
- lib
|
@@ -86,9 +87,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
86
87
|
- !ruby/object:Gem::Version
|
87
88
|
version: '0'
|
88
89
|
requirements: []
|
89
|
-
|
90
|
-
|
91
|
-
signing_key:
|
90
|
+
rubygems_version: 3.1.2
|
91
|
+
signing_key:
|
92
92
|
specification_version: 4
|
93
93
|
summary: Rails "go_to" redirection param utilities.
|
94
94
|
test_files:
|