Skip to content
This repository was archived by the owner on Apr 13, 2024. It is now read-only.

Commit e4be274

Browse files
committed
More PEP8 cleanup.
1 parent e5e42a5 commit e4be274

File tree

10 files changed

+88
-55
lines changed

10 files changed

+88
-55
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ doc/__build/*
1111
*_rsa.pub
1212
locale/
1313
pip-log.txt
14+
/.idea
15+
/.eggs

README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ For testing:
3434

3535
* tox
3636
* pyenv (optional, handy way to access multiple versions)
37-
$ for VERS in 2.7.14 3.3.7 3.4.8 3.5.5 3.6.4; do pyenv install -s $VERS; done
37+
$ for VERS in 2.7.14 3.3.7 3.4.8 3.5.5 3.6.4; do pyenv install -s $VERS; done
3838

3939
Usage
4040
-----

httpsig/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@
44
from ._version import get_versions
55
__version__ = get_versions()['version']
66
del get_versions
7+
8+
__all__ = (Signer, HeaderSigner, Verifier, HeaderVerifier)

httpsig/_version.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ def versions_from_vcs(tag_prefix, root, verbose=False):
132132
return {}
133133
if not stdout.startswith(tag_prefix):
134134
if verbose:
135-
print("tag '%s' doesn't start with prefix '%s'" % (stdout, tag_prefix))
135+
print("tag '%s' doesn't start with prefix '%s'" % (stdout, tag_prefix)) # noqa: E501
136136
return {}
137137
tag = stdout[len(tag_prefix):]
138138
stdout = run_command(GITS, ["rev-parse", "HEAD"], cwd=root)
@@ -150,7 +150,7 @@ def versions_from_parentdir(parentdir_prefix, root, verbose=False):
150150
dirname = os.path.basename(root)
151151
if not dirname.startswith(parentdir_prefix):
152152
if verbose:
153-
print("guessing rootdir is '%s', but '%s' doesn't start with prefix '%s'" %
153+
print("guessing rootdir is '%s', but '%s' doesn't start with prefix '%s'" % # noqa: E501
154154
(root, dirname, parentdir_prefix))
155155
return None
156156
return {"version": dirname[len(parentdir_prefix):], "full": ""}

httpsig/requests_auth.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111

1212
class HTTPSignatureAuth(requests.auth.AuthBase):
13-
'''
13+
"""
1414
Sign a request using the http-signature scheme.
1515
https://github.com/joyent/node-http-signature/blob/master/http_signing.md
1616
@@ -20,7 +20,7 @@ class HTTPSignatureAuth(requests.auth.AuthBase):
2020
`algorithm` is one of the six specified algorithms
2121
headers is a list of http headers to be included in the signing string,
2222
defaulting to "Date" alone.
23-
'''
23+
"""
2424
def __init__(self, key_id='', secret='', algorithm=None, headers=None):
2525
headers = headers or []
2626
self.header_signer = HeaderSigner(

httpsig/sign.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def _sign(self, data):
7474

7575

7676
class HeaderSigner(Signer):
77-
'''
77+
"""
7878
Generic object that will sign headers as a dictionary using the
7979
http-signature scheme.
8080
https://github.com/joyent/node-http-signature/blob/master/http_signing.md
@@ -86,7 +86,7 @@ class HeaderSigner(Signer):
8686
:arg algorithm: one of the six specified algorithms
8787
:arg headers: a list of http headers to be included in the signing
8888
string, defaulting to ['date'].
89-
'''
89+
"""
9090
def __init__(self, key_id, secret, algorithm=None, headers=None):
9191
if algorithm is None:
9292
algorithm = DEFAULT_SIGN_ALGORITHM

httpsig/tests/test_signature.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def test_default(self):
4444
self.assertIn('signature', params)
4545
self.assertEqual(params['keyId'], 'Test')
4646
self.assertEqual(params['algorithm'], 'rsa-sha256')
47-
self.assertEqual(params['signature'], 'jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9HpFQlG7N4YcJPteKTu4MWCLyk+gIr0wDgqtLWf9NLpMAMimdfsH7FSWGfbMFSrsVTHNTk0rK3usrfFnti1dxsM4jl0kYJCKTGI/UWkqiaxwNiKqGcdlEDrTcUhhsFsOIo8VhddmZTZ8w=')
47+
self.assertEqual(params['signature'], 'jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9HpFQlG7N4YcJPteKTu4MWCLyk+gIr0wDgqtLWf9NLpMAMimdfsH7FSWGfbMFSrsVTHNTk0rK3usrfFnti1dxsM4jl0kYJCKTGI/UWkqiaxwNiKqGcdlEDrTcUhhsFsOIo8VhddmZTZ8w=') # noqa: E501
4848

4949
def test_basic(self):
5050
hs = sign.HeaderSigner(key_id='Test', secret=self.key, headers=[
@@ -71,7 +71,7 @@ def test_basic(self):
7171
self.assertEqual(params['algorithm'], 'rsa-sha256')
7272
self.assertEqual(
7373
params['headers'], '(request-target) host date')
74-
self.assertEqual(params['signature'], 'HUxc9BS3P/kPhSmJo+0pQ4IsCo007vkv6bUm4Qehrx+B1Eo4Mq5/6KylET72ZpMUS80XvjlOPjKzxfeTQj4DiKbAzwJAb4HX3qX6obQTa00/qPDXlMepD2JtTw33yNnm/0xV7fQuvILN/ys+378Ysi082+4xBQFwvhNvSoVsGv4=')
74+
self.assertEqual(params['signature'], 'HUxc9BS3P/kPhSmJo+0pQ4IsCo007vkv6bUm4Qehrx+B1Eo4Mq5/6KylET72ZpMUS80XvjlOPjKzxfeTQj4DiKbAzwJAb4HX3qX6obQTa00/qPDXlMepD2JtTw33yNnm/0xV7fQuvILN/ys+378Ysi082+4xBQFwvhNvSoVsGv4=') # noqa: E501
7575

7676
def test_all(self):
7777
hs = sign.HeaderSigner(key_id='Test', secret=self.key, headers=[
@@ -105,4 +105,4 @@ def test_all(self):
105105
self.assertEqual(
106106
params['headers'],
107107
'(request-target) host date content-type digest content-length')
108-
self.assertEqual(params['signature'], 'Ef7MlxLXoBovhil3AlyjtBwAL9g4TN3tibLj7uuNB3CROat/9KaeQ4hW2NiJ+pZ6HQEOx9vYZAyi+7cmIkmJszJCut5kQLAwuX+Ms/mUFvpKlSo9StS2bMXDBNjOh4Auj774GFj4gwjS+3NhFeoqyr/MuN6HsEnkvn6zdgfE2i0=')
108+
self.assertEqual(params['signature'], 'Ef7MlxLXoBovhil3AlyjtBwAL9g4TN3tibLj7uuNB3CROat/9KaeQ4hW2NiJ+pZ6HQEOx9vYZAyi+7cmIkmJszJCut5kQLAwuX+Ms/mUFvpKlSo9StS2bMXDBNjOh4Auj774GFj4gwjS+3NhFeoqyr/MuN6HsEnkvn6zdgfE2i0=') # noqa: E501

httpsig/tests/test_verify.py

Lines changed: 52 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
from httpsig.sign import HeaderSigner, Signer
77
from httpsig.verify import HeaderVerifier, Verifier
88

9+
910
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
1011

1112

1213
class BaseTestCase(unittest.TestCase):
14+
1315
def _parse_auth(self, auth):
1416
"""Basic Authorization header parsing."""
1517
# split 'Signature kvpairs'
@@ -43,7 +45,8 @@ def setUp(self):
4345

4446
def test_basic_sign(self):
4547
signer = Signer(secret=self.sign_secret, algorithm=self.algorithm)
46-
verifier = Verifier(secret=self.verify_secret, algorithm=self.algorithm)
48+
verifier = Verifier(
49+
secret=self.verify_secret, algorithm=self.algorithm)
4750

4851
GOOD = b"this is a test"
4952
BAD = b"this is not the signature you were looking for..."
@@ -58,7 +61,8 @@ def test_default(self):
5861
'Date': self.header_date
5962
}
6063

61-
hs = HeaderSigner(key_id="Test", secret=self.sign_secret, algorithm=self.algorithm)
64+
hs = HeaderSigner(
65+
key_id="Test", secret=self.sign_secret, algorithm=self.algorithm)
6266
signed = hs.sign(unsigned)
6367
hv = HeaderVerifier(headers=signed, secret=self.verify_secret)
6468
self.assertTrue(hv.verify())
@@ -67,14 +71,18 @@ def test_signed_headers(self):
6771
HOST = self.header_host
6872
METHOD = self.test_method
6973
PATH = self.test_path
70-
hs = HeaderSigner(key_id="Test", secret=self.sign_secret, algorithm=self.algorithm, headers=[
71-
'(request-target)',
72-
'host',
73-
'date',
74-
'content-type',
75-
'digest',
76-
'content-length'
77-
])
74+
hs = HeaderSigner(
75+
key_id="Test",
76+
secret=self.sign_secret,
77+
algorithm=self.algorithm,
78+
headers=[
79+
'(request-target)',
80+
'host',
81+
'date',
82+
'content-type',
83+
'digest',
84+
'content-length'
85+
])
7886
unsigned = {
7987
'Host': HOST,
8088
'Date': self.header_date,
@@ -84,7 +92,9 @@ def test_signed_headers(self):
8492
}
8593
signed = hs.sign(unsigned, method=METHOD, path=PATH)
8694

87-
hv = HeaderVerifier(headers=signed, secret=self.verify_secret, host=HOST, method=METHOD, path=PATH)
95+
hv = HeaderVerifier(
96+
headers=signed, secret=self.verify_secret,
97+
host=HOST, method=METHOD, path=PATH)
8898
self.assertTrue(hv.verify())
8999

90100
def test_incorrect_headers(self):
@@ -110,23 +120,27 @@ def test_incorrect_headers(self):
110120
}
111121
signed = hs.sign(unsigned, method=METHOD, path=PATH)
112122

113-
hv = HeaderVerifier(headers=signed, secret=self.verify_secret, required_headers=["some-other-header"],
123+
hv = HeaderVerifier(headers=signed, secret=self.verify_secret,
124+
required_headers=["some-other-header"],
114125
host=HOST, method=METHOD, path=PATH)
115-
with self.assertRaises(Exception) as ex:
126+
with self.assertRaises(Exception):
116127
hv.verify()
117128

118129
def test_extra_auth_headers(self):
119130
HOST = "example.com"
120131
METHOD = "POST"
121132
PATH = '/foo?param=value&pet=dog'
122-
hs = HeaderSigner(key_id="Test", secret=self.sign_secret, algorithm=self.algorithm, headers=[
123-
'(request-target)',
124-
'host',
125-
'date',
126-
'content-type',
127-
'digest',
128-
'content-length'
129-
])
133+
hs = HeaderSigner(
134+
key_id="Test",
135+
secret=self.sign_secret,
136+
algorithm=self.algorithm, headers=[
137+
'(request-target)',
138+
'host',
139+
'date',
140+
'content-type',
141+
'digest',
142+
'content-length'
143+
])
130144
unsigned = {
131145
'Host': HOST,
132146
'Date': self.header_date,
@@ -135,30 +149,41 @@ def test_extra_auth_headers(self):
135149
'Content-Length': self.header_content_length,
136150
}
137151
signed = hs.sign(unsigned, method=METHOD, path=PATH)
138-
hv = HeaderVerifier(headers=signed, secret=self.verify_secret, method=METHOD, path=PATH,
139-
required_headers=['date', '(request-target)'])
152+
hv = HeaderVerifier(
153+
headers=signed,
154+
secret=self.verify_secret,
155+
method=METHOD,
156+
path=PATH,
157+
required_headers=['date', '(request-target)'])
140158
self.assertTrue(hv.verify())
141159

142160

143161
class TestVerifyHMACSHA256(TestVerifyHMACSHA1):
162+
144163
def setUp(self):
145164
super(TestVerifyHMACSHA256, self).setUp()
146165
self.algorithm = "hmac-sha256"
147166

148167

149168
class TestVerifyHMACSHA512(TestVerifyHMACSHA1):
169+
150170
def setUp(self):
151171
super(TestVerifyHMACSHA512, self).setUp()
152172
self.algorithm = "hmac-sha512"
153173

154174

155175
class TestVerifyRSASHA1(TestVerifyHMACSHA1):
176+
156177
def setUp(self):
157-
private_key_path = os.path.join(os.path.dirname(__file__), 'rsa_private.pem')
178+
private_key_path = os.path.join(
179+
os.path.dirname(__file__),
180+
'rsa_private.pem')
158181
with open(private_key_path, 'rb') as f:
159182
private_key = f.read()
160183

161-
public_key_path = os.path.join(os.path.dirname(__file__), 'rsa_public.pem')
184+
public_key_path = os.path.join(
185+
os.path.dirname(__file__),
186+
'rsa_public.pem')
162187
with open(public_key_path, 'rb') as f:
163188
public_key = f.read()
164189

@@ -169,12 +194,14 @@ def setUp(self):
169194

170195

171196
class TestVerifyRSASHA256(TestVerifyRSASHA1):
197+
172198
def setUp(self):
173199
super(TestVerifyRSASHA256, self).setUp()
174200
self.algorithm = "rsa-sha256"
175201

176202

177203
class TestVerifyRSASHA512(TestVerifyRSASHA1):
204+
178205
def setUp(self):
179206
super(TestVerifyRSASHA512, self).setUp()
180207
self.algorithm = "rsa-sha512"

httpsig/utils.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
import base64
2+
import six
13
import re
24
import struct
35
import hashlib
4-
import base64
5-
import six
66

77
try:
88
# Python 3
@@ -11,7 +11,6 @@
1111
# Python 2
1212
from urllib2 import parse_http_list
1313

14-
from Crypto.PublicKey import RSA
1514
from Crypto.Hash import SHA, SHA256, SHA512
1615

1716
ALGORITHMS = frozenset([
@@ -65,7 +64,8 @@ def generate_message(required_headers, headers, host=None, method=None,
6564
h = h.lower()
6665
if h == '(request-target)':
6766
if not method or not path:
68-
raise Exception('method and path arguments required when using "(request-target)"')
67+
raise Exception('method and path arguments required when ' +
68+
'using "(request-target)"')
6969
signable_list.append('%s: %s %s' % (h, method.lower(), path))
7070

7171
elif h == 'host':
@@ -76,11 +76,11 @@ def generate_message(required_headers, headers, host=None, method=None,
7676
if 'host' in headers:
7777
host = headers[h]
7878
else:
79-
raise Exception('missing required header "%s"' % (h))
79+
raise Exception('missing required header "%s"' % h)
8080
signable_list.append('%s: %s' % (h, host))
8181
else:
8282
if h not in headers:
83-
raise Exception('missing required header "%s"' % (h))
83+
raise Exception('missing required header "%s"' % h)
8484

8585
signable_list.append('%s: %s' % (h, headers[h]))
8686

@@ -94,7 +94,8 @@ def parse_authorization_header(header):
9494

9595
auth = header.split(" ", 1)
9696
if len(auth) > 2:
97-
raise ValueError('Invalid authorization header. (eg. Method key1=value1,key2="value, \"2\"")')
97+
raise ValueError('Invalid authorization header. (eg. Method ' +
98+
'key1=value1,key2="value, \"2\"")')
9899

99100
# Split up any args into a dictionary.
100101
values = {}
@@ -148,10 +149,10 @@ def build_signature_template(key_id, algorithm, headers):
148149
def lkv(d):
149150
parts = []
150151
while d:
151-
len = struct.unpack('>I', d[:4])[0]
152-
bits = d[4:len+4]
152+
length = struct.unpack('>I', d[:4])[0]
153+
bits = d[4:length+4]
153154
parts.append(bits)
154-
d = d[len+4:]
155+
d = d[length+4:]
155156
return parts
156157

157158

0 commit comments

Comments
 (0)