py3: port cli form_signature and unit tests

This patch ports the form_signature cli `swift-form-signature`
and it's corrisponding tests to py3.

In essence in Py3 the HMAC function expects binary strings.

Change-Id: I5dded4ceb80f0cc595403775e8f9c17873e1e37b
This commit is contained in:
Matthew Oliver 2018-03-13 06:19:44 +00:00
parent 0a4d1b7e22
commit e84ed57a72
3 changed files with 28 additions and 15 deletions

View File

@ -17,6 +17,7 @@ Script for generating a form signature for use with FormPost middleware.
""" """
from __future__ import print_function from __future__ import print_function
import hmac import hmac
import six
from hashlib import sha1 from hashlib import sha1
from os.path import basename from os.path import basename
from time import time from time import time
@ -92,8 +93,14 @@ def main(argv):
print('For example: /v1/account/container') print('For example: /v1/account/container')
print(' Or: /v1/account/container/object_prefix') print(' Or: /v1/account/container/object_prefix')
return 1 return 1
sig = hmac.new(key, '%s\n%s\n%s\n%s\n%s' % (path, redirect, max_file_size, data = '%s\n%s\n%s\n%s\n%s' % (path, redirect, max_file_size,
max_file_count, expires), max_file_count, expires)
if six.PY3:
data = data if isinstance(data, six.binary_type) else \
data.encode('utf8')
key = key if isinstance(key, six.binary_type) else \
key.encode('utf8')
sig = hmac.new(key, data,
sha1).hexdigest() sha1).hexdigest()
print(' Expires:', expires) print(' Expires:', expires)
print('Signature:', sig) print('Signature:', sig)

View File

@ -17,7 +17,7 @@
import hashlib import hashlib
import hmac import hmac
import mock import mock
from six import StringIO import six
import unittest import unittest
from swift.cli import form_signature from swift.cli import form_signature
@ -33,14 +33,19 @@ class TestFormSignature(unittest.TestCase):
max_file_size = str(int(1024 * 1024 * 1024 * 3.14159)) # π GiB max_file_size = str(int(1024 * 1024 * 1024 * 3.14159)) # π GiB
max_file_count = '3' max_file_count = '3'
expected_signature = hmac.new( data = "\n".join((
key,
"\n".join((
path, redirect, max_file_size, max_file_count, path, redirect, max_file_size, max_file_count,
str(int(the_time + expires)))), str(int(the_time + expires))))
hashlib.sha1).hexdigest()
out = StringIO() if six.PY3:
data = data if isinstance(data, six.binary_type) else \
data.encode('utf8')
key = key if isinstance(key, six.binary_type) else \
key.encode('utf8')
expected_signature = hmac.new(key, data, hashlib.sha1).hexdigest()
out = six.StringIO()
with mock.patch('swift.cli.form_signature.time', lambda: the_time): with mock.patch('swift.cli.form_signature.time', lambda: the_time):
with mock.patch('sys.stdout', out): with mock.patch('sys.stdout', out):
exitcode = form_signature.main([ exitcode = form_signature.main([
@ -59,7 +64,7 @@ class TestFormSignature(unittest.TestCase):
self.assertIn(sig_input, out.getvalue()) self.assertIn(sig_input, out.getvalue())
def test_too_few_args(self): def test_too_few_args(self):
out = StringIO() out = six.StringIO()
with mock.patch('sys.stdout', out): with mock.patch('sys.stdout', out):
exitcode = form_signature.main([ exitcode = form_signature.main([
'/path/to/swift-form-signature', '/path/to/swift-form-signature',
@ -70,7 +75,7 @@ class TestFormSignature(unittest.TestCase):
self.assertIn(usage, out.getvalue()) self.assertIn(usage, out.getvalue())
def test_invalid_filesize_arg(self): def test_invalid_filesize_arg(self):
out = StringIO() out = six.StringIO()
key = 'secret squirrel' key = 'secret squirrel'
with mock.patch('sys.stdout', out): with mock.patch('sys.stdout', out):
exitcode = form_signature.main([ exitcode = form_signature.main([
@ -79,7 +84,7 @@ class TestFormSignature(unittest.TestCase):
self.assertNotEqual(exitcode, 0) self.assertNotEqual(exitcode, 0)
def test_invalid_filecount_arg(self): def test_invalid_filecount_arg(self):
out = StringIO() out = six.StringIO()
key = 'secret squirrel' key = 'secret squirrel'
with mock.patch('sys.stdout', out): with mock.patch('sys.stdout', out):
exitcode = form_signature.main([ exitcode = form_signature.main([
@ -88,7 +93,7 @@ class TestFormSignature(unittest.TestCase):
self.assertNotEqual(exitcode, 0) self.assertNotEqual(exitcode, 0)
def test_invalid_path_arg(self): def test_invalid_path_arg(self):
out = StringIO() out = six.StringIO()
key = 'secret squirrel' key = 'secret squirrel'
with mock.patch('sys.stdout', out): with mock.patch('sys.stdout', out):
exitcode = form_signature.main([ exitcode = form_signature.main([
@ -97,7 +102,7 @@ class TestFormSignature(unittest.TestCase):
self.assertNotEqual(exitcode, 0) self.assertNotEqual(exitcode, 0)
def test_invalid_seconds_arg(self): def test_invalid_seconds_arg(self):
out = StringIO() out = six.StringIO()
key = 'secret squirrel' key = 'secret squirrel'
with mock.patch('sys.stdout', out): with mock.patch('sys.stdout', out):
exitcode = form_signature.main([ exitcode = form_signature.main([

View File

@ -30,6 +30,7 @@ setenv = VIRTUAL_ENV={envdir}
commands = commands =
nosetests \ nosetests \
test/unit/cli/test_dispersion_report.py \ test/unit/cli/test_dispersion_report.py \
test/unit/cli/test_form_signature.py \
test/unit/cli/test_info.py \ test/unit/cli/test_info.py \
test/unit/cli/test_relinker.py \ test/unit/cli/test_relinker.py \
test/unit/cli/test_ring_builder_analyzer.py \ test/unit/cli/test_ring_builder_analyzer.py \