google-cloud-storage 1.18.1 → 1.44.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHENTICATION.md +17 -30
  3. data/CHANGELOG.md +312 -0
  4. data/CONTRIBUTING.md +4 -5
  5. data/LOGGING.md +1 -1
  6. data/OVERVIEW.md +37 -5
  7. data/TROUBLESHOOTING.md +2 -8
  8. data/lib/google/cloud/storage/bucket/acl.rb +40 -40
  9. data/lib/google/cloud/storage/bucket/cors.rb +4 -1
  10. data/lib/google/cloud/storage/bucket/lifecycle.rb +259 -44
  11. data/lib/google/cloud/storage/bucket/list.rb +3 -3
  12. data/lib/google/cloud/storage/bucket.rb +1096 -172
  13. data/lib/google/cloud/storage/convert.rb +4 -3
  14. data/lib/google/cloud/storage/credentials.rb +16 -14
  15. data/lib/google/cloud/storage/errors.rb +7 -2
  16. data/lib/google/cloud/storage/file/acl.rb +181 -20
  17. data/lib/google/cloud/storage/file/list.rb +10 -8
  18. data/lib/google/cloud/storage/file/signer_v2.rb +36 -18
  19. data/lib/google/cloud/storage/file/signer_v4.rb +249 -61
  20. data/lib/google/cloud/storage/file/verifier.rb +2 -2
  21. data/lib/google/cloud/storage/file.rb +450 -84
  22. data/lib/google/cloud/storage/hmac_key/list.rb +182 -0
  23. data/lib/google/cloud/storage/hmac_key.rb +316 -0
  24. data/lib/google/cloud/storage/policy/binding.rb +246 -0
  25. data/lib/google/cloud/storage/policy/bindings.rb +196 -0
  26. data/lib/google/cloud/storage/policy/condition.rb +138 -0
  27. data/lib/google/cloud/storage/policy.rb +277 -24
  28. data/lib/google/cloud/storage/post_object.rb +20 -2
  29. data/lib/google/cloud/storage/project.rb +249 -50
  30. data/lib/google/cloud/storage/service.rb +479 -288
  31. data/lib/google/cloud/storage/version.rb +1 -1
  32. data/lib/google/cloud/storage.rb +86 -16
  33. data/lib/google-cloud-storage.rb +54 -7
  34. metadata +74 -27
@@ -0,0 +1,246 @@
1
+ # Copyright 2019 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ require "google/cloud/storage/policy/condition"
17
+
18
+ module Google
19
+ module Cloud
20
+ module Storage
21
+ class Policy
22
+ ##
23
+ # # Binding
24
+ #
25
+ # Value object associating members and an optional condition with a role.
26
+ #
27
+ # @see https://cloud.google.com/iam/docs/overview Cloud IAM Overview
28
+ #
29
+ # @attr [String] role Role that is assigned to members. For example,
30
+ # `roles/viewer`, `roles/editor`, or `roles/owner`. Required.
31
+ # @attr [Array<String>] members Specifies the identities requesting
32
+ # access for a Cloud Platform resource. members can have the
33
+ # following values. Required.
34
+ #
35
+ # * `allUsers`: A special identifier that represents anyone who is on
36
+ # the internet; with or without a Google account.
37
+ # * `allAuthenticatedUsers`: A special identifier that represents
38
+ # anyone who is authenticated with a Google account or a service
39
+ # account.
40
+ # * `user:{emailid}`: An email address that represents a specific
41
+ # Google account. For example, `alice@example.com`.
42
+ # * `serviceAccount:{emailid}`: An email address that represents a
43
+ # service account. For example, `my-other-app@appspot.gserviceaccount.com`.
44
+ # * `group:{emailid}`: An email address that represents a Google group.
45
+ # For example, `admins@example.com`.
46
+ # * `domain:{domain}`: The G Suite domain (primary) that represents
47
+ # all the users of that domain. For example, `google.com` or
48
+ # `example.com`. Required.
49
+ #
50
+ # @attr [Google::Cloud::Storage::Policy::Condition, nil] condition The
51
+ # condition that is associated with this binding, or `nil` if there is
52
+ # no condition. NOTE: An unsatisfied condition will not allow user
53
+ # access via current binding. Different bindings, including their
54
+ # conditions, are examined independently.
55
+ #
56
+ # @example
57
+ # require "google/cloud/storage"
58
+ #
59
+ # storage = Google::Cloud::Storage.new
60
+ # bucket = storage.bucket "my-bucket"
61
+ #
62
+ # policy = bucket.policy requested_policy_version: 3
63
+ # policy.bindings.each do |binding|
64
+ # puts binding.role
65
+ # end
66
+ #
67
+ # @example Updating a Policy from version 1 to version 3:
68
+ # require "google/cloud/storage"
69
+ #
70
+ # storage = Google::Cloud::Storage.new
71
+ # bucket = storage.bucket "my-bucket"
72
+ #
73
+ # bucket.uniform_bucket_level_access = true
74
+ #
75
+ # bucket.policy requested_policy_version: 3 do |p|
76
+ # p.version # the value is 1
77
+ # p.version = 3 # Must be explicitly set to opt-in to support for conditions.
78
+ #
79
+ # expr = "resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")"
80
+ # p.bindings.insert({
81
+ # role: "roles/storage.admin",
82
+ # members: ["user:owner@example.com"],
83
+ # condition: {
84
+ # title: "my-condition",
85
+ # description: "description of condition",
86
+ # expression: expr
87
+ # }
88
+ # })
89
+ # end
90
+ #
91
+ class Binding
92
+ attr_reader :role
93
+ attr_reader :members
94
+ attr_reader :condition
95
+
96
+ ##
97
+ # Creates a Binding object.
98
+ #
99
+ # @param [String] role Role that is assigned to members. For example,
100
+ # `roles/viewer`, `roles/editor`, or `roles/owner`. Required.
101
+ # @param [Array<String>] members Specifies the identities requesting
102
+ # access for a Cloud Platform resource. members can have the
103
+ # following values. Required.
104
+ #
105
+ # * `allUsers`: A special identifier that represents anyone who is on
106
+ # the internet; with or without a Google account.
107
+ # * `allAuthenticatedUsers`: A special identifier that represents
108
+ # anyone who is authenticated with a Google account or a service
109
+ # account.
110
+ # * `user:{emailid}`: An email address that represents a specific
111
+ # Google account. For example, `alice@example.com`.
112
+ # * `serviceAccount:{emailid}`: An email address that represents a
113
+ # service account. For example, `my-other-app@appspot.gserviceaccount.com`.
114
+ # * `group:{emailid}`: An email address that represents a Google group.
115
+ # For example, `admins@example.com`.
116
+ # * `domain:{domain}`: The G Suite domain (primary) that represents
117
+ # all the users of that domain. For example, `google.com` or
118
+ # `example.com`. Required.
119
+ #
120
+ # @param [Google::Cloud::Storage::Policy::Condition] condition The
121
+ # condition that is associated with this binding. NOTE: An unsatisfied
122
+ # condition will not allow user access via current binding. Different
123
+ # bindings, including their conditions, are examined independently.
124
+ # Optional.
125
+ #
126
+ def initialize role:, members:, condition: nil
127
+ @role = String role
128
+
129
+ @members = Array members
130
+ raise ArgumentError, "members is empty, must be provided" if @members.empty?
131
+
132
+ condition = Condition.new(**condition) if condition.is_a? Hash
133
+ if condition && !(condition.is_a? Condition)
134
+ raise ArgumentError, "expected Condition, not #{condition.inspect}"
135
+ end
136
+ @condition = condition
137
+ end
138
+
139
+ ##
140
+ # Sets the role for the binding.
141
+ #
142
+ # @param [String] new_role Role that is assigned to members. For example,
143
+ # `roles/viewer`, `roles/editor`, or `roles/owner`. Required.
144
+ #
145
+ def role= new_role
146
+ @role = String new_role
147
+ end
148
+
149
+ ##
150
+ # Sets the members for the binding.
151
+ #
152
+ # @param [Array<String>] new_members Specifies the identities requesting
153
+ # access for a Cloud Platform resource. members can have the
154
+ # following values. Required.
155
+ #
156
+ # * `allUsers`: A special identifier that represents anyone who is on
157
+ # the internet; with or without a Google account.
158
+ # * `allAuthenticatedUsers`: A special identifier that represents
159
+ # anyone who is authenticated with a Google account or a service
160
+ # account.
161
+ # * `user:{emailid}`: An email address that represents a specific
162
+ # Google account. For example, `alice@example.com`.
163
+ # * `serviceAccount:{emailid}`: An email address that represents a
164
+ # service account. For example, `my-other-app@appspot.gserviceaccount.com`.
165
+ # * `group:{emailid}`: An email address that represents a Google group.
166
+ # For example, `admins@example.com`.
167
+ # * `domain:{domain}`: The G Suite domain (primary) that represents
168
+ # all the users of that domain. For example, `google.com` or
169
+ # `example.com`. Required.
170
+ #
171
+ def members= new_members
172
+ new_members = Array new_members
173
+ raise ArgumentError, "members is empty, must be provided" if new_members.empty?
174
+ @members = new_members
175
+ end
176
+
177
+ ##
178
+ # Sets the condition for the binding.
179
+ #
180
+ # @param [Google::Cloud::Storage::Policy::Condition] new_condition The
181
+ # condition that is associated with this binding. NOTE: An unsatisfied
182
+ # condition will not allow user access via current binding. Different
183
+ # bindings, including their conditions, are examined independently.
184
+ # Optional.
185
+ # @overload condition=(title:, description: nil, expression:)
186
+ # @param [String] title Used to identify the condition. Required.
187
+ # @param [String] description Used to document the condition. Optional.
188
+ # @param [String] expression Defines an attribute-based logic
189
+ # expression using a subset of the Common Expression Language (CEL).
190
+ # The condition expression can contain multiple statements, each uses
191
+ # one attributes, and statements are combined using logic operators,
192
+ # following CEL language specification. Required.
193
+ #
194
+ def condition= new_condition
195
+ new_condition = Condition.new(**new_condition) if new_condition.is_a? Hash
196
+ if new_condition && !new_condition.is_a?(Condition)
197
+ raise ArgumentError, "expected Condition, not #{new_condition.inspect}"
198
+ end
199
+ @condition = new_condition
200
+ end
201
+
202
+ ##
203
+ # @private
204
+ def <=> other
205
+ return nil unless other.is_a? Binding
206
+
207
+ ret = role <=> other.role
208
+ return ret unless ret.zero?
209
+ ret = members <=> other.members
210
+ return ret unless ret.zero?
211
+ condition&.to_gapi <=> other.condition&.to_gapi
212
+ end
213
+
214
+ ##
215
+ # @private
216
+ def eql? other
217
+ role.eql?(other.role) &&
218
+ members.eql?(other.members) &&
219
+ condition&.to_gapi.eql?(other.condition&.to_gapi)
220
+ end
221
+
222
+ ##
223
+ # @private
224
+ def hash
225
+ [
226
+ @role,
227
+ @members,
228
+ @condition&.to_gapi
229
+ ].hash
230
+ end
231
+
232
+ ##
233
+ # @private
234
+ def to_gapi
235
+ params = {
236
+ role: @role,
237
+ members: @members,
238
+ condition: @condition&.to_gapi
239
+ }.delete_if { |_, v| v.nil? }
240
+ Google::Apis::StorageV1::Policy::Binding.new(**params)
241
+ end
242
+ end
243
+ end
244
+ end
245
+ end
246
+ end
@@ -0,0 +1,196 @@
1
+ # Copyright 2019 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ require "google/cloud/storage/policy/binding"
17
+
18
+ module Google
19
+ module Cloud
20
+ module Storage
21
+ class Policy
22
+ ##
23
+ # # Bindings
24
+ #
25
+ # Enumerable object for managing Cloud IAM bindings associated with
26
+ # a bucket.
27
+ #
28
+ # @see https://cloud.google.com/iam/docs/overview Cloud IAM Overview
29
+ #
30
+ # @example Updating a Policy from version 1 to version 3:
31
+ # require "google/cloud/storage"
32
+ #
33
+ # storage = Google::Cloud::Storage.new
34
+ # bucket = storage.bucket "my-bucket"
35
+ #
36
+ # bucket.uniform_bucket_level_access = true
37
+ #
38
+ # bucket.policy requested_policy_version: 3 do |p|
39
+ # p.version # the value is 1
40
+ # p.version = 3 # Must be explicitly set to opt-in to support for conditions.
41
+ #
42
+ # expr = "resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")"
43
+ # p.bindings.insert({
44
+ # role: "roles/storage.admin",
45
+ # members: ["user:owner@example.com"],
46
+ # condition: {
47
+ # title: "my-condition",
48
+ # description: "description of condition",
49
+ # expression: expr
50
+ # }
51
+ # })
52
+ # end
53
+ #
54
+ class Bindings
55
+ include Enumerable
56
+
57
+ ##
58
+ # @private Creates a Bindings object.
59
+ def initialize
60
+ @bindings = []
61
+ end
62
+
63
+ ##
64
+ # Adds a binding or bindings to the collection. The arguments may be
65
+ # {Google::Cloud::Storage::Policy::Binding} objects or equivalent hash
66
+ # objects that will be implicitly coerced to binding objects.
67
+ #
68
+ # @param [Google::Cloud::Storage::Policy::Binding, Hash] bindings One
69
+ # or more bindings to be added to the policy owning the collection.
70
+ # The arguments may be {Google::Cloud::Storage::Policy::Binding}
71
+ # objects or equivalent hash objects that will be implicitly coerced
72
+ # to binding objects.
73
+ #
74
+ # @return [Bindings] `self` for chaining.
75
+ #
76
+ # @example Updating a Policy from version 1 to version 3:
77
+ # require "google/cloud/storage"
78
+ #
79
+ # storage = Google::Cloud::Storage.new
80
+ # bucket = storage.bucket "my-bucket"
81
+ #
82
+ # bucket.uniform_bucket_level_access = true
83
+ #
84
+ # bucket.policy requested_policy_version: 3 do |p|
85
+ # p.version # the value is 1
86
+ # p.version = 3 # Must be explicitly set to opt-in to support for conditions.
87
+ #
88
+ # expr = "resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")"
89
+ # p.bindings.insert({
90
+ # role: "roles/storage.admin",
91
+ # members: ["user:owner@example.com"],
92
+ # condition: {
93
+ # title: "my-condition",
94
+ # description: "description of condition",
95
+ # expression: expr
96
+ # }
97
+ # })
98
+ # end
99
+ #
100
+ def insert *bindings
101
+ bindings = coerce_bindings(*bindings)
102
+ @bindings += bindings
103
+ self
104
+ end
105
+
106
+ ##
107
+ # Deletes the binding or bindings from the collection that are equal to
108
+ # the arguments. The specification arguments may be
109
+ # {Google::Cloud::Storage::Policy::Binding} objects or equivalent hash
110
+ # objects that will be implicitly coerced to binding objects.
111
+ #
112
+ # @param [Google::Cloud::Storage::Policy::Binding, Hash] bindings One
113
+ # or more specifications for bindings to be removed from the
114
+ # collection. The arguments may be
115
+ # {Google::Cloud::Storage::Policy::Binding} objects or equivalent
116
+ # hash objects that will be implicitly coerced to binding objects.
117
+ #
118
+ # @return [Bindings] `self` for chaining.
119
+ #
120
+ # @example
121
+ # require "google/cloud/storage"
122
+ #
123
+ # storage = Google::Cloud::Storage.new
124
+ # bucket = storage.bucket "my-bucket"
125
+ #
126
+ # bucket.policy requested_policy_version: 3 do |p|
127
+ # expr = "resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")"
128
+ # p.bindings.remove({
129
+ # role: "roles/storage.admin",
130
+ # members: ["user:owner@example.com"],
131
+ # condition: {
132
+ # title: "my-condition",
133
+ # description: "description of condition",
134
+ # expression: expr
135
+ # }
136
+ # })
137
+ # end
138
+ #
139
+ def remove *bindings
140
+ bindings = coerce_bindings(*bindings)
141
+ @bindings -= bindings
142
+ self
143
+ end
144
+
145
+ ##
146
+ # Calls the block once for each binding in the collection, passing
147
+ # a {Google::Cloud::Storage::Policy::Binding} object as parameter. A
148
+ # {Google::Cloud::Storage::Policy::Binding} object is passed even
149
+ # when the arguments to {#insert} were hash objects.
150
+ #
151
+ # If no block is given, an enumerator is returned instead.
152
+ #
153
+ # @yield [binding] A binding in this bindings collection.
154
+ # @yieldparam [Google::Cloud::Storage::Policy::Binding] binding A
155
+ # binding object, even when the arguments to {#insert} were hash
156
+ # objects.
157
+ #
158
+ # @return [Enumerator]
159
+ #
160
+ # @example
161
+ # require "google/cloud/storage"
162
+ #
163
+ # storage = Google::Cloud::Storage.new
164
+ # bucket = storage.bucket "my-bucket"
165
+ #
166
+ # policy = bucket.policy requested_policy_version: 3
167
+ # policy.bindings.each do |binding|
168
+ # puts binding.role
169
+ # end
170
+ #
171
+ def each &block
172
+ return enum_for :each unless block_given?
173
+
174
+ @bindings.each(&block)
175
+ end
176
+
177
+ ##
178
+ # @private
179
+ def to_gapi
180
+ @bindings.map(&:to_gapi)
181
+ end
182
+
183
+ protected
184
+
185
+ def coerce_bindings *bindings
186
+ bindings.map do |binding|
187
+ binding = Binding.new(**binding) if binding.is_a? Hash
188
+ raise ArgumentError, "expected Binding, not #{binding.inspect}" unless binding.is_a? Binding
189
+ binding
190
+ end
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,138 @@
1
+ # Copyright 2019 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ module Google
17
+ module Cloud
18
+ module Storage
19
+ class Policy
20
+ ##
21
+ # # Condition
22
+ #
23
+ # Value object accepting an attribute-based logic expression based on a
24
+ # subset of the Common Expression Language (CEL).
25
+ #
26
+ # @see https://cloud.google.com/iam/docs/conditions-overview Cloud IAM
27
+ # policies with conditions
28
+ #
29
+ # @attr [String] title Used to identify the condition. Required.
30
+ # @attr [String] description Used to document the condition. Optional.
31
+ # @attr [String] expression Defines an attribute-based logic
32
+ # expression using a subset of the Common Expression Language (CEL).
33
+ # The condition expression can contain multiple statements, each uses
34
+ # one attributes, and statements are combined using logic operators,
35
+ # following CEL language specification. Required.
36
+ #
37
+ # @example
38
+ # require "google/cloud/storage"
39
+ #
40
+ # storage = Google::Cloud::Storage.new
41
+ # bucket = storage.bucket "my-bucket"
42
+ #
43
+ # policy = bucket.policy requested_policy_version: 3
44
+ # policy.bindings.each do |binding|
45
+ # puts binding.condition.title if binding.condition
46
+ # end
47
+ #
48
+ # @example Updating a Policy from version 1 to version 3 by adding a condition:
49
+ # require "google/cloud/storage"
50
+ #
51
+ # storage = Google::Cloud::Storage.new
52
+ # bucket = storage.bucket "my-bucket"
53
+ #
54
+ # bucket.uniform_bucket_level_access = true
55
+ #
56
+ # bucket.policy requested_policy_version: 3 do |p|
57
+ # p.version # the value is 1
58
+ # p.version = 3 # Must be explicitly set to opt-in to support for conditions.
59
+ #
60
+ # expr = "resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")"
61
+ # p.bindings.insert({
62
+ # role: "roles/storage.admin",
63
+ # members: ["user:owner@example.com"],
64
+ # condition: {
65
+ # title: "my-condition",
66
+ # description: "description of condition",
67
+ # expression: expr
68
+ # }
69
+ # })
70
+ # end
71
+ #
72
+ class Condition
73
+ attr_reader :title
74
+ attr_reader :description
75
+ attr_reader :expression
76
+
77
+ ##
78
+ # Creates a Condition object.
79
+ #
80
+ # @param [String] title Used to identify the condition. Required.
81
+ # @param [String] description Used to document the condition. Optional.
82
+ # @param [String] expression Defines an attribute-based logic
83
+ # expression using a subset of the Common Expression Language (CEL).
84
+ # The condition expression can contain multiple statements, each uses
85
+ # one attributes, and statements are combined using logic operators,
86
+ # following CEL language specification. Required.
87
+ #
88
+ def initialize title:, expression:, description: nil
89
+ @title = String title
90
+ @description = String description
91
+ @expression = String expression
92
+ end
93
+
94
+ ##
95
+ # The title used to identify the condition. Required.
96
+ #
97
+ # @param [String] new_title The new title.
98
+ #
99
+ def title= new_title
100
+ @title = String new_title
101
+ end
102
+
103
+ ##
104
+ # The description to document the condition. Optional.
105
+ #
106
+ # @param [String] new_description The new description.
107
+ #
108
+ def description= new_description
109
+ @description = String new_description
110
+ end
111
+
112
+ ##
113
+ # An attribute-based logic expression using a subset of the Common
114
+ # Expression Language (CEL). The condition expression can contain
115
+ # multiple statements, each uses one attributes, and statements are
116
+ # combined using logic operators, following CEL language
117
+ # specification. Required.
118
+ #
119
+ # @see https://cloud.google.com/iam/docs/conditions-overview CEL for conditions
120
+ #
121
+ # @param [String] new_expression The new expression.
122
+ #
123
+ def expression= new_expression
124
+ @expression = String new_expression
125
+ end
126
+
127
+ def to_gapi
128
+ {
129
+ title: @title,
130
+ description: @description,
131
+ expression: @expression
132
+ }.delete_if { |_, v| v.nil? }
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end