File tree 6 files changed +59
-3
lines changed
spec/shield/operations/mixins
src/shield/operations/mixins
6 files changed +59
-3
lines changed Original file line number Diff line number Diff line change @@ -10,6 +10,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
10
10
### Changed
11
11
- Change no-op methods in ` Shield::Hash ` to ` abstract def ` s
12
12
13
+ ### Fixed
14
+ - Limit lengths of OAuth client and bearer login names to mitigate potential DoS
15
+
13
16
## [ 1.2.0] - 2024-07-05
14
17
15
18
### Fixed
Original file line number Diff line number Diff line change 200
200
name_invalid : Name is not valid
201
201
name_not_allowed : The provided name is not allowed
202
202
name_required : Name is required
203
+ name_too_long : Name cannot be longer than %{max} characters
203
204
password_length_invalid : Password must be between %{min} and %{max} characters long
204
205
password_notify_required : Password notification was not set
205
206
password_required : Password is required
Original file line number Diff line number Diff line change @@ -91,6 +91,22 @@ describe Shield::ValidateBearerLogin do
91
91
end
92
92
end
93
93
94
+ it " rejects long name" do
95
+ user = UserFactory .create
96
+
97
+ SaveBearerLogin .create(params(
98
+ user_id: user.id,
99
+ active_at: Time .utc,
100
+ name: " t" * 300 ,
101
+ token_digest: " abc" ,
102
+ scopes: [BearerScope .new(Api ::Posts ::Index ).to_s]
103
+ )) do |operation , bearer_login |
104
+ bearer_login.should be_nil
105
+
106
+ operation.name.should have_error(" operation.error.name_too_long" )
107
+ end
108
+ end
109
+
94
110
it " requires a valid name format" do
95
111
user = UserFactory .create
96
112
Original file line number Diff line number Diff line change @@ -100,6 +100,24 @@ describe Shield::ValidateOauthClient do
100
100
end
101
101
end
102
102
103
+ it " rejects long name" do
104
+ user = UserFactory .create
105
+
106
+ SaveOauthClient .create(
107
+ params(
108
+ active_at: Time .utc,
109
+ name: " c" * 300 ,
110
+ secret_digest: " a1b2c3" ,
111
+ user_id: user.id
112
+ ),
113
+ redirect_uris: [" https://example.com/oauth/callback" ],
114
+ ) do |operation , oauth_client |
115
+ oauth_client.should be_nil
116
+
117
+ operation.name.should have_error(" operation.error.name_too_long" )
118
+ end
119
+ end
120
+
103
121
it " requires a valid name format" do
104
122
user = UserFactory .create
105
123
Original file line number Diff line number Diff line change @@ -5,8 +5,10 @@ module Shield::ValidateBearerLogin
5
5
before_save do
6
6
ensure_scopes_unique
7
7
8
- validate_name_required
9
8
validate_user_id_required
9
+
10
+ validate_name_required
11
+ validate_name_length
10
12
validate_name_valid
11
13
validate_name_unique
12
14
@@ -27,6 +29,14 @@ module Shield::ValidateBearerLogin
27
29
validate_required name, message: Rex .t(:"operation.error.name_required" )
28
30
end
29
31
32
+ private def validate_name_length
33
+ max = 255
34
+
35
+ validate_size_of name,
36
+ max: max,
37
+ message: Rex .t(:"operation.error.name_too_long" , max: max)
38
+ end
39
+
30
40
private def validate_user_id_required
31
41
validate_required user_id,
32
42
message: Rex .t(:"operation.error.user_id_required" )
Original file line number Diff line number Diff line change @@ -7,6 +7,7 @@ module Shield::ValidateOauthClient
7
7
limit_redirect_uris_count
8
8
9
9
validate_name_required
10
+ validate_name_length
10
11
validate_name_unique
11
12
validate_name_valid
12
13
validate_name_allowed
@@ -22,8 +23,15 @@ module Shield::ValidateOauthClient
22
23
include Lucille ::ValidateUserExists
23
24
24
25
private def validate_name_required
25
- validate_required name,
26
- message: Rex .t(:"operation.error.name_required" )
26
+ validate_required name, message: Rex .t(:"operation.error.name_required" )
27
+ end
28
+
29
+ private def validate_name_length
30
+ max = 255
31
+
32
+ validate_size_of name,
33
+ max: max,
34
+ message: Rex .t(:"operation.error.name_too_long" , max: max)
27
35
end
28
36
29
37
private def validate_name_unique
You can’t perform that action at this time.
0 commit comments