| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  | import pytest | 
					
						
							|  |  |  | import pytest_httpbin.certs | 
					
						
							| 
									
										
										
										
											2018-11-14 16:10:08 +01:00
										 |  |  | import requests.exceptions | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 13:26:06 +02:00
										 |  |  | from httpie.ssl import AVAILABLE_SSL_VERSION_ARG_MAPPING, DEFAULT_SSL_CIPHERS | 
					
						
							| 
									
										
										
										
											2019-09-16 13:26:18 +02:00
										 |  |  | from httpie.status import ExitStatus | 
					
						
							| 
									
										
										
										
											2018-11-14 16:10:08 +01:00
										 |  |  | from utils import HTTP_OK, TESTS_ROOT, http | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     # Handle OpenSSL errors, if installed. | 
					
						
							|  |  |  |     # See <https://github.com/jakubroztocil/httpie/issues/729> | 
					
						
							|  |  |  |     # noinspection PyUnresolvedReferences | 
					
						
							|  |  |  |     import OpenSSL.SSL | 
					
						
							|  |  |  |     ssl_errors = ( | 
					
						
							|  |  |  |         requests.exceptions.SSLError, | 
					
						
							|  |  |  |         OpenSSL.SSL.Error, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     ssl_errors = ( | 
					
						
							|  |  |  |         requests.exceptions.SSLError, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 13:26:06 +02:00
										 |  |  | CERTS_ROOT = TESTS_ROOT / 'client_certs' | 
					
						
							|  |  |  | CLIENT_CERT = str(CERTS_ROOT / 'client.crt') | 
					
						
							|  |  |  | CLIENT_KEY = str(CERTS_ROOT / 'client.key') | 
					
						
							|  |  |  | CLIENT_PEM = str(CERTS_ROOT / 'client.pem') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-07 11:46:59 +08:00
										 |  |  | # FIXME: | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  | # We test against a local httpbin instance which uses a self-signed cert. | 
					
						
							|  |  |  | # Requests without --verify=<CA_BUNDLE> will fail with a verification error. | 
					
						
							|  |  |  | # See: https://github.com/kevin1024/pytest-httpbin#https-support | 
					
						
							|  |  |  | CA_BUNDLE = pytest_httpbin.certs.where() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 13:26:06 +02:00
										 |  |  | @pytest.mark.parametrize('ssl_version', | 
					
						
							|  |  |  |                          AVAILABLE_SSL_VERSION_ARG_MAPPING.keys()) | 
					
						
							| 
									
										
										
										
											2016-03-02 12:12:05 +08:00
										 |  |  | def test_ssl_version(httpbin_secure, ssl_version): | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         r = http( | 
					
						
							|  |  |  |             '--ssl', ssl_version, | 
					
						
							|  |  |  |             httpbin_secure + '/get' | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         assert HTTP_OK in r | 
					
						
							| 
									
										
										
										
											2018-11-14 16:10:08 +01:00
										 |  |  |     except ssl_errors as e: | 
					
						
							| 
									
										
										
										
											2019-08-29 08:14:19 +02:00
										 |  |  |         if ssl_version == 'ssl3': | 
					
						
							|  |  |  |             # pytest-httpbin doesn't support ssl3 | 
					
						
							|  |  |  |             pass | 
					
						
							| 
									
										
										
										
											2016-03-02 12:12:05 +08:00
										 |  |  |         else: | 
					
						
							|  |  |  |             raise | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 02:53:23 +08:00
										 |  |  | class TestClientCert: | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 10:35:40 +08:00
										 |  |  |     def test_cert_and_key(self, httpbin_secure): | 
					
						
							|  |  |  |         r = http(httpbin_secure + '/get', | 
					
						
							|  |  |  |                  '--cert', CLIENT_CERT, | 
					
						
							|  |  |  |                  '--cert-key', CLIENT_KEY) | 
					
						
							|  |  |  |         assert HTTP_OK in r | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_cert_pem(self, httpbin_secure): | 
					
						
							|  |  |  |         r = http(httpbin_secure + '/get', | 
					
						
							|  |  |  |                  '--cert', CLIENT_PEM) | 
					
						
							|  |  |  |         assert HTTP_OK in r | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  |     def test_cert_file_not_found(self, httpbin_secure): | 
					
						
							|  |  |  |         r = http(httpbin_secure + '/get', | 
					
						
							|  |  |  |                  '--cert', '/__not_found__', | 
					
						
							| 
									
										
										
										
											2019-09-03 17:14:39 +02:00
										 |  |  |                  tolerate_error_exit_status=True) | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  |         assert r.exit_status == ExitStatus.ERROR | 
					
						
							|  |  |  |         assert 'No such file or directory' in r.stderr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_cert_file_invalid(self, httpbin_secure): | 
					
						
							| 
									
										
										
										
											2018-11-14 16:10:08 +01:00
										 |  |  |         with pytest.raises(ssl_errors): | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  |             http(httpbin_secure + '/get', | 
					
						
							|  |  |  |                  '--cert', __file__) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_cert_ok_but_missing_key(self, httpbin_secure): | 
					
						
							| 
									
										
										
										
											2018-11-14 16:10:08 +01:00
										 |  |  |         with pytest.raises(ssl_errors): | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  |             http(httpbin_secure + '/get', | 
					
						
							|  |  |  |                  '--cert', CLIENT_CERT) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 02:53:23 +08:00
										 |  |  | class TestServerCert: | 
					
						
							| 
									
										
										
										
											2016-03-06 17:42:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  |     def test_verify_no_OK(self, httpbin_secure): | 
					
						
							|  |  |  |         r = http(httpbin_secure.url + '/get', '--verify=no') | 
					
						
							|  |  |  |         assert HTTP_OK in r | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-17 00:56:07 +01:00
										 |  |  |     @pytest.mark.parametrize('verify_value', ['false', 'fALse']) | 
					
						
							|  |  |  |     def test_verify_false_OK(self, httpbin_secure, verify_value): | 
					
						
							|  |  |  |         r = http(httpbin_secure.url + '/get', '--verify', verify_value) | 
					
						
							|  |  |  |         assert HTTP_OK in r | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  |     def test_verify_custom_ca_bundle_path( | 
					
						
							| 
									
										
										
										
											2018-11-14 16:10:08 +01:00
										 |  |  |         self, httpbin_secure_untrusted | 
					
						
							|  |  |  |     ): | 
					
						
							| 
									
										
										
										
											2016-03-06 17:42:35 +08:00
										 |  |  |         r = http(httpbin_secure_untrusted + '/get', '--verify', CA_BUNDLE) | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  |         assert HTTP_OK in r | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 10:35:40 +08:00
										 |  |  |     def test_self_signed_server_cert_by_default_raises_ssl_error( | 
					
						
							| 
									
										
										
										
											2018-11-14 16:10:08 +01:00
										 |  |  |         self, | 
					
						
							|  |  |  |         httpbin_secure_untrusted | 
					
						
							|  |  |  |     ): | 
					
						
							|  |  |  |         with pytest.raises(ssl_errors): | 
					
						
							| 
									
										
										
										
											2016-03-06 17:42:35 +08:00
										 |  |  |             http(httpbin_secure_untrusted.url + '/get') | 
					
						
							| 
									
										
										
										
											2016-03-02 10:35:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  |     def test_verify_custom_ca_bundle_invalid_path(self, httpbin_secure): | 
					
						
							| 
									
										
										
										
											2017-05-17 13:51:43 -03:00
										 |  |  |         # since 2.14.0 requests raises IOError | 
					
						
							| 
									
										
										
										
											2018-11-14 16:10:08 +01:00
										 |  |  |         with pytest.raises(ssl_errors + (IOError,)): | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  |             http(httpbin_secure.url + '/get', '--verify', '/__not_found__') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_verify_custom_ca_bundle_invalid_bundle(self, httpbin_secure): | 
					
						
							| 
									
										
										
										
											2018-11-14 16:10:08 +01:00
										 |  |  |         with pytest.raises(ssl_errors): | 
					
						
							| 
									
										
										
										
											2015-01-23 23:55:03 +01:00
										 |  |  |             http(httpbin_secure.url + '/get', '--verify', __file__) | 
					
						
							| 
									
										
										
										
											2020-05-23 13:26:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_ciphers(httpbin_secure): | 
					
						
							|  |  |  |     r = http( | 
					
						
							|  |  |  |         httpbin_secure.url + '/get', | 
					
						
							|  |  |  |         '--ciphers', | 
					
						
							|  |  |  |         DEFAULT_SSL_CIPHERS, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert HTTP_OK in r | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_ciphers_none_can_be_selected(httpbin_secure): | 
					
						
							|  |  |  |     r = http( | 
					
						
							|  |  |  |         httpbin_secure.url + '/get', | 
					
						
							|  |  |  |         '--ciphers', | 
					
						
							|  |  |  |         '__FOO__', | 
					
						
							|  |  |  |         tolerate_error_exit_status=True, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert r.exit_status == ExitStatus.ERROR | 
					
						
							|  |  |  |     assert 'No cipher can be selected.' in r.stderr |