123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- # -*- coding: utf-8 -*-
- # Import python libs
- from __future__ import absolute_import, print_function, unicode_literals
- # Import Salt Libs
- import salt.utils.platform
- import salt.utils.url
- # Import Salt Testing Libs
- from tests.support.unit import TestCase, skipIf
- from tests.support.mock import (
- MagicMock,
- patch,
- NO_MOCK,
- NO_MOCK_REASON
- )
- @skipIf(NO_MOCK, NO_MOCK_REASON)
- class UrlTestCase(TestCase):
- '''
- TestCase for salt.utils.url module
- '''
- # parse tests
- def test_parse_path(self):
- '''
- Test parsing an ordinary path
- '''
- path = 'interesting?/path&.conf:and other things'
- self.assertEqual(salt.utils.url.parse(path), (path, None))
- def test_parse_salt_url(self):
- '''
- Test parsing a 'salt://' URL
- '''
- path = '?funny/path with {interesting|chars}'
- url = 'salt://' + path
- if salt.utils.platform.is_windows():
- path = '_funny/path with {interesting_chars}'
- self.assertEqual(salt.utils.url.parse(url), (path, None))
- def test_parse_salt_saltenv(self):
- '''
- Test parsing a 'salt://' URL with a '?saltenv=' query
- '''
- saltenv = 'ambience'
- path = '?funny/path&with {interesting|chars}'
- url = 'salt://' + path + '?saltenv=' + saltenv
- if salt.utils.platform.is_windows():
- path = '_funny/path&with {interesting_chars}'
- self.assertEqual(salt.utils.url.parse(url), (path, saltenv))
- # create tests
- def test_create_url(self):
- '''
- Test creating a 'salt://' URL
- '''
- path = '? interesting/&path.filetype'
- url = 'salt://' + path
- if salt.utils.platform.is_windows():
- url = 'salt://_ interesting/&path.filetype'
- self.assertEqual(salt.utils.url.create(path), url)
- def test_create_url_saltenv(self):
- '''
- Test creating a 'salt://' URL with a saltenv
- '''
- saltenv = 'raumklang'
- path = '? interesting/&path.filetype'
- if salt.utils.platform.is_windows():
- path = '_ interesting/&path.filetype'
- url = 'salt://' + path + '?saltenv=' + saltenv
- self.assertEqual(salt.utils.url.create(path, saltenv), url)
- # is_escaped tests
- def test_is_escaped_windows(self):
- '''
- Test not testing a 'salt://' URL on windows
- '''
- url = 'salt://dir/file.ini'
- with patch('salt.utils.platform.is_windows', MagicMock(return_value=True)):
- self.assertFalse(salt.utils.url.is_escaped(url))
- def test_is_escaped_escaped_path(self):
- '''
- Test testing an escaped path
- '''
- path = '|dir/file.conf?saltenv=basic'
- self.assertTrue(salt.utils.url.is_escaped(path))
- def test_is_escaped_unescaped_path(self):
- '''
- Test testing an unescaped path
- '''
- path = 'dir/file.conf'
- self.assertFalse(salt.utils.url.is_escaped(path))
- def test_is_escaped_escaped_url(self):
- '''
- Test testing an escaped 'salt://' URL
- '''
- url = 'salt://|dir/file.conf?saltenv=basic'
- self.assertTrue(salt.utils.url.is_escaped(url))
- def test_is_escaped_unescaped_url(self):
- '''
- Test testing an unescaped 'salt://' URL
- '''
- url = 'salt://dir/file.conf'
- self.assertFalse(salt.utils.url.is_escaped(url))
- def test_is_escaped_generic_url(self):
- '''
- Test testing an unescaped 'salt://' URL
- '''
- url = 'https://gentoo.org/'
- self.assertFalse(salt.utils.url.is_escaped(url))
- # escape tests
- def test_escape_windows(self):
- '''
- Test not escaping a 'salt://' URL on windows
- '''
- url = 'salt://dir/file.ini'
- with patch('salt.utils.platform.is_windows', MagicMock(return_value=True)):
- self.assertEqual(salt.utils.url.escape(url), url)
- def test_escape_escaped_path(self):
- '''
- Test escaping an escaped path
- '''
- resource = '|dir/file.conf?saltenv=basic'
- self.assertEqual(salt.utils.url.escape(resource), resource)
- def test_escape_unescaped_path(self):
- '''
- Test escaping an unescaped path
- '''
- path = 'dir/file.conf'
- escaped_path = '|' + path
- if salt.utils.platform.is_windows():
- escaped_path = path
- self.assertEqual(salt.utils.url.escape(path), escaped_path)
- def test_escape_escaped_url(self):
- '''
- Test testing an escaped 'salt://' URL
- '''
- url = 'salt://|dir/file.conf?saltenv=basic'
- self.assertEqual(salt.utils.url.escape(url), url)
- def test_escape_unescaped_url(self):
- '''
- Test testing an unescaped 'salt://' URL
- '''
- path = 'dir/file.conf'
- url = 'salt://' + path
- escaped_url = 'salt://|' + path
- if salt.utils.platform.is_windows():
- escaped_url = url
- self.assertEqual(salt.utils.url.escape(url), escaped_url)
- def test_escape_generic_url(self):
- '''
- Test testing an unescaped 'salt://' URL
- '''
- url = 'https://gentoo.org/'
- self.assertEqual(salt.utils.url.escape(url), url)
- # unescape tests
- def test_unescape_windows(self):
- '''
- Test not escaping a 'salt://' URL on windows
- '''
- url = 'salt://dir/file.ini'
- with patch('salt.utils.platform.is_windows', MagicMock(return_value=True)):
- self.assertEqual(salt.utils.url.unescape(url), url)
- def test_unescape_escaped_path(self):
- '''
- Test escaping an escaped path
- '''
- resource = 'dir/file.conf?saltenv=basic'
- escaped_path = '|' + resource
- self.assertEqual(salt.utils.url.unescape(escaped_path), resource)
- def test_unescape_unescaped_path(self):
- '''
- Test escaping an unescaped path
- '''
- path = 'dir/file.conf'
- self.assertEqual(salt.utils.url.unescape(path), path)
- def test_unescape_escaped_url(self):
- '''
- Test testing an escaped 'salt://' URL
- '''
- resource = 'dir/file.conf?saltenv=basic'
- url = 'salt://' + resource
- escaped_url = 'salt://|' + resource
- self.assertEqual(salt.utils.url.unescape(escaped_url), url)
- def test_unescape_unescaped_url(self):
- '''
- Test testing an unescaped 'salt://' URL
- '''
- url = 'salt://dir/file.conf'
- self.assertEqual(salt.utils.url.unescape(url), url)
- def test_unescape_generic_url(self):
- '''
- Test testing an unescaped 'salt://' URL
- '''
- url = 'https://gentoo.org/'
- self.assertEqual(salt.utils.url.unescape(url), url)
- # add_env tests
- def test_add_env_not_salt(self):
- '''
- Test not adding a saltenv to a non 'salt://' URL
- '''
- saltenv = 'higgs'
- url = 'https://pdg.lbl.gov/'
- self.assertEqual(salt.utils.url.add_env(url, saltenv), url)
- def test_add_env(self):
- '''
- Test adding a saltenv to a 'salt://' URL
- '''
- saltenv = 'erstwhile'
- url = 'salt://salted/file.conf'
- url_env = url + '?saltenv=' + saltenv
- self.assertEqual(salt.utils.url.add_env(url, saltenv), url_env)
- # split_env tests
- def test_split_env_non_salt(self):
- '''
- Test not splitting a saltenv from a non 'salt://' URL
- '''
- saltenv = 'gravitodynamics'
- url = 'https://arxiv.org/find/all/?' + saltenv
- self.assertEqual(salt.utils.url.split_env(url), (url, None))
- def test_split_env(self):
- '''
- Test splitting a 'salt://' URL
- '''
- saltenv = 'elsewhere'
- url = 'salt://salted/file.conf'
- url_env = url + '?saltenv=' + saltenv
- self.assertEqual(salt.utils.url.split_env(url_env), (url, saltenv))
- # validate tests
- def test_validate_valid(self):
- '''
- Test URL valid validation
- '''
- url = 'salt://config/file.name?saltenv=vapid'
- protos = ['salt', 'pepper', 'cinnamon', 'melange']
- self.assertTrue(salt.utils.url.validate(url, protos))
- def test_validate_invalid(self):
- '''
- Test URL invalid validation
- '''
- url = 'cumin://config/file.name?saltenv=vapid'
- protos = ['salt', 'pepper', 'cinnamon', 'melange']
- self.assertFalse(salt.utils.url.validate(url, protos))
- # strip tests
- def test_strip_url_with_scheme(self):
- '''
- Test stripping of URL scheme
- '''
- scheme = 'git+salt+rsync+AYB://'
- resource = 'all/the/things.stuff;parameter?query=I guess'
- url = scheme + resource
- self.assertEqual(salt.utils.url.strip_proto(url), resource)
- def test_strip_url_without_scheme(self):
- '''
- Test stripping of a URL without a scheme
- '''
- resource = 'all/the/things.stuff;parameter?query=I guess'
- self.assertEqual(salt.utils.url.strip_proto(resource), resource)
- def test_http_basic_auth(self):
- '''
- Tests that adding basic auth to a URL works as expected
- '''
- # ((user, password), expected) tuples
- test_inputs = (
- ((None, None), 'http://example.com'),
- (('user', None), 'http://user@example.com'),
- (('user', 'pass'), 'http://user:pass@example.com'),
- )
- for (user, password), expected in test_inputs:
- kwargs = {
- 'url': 'http://example.com',
- 'user': user,
- 'password': password,
- }
- # Test http
- result = salt.utils.url.add_http_basic_auth(**kwargs)
- self.assertEqual(result, expected)
- # Test https
- kwargs['url'] = kwargs['url'].replace('http://', 'https://', 1)
- expected = expected.replace('http://', 'https://', 1)
- result = salt.utils.url.add_http_basic_auth(**kwargs)
- self.assertEqual(result, expected)
- def test_http_basic_auth_https_only(self):
- '''
- Tests that passing a non-https URL with https_only=True will raise a
- ValueError.
- '''
- kwargs = {
- 'url': 'http://example.com',
- 'user': 'foo',
- 'password': 'bar',
- 'https_only': True,
- }
- self.assertRaises(
- ValueError,
- salt.utils.url.add_http_basic_auth,
- **kwargs
- )
- def test_redact_http_basic_auth(self):
- sensitive_outputs = (
- 'https://deadbeaf@example.com',
- 'https://user:pw@example.com',
- )
- sanitized = 'https://<redacted>@example.com'
- for sensitive_output in sensitive_outputs:
- result = salt.utils.url.redact_http_basic_auth(sensitive_output)
- self.assertEqual(result, sanitized)
- def test_redact_non_auth_output(self):
- non_auth_output = 'This is just normal output'
- self.assertEqual(
- non_auth_output,
- salt.utils.url.redact_http_basic_auth(non_auth_output)
- )
|