Skip to content

Commit 685257c

Browse files
authored
feat(storage): add two new samples (GoogleCloudPlatform#1437)
1 parent fcfe833 commit 685257c

File tree

4 files changed

+190
-0
lines changed

4 files changed

+190
-0
lines changed

storage/src/download_public_file.php

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
2+
/**
3+
* Copyright 2021 Google LLC
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
/**
19+
* For instructions on how to run the full sample:
20+
*
21+
* @see https://github.com/GoogleCloudPlatform/php-docs-samples/tree/master/storage/README.md
22+
*/
23+
24+
namespace Google\Cloud\Samples\Storage;
25+
26+
# [START storage_download_public_file]
27+
use Google\Cloud\Storage\StorageClient;
28+
29+
/**
30+
* Download a public file using anonymous credentials.
31+
*
32+
* @param string $bucketName The name of your Cloud Storage bucket.
33+
* @param string $objectName The name of your Cloud Storage object.
34+
* @param string $destination The local destination to save the object.
35+
*/
36+
function download_public_file($bucketName, $objectName, $destination)
37+
{
38+
// $bucketName = 'my-bucket';
39+
// $objectName = 'my-object';
40+
// $destination = '/home/admin/downloads/my-object';
41+
42+
// create a storage client without authentication
43+
$storage = new StorageClient([
44+
]);
45+
46+
$bucket = $storage->bucket($bucketName);
47+
$object = $bucket->object($objectName);
48+
49+
// set `shouldSignRequest` to false to force the client to not authenticate.
50+
// if you do not have any client configuration enabled (i.e. application
51+
// default credentials), that option can be omitted.
52+
$object->downloadToFile($destination, [
53+
'shouldSignRequest' => false,
54+
]);
55+
56+
printf(
57+
'Downloaded public object %s from bucket %s to %s',
58+
$objectName,
59+
$bucketName,
60+
$destination
61+
);
62+
}
63+
# [END storage_download_public_file]
64+
65+
// The following 2 lines are only needed to run the samples
66+
require_once __DIR__ . '/../../testing/sample_helpers.php';
67+
\Google\Cloud\Samples\execute_sample(__FILE__, __NAMESPACE__, $argv);

storage/src/set_bucket_public_iam.php

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
2+
/**
3+
* Copyright 2021 Google LLC
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
/**
19+
* For instructions on how to run the full sample:
20+
*
21+
* @see https://github.com/GoogleCloudPlatform/php-docs-samples/tree/master/storage/README.md
22+
*/
23+
24+
namespace Google\Cloud\Samples\Storage;
25+
26+
# [START storage_set_bucket_public_iam]
27+
use Google\Cloud\Storage\StorageClient;
28+
29+
/**
30+
* Update the specified bucket's IAM configuration to make it publicly accessible.
31+
*
32+
* @param string $bucketName The name of your Cloud Storage bucket.
33+
*/
34+
function set_bucket_public_iam($bucketName)
35+
{
36+
// $bucketName = 'my-bucket';
37+
38+
$storage = new StorageClient();
39+
$bucket = $storage->bucket($bucketName);
40+
41+
$policy = $bucket->iam()->policy(['requestedPolicyVersion' => 3]);
42+
$policy['version'] = 3;
43+
44+
$role = 'roles/storage.objectViewer';
45+
$members = ['allUsers'];
46+
47+
$policy['bindings'][] = [
48+
'role' => $role,
49+
'members' => $members
50+
];
51+
52+
$bucket->iam()->setPolicy($policy);
53+
54+
printf('Bucket %s is now public', $bucketName);
55+
}
56+
# [END storage_set_bucket_public_iam]
57+
58+
// The following 2 lines are only needed to run the samples
59+
require_once __DIR__ . '/../../testing/sample_helpers.php';
60+
\Google\Cloud\Samples\execute_sample(__FILE__, __NAMESPACE__, $argv);

storage/test/IamTest.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,4 +260,31 @@ public function testRemoveBucketConditionalIamBinding()
260260
}
261261
$this->assertFalse($foundBinding);
262262
}
263+
264+
public function testSetBucketPublicIam()
265+
{
266+
$bucket = self::$storage->createBucket(uniqid('samples-public-iam-'));
267+
268+
$output = self::runFunctionSnippet('set_bucket_public_iam', [
269+
$bucket->name(),
270+
]);
271+
272+
$this->assertEquals(
273+
sprintf('Bucket %s is now public', $bucket->name()),
274+
$output
275+
);
276+
277+
$policy = $bucket->iam()->policy();
278+
$hasBinding = false;
279+
foreach ($policy['bindings'] as $binding) {
280+
if ($binding['role'] == 'roles/storage.objectViewer' && $binding['members'] = ['allUsers']) {
281+
$hasBinding = true;
282+
break;
283+
}
284+
}
285+
286+
$bucket->delete();
287+
288+
$this->assertTrue($hasBinding, 'has public viewable iam binding');
289+
}
263290
}

storage/test/storageTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,42 @@ public function testDeleteFileArchivedGeneration()
769769
);
770770
}
771771

772+
public function testDownloadPublicObject()
773+
{
774+
$bucket = self::$storage->createBucket(uniqid('samples-download-public-object-'));
775+
776+
self::runFunctionSnippet('set_bucket_public_iam', [
777+
$bucket->name(),
778+
]);
779+
780+
$object = self::$storage->bucket(self::$bucketName)->upload('test content', [
781+
'name' => uniqid('samples-download-public-object-'),
782+
]);
783+
784+
$downloadTo = tempnam(sys_get_temp_dir(), '/tests/' . $object->name());
785+
786+
$output = self::runFunctionSnippet('download_public_file', [
787+
self::$bucketName,
788+
$object->name(),
789+
$downloadTo,
790+
]);
791+
792+
$object->delete();
793+
$bucket->delete();
794+
795+
$this->assertEquals(
796+
sprintf(
797+
'Downloaded public object %s from bucket %s to %s',
798+
$object->name(),
799+
self::$bucketName,
800+
$downloadTo,
801+
),
802+
$output
803+
);
804+
805+
$this->assertFileExists($downloadTo);
806+
}
807+
772808
private function keyName()
773809
{
774810
return sprintf(

0 commit comments

Comments
 (0)