Skip to content

Commit 825ce9f

Browse files
committed
rm: escape_early_upper and internal refactoring
1 parent 080f773 commit 825ce9f

File tree

4 files changed

+56
-98
lines changed

4 files changed

+56
-98
lines changed

README.rst

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,7 @@ Usage
106106
107107
AuthToken(token_type=None, token_name='__token__', key=None, algorithm='sha256',
108108
salt=None, start_time=None, end_time=None, window_seconds=None,
109-
field_delimiter='~', acl_delimiter='!', escape_early=False,
110-
escape_early_upper=False, verbose=False)
109+
field_delimiter='~', acl_delimiter='!', escape_early=False, verbose=False)
111110
112111
#
113112

@@ -125,7 +124,6 @@ Usage
125124
field_delimiter Character used to delimit token body fields. [Default: ~]
126125
acl_delimiter Character used to delimit acl fields. [Default: !]
127126
escape_early Causes strings to be 'url' encoded before being used.
128-
escape_early_upper Causes strings to be 'url' encoded before being used.
129127
verbose Print all parameters.
130128
==================== ===================================================================================================
131129

akamai/authtoken/authtoken.py

Lines changed: 53 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def __init__(self, token_type=None, token_name='__token__',
5050
key=None, algorithm='sha256', salt=None,
5151
start_time=None, end_time=None, window_seconds=None,
5252
field_delimiter='~', acl_delimiter='!',
53-
escape_early=False, escape_early_upper=False, verbose=False):
53+
escape_early=False, verbose=False):
5454

5555
self.token_type = token_type
5656
self.token_name = token_name
@@ -66,31 +66,27 @@ def __init__(self, token_type=None, token_name='__token__',
6666
self.field_delimiter = field_delimiter
6767
self.acl_delimiter = acl_delimiter
6868
self.escape_early = escape_early
69-
self.escape_early_upper = escape_early_upper
7069
self.verbose = verbose
7170

72-
def escapeEarly(self, text):
73-
if self.escape_early or self.escape_early_upper:
74-
# Only escape the text if we are configured for escape early.
75-
new_text = quote_plus(text)
76-
if self.escape_early_upper:
77-
def toUpper(match):
78-
return match.group(1).upper()
79-
return re.sub(r'(%..)', toUpper, new_text)
80-
else:
81-
def toLower(match):
82-
return match.group(1).lower()
83-
return re.sub(r'(%..)', toLower, new_text)
84-
85-
# Return the original, unmodified text.
86-
return text
71+
def _escapeEarly(self, text):
72+
if self.escape_early:
73+
def toLower(match):
74+
return match.group(1).lower()
75+
return re.sub(r'(%..)', toLower, quote_plus(text))
76+
else:
77+
return text
8778

88-
def _generateToken(self, url=None, acl=None,
89-
window_seconds=None, start_time=None, end_time=None,
79+
def generateToken(self, url=None, acl=None, start_time=None,
80+
end_time=None, window_seconds=None,
9081
ip=None, payload=None, session_id=None):
82+
if not start_time:
83+
start_time = self.start_time
84+
if not end_time:
85+
end_time = self.end_time
86+
if not window_seconds:
87+
window_seconds = self.window_seconds
88+
9189
if str(start_time).lower() == 'now':
92-
# Initialize the start time if we are asked for a starting time of
93-
# now.
9490
start_time = int(time.mktime(time.gmtime()))
9591
elif start_time is not None:
9692
try:
@@ -113,7 +109,7 @@ def _generateToken(self, url=None, acl=None,
113109
if end_time is None:
114110
if int(window_seconds or 0) > 0:
115111
if start_time is None:
116-
# If we have a window window without a start time,
112+
# If we have a window_seconds without a start time,
117113
# calculate the end time starting from the current time.
118114
end_time = int(time.mktime(time.gmtime())) + \
119115
window_seconds
@@ -123,21 +119,11 @@ def _generateToken(self, url=None, acl=None,
123119
raise AuthTokenError('You must provide an expiration time or '
124120
'a duration window..')
125121

126-
try:
127-
if end_time < start_time:
128-
raise AuthTokenError('Token will have already expired.')
129-
except TypeError:
130-
pass
122+
if start_time and (end_time < start_time):
123+
raise AuthTokenError('Token will have already expired.')
131124

132-
if ((acl is None and url is None) or
133-
acl is not None and url is not None and
134-
(len(acl) <= 0) and (len(url) <= 0)):
135-
raise AuthTokenError('You must provide a URL or an ACL.')
136-
137-
if (acl is not None and url is not None and
138-
(len(acl) > 0) and (len(url) > 0)):
139-
raise AuthTokenError('You must provide a URL OR an ACL, '
140-
'not both.')
125+
if (not acl and not url) or (acl and url):
126+
raise AuthTokenError('You must provide a URL or an ACL')
141127

142128
if self.verbose:
143129
print('''
@@ -159,77 +145,56 @@ def _generateToken(self, url=None, acl=None,
159145
ACL Delimiter : {6}
160146
Escape Early : {7}
161147
Generating token...'''.format(self.token_type if self.token_type else '', #0
162-
self.token_name if self.token_name else '', #1
163-
self.key if self.key else '', #2
164-
self.algorithm if self.algorithm else '', #3
165-
self.salt if self.salt else '', #4
166-
self.field_delimiter if self.field_delimiter else '', #5
167-
self.acl_delimiter if self.acl_delimiter else '', #6
168-
self.escape_early if self.escape_early else '', #7
169-
start_time if start_time else '', #8
170-
end_time if end_time else '', #9
171-
window_seconds if window_seconds else '', #10
172-
ip if ip else '', #11
173-
url if url else '', #12
174-
acl if acl else '', #13
175-
payload if payload else '', #14
176-
session_id if session_id else '')) #15
177-
178-
hash_source = ''
179-
new_token = ''
148+
self.token_name if self.token_name else '', #1
149+
self.key if self.key else '', #2
150+
self.algorithm if self.algorithm else '', #3
151+
self.salt if self.salt else '', #4
152+
self.field_delimiter if self.field_delimiter else '', #5
153+
self.acl_delimiter if self.acl_delimiter else '', #6
154+
self.escape_early if self.escape_early else '', #7
155+
start_time if start_time else '', #8
156+
end_time if end_time else '', #9
157+
window_seconds if window_seconds else '', #10
158+
ip if ip else '', #11
159+
url if url else '', #12
160+
acl if acl else '', #13
161+
payload if payload else '', #14
162+
session_id if session_id else '')) #15
163+
164+
hash_source = []
165+
new_token = []
180166

181167
if ip:
182-
new_token += 'ip={0}{1}'.format(self.escapeEarly(ip),
183-
self.field_delimiter)
168+
new_token.append('ip={0}'.format(self._escapeEarly(ip)))
184169

185-
if start_time is not None:
186-
new_token += 'st={0}{1}'.format(start_time, self.field_delimiter)
170+
if start_time:
171+
new_token.append('st={0}'.format(start_time))
187172

188-
new_token += 'exp={0}{1}'.format(end_time, self.field_delimiter)
173+
new_token.append('exp={0}'.format(end_time))
189174

190175
if acl:
191-
new_token += 'acl={0}{1}'.format(acl, self.field_delimiter)
176+
new_token.append('acl={0}'.format(acl))
192177

193178
if session_id:
194-
new_token += 'id={0}{1}'.format(self.escapeEarly(session_id), self.field_delimiter)
179+
new_token.append('id={0}'.format(self._escapeEarly(session_id)))
195180

196181
if payload:
197-
new_token += 'data={0}{1}'.format(self.escapeEarly(payload), self.field_delimiter)
182+
new_token.append('data={0}'.format(self._escapeEarly(payload)))
198183

199-
hash_source += new_token
184+
hash_source = list(new_token)
200185
if url and not acl:
201-
hash_source += 'url={0}{1}'.format(self.escapeEarly(url), self.field_delimiter)
186+
hash_source.append('url={0}'.format(self._escapeEarly(url)))
202187

203188
if self.salt:
204-
hash_source += 'salt={0}{1}'.format(self.salt, self.field_delimiter)
189+
hash_source.append('salt={0}'.format(self.salt))
205190

206191
if self.algorithm.lower() not in ('sha256', 'sha1', 'md5'):
207192
raise AuthTokenError('Unknown algorithm')
208193

209194
token_hmac = hmac.new(
210195
binascii.a2b_hex(self.key.encode()),
211-
hash_source.rstrip(self.field_delimiter).encode(),
196+
self.field_delimiter.join(hash_source).encode(),
212197
getattr(hashlib, self.algorithm.lower())).hexdigest()
213-
new_token += 'hmac={0}'.format(token_hmac)
214-
215-
return new_token
216-
217-
def generateToken(self, url=None, acl=None, start_time=None, end_time=None, window_seconds=None,
218-
ip=None, payload=None, session_id=None):
219-
if not start_time:
220-
start_time = self.start_time
221-
222-
if not end_time:
223-
end_time = self.end_time
224-
225-
if not window_seconds:
226-
window_seconds = self.window_seconds
198+
new_token.append('hmac={0}'.format(token_hmac))
227199

228-
return self._generateToken(url=url,
229-
acl=acl,
230-
start_time=start_time,
231-
end_time=end_time,
232-
window_seconds=window_seconds,
233-
ip=ip,
234-
payload=payload,
235-
session_id=session_id)
200+
return self.field_delimiter.join(new_token)

cms_authtoken.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@
5252
'-x', '--escape_early',
5353
action='store_true', default=False, dest='escape_early',
5454
help='Causes strings to be url encoded before being used.')
55-
parser.add_option(
56-
'-X', '--escape_early_upper',
57-
action='store_true', default=False, dest='escape_early_upper',
58-
help='Causes strings to be url encoded before being used.')
5955
parser.add_option(
6056
'-v', '--verbose',
6157
action='store_true', default=False, dest='verbose',
@@ -94,7 +90,6 @@
9490
field_delimiter=options.field_delimiter,
9591
acl_delimiter=options.acl_delimiter,
9692
escape_early=options.escape_early,
97-
escape_early_upper=options.escape_early_upper,
9893
verbose=options.verbose)
9994
token = generator.generateToken(url=options.url,
10095
acl=options.access_list,

test/test_authtoken.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import requests
3232

3333

34-
3534
if 'TEST_MODE' in os.environ and os.environ['TEST_MODE'] == 'LOCAL':
3635
# export TEST_MODE=LOCAL
3736
import secrets
@@ -47,11 +46,12 @@
4746

4847
DEFAULT_WINDOW_SECONDS = 500
4948

49+
5050
class TestAuthToken(unittest.TestCase):
5151

5252
def setUp(self):
5353
# Test for Query String
54-
self.at = AuthToken(key=AT_ENCRYPTION_KEY, window_seconds=DEFAULT_WINDOW_SECONDS)
54+
self.at = AuthToken(**{'key': AT_ENCRYPTION_KEY, 'window_seconds': DEFAULT_WINDOW_SECONDS})
5555

5656
# Test for Cookie
5757
self.cat = AuthToken(key=AT_ENCRYPTION_KEY, algorithm='sha1', window_seconds=DEFAULT_WINDOW_SECONDS)

0 commit comments

Comments
 (0)