model_driven_api 2.3.2 → 2.3.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/commands/authenticate_user.rb +2 -2
- data/app/controllers/api/v2/application_controller.rb +29 -3
- data/app/controllers/api/v2/info_controller.rb +1 -1
- data/lib/concerns/api_exception_management.rb +10 -8
- data/lib/model_driven_api/version.rb +1 -1
- 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: ec88dcaf27ab5abca89f8db87d1293237950dc1879565048b4fbb3d2901b7ac3
|
4
|
+
data.tar.gz: 643513f277c72318ac7b3ffb9ef2e165258113f093611e29442e24a0aa5d553d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76eccc737ca72f10b10b7b0ae265560f41c53950c423faa8c78fece2097e502c1fe477809720e17acff7bdf796d1a5d186d8710d7fe099d3da6e12f987a2fb88
|
7
|
+
data.tar.gz: 4a9052111ab66b72e8639fa2d567bb4cfd99b565fa304fc17e2e80d8eb1d3627a526f3a2f7fcc8cc5229f4816bb578085cc06a6eef85028f603fb10538e51699
|
data/README.md
CHANGED
@@ -422,7 +422,7 @@ Once loaded the tests inside the insomnia application, please right click on the
|
|
422
422
|
|
423
423
|
## TODO
|
424
424
|
|
425
|
-
*
|
425
|
+
* Document the new feature (from version 2.3.3) to add Authentication methods which override the JWT described above. Useful for Webhooks and machine2machine trusted dialogues.
|
426
426
|
|
427
427
|
## References
|
428
428
|
Thanks to all these people for ideas:
|
@@ -107,15 +107,33 @@ class Api::V2::ApplicationController < ActionController::API
|
|
107
107
|
# call an unwanted method in the AR Model.
|
108
108
|
resource = "custom_action_#{params[:do]}"
|
109
109
|
raise NoMethodError unless @model.respond_to?(resource)
|
110
|
-
return true, MultiJson.dump(params[:id].blank? ? @model.send(resource, params) : @model.send(resource, params[:id].to_i, params))
|
110
|
+
# return true, MultiJson.dump(params[:id].blank? ? @model.send(resource, params) : @model.send(resource, params[:id].to_i, params))
|
111
|
+
return true, MultiJson.dump(@model.send(resource, params))
|
111
112
|
end
|
112
113
|
# if it's here there is no custom action in the request querystring
|
113
114
|
return false
|
114
115
|
end
|
116
|
+
|
117
|
+
def class_exists?(class_name)
|
118
|
+
klass = Module.const_get(class_name)
|
119
|
+
return klass.is_a?(Class)
|
120
|
+
rescue NameError
|
121
|
+
return false
|
122
|
+
end
|
115
123
|
|
116
124
|
def authenticate_request
|
117
|
-
|
118
|
-
|
125
|
+
# puts request.headers.inspect
|
126
|
+
@current_user = nil
|
127
|
+
# puts "Are there wbehooks headers to check for? #{Settings.ns(:security).allowed_authorization_headers}"
|
128
|
+
Settings.ns(:security).allowed_authorization_headers.split(",").each do |header|
|
129
|
+
# puts "Found header #{header}: #{request.headers[header.underscore.dasherize]}"
|
130
|
+
check_authorization("Authorize#{header}".constantize.call(request.headers, request.raw_post)) if request.headers[header.underscore.dasherize]
|
131
|
+
end
|
132
|
+
|
133
|
+
# This is the default one, if the header doesn't have a valid form for one of the other Auth methods, then use this Auth Class
|
134
|
+
check_authorization AuthorizeApiRequest.call(request.headers) unless @current_user
|
135
|
+
return unauthenticated!(OpenStruct.new({message: @auth_errors})) unless @current_user
|
136
|
+
|
119
137
|
current_user = @current_user
|
120
138
|
params[:current_user_id] = @current_user.id
|
121
139
|
# Now every time the user fires off a successful GET request,
|
@@ -147,6 +165,14 @@ class Api::V2::ApplicationController < ActionController::API
|
|
147
165
|
return not_found! if (!@model.new.is_a? ActiveRecord::Base rescue false)
|
148
166
|
end
|
149
167
|
|
168
|
+
def check_authorization cmd
|
169
|
+
if cmd.success?
|
170
|
+
@current_user = cmd.result
|
171
|
+
else
|
172
|
+
@auth_errors = cmd.errors
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
150
176
|
# Nullifying strong params for API
|
151
177
|
def params
|
152
178
|
request.parameters
|
@@ -6,7 +6,7 @@ class Api::V2::InfoController < Api::V2::ApplicationController
|
|
6
6
|
|
7
7
|
# api :GET, '/api/v2/info/version', "Just prints the APPVERSION."
|
8
8
|
def version
|
9
|
-
render json: { version:
|
9
|
+
render json: { version: "TODO: Find a Way to Dynamically Obtain It" }.to_json, status: 200
|
10
10
|
end
|
11
11
|
|
12
12
|
# api :GET, '/api/v2/info/roles'
|
@@ -2,13 +2,15 @@ module ApiExceptionManagement
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
4
|
included do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
if Rails.env.production?
|
6
|
+
rescue_from NoMethodError, with: :not_found!
|
7
|
+
rescue_from CanCan::AccessDenied, with: :unauthorized!
|
8
|
+
rescue_from AuthenticateUser::AccessDenied, with: :unauthenticated!
|
9
|
+
rescue_from ActionController::RoutingError, with: :not_found!
|
10
|
+
rescue_from ActiveModel::ForbiddenAttributesError, with: :fivehundred!
|
11
|
+
rescue_from ActiveRecord::RecordInvalid, with: :invalid!
|
12
|
+
rescue_from ActiveRecord::RecordNotFound, with: :not_found!
|
13
|
+
end
|
12
14
|
|
13
15
|
def unauthenticated! exception = AuthenticateUser::AccessDenied.new
|
14
16
|
response.headers['WWW-Authenticate'] = "Token realm=Application"
|
@@ -33,7 +35,7 @@ module ApiExceptionManagement
|
|
33
35
|
|
34
36
|
def api_error(status: 500, errors: [])
|
35
37
|
# puts errors.full_messages if !Rails.env.production? && errors.respond_to?(:full_messages)
|
36
|
-
head status && return if errors.
|
38
|
+
head status && return if errors.blank?
|
37
39
|
|
38
40
|
# For retrocompatibility, I try to send back only strings, as errors
|
39
41
|
errors_response = if errors.respond_to?(:full_messages)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: model_driven_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.
|
4
|
+
version: 2.3.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gabriele Tassoni
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thecore_backend_commons
|