blob: 4f00744e25aab367521efcfe3a708d26e8ca60ff [file] [log] [blame]
Anthony Sottilea7f73432020-02-29 20:34:45 -08001from unittest.mock import patch
2
Ara Hayrabedian02e8bdc2015-06-12 19:20:56 +04003import pytest
4
Anthony Sottile45756522019-02-11 19:56:15 -08005from pre_commit_hooks.detect_aws_credentials import get_aws_cred_files_from_env
Daniel Roschkab0d4cdb2016-12-30 08:41:24 +01006from pre_commit_hooks.detect_aws_credentials import get_aws_secrets_from_env
7from pre_commit_hooks.detect_aws_credentials import get_aws_secrets_from_file
Ara Hayrabedian02e8bdc2015-06-12 19:20:56 +04008from pre_commit_hooks.detect_aws_credentials import main
9from testing.util import get_resource_path
10
11
Daniel Roschka3939aee2017-01-03 19:05:49 +010012@pytest.mark.parametrize(
13 ('env_vars', 'values'),
14 (
15 ({}, set()),
16 ({'AWS_DUMMY_KEY': '/foo'}, set()),
17 ({'AWS_CONFIG_FILE': '/foo'}, {'/foo'}),
18 ({'AWS_CREDENTIAL_FILE': '/foo'}, {'/foo'}),
19 ({'AWS_SHARED_CREDENTIALS_FILE': '/foo'}, {'/foo'}),
20 ({'BOTO_CONFIG': '/foo'}, {'/foo'}),
21 ({'AWS_DUMMY_KEY': '/foo', 'AWS_CONFIG_FILE': '/bar'}, {'/bar'}),
22 (
23 {
24 'AWS_DUMMY_KEY': '/foo', 'AWS_CONFIG_FILE': '/bar',
Anthony Sottile2a902e02017-07-12 18:35:24 -070025 'AWS_CREDENTIAL_FILE': '/baz',
Daniel Roschka3939aee2017-01-03 19:05:49 +010026 },
Anthony Sottileb281d872017-07-17 17:41:44 -070027 {'/bar', '/baz'},
Daniel Roschka3939aee2017-01-03 19:05:49 +010028 ),
29 (
30 {
31 'AWS_CONFIG_FILE': '/foo', 'AWS_CREDENTIAL_FILE': '/bar',
Anthony Sottile2a902e02017-07-12 18:35:24 -070032 'AWS_SHARED_CREDENTIALS_FILE': '/baz',
Daniel Roschka3939aee2017-01-03 19:05:49 +010033 },
Anthony Sottileb281d872017-07-17 17:41:44 -070034 {'/foo', '/bar', '/baz'},
Daniel Roschka3939aee2017-01-03 19:05:49 +010035 ),
36 ),
37)
38def test_get_aws_credentials_file_from_env(env_vars, values):
Daniel Roschka3939aee2017-01-03 19:05:49 +010039 with patch.dict('os.environ', env_vars, clear=True):
Anthony Sottile45756522019-02-11 19:56:15 -080040 assert get_aws_cred_files_from_env() == values
Daniel Roschkab0d4cdb2016-12-30 08:41:24 +010041
42
Daniel Roschka3939aee2017-01-03 19:05:49 +010043@pytest.mark.parametrize(
44 ('env_vars', 'values'),
45 (
46 ({}, set()),
47 ({'AWS_DUMMY_KEY': 'foo'}, set()),
48 ({'AWS_SECRET_ACCESS_KEY': 'foo'}, {'foo'}),
49 ({'AWS_SECURITY_TOKEN': 'foo'}, {'foo'}),
50 ({'AWS_SESSION_TOKEN': 'foo'}, {'foo'}),
Alexander Demin75d48322020-02-13 12:01:38 +000051 ({'AWS_SESSION_TOKEN': ''}, set()),
52 ({'AWS_SESSION_TOKEN': 'foo', 'AWS_SECURITY_TOKEN': ''}, {'foo'}),
Daniel Roschka3939aee2017-01-03 19:05:49 +010053 ({'AWS_DUMMY_KEY': 'foo', 'AWS_SECRET_ACCESS_KEY': 'bar'}, {'bar'}),
54 (
55 {'AWS_SECRET_ACCESS_KEY': 'foo', 'AWS_SECURITY_TOKEN': 'bar'},
Anthony Sottile2a902e02017-07-12 18:35:24 -070056 {'foo', 'bar'},
Daniel Roschka3939aee2017-01-03 19:05:49 +010057 ),
58 ),
59)
60def test_get_aws_secrets_from_env(env_vars, values):
Daniel Roschkab0d4cdb2016-12-30 08:41:24 +010061 """Test that reading secrets from environment variables works."""
Daniel Roschka3939aee2017-01-03 19:05:49 +010062 with patch.dict('os.environ', env_vars, clear=True):
63 assert get_aws_secrets_from_env() == values
Daniel Roschkab0d4cdb2016-12-30 08:41:24 +010064
65
Daniel Roschka3939aee2017-01-03 19:05:49 +010066@pytest.mark.parametrize(
67 ('filename', 'expected_keys'),
68 (
69 (
70 'aws_config_with_secret.ini',
Anthony Sottile2a902e02017-07-12 18:35:24 -070071 {'z2rpgs5uit782eapz5l1z0y2lurtsyyk6hcfozlb'},
Daniel Roschka3939aee2017-01-03 19:05:49 +010072 ),
73 ('aws_config_with_session_token.ini', {'foo'}),
Anthony Sottilee9aea742017-07-15 12:56:51 -070074 (
75 'aws_config_with_secret_and_session_token.ini',
76 {'z2rpgs5uit782eapz5l1z0y2lurtsyyk6hcfozlb', 'foo'},
77 ),
Daniel Roschka3939aee2017-01-03 19:05:49 +010078 (
79 'aws_config_with_multiple_sections.ini',
80 {
81 '7xebzorgm5143ouge9gvepxb2z70bsb2rtrh099e',
82 'z2rpgs5uit782eapz5l1z0y2lurtsyyk6hcfozlb',
83 'ixswosj8gz3wuik405jl9k3vdajsnxfhnpui38ez',
Anthony Sottile2a902e02017-07-12 18:35:24 -070084 'foo',
85 },
Daniel Roschka3939aee2017-01-03 19:05:49 +010086 ),
87 ('aws_config_without_secrets.ini', set()),
Pablo Vega7c631b32018-01-26 15:19:01 -080088 ('aws_config_without_secrets_with_spaces.ini', set()),
Daniel Roschka3939aee2017-01-03 19:05:49 +010089 ('nonsense.txt', set()),
90 ('ok_json.json', set()),
91 ),
92)
Daniel Roschkab0d4cdb2016-12-30 08:41:24 +010093def test_get_aws_secrets_from_file(filename, expected_keys):
94 """Test that reading secrets from files works."""
95 keys = get_aws_secrets_from_file(get_resource_path(filename))
96 assert keys == expected_keys
97
98
Daniel Roschka3939aee2017-01-03 19:05:49 +010099@pytest.mark.parametrize(
100 ('filename', 'expected_retval'),
101 (
102 ('aws_config_with_secret.ini', 1),
103 ('aws_config_with_session_token.ini', 1),
104 ('aws_config_with_multiple_sections.ini', 1),
105 ('aws_config_without_secrets.ini', 0),
Pablo Vega7c631b32018-01-26 15:19:01 -0800106 ('aws_config_without_secrets_with_spaces.ini', 0),
Daniel Roschka3939aee2017-01-03 19:05:49 +0100107 ('nonsense.txt', 0),
108 ('ok_json.json', 0),
109 ),
Ara Hayrabedian02e8bdc2015-06-12 19:20:56 +0400110)
Ara Hayrabedian02e8bdc2015-06-12 19:20:56 +0400111def test_detect_aws_credentials(filename, expected_retval):
112 # with a valid credentials file
Anthony Sottilea99475a2016-05-27 14:09:50 -0700113 ret = main((
114 get_resource_path(filename),
Anthony Sottile45756522019-02-11 19:56:15 -0800115 '--credentials-file',
116 'testing/resources/aws_config_with_multiple_sections.ini',
Anthony Sottilea99475a2016-05-27 14:09:50 -0700117 ))
Ara Hayrabedian02e8bdc2015-06-12 19:20:56 +0400118 assert ret == expected_retval
119
120
Anthony Sottile21553c22020-02-18 10:24:17 -0800121def test_allows_arbitrarily_encoded_files(tmpdir):
122 src_ini = tmpdir.join('src.ini')
123 src_ini.write(
124 '[default]\n'
125 'aws_access_key_id=AKIASDFASDF\n'
126 'aws_secret_Access_key=9018asdf23908190238123\n',
127 )
128 arbitrary_encoding = tmpdir.join('f')
129 arbitrary_encoding.write_binary(b'\x12\x9a\xe2\xf2')
130 ret = main((str(arbitrary_encoding), '--credentials-file', str(src_ini)))
131 assert ret == 0
132
133
Daniel Roschka3939aee2017-01-03 19:05:49 +0100134@patch('pre_commit_hooks.detect_aws_credentials.get_aws_secrets_from_file')
135@patch('pre_commit_hooks.detect_aws_credentials.get_aws_secrets_from_env')
136def test_non_existent_credentials(mock_secrets_env, mock_secrets_file, capsys):
Daniel Roschkab0d4cdb2016-12-30 08:41:24 +0100137 """Test behavior with no configured AWS secrets."""
Daniel Roschka3939aee2017-01-03 19:05:49 +0100138 mock_secrets_env.return_value = set()
139 mock_secrets_file.return_value = set()
Anthony Sottiled444ab82016-02-08 17:05:39 -0800140 ret = main((
Daniel Roschkab0d4cdb2016-12-30 08:41:24 +0100141 get_resource_path('aws_config_without_secrets.ini'),
Anthony Sottile8626e262019-02-11 19:57:37 -0800142 '--credentials-file=testing/resources/credentailsfilethatdoesntexist',
Anthony Sottiled444ab82016-02-08 17:05:39 -0800143 ))
144 assert ret == 2
145 out, _ = capsys.readouterr()
Daniel Roschka3939aee2017-01-03 19:05:49 +0100146 assert out == (
147 'No AWS keys were found in the configured credential files '
148 'and environment variables.\nPlease ensure you have the '
149 'correct setting for --credentials-file\n'
150 )
Mike Fiedler312e7212017-02-10 08:26:26 -0500151
152
153@patch('pre_commit_hooks.detect_aws_credentials.get_aws_secrets_from_file')
154@patch('pre_commit_hooks.detect_aws_credentials.get_aws_secrets_from_env')
Anthony Sottile45756522019-02-11 19:56:15 -0800155def test_non_existent_credentials_with_allow_flag(
156 mock_secrets_env, mock_secrets_file,
157):
Mike Fiedler312e7212017-02-10 08:26:26 -0500158 mock_secrets_env.return_value = set()
159 mock_secrets_file.return_value = set()
160 ret = main((
161 get_resource_path('aws_config_without_secrets.ini'),
Anthony Sottile8626e262019-02-11 19:57:37 -0800162 '--credentials-file=testing/resources/credentailsfilethatdoesntexist',
163 '--allow-missing-credentials',
Mike Fiedler312e7212017-02-10 08:26:26 -0500164 ))
165 assert ret == 0