google-cloud-storage 1.25.0 → 1.27.0

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: 5a6c22c5d1bf15537e1a8d0b351074e67b32a9f77d70ae4febd9fac791ac1601
4
- data.tar.gz: 3378d1c26298d5a6d985ca6b1c2f09f82e00f2303a6953b7b8ee0a077b3fa120
3
+ metadata.gz: c1c5fde2ed35606723e05c787ff96fd6ec31d7e06015e09bcac8dc0bc4b9ae05
4
+ data.tar.gz: bf1391389ff711934df5302f65cdf6136bad14b0a00865728da8fe3b549b3cbe
5
5
  SHA512:
6
- metadata.gz: 6a3409354e221650f8893943755fd72050cd5cfa88960df584d98b9b57ad23ac5342a72857dd13528670ad93931514468e7f8b4dd29f537d4645ff3ca511adf7
7
- data.tar.gz: 80cd7709621da535d303d2efd196ef4cddc97cd243d0a4f2400ffcd88cfc5ed113c21ca51ad9e928df1e81dd587b62859f220e90642dedfc761bc86251d1d3cd
6
+ metadata.gz: 1e7d9a97562357737322928a56f093ed42bc8f8015a06723c5e403c402367a89f56604eeefb2bbbf289a7dce5b84ee055f76f3d6ef6df6d987f7f05ed5eed5fe
7
+ data.tar.gz: 67046c8397a7e7fabf7b0a4d4e6501417ba815b55267e641a0ab51cdb233641e699348629a021763724aaca623e25a901395d77453b78fbc90ae67d4efca17b1
@@ -102,8 +102,14 @@ To configure your system for this, simply:
102
102
  2. Authenticate using OAuth 2.0 `$ gcloud auth login`
103
103
  3. Write code as if already authenticated.
104
104
 
105
- **NOTE:** This is _not_ recommended for running in production. The Cloud SDK
106
- *should* only be used during development.
105
+ **NOTE:** The use of Cloud SDK credentials is _not_ recommended for running in
106
+ production. The Cloud SDK *should* only be used during development.
107
+
108
+ **NOTE:** The use of Cloud SDK credentials may not support certain methods such as
109
+ those that produce
110
+ [signed URLs](https://cloud.google.com/storage/docs/access-control/signed-urls) and
111
+ post objects. For these methods, authentication using a service account JSON key file
112
+ is required.
107
113
 
108
114
  [gce-how-to]: https://cloud.google.com/compute/docs/authentication#using
109
115
  [dev-console]: https://console.cloud.google.com/project
@@ -1,5 +1,58 @@
1
1
  # Release History
2
2
 
3
+ ### 1.27.0 / 2020-07-29
4
+
5
+ #### Features
6
+
7
+ * Add support for signing URLs with IAMCredentials SignBlob API
8
+ * Add signer parameter accepting Procs to the following methods:
9
+ * Project#signed_url
10
+ * Bucket#generate_signed_post_policy_v4
11
+ * Bucket#post_object
12
+ * Bucket#signed_url
13
+ * File#signed_url
14
+ * Update signer aliases signing_key and private_key to similarly support Procs
15
+
16
+ #### Documentation
17
+
18
+ * Update documentation of SignedUrlUnavailable
19
+
20
+ ### 1.26.2 / 2020-05-28
21
+
22
+ #### Documentation
23
+
24
+ * Fix a few broken links
25
+
26
+ ### 1.26.1 / 2020-05-06
27
+
28
+ #### Bug Fixes
29
+
30
+ * Add missing bucket condition in SignerV4#post_object
31
+ * Ensure bucket is not returned in PostObject fields
32
+
33
+ ### 1.26.0 / 2020-04-06
34
+
35
+ #### Features
36
+
37
+ * Update V4 Signature support in Project#signed_url, Bucket#signed_url and File#signed_url
38
+ * Add scheme, virtual_hosted_style and bucket_bound_hostname to #signed_url methods
39
+ * Add support for V4 query param encoding and ordering
40
+ * Convert tabs in V4 to single whitespace character
41
+ * Set payload in V4 to X-Goog-Content-SHA256 if present
42
+ * Fix method param default value GET for #signed_url
43
+ * Add support for V4 Signature POST Policies
44
+ * Add Bucket#generate_signed_post_policy_v4
45
+
46
+ #### Bug Fixes
47
+
48
+ * Address keyword argument warnings in Ruby 2.7 and later
49
+
50
+ ### 1.25.1 / 2020-01-06
51
+
52
+ #### Documentation
53
+
54
+ * Add ARCHIVE storage class
55
+
3
56
  ### 1.25.0 / 2019-12-12
4
57
 
5
58
  #### Features
@@ -24,14 +24,8 @@ improved, *please* create a new issue on GitHub so we can talk about it.
24
24
 
25
25
  - [New issue][gh-ruby]
26
26
 
27
- Or, you can ask questions on the [Google Cloud Platform Slack][slack-ruby]. You
28
- can use the "ruby" channel for general Ruby questions, or use the
29
- "google-cloud-ruby" channel if you have questions about this gem in particular.
30
-
31
27
  [so-ruby]: http://stackoverflow.com/questions/tagged/google-cloud-platform+ruby+storage
32
28
 
33
- [gh-search-ruby]: https://github.com/googlecloudplatform/google-cloud-ruby/issues?q=label%3A%22api%3A+storage%22
34
-
35
- [gh-ruby]: https://github.com/googlecloudplatform/google-cloud-ruby/issues/new
29
+ [gh-search-ruby]: https://github.com/googleapis/google-cloud-ruby/issues?q=label%3A%22api%3A+storage%22
36
30
 
37
- [slack-ruby]: https://gcp-slack.appspot.com/
31
+ [gh-ruby]: https://github.com/googleapis/google-cloud-ruby/issues/new
@@ -357,7 +357,7 @@ module Google
357
357
  ##
358
358
  # The bucket's storage class. This defines how objects in the bucket are
359
359
  # stored and determines the SLA and the cost of storage. Values include
360
- # `STANDARD`, `NEARLINE`, and `COLDLINE`. `REGIONAL`,`MULTI_REGIONAL`,
360
+ # `STANDARD`, `NEARLINE`, `COLDLINE`, and `ARCHIVE`. `REGIONAL`,`MULTI_REGIONAL`,
361
361
  # and `DURABLE_REDUCED_AVAILABILITY` are supported as legacy storage
362
362
  # classes.
363
363
  #
@@ -370,11 +370,11 @@ module Google
370
370
  ##
371
371
  # Updates the bucket's storage class. This defines how objects in the
372
372
  # bucket are stored and determines the SLA and the cost of storage.
373
- # Accepted values include `:standard`, `:nearline`, and `:coldline`, as
374
- # well as the equivalent strings returned by {Bucket#storage_class}.
375
- # `:multi_regional`, `:regional`, and `durable_reduced_availability`
376
- # are accepted as legacy storage classes. For more information, see
377
- # [Storage
373
+ # Accepted values include `:standard`, `:nearline`, `:coldline`, and
374
+ # `:archive`, as well as the equivalent strings returned by
375
+ # {Bucket#storage_class}. `:multi_regional`, `:regional`, and
376
+ # `durable_reduced_availability` are accepted as legacy storage classes.
377
+ # For more information, see [Storage
378
378
  # Classes](https://cloud.google.com/storage/docs/storage-classes).
379
379
  #
380
380
  # @param [Symbol, String] new_storage_class Storage class of the bucket.
@@ -1146,8 +1146,8 @@ module Google
1146
1146
  # @param [Symbol, String] storage_class Storage class of the file.
1147
1147
  # Determines how the file is stored and determines the SLA and the
1148
1148
  # cost of storage. Accepted values include `:standard`, `:nearline`,
1149
- # and `:coldline`, as well as the equivalent strings returned by
1150
- # {#storage_class}. `:multi_regional`, `:regional`, and
1149
+ # `:coldline`, and `:archive`, as well as the equivalent strings
1150
+ # returned by {#storage_class}. `:multi_regional`, `:regional`, and
1151
1151
  # `durable_reduced_availability` are accepted legacy storage classes.
1152
1152
  # For more information, see [Storage
1153
1153
  # Classes](https://cloud.google.com/storage/docs/storage-classes)
@@ -1254,22 +1254,27 @@ module Google
1254
1254
  storage_class: nil, encryption_key: nil, kms_key: nil,
1255
1255
  temporary_hold: nil, event_based_hold: nil
1256
1256
  ensure_service!
1257
- options = { acl: File::Acl.predefined_rule_for(acl), md5: md5,
1258
- cache_control: cache_control, content_type: content_type,
1259
- content_disposition: content_disposition, crc32c: crc32c,
1260
- content_encoding: content_encoding, metadata: metadata,
1261
- content_language: content_language, key: encryption_key,
1262
- kms_key: kms_key,
1263
- storage_class: storage_class_for(storage_class),
1264
- temporary_hold: temporary_hold,
1265
- event_based_hold: event_based_hold,
1266
- user_project: user_project }
1267
1257
  ensure_io_or_file_exists! file
1268
1258
  path ||= file.path if file.respond_to? :path
1269
1259
  path ||= file if file.is_a? String
1270
1260
  raise ArgumentError, "must provide path" if path.nil?
1271
1261
 
1272
- gapi = service.insert_file name, file, path, options
1262
+
1263
+ gapi = service.insert_file name, file, path, acl: File::Acl.predefined_rule_for(acl),
1264
+ md5: md5,
1265
+ cache_control: cache_control,
1266
+ content_type: content_type,
1267
+ content_disposition: content_disposition,
1268
+ crc32c: crc32c,
1269
+ content_encoding: content_encoding,
1270
+ metadata: metadata,
1271
+ content_language: content_language,
1272
+ key: encryption_key,
1273
+ kms_key: kms_key,
1274
+ storage_class: storage_class_for(storage_class),
1275
+ temporary_hold: temporary_hold,
1276
+ event_based_hold: event_based_hold,
1277
+ user_project: user_project
1273
1278
  File.from_gapi gapi, service, user_project: user_project
1274
1279
  end
1275
1280
  alias upload_file create_file
@@ -1368,9 +1373,6 @@ module Google
1368
1373
  raise ArgumentError, "must provide at least two source files"
1369
1374
  end
1370
1375
 
1371
- options = { acl: File::Acl.predefined_rule_for(acl),
1372
- key: encryption_key,
1373
- user_project: user_project }
1374
1376
  destination_gapi = nil
1375
1377
  if block_given?
1376
1378
  destination_gapi = API::Object.new
@@ -1378,8 +1380,11 @@ module Google
1378
1380
  yield updater
1379
1381
  updater.check_for_changed_metadata!
1380
1382
  end
1381
- gapi = service.compose_file name, sources, destination,
1382
- destination_gapi, options
1383
+
1384
+ acl_rule = File::Acl.predefined_rule_for acl
1385
+ gapi = service.compose_file name, sources, destination, destination_gapi, acl: acl_rule,
1386
+ key: encryption_key,
1387
+ user_project: user_project
1383
1388
  File.from_gapi gapi, service, user_project: user_project
1384
1389
  end
1385
1390
  alias compose_file compose
@@ -1401,7 +1406,7 @@ module Google
1401
1406
  # A {SignedUrlUnavailable} is raised if the service account credentials
1402
1407
  # are missing. Service account credentials are acquired by following the
1403
1408
  # steps in [Service Account Authentication](
1404
- # https://cloud.google.com/storage/docs/authentication#service_accounts).
1409
+ # https://cloud.google.com/iam/docs/service-accounts).
1405
1410
  #
1406
1411
  # @see https://cloud.google.com/storage/docs/access-control/signed-urls
1407
1412
  # Signed URLs guide
@@ -1428,10 +1433,22 @@ module Google
1428
1433
  # use the signed URL.
1429
1434
  # @param [String] issuer Service Account's Client Email.
1430
1435
  # @param [String] client_email Service Account's Client Email.
1431
- # @param [OpenSSL::PKey::RSA, String] signing_key Service Account's
1432
- # Private Key.
1433
- # @param [OpenSSL::PKey::RSA, String] private_key Service Account's
1434
- # Private Key.
1436
+ # @param [OpenSSL::PKey::RSA, String, Proc] signing_key Service Account's
1437
+ # Private Key or a Proc that accepts a single String parameter and returns a
1438
+ # RSA SHA256 signature using a valid Google Service Account Private Key.
1439
+ # @param [OpenSSL::PKey::RSA, String, Proc] private_key Service Account's
1440
+ # Private Key or a Proc that accepts a single String parameter and returns a
1441
+ # RSA SHA256 signature using a valid Google Service Account Private Key.
1442
+ # @param [OpenSSL::PKey::RSA, String, Proc] signer Service Account's
1443
+ # Private Key or a Proc that accepts a single String parameter and returns a
1444
+ # RSA SHA256 signature using a valid Google Service Account Private Key.
1445
+ #
1446
+ # When using this method in environments such as GAE Flexible Environment,
1447
+ # GKE, or Cloud Functions where the private key is unavailable, it may be
1448
+ # necessary to provide a Proc (or lambda) via the signer parameter. This
1449
+ # Proc should return a signature created using a RPC call to the
1450
+ # [Service Account Credentials signBlob](https://cloud.google.com/iam/docs/reference/credentials/rest/v1/projects.serviceAccounts/signBlob)
1451
+ # method as shown in the example below.
1435
1452
  # @param [Hash] query Query string parameters to include in the signed
1436
1453
  # URL. The given parameters are not verified by the signature.
1437
1454
  #
@@ -1440,11 +1457,29 @@ module Google
1440
1457
  # using the URL, but only when the file resource is missing the
1441
1458
  # corresponding values. (These values can be permanently set using
1442
1459
  # {File#content_disposition=} and {File#content_type=}.)
1460
+ # @param [String] scheme The URL scheme. The default value is `HTTPS`.
1461
+ # @param [Boolean] virtual_hosted_style Whether to use a virtual hosted-style
1462
+ # hostname, which adds the bucket into the host portion of the URI rather
1463
+ # than the path, e.g. `https://mybucket.storage.googleapis.com/...`.
1464
+ # For V4 signing, this also sets the `host` header in the canonicalized
1465
+ # extension headers to the virtual hosted-style host, unless that header is
1466
+ # supplied via the `headers` param. The default value of `false` uses the
1467
+ # form of `https://storage.googleapis.com/mybucket`.
1468
+ # @param [String] bucket_bound_hostname Use a bucket-bound hostname, which
1469
+ # replaces the `storage.googleapis.com` host with the name of a `CNAME`
1470
+ # bucket, e.g. a bucket named `gcs-subdomain.my.domain.tld`, or a Google
1471
+ # Cloud Load Balancer which routes to a bucket you own, e.g.
1472
+ # `my-load-balancer-domain.tld`.
1443
1473
  # @param [Symbol, String] version The version of the signed credential
1444
1474
  # to create. Must be one of `:v2` or `:v4`. The default value is
1445
1475
  # `:v2`.
1446
1476
  #
1447
- # @return [String]
1477
+ # @return [String] The signed URL.
1478
+ #
1479
+ # @raise [SignedUrlUnavailable] If the service account credentials
1480
+ # are missing. Service account credentials are acquired by following the
1481
+ # steps in [Service Account Authentication](
1482
+ # https://cloud.google.com/iam/docs/service-accounts).
1448
1483
  #
1449
1484
  # @example
1450
1485
  # require "google/cloud/storage"
@@ -1475,6 +1510,40 @@ module Google
1475
1510
  # issuer: "service-account@gcloud.com",
1476
1511
  # signing_key: key
1477
1512
  #
1513
+ # @example Using Cloud IAMCredentials signBlob to create the signature:
1514
+ # require "google/cloud/storage"
1515
+ # require "google/apis/iamcredentials_v1"
1516
+ # require "googleauth"
1517
+ #
1518
+ # # Issuer is the service account email that the Signed URL will be signed with
1519
+ # # and any permission granted in the Signed URL must be granted to the
1520
+ # # Google Service Account.
1521
+ # issuer = "service-account@project-id.iam.gserviceaccount.com"
1522
+ #
1523
+ # # Create a lambda that accepts the string_to_sign
1524
+ # signer = lambda do |string_to_sign|
1525
+ # IAMCredentials = Google::Apis::IamcredentialsV1
1526
+ # iam_client = IAMCredentials::IAMCredentialsService.new
1527
+ #
1528
+ # # Get the environment configured authorization
1529
+ # scopes = ["https://www.googleapis.com/auth/iam"]
1530
+ # iam_client.authorization = Google::Auth.get_application_default scopes
1531
+ #
1532
+ # request = {
1533
+ # "payload": string_to_sign,
1534
+ # }
1535
+ # resource = "projects/-/serviceAccounts/#{issuer}"
1536
+ # response = iam_client.sign_service_account_blob resource, request, {}
1537
+ # response.signed_blob
1538
+ # end
1539
+ #
1540
+ # storage = Google::Cloud::Storage.new
1541
+ #
1542
+ # bucket_name = "my-todo-app"
1543
+ # file_path = "avatars/heidi/400x400.png"
1544
+ # url = storage.signed_url bucket_name, file_path,
1545
+ # method: "GET", issuer: issuer,
1546
+ # signer: signer
1478
1547
  # @example Using the `headers` option:
1479
1548
  # require "google/cloud/storage"
1480
1549
  #
@@ -1510,28 +1579,52 @@ module Google
1510
1579
  # bucket = storage.bucket "my-todo-app"
1511
1580
  # list_files_url = bucket.signed_url version: :v4
1512
1581
  #
1513
- def signed_url path = nil, method: nil, expires: nil, content_type: nil,
1514
- content_md5: nil, headers: nil, issuer: nil,
1515
- client_email: nil, signing_key: nil, private_key: nil,
1516
- query: nil, version: nil
1582
+ def signed_url path = nil,
1583
+ method: "GET",
1584
+ expires: nil,
1585
+ content_type: nil,
1586
+ content_md5: nil,
1587
+ headers: nil,
1588
+ issuer: nil,
1589
+ client_email: nil,
1590
+ signing_key: nil,
1591
+ private_key: nil,
1592
+ signer: nil,
1593
+ query: nil,
1594
+ scheme: "HTTPS",
1595
+ virtual_hosted_style: nil,
1596
+ bucket_bound_hostname: nil,
1597
+ version: nil
1517
1598
  ensure_service!
1518
1599
  version ||= :v2
1519
1600
  case version.to_sym
1520
1601
  when :v2
1521
- signer = File::SignerV2.from_bucket self, path
1522
- signer.signed_url method: method, expires: expires,
1523
- headers: headers, content_type: content_type,
1524
- content_md5: content_md5, issuer: issuer,
1525
- client_email: client_email,
1526
- signing_key: signing_key,
1527
- private_key: private_key, query: query
1602
+ sign = File::SignerV2.from_bucket self, path
1603
+ sign.signed_url method: method,
1604
+ expires: expires,
1605
+ headers: headers,
1606
+ content_type: content_type,
1607
+ content_md5: content_md5,
1608
+ issuer: issuer,
1609
+ client_email: client_email,
1610
+ signing_key: signing_key,
1611
+ private_key: private_key,
1612
+ signer: signer,
1613
+ query: query
1528
1614
  when :v4
1529
- signer = File::SignerV4.from_bucket self, path
1530
- signer.signed_url method: method, expires: expires,
1531
- headers: headers, issuer: issuer,
1532
- client_email: client_email,
1533
- signing_key: signing_key,
1534
- private_key: private_key, query: query
1615
+ sign = File::SignerV4.from_bucket self, path
1616
+ sign.signed_url method: method,
1617
+ expires: expires,
1618
+ headers: headers,
1619
+ issuer: issuer,
1620
+ client_email: client_email,
1621
+ signing_key: signing_key,
1622
+ private_key: private_key,
1623
+ signer: signer,
1624
+ query: query,
1625
+ scheme: scheme,
1626
+ virtual_hosted_style: virtual_hosted_style,
1627
+ bucket_bound_hostname: bucket_bound_hostname
1535
1628
  else
1536
1629
  raise ArgumentError, "version '#{version}' not supported"
1537
1630
  end
@@ -1552,28 +1645,45 @@ module Google
1552
1645
  # A {SignedUrlUnavailable} is raised if the service account credentials
1553
1646
  # are missing. Service account credentials are acquired by following the
1554
1647
  # steps in [Service Account Authentication](
1555
- # https://cloud.google.com/storage/docs/authentication#service_accounts).
1648
+ # https://cloud.google.com/iam/docs/service-accounts).
1556
1649
  #
1557
1650
  # @see https://cloud.google.com/storage/docs/xml-api/post-object
1558
1651
  #
1559
1652
  # @param [String] path Path to the file in Google Cloud Storage.
1560
1653
  # @param [Hash] policy The security policy that describes what
1561
- # can and cannot be uploaded in the form. When provided,
1562
- # the PostObject fields will include a Signature based on the JSON
1563
- # representation of this Hash and the same policy in Base64 format.
1654
+ # can and cannot be uploaded in the form. When provided, the PostObject
1655
+ # fields will include a signature based on the JSON representation of
1656
+ # this hash and the same policy in Base64 format.
1657
+ #
1564
1658
  # If you do not provide a security policy, requests are considered
1565
1659
  # to be anonymous and will only work with buckets that have granted
1566
- # WRITE or FULL_CONTROL permission to anonymous users.
1660
+ # `WRITE` or `FULL_CONTROL` permission to anonymous users.
1567
1661
  # See [Policy Document](https://cloud.google.com/storage/docs/xml-api/post-object#policydocument)
1568
1662
  # for more information.
1569
1663
  # @param [String] issuer Service Account's Client Email.
1570
1664
  # @param [String] client_email Service Account's Client Email.
1571
- # @param [OpenSSL::PKey::RSA, String] signing_key Service Account's
1572
- # Private Key.
1573
- # @param [OpenSSL::PKey::RSA, String] private_key Service Account's
1574
- # Private Key.
1575
- #
1576
- # @return [PostObject]
1665
+ # @param [OpenSSL::PKey::RSA, String, Proc] signing_key Service Account's
1666
+ # Private Key or a Proc that accepts a single String parameter and returns a
1667
+ # RSA SHA256 signature using a valid Google Service Account Private Key.
1668
+ # @param [OpenSSL::PKey::RSA, String, Proc] private_key Service Account's
1669
+ # Private Key or a Proc that accepts a single String parameter and returns a
1670
+ # RSA SHA256 signature using a valid Google Service Account Private Key.
1671
+ # @param [OpenSSL::PKey::RSA, String, Proc] signer Service Account's
1672
+ # Private Key or a Proc that accepts a single String parameter and returns a
1673
+ # RSA SHA256 signature using a valid Google Service Account Private Key.
1674
+ #
1675
+ # When using this method in environments such as GAE Flexible Environment,
1676
+ # GKE, or Cloud Functions where the private key is unavailable, it may be
1677
+ # necessary to provide a Proc (or lambda) via the signer parameter. This
1678
+ # Proc should return a signature created using a RPC call to the
1679
+ # [Service Account Credentials signBlob](https://cloud.google.com/iam/docs/reference/credentials/rest/v1/projects.serviceAccounts/signBlob)
1680
+ # method as shown in the example below.
1681
+ # @return [PostObject] An object containing the URL, fields, and values needed to upload files via html forms.
1682
+ #
1683
+ # @raise [SignedUrlUnavailable] If the service account credentials
1684
+ # are missing. Service account credentials are acquired by following the
1685
+ # steps in [Service Account Authentication](
1686
+ # https://cloud.google.com/iam/docs/service-accounts).
1577
1687
  #
1578
1688
  # @example
1579
1689
  # require "google/cloud/storage"
@@ -1633,15 +1743,213 @@ module Google
1633
1743
  # post.fields[:signature] #=> "ABC...XYZ="
1634
1744
  # post.fields[:policy] #=> "ABC...XYZ="
1635
1745
  #
1636
- def post_object path, policy: nil, issuer: nil,
1637
- client_email: nil, signing_key: nil,
1638
- private_key: nil
1746
+ # @example Using Cloud IAMCredentials signBlob to create the signature:
1747
+ # require "google/cloud/storage"
1748
+ # require "google/apis/iamcredentials_v1"
1749
+ # require "googleauth"
1750
+ #
1751
+ # # Issuer is the service account email that the Signed URL will be signed with
1752
+ # # and any permission granted in the Signed URL must be granted to the
1753
+ # # Google Service Account.
1754
+ # issuer = "service-account@project-id.iam.gserviceaccount.com"
1755
+ #
1756
+ # # Create a lambda that accepts the string_to_sign
1757
+ # signer = lambda do |string_to_sign|
1758
+ # IAMCredentials = Google::Apis::IamcredentialsV1
1759
+ # iam_client = IAMCredentials::IAMCredentialsService.new
1760
+ #
1761
+ # # Get the environment configured authorization
1762
+ # scopes = ["https://www.googleapis.com/auth/iam"]
1763
+ # iam_client.authorization = Google::Auth.get_application_default scopes
1764
+ #
1765
+ # request = {
1766
+ # "payload": string_to_sign,
1767
+ # }
1768
+ # resource = "projects/-/serviceAccounts/#{issuer}"
1769
+ # response = iam_client.sign_service_account_blob resource, request, {}
1770
+ # response.signed_blob
1771
+ # end
1772
+ #
1773
+ # storage = Google::Cloud::Storage.new
1774
+ #
1775
+ # bucket = storage.bucket "my-todo-app"
1776
+ # post = bucket.post_object "avatars/heidi/400x400.png",
1777
+ # issuer: issuer,
1778
+ # signer: signer
1779
+ #
1780
+ # post.url #=> "https://storage.googleapis.com"
1781
+ # post.fields[:key] #=> "my-todo-app/avatars/heidi/400x400.png"
1782
+ # post.fields[:GoogleAccessId] #=> "0123456789@gserviceaccount.com"
1783
+ # post.fields[:signature] #=> "ABC...XYZ="
1784
+ # post.fields[:policy] #=> "ABC...XYZ="
1785
+ #
1786
+ def post_object path,
1787
+ policy: nil,
1788
+ issuer: nil,
1789
+ client_email: nil,
1790
+ signing_key: nil,
1791
+ private_key: nil,
1792
+ signer: nil
1639
1793
  ensure_service!
1794
+ sign = File::SignerV2.from_bucket self, path
1795
+ sign.post_object issuer: issuer,
1796
+ client_email: client_email,
1797
+ signing_key: signing_key,
1798
+ private_key: private_key,
1799
+ signer: signer,
1800
+ policy: policy
1801
+ end
1640
1802
 
1641
- signer = File::SignerV2.from_bucket self, path
1642
- signer.post_object issuer: issuer, client_email: client_email,
1643
- signing_key: signing_key, private_key: private_key,
1644
- policy: policy
1803
+ ##
1804
+ # Generate a PostObject that includes the fields and url to
1805
+ # upload objects via html forms.
1806
+ #
1807
+ # Generating a PostObject requires service account credentials,
1808
+ # either by connecting with a service account when calling
1809
+ # {Google::Cloud.storage}, or by passing in the service account
1810
+ # `issuer` and `signing_key` values. Although the private key can
1811
+ # be passed as a string for convenience, creating and storing
1812
+ # an instance of `OpenSSL::PKey::RSA` is more efficient
1813
+ # when making multiple calls to `generate_signed_post_policy_v4`.
1814
+ #
1815
+ # A {SignedUrlUnavailable} is raised if the service account credentials
1816
+ # are missing. Service account credentials are acquired by following the
1817
+ # steps in [Service Account Authentication](
1818
+ # https://cloud.google.com/iam/docs/service-accounts).
1819
+ #
1820
+ # @see https://cloud.google.com/storage/docs/xml-api/post-object
1821
+ #
1822
+ # @param [String] path Path to the file in Google Cloud Storage.
1823
+ # @param [String] issuer Service Account's Client Email.
1824
+ # @param [String] client_email Service Account's Client Email.
1825
+ # @param [OpenSSL::PKey::RSA, String, Proc] signing_key Service Account's
1826
+ # Private Key or a Proc that accepts a single String parameter and returns a
1827
+ # RSA SHA256 signature using a valid Google Service Account Private Key.
1828
+ # @param [OpenSSL::PKey::RSA, String, Proc] private_key Service Account's
1829
+ # Private Key or a Proc that accepts a single String parameter and returns a
1830
+ # RSA SHA256 signature using a valid Google Service Account Private Key.
1831
+ # @param [OpenSSL::PKey::RSA, String, Proc] signer Service Account's
1832
+ # Private Key or a Proc that accepts a single String parameter and returns a
1833
+ # RSA SHA256 signature using a valid Google Service Account Private Key.
1834
+ #
1835
+ # When using this method in environments such as GAE Flexible Environment,
1836
+ # GKE, or Cloud Functions where the private key is unavailable, it may be
1837
+ # necessary to provide a Proc (or lambda) via the signer parameter. This
1838
+ # Proc should return a signature created using a RPC call to the
1839
+ # [Service Account Credentials signBlob](https://cloud.google.com/iam/docs/reference/credentials/rest/v1/projects.serviceAccounts/signBlob)
1840
+ # method as shown in the example below.
1841
+ # @param [Integer] expires The number of seconds until the URL expires.
1842
+ # The default is 604800 (7 days).
1843
+ # @param [Hash] fields User-supplied form fields such as `acl`,
1844
+ # `cache-control`, `success_action_status`, and `success_action_redirect`.
1845
+ # @param [Array<Hash|Array>] conditions User-supplied policy conditions.
1846
+ # @param [String] scheme The URL scheme. The default value is `HTTPS`.
1847
+ # @param [Boolean] virtual_hosted_style Whether to use a virtual hosted-style
1848
+ # hostname, which adds the bucket into the host portion of the URI rather
1849
+ # than the path, e.g. `https://mybucket.storage.googleapis.com/...`.
1850
+ # The default value of `false` uses the
1851
+ # form of `https://storage.googleapis.com/mybucket`.
1852
+ # @param [String] bucket_bound_hostname Use a bucket-bound hostname, which
1853
+ # replaces the `storage.googleapis.com` host with the name of a `CNAME`
1854
+ # bucket, e.g. a bucket named `gcs-subdomain.my.domain.tld`, or a Google
1855
+ # Cloud Load Balancer which routes to a bucket you own, e.g.
1856
+ # `my-load-balancer-domain.tld`.
1857
+ #
1858
+ # @return [PostObject] An object containing the URL, fields, and values needed to upload files via html forms.
1859
+ #
1860
+ # @raise [SignedUrlUnavailable] If the service account credentials
1861
+ # are missing. Service account credentials are acquired by following the
1862
+ # steps in [Service Account Authentication](
1863
+ # https://cloud.google.com/iam/docs/service-accounts).
1864
+ #
1865
+ # @example
1866
+ # require "google/cloud/storage"
1867
+ #
1868
+ # storage = Google::Cloud::Storage.new
1869
+ #
1870
+ # bucket = storage.bucket "my-todo-app"
1871
+ #
1872
+ # conditions = [["starts-with", "$acl","public"]]
1873
+ # post = bucket.generate_signed_post_policy_v4 "avatars/heidi/400x400.png", expires: 10,
1874
+ # conditions: conditions
1875
+ #
1876
+ # post.url #=> "https://storage.googleapis.com/my-todo-app/"
1877
+ # post.fields["key"] #=> "my-todo-app/avatars/heidi/400x400.png"
1878
+ # post.fields["policy"] #=> "ABC...XYZ"
1879
+ # post.fields["x-goog-algorithm"] #=> "GOOG4-RSA-SHA256"
1880
+ # post.fields["x-goog-credential"] #=> "cred@pid.iam.gserviceaccount.com/20200123/auto/storage/goog4_request"
1881
+ # post.fields["x-goog-date"] #=> "20200128T000000Z"
1882
+ # post.fields["x-goog-signature"] #=> "4893a0e...cd82"
1883
+ #
1884
+ # @example Using Cloud IAMCredentials signBlob to create the signature:
1885
+ # require "google/cloud/storage"
1886
+ # require "google/apis/iamcredentials_v1"
1887
+ # require "googleauth"
1888
+ #
1889
+ # # Issuer is the service account email that the Signed URL will be signed with
1890
+ # # and any permission granted in the Signed URL must be granted to the
1891
+ # # Google Service Account.
1892
+ # issuer = "service-account@project-id.iam.gserviceaccount.com"
1893
+ #
1894
+ # # Create a lambda that accepts the string_to_sign
1895
+ # signer = lambda do |string_to_sign|
1896
+ # IAMCredentials = Google::Apis::IamcredentialsV1
1897
+ # iam_client = IAMCredentials::IAMCredentialsService.new
1898
+ #
1899
+ # # Get the environment configured authorization
1900
+ # scopes = ["https://www.googleapis.com/auth/iam"]
1901
+ # iam_client.authorization = Google::Auth.get_application_default scopes
1902
+ #
1903
+ # request = {
1904
+ # "payload": string_to_sign,
1905
+ # }
1906
+ # resource = "projects/-/serviceAccounts/#{issuer}"
1907
+ # response = iam_client.sign_service_account_blob resource, request, {}
1908
+ # response.signed_blob
1909
+ # end
1910
+ #
1911
+ # storage = Google::Cloud::Storage.new
1912
+ #
1913
+ # bucket = storage.bucket "my-todo-app"
1914
+ # conditions = [["starts-with", "$acl","public"]]
1915
+ # post = bucket.generate_signed_post_policy_v4(
1916
+ # "avatars/heidi/400x400.png", expires: 10,
1917
+ # conditions: conditions, issuer: issuer, signer: signer
1918
+ # )
1919
+ #
1920
+ # post.url #=> "https://storage.googleapis.com/my-todo-app/"
1921
+ # post.fields["key"] #=> "my-todo-app/avatars/heidi/400x400.png"
1922
+ # post.fields["policy"] #=> "ABC...XYZ"
1923
+ # post.fields["x-goog-algorithm"] #=> "GOOG4-RSA-SHA256"
1924
+ # post.fields["x-goog-credential"] #=> "cred@pid.iam.gserviceaccount.com/20200123/auto/storage/goog4_request"
1925
+ # post.fields["x-goog-date"] #=> "20200128T000000Z"
1926
+ # post.fields["x-goog-signature"] #=> "4893a0e...cd82"
1927
+ #
1928
+ def generate_signed_post_policy_v4 path,
1929
+ issuer: nil,
1930
+ client_email: nil,
1931
+ signing_key: nil,
1932
+ private_key: nil,
1933
+ signer: nil,
1934
+ expires: nil,
1935
+ fields: nil,
1936
+ conditions: nil,
1937
+ scheme: "https",
1938
+ virtual_hosted_style: nil,
1939
+ bucket_bound_hostname: nil
1940
+ ensure_service!
1941
+ sign = File::SignerV4.from_bucket self, path
1942
+ sign.post_object issuer: issuer,
1943
+ client_email: client_email,
1944
+ signing_key: signing_key,
1945
+ private_key: private_key,
1946
+ signer: signer,
1947
+ expires: expires,
1948
+ fields: fields,
1949
+ conditions: conditions,
1950
+ scheme: scheme,
1951
+ virtual_hosted_style: virtual_hosted_style,
1952
+ bucket_bound_hostname: bucket_bound_hostname
1645
1953
  end
1646
1954
 
1647
1955
  ##
@@ -2125,11 +2433,12 @@ module Google
2125
2433
  def create_notification topic, custom_attrs: nil, event_types: nil,
2126
2434
  prefix: nil, payload: nil
2127
2435
  ensure_service!
2128
- options = { custom_attrs: custom_attrs, event_types: event_types,
2129
- prefix: prefix, payload: payload,
2130
- user_project: user_project }
2131
2436
 
2132
- gapi = service.insert_notification name, topic, options
2437
+ gapi = service.insert_notification name, topic, custom_attrs: custom_attrs,
2438
+ event_types: event_types,
2439
+ prefix: prefix,
2440
+ payload: payload,
2441
+ user_project: user_project
2133
2442
  Notification.from_gapi name, gapi, service, user_project: user_project
2134
2443
  end
2135
2444
  alias new_notification create_notification
@@ -2215,7 +2524,7 @@ module Google
2215
2524
  patch_args = Hash[attributes.map do |attr|
2216
2525
  [attr, @gapi.send(attr)]
2217
2526
  end]
2218
- patch_gapi = API::Bucket.new patch_args
2527
+ patch_gapi = API::Bucket.new(**patch_args)
2219
2528
  @gapi = service.patch_bucket name, patch_gapi,
2220
2529
  user_project: user_project
2221
2530
  @lazy = nil