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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2ba7ddf7b17643a875b6f49757bea1ec1cbd4482beeeb61b288a714d7469df0b
4
- data.tar.gz: 670faf6e2676386cb879456c7c204e41ebeb14be0b8a0629ea3e23b48587bd87
3
+ metadata.gz: 86e29962236a43fe36f9606ce411217392788b49899ba76c53100aa109b0fd69
4
+ data.tar.gz: a508765b80eba3cc0ea4143cf9d5cc76cd960a1b0340498b862eab12b0efe683
5
5
  SHA512:
6
- metadata.gz: 5cadd848507db4d323827e4d505644d6fdc2bae9b7e1add6008b8d3c73982d6f99527e90c6c3957a41afeec0563f98cebce8c369c5bcf78abcf31aa62a4bec68
7
- data.tar.gz: a9eea3e5bb2ae6ecc37563452433194a4eae524b356e7becea94baae65d3b19a72c46bff7e784b24093ac2e0aa75c1e75a88657309e653c77ceb9b3579c71696
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 true if @allowed_hosts.empty?
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
- return false unless parsed_url.is_a?(URI::HTTPS)
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
- hostname = parsed_url.host.downcase
35
- return true if @allowed_hosts.key? hostname
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
- rescue URI::InvalidURIError
39
- false
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
@@ -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.get_all.key?(AUTHORIZATION_HEADER_KEY)
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
- token = @access_token_provider.get_authorization_token(request.uri, additional_properties).resume
28
- request.headers.add(AUTHORIZATION_HEADER_KEY, "Bearer #{token}") unless token.nil? || token.empty?
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
- existing_value = @headers[key]
15
- if existing_value.nil?
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[key] = existing_value | value
23
+ @headers[existing_key] = @headers[existing_key] | value.map(&:to_s)
23
24
  else
24
- existing_value << value.to_s
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
- existing_value = @headers[key]
34
- return false unless existing_value.nil? || existing_value.empty?
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] = [value.to_s]
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
- @headers[key]
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
- @headers.delete(key)
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, :headers
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
- @headers.try_add(@@content_type_header, content_type)
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
- @headers.try_add(@@content_type_header, content_type)
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
- @headers.remove(@@content_type_header)
128
+ headers.remove(@@content_type_header)
122
129
  end
123
- @headers.try_add(@@content_type_header, content_type)
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
- h&.get_all&.select { |x, y| @headers.add(x.to_s, y) }
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 = eval("q.#{method_name}")
159
+ value = q.public_send(x)
153
160
  query_parameters[key] = value unless value.nil?
154
161
  end
155
162
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MicrosoftKiotaAbstractions
4
- VERSION = '0.25.1' # x-release-please-version
4
+ VERSION = '0.25.3' # x-release-please-version
5
5
  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', '>= 0.0.39', '< 2.1.0'
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.1
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: 0.0.39
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: 0.0.39
42
+ version: 2.0.13
43
43
  - - "<"
44
44
  - !ruby/object:Gem::Version
45
45
  version: 2.1.0