Skip to content

Commit e25dda2

Browse files
authored
Merge pull request #9408 from aws/lint-unsafe-botocore-s3transfer
Lint botocore and s3transfer with --unsafe-fixes
2 parents 8ffcfa7 + d612b03 commit e25dda2

File tree

153 files changed

+838
-1012
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

153 files changed

+838
-1012
lines changed

awscli/botocore/auth.py

+19-21
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ def calc_signature(self, request, params):
130130
path = split.path
131131
if len(path) == 0:
132132
path = '/'
133-
string_to_sign = '%s\n%s\n%s\n' % (request.method, split.netloc, path)
133+
string_to_sign = f'{request.method}\n{split.netloc}\n{path}\n'
134134
lhmac = hmac.new(
135135
self.credentials.secret_key.encode('utf-8'), digestmod=sha256
136136
)
@@ -199,8 +199,7 @@ def add_auth(self, request):
199199
new_hmac.update(request.headers['Date'].encode('utf-8'))
200200
encoded_signature = encodebytes(new_hmac.digest()).strip()
201201
signature = (
202-
'AWS3-HTTPS AWSAccessKeyId=%s,Algorithm=%s,Signature=%s'
203-
% (
202+
'AWS3-HTTPS AWSAccessKeyId={},Algorithm={},Signature={}'.format(
204203
self.credentials.access_key,
205204
'HmacSHA256',
206205
encoded_signature.decode('utf-8'),
@@ -271,7 +270,7 @@ def _canonical_query_string_params(self, params):
271270
# Sort by the URI-encoded key names, and in the case of
272271
# repeated keys, then sort by the value.
273272
for key, value in sorted(key_val_pairs):
274-
sorted_key_vals.append('%s=%s' % (key, value))
273+
sorted_key_vals.append(f'{key}={value}')
275274
canonical_query_string = '&'.join(sorted_key_vals)
276275
return canonical_query_string
277276

@@ -287,7 +286,7 @@ def _canonical_query_string_url(self, parts):
287286
# Sort by the URI-encoded key names, and in the case of
288287
# repeated keys, then sort by the value.
289288
for key, value in sorted(key_val_pairs):
290-
sorted_key_vals.append('%s=%s' % (key, value))
289+
sorted_key_vals.append(f'{key}={value}')
291290
canonical_query_string = '&'.join(sorted_key_vals)
292291
return canonical_query_string
293292

@@ -304,7 +303,7 @@ def canonical_headers(self, headers_to_sign):
304303
value = ','.join(
305304
self._header_value(v) for v in headers_to_sign.get_all(key)
306305
)
307-
headers.append('%s:%s' % (key, ensure_unicode(value)))
306+
headers.append(f'{key}:{ensure_unicode(value)}')
308307
return '\n'.join(headers)
309308

310309
def _header_value(self, value):
@@ -316,9 +315,8 @@ def _header_value(self, value):
316315
return ' '.join(value.split())
317316

318317
def signed_headers(self, headers_to_sign):
319-
l = ['%s' % n.lower().strip() for n in set(headers_to_sign)]
320-
l = sorted(l)
321-
return ';'.join(l)
318+
headers = sorted(n.lower().strip() for n in set(headers_to_sign))
319+
return ';'.join(headers)
322320

323321
def _is_streaming_checksum_payload(self, request):
324322
checksum_context = request.context.get('checksum', {})
@@ -437,11 +435,13 @@ def add_auth(self, request):
437435
self._inject_signature_to_request(request, signature)
438436

439437
def _inject_signature_to_request(self, request, signature):
440-
l = ['AWS4-HMAC-SHA256 Credential=%s' % self.scope(request)]
438+
auth_str = [f'AWS4-HMAC-SHA256 Credential={self.scope(request)}']
441439
headers_to_sign = self.headers_to_sign(request)
442-
l.append('SignedHeaders=%s' % self.signed_headers(headers_to_sign))
443-
l.append('Signature=%s' % signature)
444-
request.headers['Authorization'] = ', '.join(l)
440+
auth_str.append(
441+
f"SignedHeaders={self.signed_headers(headers_to_sign)}"
442+
)
443+
auth_str.append(f'Signature={signature}')
444+
request.headers['Authorization'] = ', '.join(auth_str)
445445
return request
446446

447447
def _modify_request_before_signing(self, request):
@@ -480,7 +480,7 @@ def _set_necessary_date_headers(self, request):
480480

481481
class S3SigV4Auth(SigV4Auth):
482482
def _modify_request_before_signing(self, request):
483-
super(S3SigV4Auth, self)._modify_request_before_signing(request)
483+
super()._modify_request_before_signing(request)
484484
if 'X-Amz-Content-SHA256' in request.headers:
485485
del request.headers['X-Amz-Content-SHA256']
486486

@@ -525,7 +525,7 @@ def _should_sha256_sign_payload(self, request):
525525

526526
# If the S3-specific checks had no results, delegate to the generic
527527
# checks.
528-
return super(S3SigV4Auth, self)._should_sha256_sign_payload(request)
528+
return super()._should_sha256_sign_payload(request)
529529

530530
def _normalize_url_path(self, path):
531531
# For S3, we do not normalize the path.
@@ -688,7 +688,7 @@ def _inject_signature_to_request(self, request, signature):
688688
# Rather than calculating an "Authorization" header, for the query
689689
# param quth, we just append an 'X-Amz-Signature' param to the end
690690
# of the query string.
691-
request.url += '&X-Amz-Signature=%s' % signature
691+
request.url += f'&X-Amz-Signature={signature}'
692692

693693
def _normalize_url_path(self, path):
694694
# For S3, we do not normalize the path.
@@ -708,9 +708,7 @@ class SigV4QueryAuth(SigV4Auth):
708708
def __init__(
709709
self, credentials, service_name, region_name, expires=DEFAULT_EXPIRES
710710
):
711-
super(SigV4QueryAuth, self).__init__(
712-
credentials, service_name, region_name
713-
)
711+
super().__init__(credentials, service_name, region_name)
714712
self._expires = expires
715713

716714
def _modify_request_before_signing(self, request):
@@ -784,7 +782,7 @@ def _inject_signature_to_request(self, request, signature):
784782
# Rather than calculating an "Authorization" header, for the query
785783
# param quth, we just append an 'X-Amz-Signature' param to the end
786784
# of the query string.
787-
request.url += '&X-Amz-Signature=%s' % signature
785+
request.url += f'&X-Amz-Signature={signature}'
788786

789787

790788
class S3SigV4QueryAuth(SigV4QueryAuth):
@@ -881,7 +879,7 @@ def add_auth(self, request):
881879
# the botocore.crt.auth module imports functions/classes defined above from
882880
# this module. In the future, we should isolate those functions/classes into
883881
# a separate utility module to avoid any potential circular import.
884-
import botocore.crt.auth
882+
import botocore.crt.auth # noqa
885883

886884

887885
def resolve_auth_type(auth_trait):

awscli/botocore/awsrequest.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class AWSConnection:
6464
"""
6565

6666
def __init__(self, *args, **kwargs):
67-
super(AWSConnection, self).__init__(*args, **kwargs)
67+
super().__init__(*args, **kwargs)
6868
self._original_response_cls = self.response_class
6969
# We'd ideally hook into httplib's states, but they're all
7070
# __mangled_vars so we use our own state var. This variable is set
@@ -78,7 +78,7 @@ def __init__(self, *args, **kwargs):
7878
self._expect_header_set = False
7979

8080
def close(self):
81-
super(AWSConnection, self).close()
81+
super().close()
8282
# Reset all of our instance state we were tracking.
8383
self._response_received = False
8484
self._expect_header_set = False
@@ -91,7 +91,7 @@ def _send_request(self, method, url, body, headers, *args, **kwargs):
9191
else:
9292
self._expect_header_set = False
9393
self.response_class = self._original_response_cls
94-
rval = super(AWSConnection, self)._send_request(
94+
rval = super()._send_request(
9595
method, url, body, headers, *args, **kwargs
9696
)
9797
self._expect_header_set = False
@@ -215,7 +215,7 @@ def send(self, str):
215215
"Not sending data."
216216
)
217217
return
218-
return super(AWSConnection, self).send(str)
218+
return super().send(str)
219219

220220
def _is_100_continue_status(self, maybe_status_line):
221221
parts = maybe_status_line.split(None, 2)
@@ -275,9 +275,9 @@ def prepare_request_dict(
275275
percent_encode_sequence = botocore.utils.percent_encode_sequence
276276
encoded_query_string = percent_encode_sequence(r['query_string'])
277277
if '?' not in url:
278-
url += '?%s' % encoded_query_string
278+
url += f'?{encoded_query_string}'
279279
else:
280-
url += '&%s' % encoded_query_string
280+
url += f'&{encoded_query_string}'
281281
r['url'] = url
282282
r['context'] = context
283283
if context is None:
@@ -371,7 +371,7 @@ def _prepare_url(self, original):
371371
url = original.url
372372
if original.params:
373373
params = urlencode(list(original.params.items()), doseq=True)
374-
url = '%s?%s' % (url, params)
374+
url = f'{url}?{params}'
375375
return url
376376

377377
def _prepare_headers(self, original, prepared_body=None):

awscli/botocore/client.py

+12-19
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ def _create_client_class(self, service_name, service_model):
190190
bases = [BaseClient]
191191
service_id = service_model.service_id.hyphenize()
192192
self._event_emitter.emit(
193-
'creating-client-class.%s' % service_id,
193+
f'creating-client-class.{service_id}',
194194
class_attributes=class_attributes,
195195
base_classes=bases,
196196
)
@@ -214,10 +214,9 @@ def _normalize_fips_region(self, region_name, client_config):
214214
else:
215215
client_config = config_use_fips_endpoint
216216
logger.warning(
217-
'transforming region from %s to %s and setting '
217+
f'transforming region from {region_name} to {normalized_region_name} and setting '
218218
'use_fips_endpoint to true. client should not '
219219
'be configured with a fips psuedo region.'
220-
% (region_name, normalized_region_name)
221220
)
222221
region_name = normalized_region_name
223222
return region_name, client_config
@@ -399,7 +398,7 @@ def _api_call(self, *args, **kwargs):
399398
# 1 argument.
400399
if args:
401400
raise TypeError(
402-
"%s() only accepts keyword arguments." % py_operation_name
401+
f"{py_operation_name}() only accepts keyword arguments."
403402
)
404403
# The "self" in this scope is referring to the BaseClient.
405404
return self._make_api_call(operation_name, kwargs)
@@ -413,7 +412,7 @@ def _api_call(self, *args, **kwargs):
413412
method_name=operation_name,
414413
event_emitter=self._event_emitter,
415414
method_description=operation_model.documentation,
416-
example_prefix='response = client.%s' % py_operation_name,
415+
example_prefix=f'response = client.{py_operation_name}',
417416
include_signature=False,
418417
)
419418
_api_call.__doc__ = docstring
@@ -626,7 +625,7 @@ def _make_url(self, hostname, is_secure, supported_protocols):
626625
scheme = 'https'
627626
else:
628627
scheme = 'http'
629-
return '%s://%s' % (scheme, hostname)
628+
return f'{scheme}://{hostname}'
630629

631630
def _resolve_signing_name(self, service_name, resolved):
632631
# CredentialScope overrides everything else.
@@ -748,9 +747,8 @@ def __init__(
748747
self._register_handlers()
749748

750749
def __getattr__(self, item):
751-
event_name = 'getattr.%s.%s' % (
752-
self._service_model.service_id.hyphenize(),
753-
item,
750+
event_name = (
751+
f'getattr.{self._service_model.service_id.hyphenize()}.{item}'
754752
)
755753
handler, event_response = self.meta.events.emit_until_response(
756754
event_name, client=self
@@ -760,15 +758,14 @@ def __getattr__(self, item):
760758
return event_response
761759

762760
raise AttributeError(
763-
"'%s' object has no attribute '%s'"
764-
% (self.__class__.__name__, item)
761+
f"'{self.__class__.__name__}' object has no attribute '{item}'"
765762
)
766763

767764
def _register_handlers(self):
768765
# Register the handler required to sign requests.
769766
service_id = self.meta.service_model.service_id.hyphenize()
770767
self.meta.events.register(
771-
'request-created.%s' % service_id, self._request_signer.handler
768+
f'request-created.{service_id}', self._request_signer.handler
772769
)
773770
# Rebuild user agent string right before request is sent
774771
# to ensure all registered features are included.
@@ -1029,11 +1026,7 @@ def paginate(self, **kwargs):
10291026

10301027
# Rename the paginator class based on the type of paginator.
10311028
paginator_class_name = str(
1032-
'%s.Paginator.%s'
1033-
% (
1034-
get_service_module_name(self.meta.service_model),
1035-
actual_operation_name,
1036-
)
1029+
f'{get_service_module_name(self.meta.service_model)}.Paginator.{actual_operation_name}'
10371030
)
10381031

10391032
# Create the new paginator class
@@ -1100,13 +1093,13 @@ def get_waiter(self, waiter_name):
11001093
"""
11011094
config = self._get_waiter_config()
11021095
if not config:
1103-
raise ValueError("Waiter does not exist: %s" % waiter_name)
1096+
raise ValueError(f"Waiter does not exist: {waiter_name}")
11041097
model = waiter.WaiterModel(config)
11051098
mapping = {}
11061099
for name in model.waiter_names:
11071100
mapping[xform_name(name)] = name
11081101
if waiter_name not in mapping:
1109-
raise ValueError("Waiter does not exist: %s" % waiter_name)
1102+
raise ValueError(f"Waiter does not exist: {waiter_name}")
11101103

11111104
return waiter.create_waiter_with_client(
11121105
mapping[waiter_name], model, self

awscli/botocore/config.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -336,14 +336,13 @@ def _record_user_provided_options(self, args, kwargs):
336336
user_provided_options[key] = value
337337
# The key must exist in the available options
338338
else:
339-
raise TypeError('Got unexpected keyword argument \'%s\'' % key)
339+
raise TypeError(f'Got unexpected keyword argument \'{key}\'')
340340

341341
# The number of args should not be longer than the allowed
342342
# options
343343
if len(args) > len(option_order):
344344
raise TypeError(
345-
'Takes at most %s arguments (%s given)'
346-
% (len(option_order), len(args))
345+
f'Takes at most {len(option_order)} arguments ({len(args)} given)'
347346
)
348347

349348
# Iterate through the args passed through to the constructor and map
@@ -352,8 +351,7 @@ def _record_user_provided_options(self, args, kwargs):
352351
# If it a kwarg was specified for the arg, then error out
353352
if option_order[i] in user_provided_options:
354353
raise TypeError(
355-
'Got multiple values for keyword argument \'%s\''
356-
% (option_order[i])
354+
f'Got multiple values for keyword argument \'{option_order[i]}\''
357355
)
358356
user_provided_options[option_order[i]] = arg
359357

awscli/botocore/configprovider.py

+7-18
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ def _convert_type(self, value):
560560
return value
561561

562562
def __repr__(self):
563-
return '[%s]' % ', '.join([str(p) for p in self._providers])
563+
return '[{}]'.format(', '.join([str(p) for p in self._providers]))
564564

565565

566566
class InstanceVarProvider(BaseProvider):
@@ -586,10 +586,7 @@ def provide(self):
586586
return value
587587

588588
def __repr__(self):
589-
return 'InstanceVarProvider(instance_var=%s, session=%s)' % (
590-
self._instance_var,
591-
self._session,
592-
)
589+
return f'InstanceVarProvider(instance_var={self._instance_var}, session={self._session})'
593590

594591

595592
class ScopedConfigProvider(BaseProvider):
@@ -620,10 +617,7 @@ def provide(self):
620617
return scoped_config.get(self._config_var_name)
621618

622619
def __repr__(self):
623-
return 'ScopedConfigProvider(config_var_name=%s, session=%s)' % (
624-
self._config_var_name,
625-
self._session,
626-
)
620+
return f'ScopedConfigProvider(config_var_name={self._config_var_name}, session={self._session})'
627621

628622

629623
class EnvironmentProvider(BaseProvider):
@@ -648,7 +642,7 @@ def provide(self):
648642
return None
649643

650644
def __repr__(self):
651-
return 'EnvironmentProvider(name=%s, env=%s)' % (self._name, self._env)
645+
return f'EnvironmentProvider(name={self._name}, env={self._env})'
652646

653647

654648
class SectionConfigProvider(BaseProvider):
@@ -688,13 +682,8 @@ def provide(self):
688682

689683
def __repr__(self):
690684
return (
691-
'SectionConfigProvider(section_name=%s, '
692-
'session=%s, override_providers=%s)'
693-
% (
694-
self._section_name,
695-
self._session,
696-
self._override_providers,
697-
)
685+
f'SectionConfigProvider(section_name={self._section_name}, '
686+
f'session={self._session}, override_providers={self._override_providers})'
698687
)
699688

700689

@@ -709,7 +698,7 @@ def provide(self):
709698
return self._value
710699

711700
def __repr__(self):
712-
return 'ConstantProvider(value=%s)' % self._value
701+
return f'ConstantProvider(value={self._value})'
713702

714703

715704
class ConfiguredEndpointProvider(BaseProvider):

0 commit comments

Comments
 (0)