bits_service_client 3.4.0 → 4.0.0.pre.1

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
  SHA1:
3
- metadata.gz: b4242082d6a29fcdb2819d861e9f883a4befc391
4
- data.tar.gz: 6943669dc1c3f5478cc9972baead5bc436d058c6
3
+ metadata.gz: 3fd02832b61746287f81c5d06ef2002cb97fb33b
4
+ data.tar.gz: 80e5101938d38d36dbcc0e1f1ff54b36019eaf33
5
5
  SHA512:
6
- metadata.gz: 3a8067ed2c86500ee9c5cb599ad08b7acaecfe457cd5ac26d4a879ec32a850318b3a3789b49a74da3e366e734ee277915677d47d045ee77bac22eecde7e9d465
7
- data.tar.gz: 74ba859b0b6f0a704bf8a7a4844858171a7134dfa9405d9966f3ef45e37132d9f1e5cbdb2c1532448d4ee0385ba32b0a59fab53e8aa8492d447df147931abebf
6
+ metadata.gz: 39246c058170ffbf73192359b7afa6d065cf109258d1bcf5dd65a40e95daca3388cb719d304f6bafd9ca7a1033fd94823e1352a7293034946eac89e18d766d2d
7
+ data.tar.gz: 033f7d52d78390765856053892bef6a369a56345600f4cbed9b61420e012359b0319bee5730ddeec50ee1e182d8b7be2b333f71a960cdbb226dbae33561d00d7
data/.rubocop.yml CHANGED
@@ -53,7 +53,7 @@ Performance/Sample:
53
53
  Style/Alias:
54
54
  EnforcedStyle: prefer_alias_method
55
55
 
56
- Style/AlignParameters:
56
+ Layout/AlignParameters:
57
57
  Enabled: false
58
58
 
59
59
  Style/BlockDelimiters:
@@ -65,13 +65,13 @@ Style/BracesAroundHashParameters:
65
65
  Style/ClassAndModuleChildren:
66
66
  Enabled: false
67
67
 
68
- Style/ClosingParenthesisIndentation:
68
+ Layout/ClosingParenthesisIndentation:
69
69
  Enabled: false
70
70
 
71
71
  Style/Documentation:
72
72
  Enabled: false
73
73
 
74
- Style/DotPosition:
74
+ Layout/DotPosition:
75
75
  EnforcedStyle: trailing
76
76
 
77
77
  Style/DoubleNegation:
@@ -89,10 +89,10 @@ Style/GuardClause:
89
89
  Style/IfUnlessModifier:
90
90
  Enabled: false
91
91
 
92
- Style/IndentArray:
92
+ Layout/IndentArray:
93
93
  EnforcedStyle: consistent
94
94
 
95
- Style/IndentHash:
95
+ Layout/IndentHash:
96
96
  Enabled: false
97
97
 
98
98
  Style/Lambda:
@@ -101,10 +101,10 @@ Style/Lambda:
101
101
  Style/MultilineBlockChain:
102
102
  Enabled: false
103
103
 
104
- Style/MultilineBlockLayout:
104
+ Layout/MultilineBlockLayout:
105
105
  Enabled: false
106
106
 
107
- Style/MultilineOperationIndentation:
107
+ Layout/MultilineOperationIndentation:
108
108
  Enabled: false
109
109
 
110
110
  Style/NegatedIf:
@@ -116,7 +116,7 @@ Style/Next:
116
116
  Style/NumericLiterals:
117
117
  Enabled: false
118
118
 
119
- Style/PredicateName:
119
+ Naming/PredicateName:
120
120
  Enabled: false
121
121
 
122
122
  Style/RaiseArgs:
@@ -134,7 +134,7 @@ Style/SignalException:
134
134
  Style/SingleLineBlockParams:
135
135
  Enabled: false
136
136
 
137
- Style/SpaceAroundEqualsInParameterDefault:
137
+ Layout/SpaceAroundEqualsInParameterDefault:
138
138
  EnforcedStyle: no_space
139
139
 
140
140
  Style/StructInheritance:
@@ -143,7 +143,10 @@ Style/StructInheritance:
143
143
  Style/TrailingCommaInArguments:
144
144
  Enabled: false
145
145
 
146
- Style/TrailingCommaInLiteral:
146
+ Style/TrailingCommaInArrayLiteral:
147
+ Enabled: false
148
+
149
+ Style/TrailingCommaInHashLiteral:
147
150
  Enabled: false
148
151
 
149
152
  Style/TrailingUnderscoreVariable:
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path('../lib', __FILE__)
3
+ lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'bits_service_client/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = 'bits_service_client'
9
9
  spec.version = BitsServiceClient::VERSION
10
- spec.authors = ['Rizwan Reza', 'Steffen Uhlig', 'Peter Goetz', 'Norman Sutorius']
11
- spec.email = ['rizwanreza@gmail.com', 'steffen.uhlig@de.ibm.com', 'peter.gtz@gmail.com', 'norman.sutorius@de.ibm.com']
10
+ spec.authors = ['Rizwan Reza', 'Steffen Uhlig', 'Peter Goetz', 'Norman Sutorius','Tobias Zipfel']
11
+ spec.email = ['rizwanreza@gmail.com', 'steffen.uhlig@de.ibm.com', 'peter.gtz@gmail.com', 'norman.sutorius@de.ibm.com', 'tobias.zipfel@gmail.com']
12
12
 
13
13
  spec.summary = 'Bits Services client for Cloud Foundry'
14
14
  spec.homepage = 'https://github.com/cloudfoundry-incubator/bits-service-client'
@@ -17,18 +17,18 @@ Gem::Specification.new do |spec|
17
17
  spec.require_paths = ['lib']
18
18
 
19
19
  spec.add_dependency 'activesupport'
20
- spec.add_dependency 'steno'
21
20
  spec.add_dependency 'statsd-ruby', '~> 1.4.0'
21
+ spec.add_dependency 'steno'
22
22
 
23
23
  spec.add_development_dependency 'bundler', '~> 1.11'
24
24
  spec.add_development_dependency 'multipart-post'
25
+ spec.add_development_dependency 'pry'
26
+ spec.add_development_dependency 'pry-nav'
25
27
  spec.add_development_dependency 'rack-test'
26
28
  spec.add_development_dependency 'rake', '~> 10.0'
27
29
  spec.add_development_dependency 'rb-readline'
28
30
  spec.add_development_dependency 'rspec', '~> 3.0'
29
31
  spec.add_development_dependency 'rubocop'
30
- spec.add_development_dependency 'webmock', '= 2.3.1'
31
32
  spec.add_development_dependency 'sinatra'
32
- spec.add_development_dependency 'pry'
33
- spec.add_development_dependency 'pry-nav'
33
+ spec.add_development_dependency 'webmock', '= 2.3.1'
34
34
  end
@@ -4,6 +4,7 @@ require 'json'
4
4
  require 'net/http/post/multipart'
5
5
  require 'openssl'
6
6
 
7
+ require 'util/signature_util'
7
8
  require 'bits_service_client/version'
8
9
  require 'bits_service_client/blob'
9
10
  require 'bits_service_client/errors'
@@ -1,17 +1,22 @@
1
1
  # frozen_string_literal: true
2
+ require 'util/signature_util'
2
3
 
3
4
  module BitsService
4
5
  class Blob
6
+
7
+ include BitsService::SignatureUtil
8
+
5
9
  attr_reader :key
6
10
 
7
- def initialize(key:, private_endpoint:, private_http_client:, vcap_request_id:, username:, password:, resource_type:)
11
+ def initialize(key:, private_endpoint:, private_http_client:, vcap_request_id:, resource_type:, public_endpoint:, signing_key_secret:, signing_key_id:)
8
12
  @key = key
9
13
  @private_http_client = private_http_client
10
14
  @vcap_request_id = vcap_request_id
11
- @username = username
12
- @password = password
13
15
  @resource_type = resource_type
14
16
  @private_endpoint = private_endpoint
17
+ @public_endpoint = public_endpoint
18
+ @signing_key_secret = signing_key_secret
19
+ @signing_key_id = signing_key_id
15
20
  end
16
21
 
17
22
  def attributes(*_)
@@ -38,19 +43,14 @@ module BitsService
38
43
 
39
44
  def signed_url(key, verb: nil)
40
45
  query = if verb.nil?
41
- ''
42
- else
43
- "?verb=#{verb}"
44
- end
45
-
46
- response = @private_http_client.get("/sign#{resource_path(key)}#{query}", @vcap_request_id, { username: @username, password: @password })
47
- validate_response_code!([200, 302], response)
48
-
49
- response.tap do |result|
50
- result.body = result['location'] if result.code.to_i == 302
46
+ ''
47
+ else
48
+ "&verb=#{verb}"
51
49
  end
52
50
 
53
- response.body
51
+ signed_url = "#{@public_endpoint}#{self.sign_signature(resource_path(key), @signing_key_secret, @signing_key_id)}#{query}"
52
+ logger.debug( "Created signed URL: #{signed_url}")
53
+ return signed_url
54
54
  end
55
55
 
56
56
  def generate_private_url(key)
@@ -63,22 +63,6 @@ module BitsService
63
63
  File.join(@private_endpoint.to_s, path)
64
64
  end
65
65
 
66
- # TODO: Refactor the following code to avoid duplicate methods with BitsService::Client
67
-
68
- def validate_response_code!(expected_codes, response)
69
- return if Array(expected_codes).include?(response.code.to_i)
70
-
71
- error = {
72
- response_code: response.code,
73
- response_body: response.body,
74
- response: response
75
- }.to_json
76
-
77
- logger.error("UnexpectedResponseCode: expected '#{expected_codes}' got #{response.code}")
78
-
79
- fail BlobstoreError.new(error)
80
- end
81
-
82
66
  def resource_path(key)
83
67
  prefix = @resource_type == :buildpack_cache ? 'buildpack_cache/entries/' : @resource_type
84
68
  File.join('/', prefix.to_s, key.to_s)
@@ -15,6 +15,8 @@ module BitsService
15
15
  @password = validated(bits_service_options, :password)
16
16
  @private_endpoint = validated_http_url(bits_service_options, :private_endpoint)
17
17
  @public_endpoint = validated_http_url(bits_service_options, :public_endpoint)
18
+ @signing_key_secret = validated(bits_service_options, :signing_key_secret)
19
+ @signing_key_id = validated(bits_service_options, :signing_key_id)
18
20
 
19
21
  raise ResourceTypeNotPresent.new('Must specify resource type') unless resource_type
20
22
  @resource_type = resource_type
@@ -107,9 +109,10 @@ module BitsService
107
109
  private_http_client: @private_http_client,
108
110
  private_endpoint: @private_endpoint,
109
111
  vcap_request_id: @vcap_request_id,
110
- username: @username,
111
- password: @password,
112
- resource_type: @resource_type
112
+ resource_type: @resource_type,
113
+ public_endpoint: @public_endpoint,
114
+ signing_key_secret: @signing_key_secret,
115
+ signing_key_id: @signing_key_id,
113
116
  )
114
117
  end
115
118
 
@@ -1,15 +1,20 @@
1
1
  # frozen_string_literal: true
2
+ require 'util/signature_util'
2
3
 
3
4
  module BitsService
4
5
  class ResourcePool
5
- def initialize(endpoint:, request_timeout_in_seconds:, vcap_request_id: '', ca_cert_path: nil, username:, password:)
6
- @endpoint = URI.parse(endpoint)
6
+
7
+ include BitsService::SignatureUtil
8
+
9
+ def initialize(bits_service_options:, request_timeout_in_seconds:, vcap_request_id: '')
10
+ @endpoint = URI.parse(bits_service_options[:private_endpoint])
11
+ @public_endpoint = bits_service_options[:public_endpoint]
7
12
  @request_timeout_in_seconds = request_timeout_in_seconds
13
+ @signed_key_secret = bits_service_options[:signing_key_secret]
14
+ @signed_key_id = bits_service_options[:signing_key_id]
8
15
  @vcap_request_id = vcap_request_id
9
16
  @logger = Steno.logger('cc.bits_service_client')
10
- @ca_cert_path = ca_cert_path
11
- @username = username
12
- @password = password
17
+ @ca_cert_path = bits_service_options[:ca_cert_path]
13
18
  end
14
19
 
15
20
  def matches(resources_json)
@@ -19,11 +24,10 @@ module BitsService
19
24
  end
20
25
 
21
26
  def signed_matches_url
22
- req = Net::HTTP::Get.new('/sign/app_stash/matches?verb=post')
23
- req.basic_auth(@username, @password)
24
- response = do_request(http_client, req, @vcap_request_id)
25
- validate_response_code!(200, response)
26
- response.body
27
+ # "verb=post"
28
+ signed_url = "#{@public_endpoint}#{self.sign_signature("/app_stash/matches", @signed_key_secret, @signed_key_id)}"
29
+ @logger.debug("Created signed URL: #{signed_url}")
30
+ return signed_url
27
31
  end
28
32
 
29
33
  def bundles(resources_json, entries_path)
@@ -113,5 +117,6 @@ module BitsService
113
117
  http_client.verify_mode = OpenSSL::SSL::VERIFY_PEER
114
118
  http_client.cert_store = cert_store
115
119
  end
120
+
116
121
  end
117
122
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BitsServiceClient
4
- VERSION = '3.4.0'
4
+ VERSION = '4.0.0.pre.1'
5
5
  end
@@ -0,0 +1,18 @@
1
+ module BitsService
2
+ module SignatureUtil
3
+ def sign_signature(resource_path, key_secret, key_id)
4
+ expires = seconds_since_the_unix_epoch_with_offset(3600)
5
+ signature_parts = "#{expires}#{resource_path}#{' '}#{key_secret}"
6
+ digest = OpenSSL::Digest::SHA256.new
7
+ hmac = OpenSSL::HMAC.new(key_secret, digest)
8
+ signature=OpenSSL::HMAC.hexdigest(digest, key_secret, signature_parts)
9
+ signed_path = "#{resource_path}?signature=#{signature}&expires=#{expires}&AccessKeyId=#{key_id}"
10
+ return signed_path
11
+ end
12
+
13
+ def seconds_since_the_unix_epoch_with_offset(offset)
14
+ t = Time.now.utc + offset
15
+ t.strftime('%s')
16
+ end
17
+ end
18
+ end
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bits_service_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.0
4
+ version: 4.0.0.pre.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rizwan Reza
8
8
  - Steffen Uhlig
9
9
  - Peter Goetz
10
10
  - Norman Sutorius
11
+ - Tobias Zipfel
11
12
  autorequire:
12
13
  bindir: bin
13
14
  cert_chain: []
14
- date: 2019-01-10 00:00:00.000000000 Z
15
+ date: 2019-01-22 00:00:00.000000000 Z
15
16
  dependencies:
16
17
  - !ruby/object:Gem::Dependency
17
18
  name: activesupport
@@ -28,33 +29,33 @@ dependencies:
28
29
  - !ruby/object:Gem::Version
29
30
  version: '0'
30
31
  - !ruby/object:Gem::Dependency
31
- name: steno
32
+ name: statsd-ruby
32
33
  requirement: !ruby/object:Gem::Requirement
33
34
  requirements:
34
- - - ">="
35
+ - - "~>"
35
36
  - !ruby/object:Gem::Version
36
- version: '0'
37
+ version: 1.4.0
37
38
  type: :runtime
38
39
  prerelease: false
39
40
  version_requirements: !ruby/object:Gem::Requirement
40
41
  requirements:
41
- - - ">="
42
+ - - "~>"
42
43
  - !ruby/object:Gem::Version
43
- version: '0'
44
+ version: 1.4.0
44
45
  - !ruby/object:Gem::Dependency
45
- name: statsd-ruby
46
+ name: steno
46
47
  requirement: !ruby/object:Gem::Requirement
47
48
  requirements:
48
- - - "~>"
49
+ - - ">="
49
50
  - !ruby/object:Gem::Version
50
- version: 1.4.0
51
+ version: '0'
51
52
  type: :runtime
52
53
  prerelease: false
53
54
  version_requirements: !ruby/object:Gem::Requirement
54
55
  requirements:
55
- - - "~>"
56
+ - - ">="
56
57
  - !ruby/object:Gem::Version
57
- version: 1.4.0
58
+ version: '0'
58
59
  - !ruby/object:Gem::Dependency
59
60
  name: bundler
60
61
  requirement: !ruby/object:Gem::Requirement
@@ -84,7 +85,7 @@ dependencies:
84
85
  - !ruby/object:Gem::Version
85
86
  version: '0'
86
87
  - !ruby/object:Gem::Dependency
87
- name: rack-test
88
+ name: pry
88
89
  requirement: !ruby/object:Gem::Requirement
89
90
  requirements:
90
91
  - - ">="
@@ -98,21 +99,21 @@ dependencies:
98
99
  - !ruby/object:Gem::Version
99
100
  version: '0'
100
101
  - !ruby/object:Gem::Dependency
101
- name: rake
102
+ name: pry-nav
102
103
  requirement: !ruby/object:Gem::Requirement
103
104
  requirements:
104
- - - "~>"
105
+ - - ">="
105
106
  - !ruby/object:Gem::Version
106
- version: '10.0'
107
+ version: '0'
107
108
  type: :development
108
109
  prerelease: false
109
110
  version_requirements: !ruby/object:Gem::Requirement
110
111
  requirements:
111
- - - "~>"
112
+ - - ">="
112
113
  - !ruby/object:Gem::Version
113
- version: '10.0'
114
+ version: '0'
114
115
  - !ruby/object:Gem::Dependency
115
- name: rb-readline
116
+ name: rack-test
116
117
  requirement: !ruby/object:Gem::Requirement
117
118
  requirements:
118
119
  - - ">="
@@ -126,21 +127,21 @@ dependencies:
126
127
  - !ruby/object:Gem::Version
127
128
  version: '0'
128
129
  - !ruby/object:Gem::Dependency
129
- name: rspec
130
+ name: rake
130
131
  requirement: !ruby/object:Gem::Requirement
131
132
  requirements:
132
133
  - - "~>"
133
134
  - !ruby/object:Gem::Version
134
- version: '3.0'
135
+ version: '10.0'
135
136
  type: :development
136
137
  prerelease: false
137
138
  version_requirements: !ruby/object:Gem::Requirement
138
139
  requirements:
139
140
  - - "~>"
140
141
  - !ruby/object:Gem::Version
141
- version: '3.0'
142
+ version: '10.0'
142
143
  - !ruby/object:Gem::Dependency
143
- name: rubocop
144
+ name: rb-readline
144
145
  requirement: !ruby/object:Gem::Requirement
145
146
  requirements:
146
147
  - - ">="
@@ -154,21 +155,21 @@ dependencies:
154
155
  - !ruby/object:Gem::Version
155
156
  version: '0'
156
157
  - !ruby/object:Gem::Dependency
157
- name: webmock
158
+ name: rspec
158
159
  requirement: !ruby/object:Gem::Requirement
159
160
  requirements:
160
- - - '='
161
+ - - "~>"
161
162
  - !ruby/object:Gem::Version
162
- version: 2.3.1
163
+ version: '3.0'
163
164
  type: :development
164
165
  prerelease: false
165
166
  version_requirements: !ruby/object:Gem::Requirement
166
167
  requirements:
167
- - - '='
168
+ - - "~>"
168
169
  - !ruby/object:Gem::Version
169
- version: 2.3.1
170
+ version: '3.0'
170
171
  - !ruby/object:Gem::Dependency
171
- name: sinatra
172
+ name: rubocop
172
173
  requirement: !ruby/object:Gem::Requirement
173
174
  requirements:
174
175
  - - ">="
@@ -182,7 +183,7 @@ dependencies:
182
183
  - !ruby/object:Gem::Version
183
184
  version: '0'
184
185
  - !ruby/object:Gem::Dependency
185
- name: pry
186
+ name: sinatra
186
187
  requirement: !ruby/object:Gem::Requirement
187
188
  requirements:
188
189
  - - ">="
@@ -196,25 +197,26 @@ dependencies:
196
197
  - !ruby/object:Gem::Version
197
198
  version: '0'
198
199
  - !ruby/object:Gem::Dependency
199
- name: pry-nav
200
+ name: webmock
200
201
  requirement: !ruby/object:Gem::Requirement
201
202
  requirements:
202
- - - ">="
203
+ - - '='
203
204
  - !ruby/object:Gem::Version
204
- version: '0'
205
+ version: 2.3.1
205
206
  type: :development
206
207
  prerelease: false
207
208
  version_requirements: !ruby/object:Gem::Requirement
208
209
  requirements:
209
- - - ">="
210
+ - - '='
210
211
  - !ruby/object:Gem::Version
211
- version: '0'
212
+ version: 2.3.1
212
213
  description:
213
214
  email:
214
215
  - rizwanreza@gmail.com
215
216
  - steffen.uhlig@de.ibm.com
216
217
  - peter.gtz@gmail.com
217
218
  - norman.sutorius@de.ibm.com
219
+ - tobias.zipfel@gmail.com
218
220
  executables: []
219
221
  extensions: []
220
222
  extra_rdoc_files: []
@@ -237,6 +239,7 @@ files:
237
239
  - lib/bits_service_client/logging_http_client.rb
238
240
  - lib/bits_service_client/resource_pool.rb
239
241
  - lib/bits_service_client/version.rb
242
+ - lib/util/signature_util.rb
240
243
  homepage: https://github.com/cloudfoundry-incubator/bits-service-client
241
244
  licenses: []
242
245
  metadata: {}
@@ -251,9 +254,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
251
254
  version: '0'
252
255
  required_rubygems_version: !ruby/object:Gem::Requirement
253
256
  requirements:
254
- - - ">="
257
+ - - ">"
255
258
  - !ruby/object:Gem::Version
256
- version: '0'
259
+ version: 1.3.1
257
260
  requirements: []
258
261
  rubyforge_project:
259
262
  rubygems_version: 2.6.14.3