From 805390ecf0ff230d4689fd2eea53620b4e1e31c4 Mon Sep 17 00:00:00 2001 From: Frank Natividad Date: Mon, 30 Mar 2020 18:46:44 -0700 Subject: [PATCH 1/4] feat: add post policy sample --- storage/cloud-client/snippets_test.py | 11 ++++ .../storage_generate_signed_post_policy_v4.py | 58 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 storage/cloud-client/storage_generate_signed_post_policy_v4.py diff --git a/storage/cloud-client/snippets_test.py b/storage/cloud-client/snippets_test.py index 42e73944d0a..32588f91a39 100644 --- a/storage/cloud-client/snippets_test.py +++ b/storage/cloud-client/snippets_test.py @@ -40,6 +40,7 @@ import storage_generate_signed_url_v2 import storage_generate_signed_url_v4 import storage_generate_upload_signed_url_v4 +import storage_generate_signed_post_policy_v4 import storage_set_bucket_default_kms_key KMS_KEY = os.environ["CLOUD_KMS_KEY"] @@ -202,6 +203,16 @@ def test_generate_upload_signed_url_v4(test_bucket, capsys): assert blob.download_as_string() == content +def test_generate_signed_post_policy_v4(test_bucket, capsys): + blob_name = "storage_snippets_test_upload" + content = b"Uploaded via v4 signed url" + short_name = storage_generate_signed_post_policy_v4 + html_form = short_name.generate_signed_post_policy_v4( + test_bucket.name, blob_name + ) + assert html_form == "" + + def test_rename_blob(test_blob): bucket = storage.Client().bucket(test_blob.bucket.name) diff --git a/storage/cloud-client/storage_generate_signed_post_policy_v4.py b/storage/cloud-client/storage_generate_signed_post_policy_v4.py new file mode 100644 index 00000000000..3bb4e341641 --- /dev/null +++ b/storage/cloud-client/storage_generate_signed_post_policy_v4.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python + +# Copyright 2020 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +# [START storage_generate_signed_post_policy_v4] +from google.cloud import storage +import datetime + + +def generate_signed_post_policy_v4(bucket_name, blob_name): + """Generates a v4 POST Policy and prints an HTML form.""" + # bucket_name = 'your-bucket-name' + # blob_name = 'your-object-name' + + storage_client = storage.Client() + + policy = storage_client.generate_signed_post_policy_v4( + bucket_name, + object_name, + expiration=datetime.timedelta(minutes=10), + ) + + # Create an HTML form with the provided policy + form_html = "
\n".format(policy["url"]) + + # Include all fields returned in the HTML form as they're required + for index, (key, value) in enumerate(policy["fields"].items()): + form_html += " \n".format(key, value) + + form_html += "
\n" + form_html += "
\n" + form_html += "
" + + print(form_html) + + return form_html + + +# [END storage_generate_signed_post_policy_v4] + +if __name__ == "__main__": + generate_signed_post_policy_v4( + bucket_name=sys.argv[1], blob_name=sys.argv[2] + ) From 497d19748f77c2cc8c9f219f1a70e71c1dc3ff32 Mon Sep 17 00:00:00 2001 From: Frank Natividad Date: Thu, 2 Apr 2020 23:44:38 -0700 Subject: [PATCH 2/4] use 1.27.0 --- storage/cloud-client/requirements.txt | 2 +- storage/cloud-client/snippets_test.py | 20 ++++++++++++------- .../storage_generate_signed_post_policy_v4.py | 20 +++++++++++-------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/storage/cloud-client/requirements.txt b/storage/cloud-client/requirements.txt index ede7da0e8e7..05d4d995b84 100644 --- a/storage/cloud-client/requirements.txt +++ b/storage/cloud-client/requirements.txt @@ -1,2 +1,2 @@ google-cloud-pubsub==1.1.0 -google-cloud-storage==1.26.0 +google-cloud-storage==1.27.0 diff --git a/storage/cloud-client/snippets_test.py b/storage/cloud-client/snippets_test.py index 32588f91a39..682420eebab 100644 --- a/storage/cloud-client/snippets_test.py +++ b/storage/cloud-client/snippets_test.py @@ -40,7 +40,7 @@ import storage_generate_signed_url_v2 import storage_generate_signed_url_v4 import storage_generate_upload_signed_url_v4 -import storage_generate_signed_post_policy_v4 +import storage_generate_signed_policy_v4 import storage_set_bucket_default_kms_key KMS_KEY = os.environ["CLOUD_KMS_KEY"] @@ -203,14 +203,20 @@ def test_generate_upload_signed_url_v4(test_bucket, capsys): assert blob.download_as_string() == content -def test_generate_signed_post_policy_v4(test_bucket, capsys): - blob_name = "storage_snippets_test_upload" - content = b"Uploaded via v4 signed url" - short_name = storage_generate_signed_post_policy_v4 - html_form = short_name.generate_signed_post_policy_v4( +def test_generate_signed_policy_v4(test_bucket, capsys): + blob_name = "storage_snippets_test_form" + short_name = storage_generate_signed_policy_v4 + form = short_name.generate_signed_policy_v4( test_bucket.name, blob_name ) - assert html_form == "" + assert "name='key' value='{}'".format(blob_name) in form + assert "name='x-goog-signature'" in form + assert "name='x-goog-date'" in form + assert "name='x-goog-credential'" in form + assert "name='x-goog-algorithm' value='GOOG4-RSA-SHA256'" in form + assert "name='policy'" in form + assert "name='x-goog-meta-test' value='data'" in form + assert "type='file' name='file'/>" in form def test_rename_blob(test_blob): diff --git a/storage/cloud-client/storage_generate_signed_post_policy_v4.py b/storage/cloud-client/storage_generate_signed_post_policy_v4.py index 3bb4e341641..392660af6ab 100644 --- a/storage/cloud-client/storage_generate_signed_post_policy_v4.py +++ b/storage/cloud-client/storage_generate_signed_post_policy_v4.py @@ -30,24 +30,28 @@ def generate_signed_post_policy_v4(bucket_name, blob_name): policy = storage_client.generate_signed_post_policy_v4( bucket_name, - object_name, + blob_name, expiration=datetime.timedelta(minutes=10), + fields={ + 'x-goog-meta-test': 'data' + } ) # Create an HTML form with the provided policy - form_html = "
\n".format(policy["url"]) + header = "\n" + form = header.format(policy["url"]) # Include all fields returned in the HTML form as they're required for index, (key, value) in enumerate(policy["fields"].items()): - form_html += " \n".format(key, value) + form += " \n".format(key, value) - form_html += "
\n" - form_html += "
\n" - form_html += "
" + form += "
\n" + form += "
\n" + form += "" - print(form_html) + print(form) - return form_html + return form # [END storage_generate_signed_post_policy_v4] From f8c22cd39bf13d6a53e8bf04a159b7e2dbea7275 Mon Sep 17 00:00:00 2001 From: Frank Natividad Date: Fri, 3 Apr 2020 00:11:00 -0700 Subject: [PATCH 3/4] fix --- storage/cloud-client/snippets_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/storage/cloud-client/snippets_test.py b/storage/cloud-client/snippets_test.py index 682420eebab..31cec838354 100644 --- a/storage/cloud-client/snippets_test.py +++ b/storage/cloud-client/snippets_test.py @@ -40,7 +40,7 @@ import storage_generate_signed_url_v2 import storage_generate_signed_url_v4 import storage_generate_upload_signed_url_v4 -import storage_generate_signed_policy_v4 +import storage_generate_signed_post_policy_v4 import storage_set_bucket_default_kms_key KMS_KEY = os.environ["CLOUD_KMS_KEY"] @@ -205,8 +205,8 @@ def test_generate_upload_signed_url_v4(test_bucket, capsys): def test_generate_signed_policy_v4(test_bucket, capsys): blob_name = "storage_snippets_test_form" - short_name = storage_generate_signed_policy_v4 - form = short_name.generate_signed_policy_v4( + short_name = storage_generate_signed_post_policy_v4 + form = short_name.generate_signed_post_policy_v4( test_bucket.name, blob_name ) assert "name='key' value='{}'".format(blob_name) in form From ab76a9ff81e7329ba1e1d9304ccd543e11da945e Mon Sep 17 00:00:00 2001 From: Frank Natividad Date: Fri, 3 Apr 2020 14:23:56 -0700 Subject: [PATCH 4/4] simplify iterator --- storage/cloud-client/storage_generate_signed_post_policy_v4.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/cloud-client/storage_generate_signed_post_policy_v4.py b/storage/cloud-client/storage_generate_signed_post_policy_v4.py index 392660af6ab..8d7e2e937ee 100644 --- a/storage/cloud-client/storage_generate_signed_post_policy_v4.py +++ b/storage/cloud-client/storage_generate_signed_post_policy_v4.py @@ -42,7 +42,7 @@ def generate_signed_post_policy_v4(bucket_name, blob_name): form = header.format(policy["url"]) # Include all fields returned in the HTML form as they're required - for index, (key, value) in enumerate(policy["fields"].items()): + for key, value in policy["fields"].items(): form += " \n".format(key, value) form += "
\n"