inferno_core 0.4.38 → 0.4.39
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 +4 -4
- data/lib/inferno/apps/cli/main.rb +27 -10
- data/lib/inferno/apps/cli/templates/lib/%library_name%.rb.tt +1 -1
- data/lib/inferno/dsl/auth_info.rb +174 -0
- data/lib/inferno/dsl/suite_endpoint.rb +0 -1
- data/lib/inferno/public/bundle.js +3 -3
- data/lib/inferno/repositories/session_data.rb +24 -1
- data/lib/inferno/utils/middleware/request_logger.rb +1 -1
- data/lib/inferno/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c569fc01e07576cb3aa512c37a69d730bc7b9848bd24ed95935b23a0d52759c
|
4
|
+
data.tar.gz: 41165f4f56dcf7c7e552ec0c391b868e5020feed0957f12d508489835a91d140
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03cb4fec0a859ba0967d891b62d4741b6a241839bce017ac0a9f212c06cabbec45e3d8c9464d8a75421c697c6e547af19e5bdbe8055ab7ea630344a781dfdf5e
|
7
|
+
data.tar.gz: ad2fc2e5f42777535e912e4bc8217f48d9d90babb074b071b7437fb3b987f4f8470f505f9e1bd29b1b893f7b6ccc36800145ad62fe82664188e0eab965b71cf5
|
@@ -27,20 +27,24 @@ module Inferno
|
|
27
27
|
desc: 'Automatically restart Inferno when a file is changed.'
|
28
28
|
def start
|
29
29
|
Migration.new.run(Logger::INFO)
|
30
|
-
command = 'foreman start --env=/dev/null'
|
31
|
-
if `gem list -i foreman`.chomp == 'false'
|
32
|
-
puts "You must install foreman with 'gem install foreman' prior to running Inferno."
|
33
|
-
end
|
34
30
|
|
35
|
-
|
36
|
-
|
37
|
-
|
31
|
+
without_bundler do
|
32
|
+
command = 'foreman start --env=/dev/null'
|
33
|
+
|
34
|
+
if `gem list -i foreman`.chomp == 'false'
|
35
|
+
puts "You must install foreman with 'gem install foreman' prior to running Inferno."
|
38
36
|
end
|
39
37
|
|
40
|
-
|
41
|
-
|
38
|
+
if options[:watch]
|
39
|
+
if `gem list -i rerun`.chomp == 'false'
|
40
|
+
puts "You must install 'rerun' with 'gem install rerun' to restart on file changes."
|
41
|
+
end
|
42
|
+
|
43
|
+
command = "rerun \"#{command}\" --background"
|
44
|
+
end
|
42
45
|
|
43
|
-
|
46
|
+
exec command
|
47
|
+
end
|
44
48
|
end
|
45
49
|
|
46
50
|
desc 'suites', 'List available test suites'
|
@@ -60,6 +64,19 @@ module Inferno
|
|
60
64
|
def version
|
61
65
|
puts "Inferno Core v#{Inferno::VERSION}"
|
62
66
|
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
# https://github.com/rubocop/rubocop/issues/12571 - still affects Ruby 3.1 upto Rubocop 1.63
|
71
|
+
# rubocop:disable Naming/BlockForwarding
|
72
|
+
def without_bundler(&block)
|
73
|
+
if defined?(Bundler) && ENV['BUNDLE_GEMFILE']
|
74
|
+
Bundler.with_unbundled_env(&block)
|
75
|
+
else
|
76
|
+
yield
|
77
|
+
end
|
78
|
+
end
|
79
|
+
# rubocop:enable Naming/BlockForwarding
|
63
80
|
end
|
64
81
|
end
|
65
82
|
end
|
@@ -21,7 +21,7 @@ module <%= module_name %>
|
|
21
21
|
oauth_credentials :credentials
|
22
22
|
end
|
23
23
|
|
24
|
-
# All FHIR validation
|
24
|
+
# All FHIR validation requests will use this FHIR validator
|
25
25
|
fhir_resource_validator do
|
26
26
|
# igs 'identifier#version' # Use this method for published IGs/versions
|
27
27
|
# igs 'igs/filename.tgz' # Use this otherwise
|
@@ -0,0 +1,174 @@
|
|
1
|
+
require_relative '../entities/attributes'
|
2
|
+
|
3
|
+
module Inferno
|
4
|
+
module DSL
|
5
|
+
# AuthInfo provide a user with a single input which contains the information
|
6
|
+
# needed for a fhir client to perform authorization and refresh an access
|
7
|
+
# token when necessary.
|
8
|
+
#
|
9
|
+
# AuthInfo supports the following `auth_type`:
|
10
|
+
# - `public` - client id only
|
11
|
+
# - `symmetric` - Symmetric confidential (i.e., with a static client id and
|
12
|
+
# secret)
|
13
|
+
# - `asymmetric` - Symmetric confidential (i.e., a client id with a signed
|
14
|
+
# JWT rather than a client secret)
|
15
|
+
# - `backend_services`
|
16
|
+
#
|
17
|
+
# When configuring an AuthInfo input, the invdidual fields are exposed as
|
18
|
+
# `components` in the input's options, and can be configured there similar
|
19
|
+
# to normal inputs.
|
20
|
+
#
|
21
|
+
# The AuthInfo input type supports two different modes in the UI. Different
|
22
|
+
# fields will be presented to the user dependengi on which mode is selected.
|
23
|
+
# - `auth` - This presents the inputs needed to perform authorization, and
|
24
|
+
# is appropriate to use as an input to test groups which perform
|
25
|
+
# authorization
|
26
|
+
# - `access` - This presents the inputs needed to access resources assuming
|
27
|
+
# that authorization has already happened, and is appropriate to use as an
|
28
|
+
# input to test groups which access resources using previously granted
|
29
|
+
# authorization
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
# class AuthInfoExampleSuite < Inferno::TestSuite
|
33
|
+
# input :url,
|
34
|
+
# title: 'Base FHIR url'
|
35
|
+
#
|
36
|
+
# group do
|
37
|
+
# title 'Perform public authorization'
|
38
|
+
# input :fhir_auth,
|
39
|
+
# type: :auth_info,
|
40
|
+
# options: {
|
41
|
+
# mode: 'auth',
|
42
|
+
# components: [
|
43
|
+
# {
|
44
|
+
# name: :auth_type,
|
45
|
+
# default: 'public',
|
46
|
+
# locked: true
|
47
|
+
# }
|
48
|
+
# ]
|
49
|
+
# }
|
50
|
+
#
|
51
|
+
# # Some tests here to perform authorization
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# group do
|
55
|
+
# title 'FHIR API Tests'
|
56
|
+
# input :fhir_auth,
|
57
|
+
# type: :auth_info,
|
58
|
+
# options: {
|
59
|
+
# mode: 'access'
|
60
|
+
# }
|
61
|
+
#
|
62
|
+
# fhir_client do
|
63
|
+
# url :url
|
64
|
+
# auth_info :fhir_auth # NOT YET IMPLEMENTED
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# # Some tests here to access FHIR API
|
68
|
+
# end
|
69
|
+
# end
|
70
|
+
class AuthInfo
|
71
|
+
ATTRIBUTES = [
|
72
|
+
:auth_type,
|
73
|
+
:use_discovery,
|
74
|
+
:token_url,
|
75
|
+
:auth_url,
|
76
|
+
:requested_scopes,
|
77
|
+
:client_id,
|
78
|
+
:client_secret,
|
79
|
+
:redirect_url, # TODO: does this belong here?
|
80
|
+
:pkce_support,
|
81
|
+
:pkce_code_challenge_method,
|
82
|
+
:auth_request_method,
|
83
|
+
:encryption_algorithm,
|
84
|
+
:kid,
|
85
|
+
:jwks,
|
86
|
+
:access_token,
|
87
|
+
:refresh_token,
|
88
|
+
:issue_time,
|
89
|
+
:expires_in,
|
90
|
+
:name
|
91
|
+
].freeze
|
92
|
+
|
93
|
+
include Entities::Attributes
|
94
|
+
|
95
|
+
attr_accessor :client
|
96
|
+
|
97
|
+
# @!attribute [rw] auth_type The type of authorization to be performed.
|
98
|
+
# One of `public`, `symmetric`, `asymmetric`, or `backend_services`
|
99
|
+
# @!attribute [rw] token_url The url of the auth server's token endpoint
|
100
|
+
# @!attribute [rw] auth_url The url of the authorization endpoint
|
101
|
+
# @!attribute [rw] requested_scopes The scopes which will be requested
|
102
|
+
# during authorization
|
103
|
+
# @!attribute [rw] client_id
|
104
|
+
# @!attribute [rw] client_secret
|
105
|
+
# @!attribute [rw] redirect_url
|
106
|
+
# @!attribute [rw] pkce_support Whether PKCE will be used during
|
107
|
+
# authorization. Either `enabled` or `disabled`.
|
108
|
+
# @!attribute [rw] pkce_code_challenge_method Either `S256` (default) or
|
109
|
+
# `plain`
|
110
|
+
# @!attribute [rw] auth_request_method The http method which will be used
|
111
|
+
# to perform the request to the authorization endpoint. Either `get`
|
112
|
+
# (default) or `post`
|
113
|
+
# @!attribute [rw] encryption_algorithm The encryption algorithm which
|
114
|
+
# will be used to sign the JWT client credentials. Either `es384`
|
115
|
+
# (default) or `rs384`
|
116
|
+
# @!attribute [rw] kid The key id for the keys to be used to sign the JWT
|
117
|
+
# client credentials. When blank, the first key for the selected
|
118
|
+
# encryption algorithm will be used
|
119
|
+
# @!attribute [rw] jwks A JWKS (including private keys) which will be used
|
120
|
+
# instead of Inferno's default JWKS if provided
|
121
|
+
# @!attribute [rw] access_token
|
122
|
+
# @!attribute [rw] refresh_token
|
123
|
+
# @!attribute [rw] issue_time An iso8601 formatted string representing the
|
124
|
+
# time the access token was issued
|
125
|
+
# @!attribute [rw] expires_in The lifetime of the access token in seconds
|
126
|
+
# @!attribute [rw] name
|
127
|
+
|
128
|
+
# @private
|
129
|
+
def initialize(raw_attributes_hash)
|
130
|
+
attributes_hash = raw_attributes_hash.symbolize_keys
|
131
|
+
|
132
|
+
invalid_keys = attributes_hash.keys - ATTRIBUTES
|
133
|
+
|
134
|
+
raise Exceptions::UnknownAttributeException.new(invalid_keys, self.class) if invalid_keys.present?
|
135
|
+
|
136
|
+
attributes_hash.each do |name, value|
|
137
|
+
value = DateTime.parse(value) if name == :issue_time && value.is_a?(String)
|
138
|
+
|
139
|
+
instance_variable_set(:"@#{name}", value)
|
140
|
+
end
|
141
|
+
|
142
|
+
self.issue_time = DateTime.now if access_token.present? && issue_time.blank?
|
143
|
+
end
|
144
|
+
|
145
|
+
# @private
|
146
|
+
def to_hash
|
147
|
+
self.class::ATTRIBUTES.each_with_object({}) do |attribute, hash|
|
148
|
+
value = send(attribute)
|
149
|
+
next if value.nil?
|
150
|
+
|
151
|
+
value = issue_time.iso8601 if attribute == :issue_time
|
152
|
+
|
153
|
+
hash[attribute] = value
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# @private
|
158
|
+
def to_s
|
159
|
+
JSON.generate(to_hash)
|
160
|
+
end
|
161
|
+
|
162
|
+
# @private
|
163
|
+
def add_to_client(client)
|
164
|
+
# TODO
|
165
|
+
# client.auth = self
|
166
|
+
# self.client = client
|
167
|
+
|
168
|
+
# return unless access_token.present?
|
169
|
+
|
170
|
+
# client.set_bearer_token(access_token)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
@@ -289,7 +289,6 @@ module Inferno
|
|
289
289
|
uri.query = env['rack.request.query_string'] if env['rack.request.query_string'].present?
|
290
290
|
url = uri&.to_s
|
291
291
|
verb = env['REQUEST_METHOD']
|
292
|
-
logger.info('get body')
|
293
292
|
request_body = env['rack.input']
|
294
293
|
request_body.rewind if env['rack.input'].respond_to? :rewind
|
295
294
|
request_body = request_body.instance_of?(Puma::NullIO) ? nil : request_body.string
|