apicasso 0.6.5 → 0.6.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/apicasso/crud_controller.rb +0 -14
- data/app/controllers/concerns/crud_utils.rb +62 -28
- data/app/controllers/concerns/orderable.rb +2 -1
- data/app/controllers/concerns/sql_security.rb +12 -6
- data/lib/apicasso/version.rb +1 -1
- data/lib/generators/apicasso/install/install_generator.rb +1 -1
- data/spec/dummy/log/test.log +1792 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 05272b515597bae8632763fc837cc5e18ac0ed42209068b4f88d19b6c7356043
|
4
|
+
data.tar.gz: 4e31ec9f33f2d7f1fe91c5154c80992390af1b65dc50e90b7e68f2ed2986472d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f249d297a5ab7abc073f4419acae6f99b7e03859f2afbd170079f9d3832d634ae87b51891939fab83dc6b2fb600e2d01e07a888c645b5e9e3ce59a005980c5e
|
7
|
+
data.tar.gz: d33c492ef94b5184acb47b30f621d7fe5bc355868f6c08ae6fcf7bf8a59e81e55ac66c5104a005902e8c3f6c83ccccef8f94f1dc51ffeb3914bdac5663ed2da1
|
@@ -91,13 +91,6 @@ module Apicasso
|
|
91
91
|
authorize! action_to_cancancan, @object
|
92
92
|
end
|
93
93
|
|
94
|
-
# Used to setup the resource's schema, mapping attributes and it's types
|
95
|
-
def resource_schema
|
96
|
-
schemated = {}
|
97
|
-
resource.columns_hash.each { |key, value| schemated[key] = value.type }
|
98
|
-
schemated
|
99
|
-
end
|
100
|
-
|
101
94
|
# Used to setup the records from the selected resource that are
|
102
95
|
# going to be rendered, if authorized
|
103
96
|
def set_records
|
@@ -180,13 +173,6 @@ module Apicasso
|
|
180
173
|
end
|
181
174
|
end
|
182
175
|
|
183
|
-
# Only allow a trusted parameter "white list" through,
|
184
|
-
# based on resource's schema.
|
185
|
-
def object_params
|
186
|
-
params.require(resource.name.underscore.to_sym)
|
187
|
-
.permit(resource_params)
|
188
|
-
end
|
189
|
-
|
190
176
|
# Common setup to stablish which model is the resource of this request
|
191
177
|
def set_root_resource
|
192
178
|
@root_resource = params[:resource].classify.constantize
|
@@ -31,36 +31,63 @@ module CrudUtils
|
|
31
31
|
built
|
32
32
|
end
|
33
33
|
|
34
|
+
# Used to setup the resource's schema, mapping attributes and it's types
|
35
|
+
def resource_schema
|
36
|
+
schemated = {}
|
37
|
+
resource.columns_hash.each { |key, value| schemated[key] = value.type }
|
38
|
+
schemated
|
39
|
+
end
|
40
|
+
|
34
41
|
# A wrapper to has_one relations parameter building
|
35
42
|
def has_one_params
|
36
43
|
resource.reflect_on_all_associations(:has_one).map do |one|
|
37
|
-
|
38
|
-
next if one.class_name.ends_with?('Blob')
|
39
|
-
|
40
|
-
one.name.to_s.gsub(/(_attachment)$/, '').to_sym
|
41
|
-
else
|
42
|
-
one.name
|
43
|
-
end
|
44
|
+
relation_param(one)
|
44
45
|
end.compact
|
45
46
|
end
|
46
47
|
|
47
48
|
# A wrapper to has_many parameter building
|
48
49
|
def has_many_params
|
49
50
|
resource.reflect_on_all_associations(:has_many).map do |many|
|
50
|
-
|
51
|
-
next if many.class_name.ends_with?('Blob')
|
52
|
-
|
53
|
-
{ many.name.to_s.gsub(/(_attachments)$/, '').to_sym => [] }
|
54
|
-
else
|
55
|
-
{ many.name.to_sym => [] }
|
56
|
-
end
|
51
|
+
relation_param(many)
|
57
52
|
end.compact
|
58
53
|
end
|
59
54
|
|
55
|
+
# Extract permitted parameter from relation based on it's type
|
56
|
+
# This method proccess ActiveStorage parameters differently,
|
57
|
+
# so that it becomes available without further configuration
|
58
|
+
def relation_param(relation)
|
59
|
+
if relation.class_name.starts_with?('ActiveStorage')
|
60
|
+
return if relation.class_name.ends_with?('Blob')
|
61
|
+
|
62
|
+
active_storage_param(relation)
|
63
|
+
else
|
64
|
+
common_relation_param(relation)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Non-ActiveStorage relation parameter parsing, receives the
|
69
|
+
# relation reflection as parameter
|
70
|
+
def common_relation_param(relation)
|
71
|
+
if relation.has_one?
|
72
|
+
relation.name
|
73
|
+
else
|
74
|
+
{ relation.name.to_sym => [] }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# ActiveStorage relation parameter parsing, receives the
|
79
|
+
# relation reflection as parameter
|
80
|
+
def active_storage_param(relation)
|
81
|
+
if relation.has_one?
|
82
|
+
relation.name.to_s.gsub(/(_attachment)$/, '').to_sym
|
83
|
+
else
|
84
|
+
{ relation.name.to_s.gsub(/(_attachments)$/, '').to_sym => [] }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
60
88
|
# Parse to include options
|
61
89
|
def include_options
|
62
|
-
{ include: parsed_associations || [],
|
63
|
-
methods: parsed_methods || [] }
|
90
|
+
{ include: parsed_associations || [], methods: parsed_methods || [] }
|
64
91
|
end
|
65
92
|
|
66
93
|
# Used to avoid errors parsing the search query, which can be passed as
|
@@ -75,25 +102,25 @@ module CrudUtils
|
|
75
102
|
# Used to avoid errors in included associations parsing and to enable a
|
76
103
|
# insertion point for a change on splitting method.
|
77
104
|
def parsed_associations
|
78
|
-
|
79
|
-
if @object.respond_to?(param)
|
80
|
-
param if associations_array.include?(param)
|
81
|
-
end
|
82
|
-
end.compact
|
83
|
-
rescue NoMethodError
|
84
|
-
[]
|
105
|
+
parsed_include(:include)
|
85
106
|
end
|
86
107
|
|
87
108
|
# Used to avoid errors in included associations parsing and to enable a
|
88
109
|
# insertion point for a change on splitting method.
|
89
110
|
def parsed_methods
|
90
|
-
|
91
|
-
|
111
|
+
parsed_include(:method)
|
112
|
+
end
|
113
|
+
|
114
|
+
def parsed_include(opts = nil)
|
115
|
+
params[:include]&.split(',')&.map do |param|
|
116
|
+
next unless @object.respond_to?(param)
|
117
|
+
|
118
|
+
if opts == :method
|
92
119
|
param unless associations_array.include?(param)
|
120
|
+
elsif opts == :include
|
121
|
+
param if associations_array.include?(param)
|
93
122
|
end
|
94
|
-
end
|
95
|
-
rescue NoMethodError
|
96
|
-
[]
|
123
|
+
end&.compact
|
97
124
|
end
|
98
125
|
|
99
126
|
# Used to avoid errors in fieldset selection parsing and to enable a
|
@@ -136,4 +163,11 @@ module CrudUtils
|
|
136
163
|
uri.query = Rack::Utils.build_query(query)
|
137
164
|
uri.to_s
|
138
165
|
end
|
166
|
+
|
167
|
+
# Only allow a trusted parameter "white list" through,
|
168
|
+
# based on resource's schema.
|
169
|
+
def object_params
|
170
|
+
params.require(resource.name.underscore.to_sym)
|
171
|
+
.permit(resource_params)
|
172
|
+
end
|
139
173
|
end
|
@@ -39,7 +39,8 @@ module Orderable
|
|
39
39
|
attr.match(/\A[+-]/).nil? ? '+': attr.slice!(0)
|
40
40
|
end
|
41
41
|
|
42
|
+
# Gets class of the resource of the current request
|
42
43
|
def model
|
43
|
-
|
44
|
+
(params[:nested] || params[:resource] || controller_name).classify.constantize
|
44
45
|
end
|
45
46
|
end
|
@@ -27,17 +27,23 @@ module SqlSecurity
|
|
27
27
|
|
28
28
|
# Check if request is a sql injection
|
29
29
|
def sql_injection(klass)
|
30
|
-
apicasso_parameters.each do |
|
31
|
-
if
|
32
|
-
|
33
|
-
|
34
|
-
return false unless parameters_sql_safe?(klass, value)
|
35
|
-
end
|
30
|
+
apicasso_parameters.each do |name, value|
|
31
|
+
next if safe_parameter?(klass, name, value)
|
32
|
+
|
33
|
+
return false
|
36
34
|
end
|
37
35
|
end
|
38
36
|
|
39
37
|
private
|
40
38
|
|
39
|
+
def safe_parameter?(klass, name, value)
|
40
|
+
if name.to_sym == :group
|
41
|
+
group_sql_safe?(klass, value)
|
42
|
+
else
|
43
|
+
parameters_sql_safe?(klass, value)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
41
47
|
# Check for SQL injection before requests and
|
42
48
|
# raise a exception when find
|
43
49
|
def bad_request?
|
data/lib/apicasso/version.rb
CHANGED