Skip to content

Commit 21553c2

Browse files
committed
Allow arbitrarily encoded files to be checked with detect-aws-credentials
1 parent c7d0d3c commit 21553c2

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

pre_commit_hooks/detect_aws_credentials.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def get_aws_secrets_from_file(credentials_file: str) -> Set[str]:
6969

7070
def check_file_for_aws_keys(
7171
filenames: Sequence[str],
72-
keys: Set[str],
72+
keys: Set[bytes],
7373
) -> List[BadFile]:
7474
"""Check if files contain AWS secrets.
7575
@@ -79,13 +79,14 @@ def check_file_for_aws_keys(
7979
bad_files = []
8080

8181
for filename in filenames:
82-
with open(filename, 'r') as content:
82+
with open(filename, 'rb') as content:
8383
text_body = content.read()
8484
for key in keys:
8585
# naively match the entire file, low chance of incorrect
8686
# collision
8787
if key in text_body:
88-
bad_files.append(BadFile(filename, key[:4].ljust(28, '*')))
88+
key_hidden = key.decode()[:4].ljust(28, '*')
89+
bad_files.append(BadFile(filename, key_hidden))
8990
return bad_files
9091

9192

@@ -137,7 +138,8 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
137138
)
138139
return 2
139140

140-
bad_filenames = check_file_for_aws_keys(args.filenames, keys)
141+
keys_b = {key.encode() for key in keys}
142+
bad_filenames = check_file_for_aws_keys(args.filenames, keys_b)
141143
if bad_filenames:
142144
for bad_file in bad_filenames:
143145
print(f'AWS secret found in {bad_file.filename}: {bad_file.key}')

tests/detect_aws_credentials_test.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,19 @@ def test_detect_aws_credentials(filename, expected_retval):
117117
assert ret == expected_retval
118118

119119

120+
def test_allows_arbitrarily_encoded_files(tmpdir):
121+
src_ini = tmpdir.join('src.ini')
122+
src_ini.write(
123+
'[default]\n'
124+
'aws_access_key_id=AKIASDFASDF\n'
125+
'aws_secret_Access_key=9018asdf23908190238123\n',
126+
)
127+
arbitrary_encoding = tmpdir.join('f')
128+
arbitrary_encoding.write_binary(b'\x12\x9a\xe2\xf2')
129+
ret = main((str(arbitrary_encoding), '--credentials-file', str(src_ini)))
130+
assert ret == 0
131+
132+
120133
@patch('pre_commit_hooks.detect_aws_credentials.get_aws_secrets_from_file')
121134
@patch('pre_commit_hooks.detect_aws_credentials.get_aws_secrets_from_env')
122135
def test_non_existent_credentials(mock_secrets_env, mock_secrets_file, capsys):

0 commit comments

Comments
 (0)