microsoft_kiota_abstractions 0.25.1 → 0.25.3
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/microsoft_kiota_abstractions/authentication/allowed_hosts_validator.rb +35 -7
- data/lib/microsoft_kiota_abstractions/authentication/base_bearer_token_authentication_provider.rb +30 -3
- data/lib/microsoft_kiota_abstractions/request_headers.rb +49 -14
- data/lib/microsoft_kiota_abstractions/request_information.rb +16 -9
- data/lib/microsoft_kiota_abstractions/version.rb +1 -1
- data/microsoft_kiota_abstractions.gemspec +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 86e29962236a43fe36f9606ce411217392788b49899ba76c53100aa109b0fd69
|
|
4
|
+
data.tar.gz: a508765b80eba3cc0ea4143cf9d5cc76cd960a1b0340498b862eab12b0efe683
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 19e2eb208ceeac2a34a7977b47af90348e6a8c4818e40f01da2adc2c82219cb88bd29fbcd7711c650a7f4f0f8ff2487a41464fa34cac6f48ffeb928f613c639f
|
|
7
|
+
data.tar.gz: a0e5573e8f792325c3403ccfd523d694228540a615fed49054201903658ea53c1a76ba8d6b151b4e69904985e07f1aeb7952fba15dbef2297595c18f46970278
|
|
@@ -6,6 +6,8 @@ module MicrosoftKiotaAbstractions
|
|
|
6
6
|
# Maintains a list of valid hosts and allows authentication providers to check whether
|
|
7
7
|
# a host is valid before authenticating a request
|
|
8
8
|
class AllowedHostsValidator
|
|
9
|
+
LOCALHOST_STRINGS = ['localhost', '::1', '[::1]', '127.0.0.1'].freeze
|
|
10
|
+
|
|
9
11
|
# creates a new AllocatedHostsValidator with provided values
|
|
10
12
|
def initialize(allowed_hosts)
|
|
11
13
|
self.allowed_hosts = allowed_hosts
|
|
@@ -24,19 +26,45 @@ module MicrosoftKiotaAbstractions
|
|
|
24
26
|
|
|
25
27
|
# checks whether the provided host is valid
|
|
26
28
|
def url_host_valid?(url)
|
|
27
|
-
return
|
|
29
|
+
return false if url.nil?
|
|
30
|
+
|
|
31
|
+
begin
|
|
32
|
+
parsed_url = URI(url)
|
|
33
|
+
rescue URI::InvalidURIError, ArgumentError
|
|
34
|
+
return false
|
|
35
|
+
end
|
|
28
36
|
|
|
29
|
-
parsed_url = URI(url)
|
|
30
37
|
return false if parsed_url.host.nil?
|
|
31
38
|
|
|
32
|
-
|
|
39
|
+
is_https = parsed_url.is_a?(URI::HTTPS)
|
|
40
|
+
is_http_localhost = parsed_url.is_a?(URI::HTTP) && localhost?(parsed_url)
|
|
41
|
+
return false unless is_https || is_http_localhost
|
|
42
|
+
|
|
43
|
+
return true if @allowed_hosts.empty?
|
|
44
|
+
|
|
45
|
+
host = parsed_url.host.downcase
|
|
46
|
+
return true if @allowed_hosts.key?(host)
|
|
33
47
|
|
|
34
|
-
|
|
35
|
-
return true if @allowed_hosts.key?
|
|
48
|
+
stripped_host = host.delete_prefix('[').delete_suffix(']')
|
|
49
|
+
return true if @allowed_hosts.key?(stripped_host)
|
|
50
|
+
|
|
51
|
+
hostname = (parsed_url.hostname || host).downcase
|
|
52
|
+
return true if @allowed_hosts.key?(hostname)
|
|
36
53
|
|
|
37
54
|
@allowed_hosts.any? { |allowed_host, _| allowed_host.start_with?('.') && hostname.end_with?(allowed_host) }
|
|
38
|
-
|
|
39
|
-
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# checks whether the host in the parsed url is a loopback/localhost address
|
|
58
|
+
def localhost?(parsed_url)
|
|
59
|
+
host = parsed_url.host
|
|
60
|
+
return false if host.nil?
|
|
61
|
+
|
|
62
|
+
return true if LOCALHOST_STRINGS.include?(host.downcase)
|
|
63
|
+
|
|
64
|
+
hostname = parsed_url.hostname
|
|
65
|
+
return false if hostname.nil?
|
|
66
|
+
|
|
67
|
+
LOCALHOST_STRINGS.include?(hostname.downcase)
|
|
40
68
|
end
|
|
41
69
|
|
|
42
70
|
# gets the list of valid hosts
|
data/lib/microsoft_kiota_abstractions/authentication/base_bearer_token_authentication_provider.rb
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative 'authentication_provider'
|
|
4
4
|
require_relative 'access_token_provider'
|
|
5
|
+
require_relative '../request_headers'
|
|
5
6
|
|
|
6
7
|
module MicrosoftKiotaAbstractions
|
|
7
8
|
# Provides a base class for implementing AuthenticationProvider for Bearer token scheme
|
|
@@ -19,15 +20,41 @@ module MicrosoftKiotaAbstractions
|
|
|
19
20
|
raise StandardError, 'Request cannot be null' if request.nil?
|
|
20
21
|
|
|
21
22
|
# If request contains already an authorization header, nothing needs to be done.
|
|
22
|
-
if request.headers.
|
|
23
|
+
has_auth_header = if request.headers.respond_to?(:key?)
|
|
24
|
+
request.headers.key?(AUTHORIZATION_HEADER_KEY)
|
|
25
|
+
elsif request.headers.respond_to?(:get_all) && request.headers.get_all
|
|
26
|
+
request.headers.get_all.keys.any? { |k| k.to_s.casecmp?(AUTHORIZATION_HEADER_KEY) }
|
|
27
|
+
else
|
|
28
|
+
false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
if has_auth_header
|
|
23
32
|
Fiber.new do
|
|
24
33
|
end
|
|
25
34
|
else
|
|
26
35
|
Fiber.new do
|
|
27
|
-
|
|
28
|
-
|
|
36
|
+
auth_fiber = @access_token_provider.get_authorization_token(request.uri, additional_properties)
|
|
37
|
+
token = auth_fiber.resume if auth_fiber
|
|
38
|
+
unless token.nil? || token.empty?
|
|
39
|
+
headers = ensure_request_headers(request)
|
|
40
|
+
headers.add(AUTHORIZATION_HEADER_KEY, "Bearer #{token}")
|
|
41
|
+
end
|
|
29
42
|
end
|
|
30
43
|
end
|
|
31
44
|
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def ensure_request_headers(request)
|
|
49
|
+
return request.headers unless request.headers.nil?
|
|
50
|
+
|
|
51
|
+
headers = RequestHeaders.new
|
|
52
|
+
if request.respond_to?(:headers=)
|
|
53
|
+
request.headers = headers
|
|
54
|
+
elsif request.instance_variable_defined?(:@headers)
|
|
55
|
+
request.instance_variable_set(:@headers, headers)
|
|
56
|
+
end
|
|
57
|
+
headers
|
|
58
|
+
end
|
|
32
59
|
end
|
|
33
60
|
end
|
|
@@ -7,46 +7,60 @@ module MicrosoftKiotaAbstractions
|
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
def add(key, value)
|
|
10
|
-
if key.nil? || key.empty? || value.nil? || value.empty?
|
|
10
|
+
if key.nil? || key.to_s.empty? || value.nil? || (value.respond_to?(:empty?) && value.empty?)
|
|
11
11
|
raise ArgumentError, 'key and value cannot be nil or empty'
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
key = key.to_s
|
|
15
|
+
existing_key = find_key(key)
|
|
16
|
+
if existing_key.nil?
|
|
16
17
|
@headers[key] = if value.is_a?(Array)
|
|
17
|
-
value
|
|
18
|
+
value.map(&:to_s)
|
|
18
19
|
else
|
|
19
20
|
[value.to_s]
|
|
20
21
|
end
|
|
21
22
|
elsif value.is_a?(Array)
|
|
22
|
-
@headers[
|
|
23
|
+
@headers[existing_key] = @headers[existing_key] | value.map(&:to_s)
|
|
23
24
|
else
|
|
24
|
-
|
|
25
|
+
@headers[existing_key] = @headers[existing_key] | [value.to_s]
|
|
25
26
|
end
|
|
26
27
|
end
|
|
27
28
|
|
|
28
29
|
def try_add(key, value)
|
|
29
|
-
if key.nil? || key.empty? || value.nil? || value.empty?
|
|
30
|
+
if key.nil? || key.to_s.empty? || value.nil? || (value.respond_to?(:empty?) && value.empty?)
|
|
30
31
|
raise ArgumentError, 'key and value cannot be nil or empty'
|
|
31
32
|
end
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
key = key.to_s
|
|
35
|
+
existing_key = find_key(key)
|
|
36
|
+
return false if existing_key && !@headers[existing_key].empty?
|
|
35
37
|
|
|
36
|
-
@headers[key] =
|
|
38
|
+
@headers[existing_key || key] = if value.is_a?(Array)
|
|
39
|
+
value.map(&:to_s)
|
|
40
|
+
else
|
|
41
|
+
[value.to_s]
|
|
42
|
+
end
|
|
37
43
|
true
|
|
38
44
|
end
|
|
39
45
|
|
|
40
46
|
def get(key)
|
|
41
|
-
raise ArgumentError, 'key cannot be nil or empty' if key.nil? || key.empty?
|
|
47
|
+
raise ArgumentError, 'key cannot be nil or empty' if key.nil? || key.to_s.empty?
|
|
42
48
|
|
|
43
|
-
|
|
49
|
+
existing_key = find_key(key.to_s)
|
|
50
|
+
existing_key ? @headers[existing_key] : nil
|
|
44
51
|
end
|
|
45
52
|
|
|
46
53
|
def remove(key)
|
|
47
|
-
raise ArgumentError, 'key cannot be nil or empty' if key.nil? || key.empty?
|
|
54
|
+
raise ArgumentError, 'key cannot be nil or empty' if key.nil? || key.to_s.empty?
|
|
48
55
|
|
|
49
|
-
|
|
56
|
+
existing_key = find_key(key.to_s)
|
|
57
|
+
@headers.delete(existing_key) if existing_key
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def key?(key)
|
|
61
|
+
return false if key.nil? || key.to_s.empty?
|
|
62
|
+
|
|
63
|
+
!find_key(key.to_s).nil?
|
|
50
64
|
end
|
|
51
65
|
|
|
52
66
|
def clear
|
|
@@ -56,5 +70,26 @@ module MicrosoftKiotaAbstractions
|
|
|
56
70
|
def get_all
|
|
57
71
|
@headers
|
|
58
72
|
end
|
|
73
|
+
|
|
74
|
+
def add_all(other)
|
|
75
|
+
return if other.nil?
|
|
76
|
+
|
|
77
|
+
if other.respond_to?(:get_all)
|
|
78
|
+
other.get_all.each { |k, v| add(k.to_s, v) }
|
|
79
|
+
elsif other.is_a?(Hash)
|
|
80
|
+
other.each { |k, v| add(k.to_s, v) }
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
def find_key(key)
|
|
87
|
+
return key if @headers.key?(key)
|
|
88
|
+
|
|
89
|
+
key_str = key.to_s
|
|
90
|
+
return key_str if @headers.key?(key_str)
|
|
91
|
+
|
|
92
|
+
@headers.keys.find { |k| k.to_s.casecmp?(key_str) }
|
|
93
|
+
end
|
|
59
94
|
end
|
|
60
95
|
end
|
|
@@ -10,7 +10,8 @@ require_relative 'request_headers'
|
|
|
10
10
|
|
|
11
11
|
module MicrosoftKiotaAbstractions
|
|
12
12
|
class RequestInformation
|
|
13
|
-
attr_reader :content, :http_method
|
|
13
|
+
attr_reader :content, :http_method
|
|
14
|
+
attr_writer :headers
|
|
14
15
|
attr_accessor :url_template, :path_parameters, :query_parameters
|
|
15
16
|
|
|
16
17
|
@@binary_content_type = 'application/octet-stream'
|
|
@@ -23,6 +24,10 @@ module MicrosoftKiotaAbstractions
|
|
|
23
24
|
@path_parameters = {}
|
|
24
25
|
end
|
|
25
26
|
|
|
27
|
+
def headers
|
|
28
|
+
@headers ||= RequestHeaders.new
|
|
29
|
+
end
|
|
30
|
+
|
|
26
31
|
def uri=(arg)
|
|
27
32
|
raise ArgumentError, 'arg cannot be nil or empty' if arg.nil? || arg.empty?
|
|
28
33
|
|
|
@@ -35,6 +40,8 @@ module MicrosoftKiotaAbstractions
|
|
|
35
40
|
return @uri unless @uri.nil?
|
|
36
41
|
|
|
37
42
|
if path_parameters[@@raw_url_key].nil?
|
|
43
|
+
raise StandardError, 'url_template cannot be nil or empty' if @url_template.nil? || @url_template.empty?
|
|
44
|
+
|
|
38
45
|
values = path_parameters.merge(query_parameters).transform_values { |v| template_value(v) }
|
|
39
46
|
return URI(StdUriTemplate.expand(@url_template, values))
|
|
40
47
|
end
|
|
@@ -82,7 +89,7 @@ module MicrosoftKiotaAbstractions
|
|
|
82
89
|
def set_stream_content(value = $stdin, content_type)
|
|
83
90
|
@content = value
|
|
84
91
|
content_type = @@binary_content_type if content_type.nil? || content_type.empty?
|
|
85
|
-
|
|
92
|
+
headers.try_add(@@content_type_header, content_type)
|
|
86
93
|
end
|
|
87
94
|
|
|
88
95
|
SCALAR_WRITERS = {
|
|
@@ -101,7 +108,7 @@ module MicrosoftKiotaAbstractions
|
|
|
101
108
|
|
|
102
109
|
def set_content_from_scalar(request_adapter, content_type, values)
|
|
103
110
|
writer = request_adapter.get_serialization_writer_factory.get_serialization_writer(content_type)
|
|
104
|
-
|
|
111
|
+
headers.try_add(@@content_type_header, content_type)
|
|
105
112
|
if values.is_a?(Array)
|
|
106
113
|
writer.write_collection_of_primitive_values(nil, values)
|
|
107
114
|
else
|
|
@@ -118,21 +125,21 @@ module MicrosoftKiotaAbstractions
|
|
|
118
125
|
if values.is_a?(MultipartBody)
|
|
119
126
|
content_type = "#{content_type.gsub(/;\s*boundary=[^;]*/i, '')}; boundary=#{values.boundary}"
|
|
120
127
|
values.request_adapter = request_adapter
|
|
121
|
-
|
|
128
|
+
headers.remove(@@content_type_header)
|
|
122
129
|
end
|
|
123
|
-
|
|
130
|
+
headers.try_add(@@content_type_header, content_type)
|
|
124
131
|
if !values.nil? && values.is_a?(Array)
|
|
125
132
|
writer.write_collection_of_object_values(nil, values)
|
|
126
133
|
else
|
|
127
134
|
writer.write_object_value(nil, values)
|
|
128
135
|
end
|
|
129
136
|
@content = writer.get_serialized_content
|
|
130
|
-
rescue StandardError
|
|
131
|
-
raise StandardError, 'could not serialize payload'
|
|
132
137
|
end
|
|
133
138
|
|
|
134
139
|
def add_headers_from_raw_object(h)
|
|
135
|
-
|
|
140
|
+
return if h.nil?
|
|
141
|
+
|
|
142
|
+
headers.add_all(h)
|
|
136
143
|
end
|
|
137
144
|
|
|
138
145
|
def set_query_string_parameters_from_raw_object(q)
|
|
@@ -149,7 +156,7 @@ module MicrosoftKiotaAbstractions
|
|
|
149
156
|
rescue StandardError
|
|
150
157
|
key = method_name
|
|
151
158
|
end
|
|
152
|
-
value =
|
|
159
|
+
value = q.public_send(x)
|
|
153
160
|
query_parameters[key] = value unless value.nil?
|
|
154
161
|
end
|
|
155
162
|
end
|
|
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
|
|
|
28
28
|
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
|
29
29
|
spec.require_paths = ['lib']
|
|
30
30
|
spec.add_dependency 'iso8601', '~> 0.13.0'
|
|
31
|
-
spec.add_dependency 'stduritemplate', '>=
|
|
31
|
+
spec.add_dependency 'stduritemplate', '>= 2.0.13', '< 2.1.0'
|
|
32
32
|
spec.add_development_dependency 'rake', '~> 13.0'
|
|
33
33
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
|
34
34
|
spec.add_development_dependency 'rubocop'
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: microsoft_kiota_abstractions
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.25.
|
|
4
|
+
version: 0.25.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Microsoft Corporation
|
|
@@ -29,7 +29,7 @@ dependencies:
|
|
|
29
29
|
requirements:
|
|
30
30
|
- - ">="
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version:
|
|
32
|
+
version: 2.0.13
|
|
33
33
|
- - "<"
|
|
34
34
|
- !ruby/object:Gem::Version
|
|
35
35
|
version: 2.1.0
|
|
@@ -39,7 +39,7 @@ dependencies:
|
|
|
39
39
|
requirements:
|
|
40
40
|
- - ">="
|
|
41
41
|
- !ruby/object:Gem::Version
|
|
42
|
-
version:
|
|
42
|
+
version: 2.0.13
|
|
43
43
|
- - "<"
|
|
44
44
|
- !ruby/object:Gem::Version
|
|
45
45
|
version: 2.1.0
|