snowflake-connector-python 4.4.0__cp314-cp314-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- snowflake/connector/__init__.py +118 -0
- snowflake/connector/_query_context_cache.py +276 -0
- snowflake/connector/_sql_util.py +48 -0
- snowflake/connector/_utils.py +353 -0
- snowflake/connector/aio/README.md +88 -0
- snowflake/connector/aio/__init__.py +163 -0
- snowflake/connector/aio/_azure_storage_client.py +227 -0
- snowflake/connector/aio/_bind_upload_agent.py +69 -0
- snowflake/connector/aio/_connection.py +1216 -0
- snowflake/connector/aio/_cursor.py +1402 -0
- snowflake/connector/aio/_description.py +5 -0
- snowflake/connector/aio/_direct_file_operation_utils.py +88 -0
- snowflake/connector/aio/_file_transfer_agent.py +316 -0
- snowflake/connector/aio/_gcs_storage_client.py +360 -0
- snowflake/connector/aio/_network.py +860 -0
- snowflake/connector/aio/_ocsp_asn1crypto.py +51 -0
- snowflake/connector/aio/_ocsp_snowflake.py +608 -0
- snowflake/connector/aio/_pandas_tools.py +561 -0
- snowflake/connector/aio/_result_batch.py +442 -0
- snowflake/connector/aio/_result_set.py +309 -0
- snowflake/connector/aio/_s3_storage_client.py +460 -0
- snowflake/connector/aio/_session_manager.py +588 -0
- snowflake/connector/aio/_storage_client.py +331 -0
- snowflake/connector/aio/_telemetry.py +97 -0
- snowflake/connector/aio/_time_util.py +57 -0
- snowflake/connector/aio/_wif_util.py +324 -0
- snowflake/connector/aio/auth/__init__.py +52 -0
- snowflake/connector/aio/auth/_auth.py +406 -0
- snowflake/connector/aio/auth/_by_plugin.py +131 -0
- snowflake/connector/aio/auth/_default.py +28 -0
- snowflake/connector/aio/auth/_idtoken.py +54 -0
- snowflake/connector/aio/auth/_keypair.py +60 -0
- snowflake/connector/aio/auth/_no_auth.py +31 -0
- snowflake/connector/aio/auth/_oauth.py +27 -0
- snowflake/connector/aio/auth/_oauth_code.py +117 -0
- snowflake/connector/aio/auth/_oauth_credentials.py +100 -0
- snowflake/connector/aio/auth/_okta.py +247 -0
- snowflake/connector/aio/auth/_pat.py +27 -0
- snowflake/connector/aio/auth/_usrpwdmfa.py +30 -0
- snowflake/connector/aio/auth/_webbrowser.py +405 -0
- snowflake/connector/aio/auth/_workload_identity.py +60 -0
- snowflake/connector/arrow_context.py +211 -0
- snowflake/connector/auth/__init__.py +53 -0
- snowflake/connector/auth/_auth.py +669 -0
- snowflake/connector/auth/_http_server.py +257 -0
- snowflake/connector/auth/_oauth_base.py +472 -0
- snowflake/connector/auth/by_plugin.py +219 -0
- snowflake/connector/auth/default.py +36 -0
- snowflake/connector/auth/idtoken.py +72 -0
- snowflake/connector/auth/keypair.py +225 -0
- snowflake/connector/auth/no_auth.py +39 -0
- snowflake/connector/auth/oauth.py +49 -0
- snowflake/connector/auth/oauth_code.py +490 -0
- snowflake/connector/auth/oauth_credentials.py +71 -0
- snowflake/connector/auth/okta.py +339 -0
- snowflake/connector/auth/pat.py +40 -0
- snowflake/connector/auth/usrpwdmfa.py +69 -0
- snowflake/connector/auth/webbrowser.py +514 -0
- snowflake/connector/auth/workload_identity.py +110 -0
- snowflake/connector/azure_storage_client.py +278 -0
- snowflake/connector/backoff_policies.py +141 -0
- snowflake/connector/bind_upload_agent.py +89 -0
- snowflake/connector/cache.py +696 -0
- snowflake/connector/compat.py +127 -0
- snowflake/connector/config_manager.py +553 -0
- snowflake/connector/connection.py +2671 -0
- snowflake/connector/connection_diagnostic.py +793 -0
- snowflake/connector/constants.py +460 -0
- snowflake/connector/converter.py +809 -0
- snowflake/connector/converter_issue23517.py +87 -0
- snowflake/connector/converter_null.py +14 -0
- snowflake/connector/converter_snowsql.py +205 -0
- snowflake/connector/crl.py +919 -0
- snowflake/connector/crl_cache.py +734 -0
- snowflake/connector/cursor.py +2099 -0
- snowflake/connector/dbapi.py +53 -0
- snowflake/connector/description.py +21 -0
- snowflake/connector/direct_file_operation_utils.py +88 -0
- snowflake/connector/encryption_util.py +220 -0
- snowflake/connector/errorcode.py +94 -0
- snowflake/connector/errors.py +666 -0
- snowflake/connector/externals_utils/__init__.py +0 -0
- snowflake/connector/externals_utils/externals_setup.py +30 -0
- snowflake/connector/feature.py +4 -0
- snowflake/connector/file_compression_type.py +118 -0
- snowflake/connector/file_lock.py +72 -0
- snowflake/connector/file_transfer_agent.py +1244 -0
- snowflake/connector/file_util.py +153 -0
- snowflake/connector/gcs_storage_client.py +476 -0
- snowflake/connector/gzip_decoder.py +85 -0
- snowflake/connector/interval_util.py +26 -0
- snowflake/connector/local_storage_client.py +90 -0
- snowflake/connector/log_configuration.py +62 -0
- snowflake/connector/logging_utils/__init__.py +0 -0
- snowflake/connector/logging_utils/filters.py +72 -0
- snowflake/connector/minicore/__init__.py +0 -0
- snowflake/connector/minicore/aix_ppc64/libsf_mini_core.a +0 -0
- snowflake/connector/minicore/aix_ppc64/libsf_mini_core_static.a +0 -0
- snowflake/connector/minicore/linux_aarch64_glibc/libsf_mini_core.so +0 -0
- snowflake/connector/minicore/linux_aarch64_musl/libsf_mini_core.so +0 -0
- snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
- snowflake/connector/minicore/linux_x86_64_musl/libsf_mini_core.so +0 -0
- snowflake/connector/minicore/macos_aarch64/libsf_mini_core.dylib +0 -0
- snowflake/connector/minicore/macos_x86_64/libsf_mini_core.dylib +0 -0
- snowflake/connector/minicore/windows_x86_64/sf_mini_core.dll +0 -0
- snowflake/connector/minicore/windows_x86_64/sf_mini_core_static.lib +0 -0
- snowflake/connector/nanoarrow_arrow_iterator.cp314-win_amd64.pyd +0 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +60 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +29 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +19 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +26 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +21 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +23 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +570 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +98 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +125 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +115 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +1140 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +138 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +47 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +46 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +83 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +35 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +97 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +72 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +73 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +28 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +30 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +35 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +17 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +23 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +45 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +75 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +57 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +209 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +75 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +30 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +46 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +29 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +8 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +95 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +57 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +36 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +34 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +48 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +19 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +26 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +36 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +31 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +346 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +145 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +14 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +67 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +68 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +101 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +127 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +45 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +1908 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +215 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +125 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +7 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +55 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +148 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +31 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +8 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +144 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +162 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +97 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +239 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +14 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +210 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +84 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +84 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +20 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +51 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +206 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +118 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +19 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +52 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +2 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +25 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +67 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +162 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +898 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +190 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +6 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +52 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +3204 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +3217 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +3618 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +379 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +262 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +512 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +350 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +33273 -0
- snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +397 -0
- snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +100 -0
- snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +49 -0
- snowflake/connector/network.py +1227 -0
- snowflake/connector/ocsp_asn1crypto.py +447 -0
- snowflake/connector/ocsp_snowflake.py +1939 -0
- snowflake/connector/options.py +179 -0
- snowflake/connector/os_details.py +88 -0
- snowflake/connector/pandas_tools.py +734 -0
- snowflake/connector/platform_detection.py +555 -0
- snowflake/connector/proxy.py +28 -0
- snowflake/connector/py.typed +0 -0
- snowflake/connector/result_batch.py +917 -0
- snowflake/connector/result_set.py +340 -0
- snowflake/connector/s3_storage_client.py +614 -0
- snowflake/connector/secret_detector.py +181 -0
- snowflake/connector/session_manager.py +650 -0
- snowflake/connector/sf_dirs.py +64 -0
- snowflake/connector/sfbinaryformat.py +35 -0
- snowflake/connector/sfdatetime.py +345 -0
- snowflake/connector/snow_logging.py +144 -0
- snowflake/connector/sqlstate.py +9 -0
- snowflake/connector/ssd_internal_keys.py +30 -0
- snowflake/connector/ssl_wrap_socket.py +281 -0
- snowflake/connector/storage_client.py +486 -0
- snowflake/connector/telemetry.py +254 -0
- snowflake/connector/telemetry_oob.py +544 -0
- snowflake/connector/test_util.py +30 -0
- snowflake/connector/time_util.py +159 -0
- snowflake/connector/token_cache.py +457 -0
- snowflake/connector/tool/__init__.py +0 -0
- snowflake/connector/tool/dump_certs.py +57 -0
- snowflake/connector/tool/dump_ocsp_response.py +139 -0
- snowflake/connector/tool/dump_ocsp_response_cache.py +194 -0
- snowflake/connector/tool/probe_connection.py +69 -0
- snowflake/connector/url_util.py +55 -0
- snowflake/connector/util_text.py +320 -0
- snowflake/connector/vendored/__init__.py +3 -0
- snowflake/connector/vendored/requests/LICENSE +175 -0
- snowflake/connector/vendored/requests/__init__.py +184 -0
- snowflake/connector/vendored/requests/__version__.py +14 -0
- snowflake/connector/vendored/requests/_internal_utils.py +50 -0
- snowflake/connector/vendored/requests/adapters.py +696 -0
- snowflake/connector/vendored/requests/api.py +157 -0
- snowflake/connector/vendored/requests/auth.py +314 -0
- snowflake/connector/vendored/requests/certs.py +17 -0
- snowflake/connector/vendored/requests/compat.py +106 -0
- snowflake/connector/vendored/requests/cookies.py +561 -0
- snowflake/connector/vendored/requests/exceptions.py +151 -0
- snowflake/connector/vendored/requests/help.py +134 -0
- snowflake/connector/vendored/requests/hooks.py +33 -0
- snowflake/connector/vendored/requests/models.py +1039 -0
- snowflake/connector/vendored/requests/packages.py +23 -0
- snowflake/connector/vendored/requests/sessions.py +831 -0
- snowflake/connector/vendored/requests/status_codes.py +128 -0
- snowflake/connector/vendored/requests/structures.py +99 -0
- snowflake/connector/vendored/requests/utils.py +1086 -0
- snowflake/connector/vendored/urllib3/LICENSE.txt +21 -0
- snowflake/connector/vendored/urllib3/__init__.py +211 -0
- snowflake/connector/vendored/urllib3/_base_connection.py +165 -0
- snowflake/connector/vendored/urllib3/_collections.py +487 -0
- snowflake/connector/vendored/urllib3/_request_methods.py +278 -0
- snowflake/connector/vendored/urllib3/_version.py +34 -0
- snowflake/connector/vendored/urllib3/connection.py +1108 -0
- snowflake/connector/vendored/urllib3/connectionpool.py +1178 -0
- snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +17 -0
- snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +260 -0
- snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +110 -0
- snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +726 -0
- snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +22 -0
- snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +277 -0
- snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +564 -0
- snowflake/connector/vendored/urllib3/contrib/socks.py +228 -0
- snowflake/connector/vendored/urllib3/exceptions.py +335 -0
- snowflake/connector/vendored/urllib3/fields.py +341 -0
- snowflake/connector/vendored/urllib3/filepost.py +89 -0
- snowflake/connector/vendored/urllib3/http2/__init__.py +53 -0
- snowflake/connector/vendored/urllib3/http2/connection.py +356 -0
- snowflake/connector/vendored/urllib3/http2/probe.py +87 -0
- snowflake/connector/vendored/urllib3/poolmanager.py +651 -0
- snowflake/connector/vendored/urllib3/py.typed +2 -0
- snowflake/connector/vendored/urllib3/response.py +1480 -0
- snowflake/connector/vendored/urllib3/util/__init__.py +42 -0
- snowflake/connector/vendored/urllib3/util/connection.py +137 -0
- snowflake/connector/vendored/urllib3/util/proxy.py +43 -0
- snowflake/connector/vendored/urllib3/util/request.py +263 -0
- snowflake/connector/vendored/urllib3/util/response.py +101 -0
- snowflake/connector/vendored/urllib3/util/retry.py +549 -0
- snowflake/connector/vendored/urllib3/util/ssl_.py +527 -0
- snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +159 -0
- snowflake/connector/vendored/urllib3/util/ssltransport.py +271 -0
- snowflake/connector/vendored/urllib3/util/timeout.py +275 -0
- snowflake/connector/vendored/urllib3/util/url.py +469 -0
- snowflake/connector/vendored/urllib3/util/util.py +42 -0
- snowflake/connector/vendored/urllib3/util/wait.py +124 -0
- snowflake/connector/version.py +3 -0
- snowflake/connector/wif_util.py +434 -0
- snowflake_connector_python-4.4.0.dist-info/DELVEWHEEL +2 -0
- snowflake_connector_python-4.4.0.dist-info/METADATA +1591 -0
- snowflake_connector_python-4.4.0.dist-info/RECORD +302 -0
- snowflake_connector_python-4.4.0.dist-info/WHEEL +5 -0
- snowflake_connector_python-4.4.0.dist-info/entry_points.txt +4 -0
- snowflake_connector_python-4.4.0.dist-info/licenses/LICENSE.txt +202 -0
- snowflake_connector_python-4.4.0.dist-info/licenses/NOTICE +8 -0
- snowflake_connector_python-4.4.0.dist-info/top_level.txt +1 -0
- snowflake_connector_python.libs/msvcp140-0f885b509a685d2bbfa652fed26b5fb3.dll +0 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# SSL wrap socket for PyOpenSSL.
|
|
5
|
+
# Mostly copied from
|
|
6
|
+
#
|
|
7
|
+
# https://github.com/shazow/urllib3/blob/master/urllib3/contrib/pyopenssl.py
|
|
8
|
+
#
|
|
9
|
+
# and added OCSP validator on the top.
|
|
10
|
+
import logging
|
|
11
|
+
import os
|
|
12
|
+
import ssl
|
|
13
|
+
import time
|
|
14
|
+
import weakref
|
|
15
|
+
from contextvars import ContextVar
|
|
16
|
+
from functools import wraps
|
|
17
|
+
from inspect import signature as _sig
|
|
18
|
+
from socket import socket
|
|
19
|
+
from typing import TYPE_CHECKING, Any
|
|
20
|
+
|
|
21
|
+
import certifi
|
|
22
|
+
import OpenSSL.SSL
|
|
23
|
+
|
|
24
|
+
from .constants import OCSP_ROOT_CERTS_DICT_LOCK_TIMEOUT_DEFAULT_NO_TIMEOUT, OCSPMode
|
|
25
|
+
from .crl import CertRevocationCheckMode, CRLConfig, CRLValidator
|
|
26
|
+
from .errorcode import ER_OCSP_RESPONSE_CERT_STATUS_REVOKED
|
|
27
|
+
from .errors import OperationalError
|
|
28
|
+
from .session_manager import SessionManager, SessionManagerFactory
|
|
29
|
+
from .vendored.urllib3 import connection as connection_
|
|
30
|
+
from .vendored.urllib3.contrib.pyopenssl import PyOpenSSLContext, WrappedSocket
|
|
31
|
+
from .vendored.urllib3.util import ssl_ as ssl_
|
|
32
|
+
|
|
33
|
+
if TYPE_CHECKING:
|
|
34
|
+
from cryptography import x509
|
|
35
|
+
|
|
36
|
+
DEFAULT_OCSP_MODE: OCSPMode = OCSPMode.FAIL_OPEN
|
|
37
|
+
FEATURE_OCSP_MODE: OCSPMode = DEFAULT_OCSP_MODE
|
|
38
|
+
FEATURE_ROOT_CERTS_DICT_LOCK_TIMEOUT: int = (
|
|
39
|
+
OCSP_ROOT_CERTS_DICT_LOCK_TIMEOUT_DEFAULT_NO_TIMEOUT
|
|
40
|
+
)
|
|
41
|
+
DEFAULT_CRL_CONFIG: CRLConfig = CRLConfig()
|
|
42
|
+
FEATURE_CRL_CONFIG: CRLConfig = DEFAULT_CRL_CONFIG
|
|
43
|
+
|
|
44
|
+
"""
|
|
45
|
+
OCSP Response cache file name
|
|
46
|
+
"""
|
|
47
|
+
FEATURE_OCSP_RESPONSE_CACHE_FILE_NAME: str | None = None
|
|
48
|
+
|
|
49
|
+
log = logging.getLogger(__name__)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# Helper utilities (private)
|
|
53
|
+
def _resolve_cafile(kwargs: dict[str, Any]) -> str | None:
|
|
54
|
+
"""Resolve CA bundle path from kwargs or standard environment variables.
|
|
55
|
+
|
|
56
|
+
Precedence:
|
|
57
|
+
1) kwargs['ca_certs'] if provided by caller
|
|
58
|
+
2) REQUESTS_CA_BUNDLE
|
|
59
|
+
3) SSL_CERT_FILE
|
|
60
|
+
"""
|
|
61
|
+
caf = kwargs.get("ca_certs")
|
|
62
|
+
if caf:
|
|
63
|
+
return caf
|
|
64
|
+
return os.environ.get("REQUESTS_CA_BUNDLE") or os.environ.get("SSL_CERT_FILE")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _ensure_partial_chain_on_context(ctx: PyOpenSSLContext, cafile: str | None) -> None:
|
|
68
|
+
"""Load CA bundle (when provided) and enable OpenSSL partial-chain support on ctx."""
|
|
69
|
+
if cafile:
|
|
70
|
+
try:
|
|
71
|
+
ctx.load_verify_locations(cafile=cafile, capath=None)
|
|
72
|
+
except (ssl.SSLError, OSError, ValueError):
|
|
73
|
+
# Leave context unchanged; handshake/validation surfaces failures
|
|
74
|
+
pass
|
|
75
|
+
try:
|
|
76
|
+
store = ctx._ctx.get_cert_store()
|
|
77
|
+
from OpenSSL import crypto as _crypto
|
|
78
|
+
|
|
79
|
+
if hasattr(_crypto, "X509StoreFlags") and hasattr(
|
|
80
|
+
_crypto.X509StoreFlags, "PARTIAL_CHAIN"
|
|
81
|
+
):
|
|
82
|
+
store.set_flags(_crypto.X509StoreFlags.PARTIAL_CHAIN)
|
|
83
|
+
except (AttributeError, ImportError, OpenSSL.SSL.Error, OSError, ValueError):
|
|
84
|
+
# Best-effort; if not available, default chain building applies
|
|
85
|
+
pass
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _build_context_with_partial_chain(cafile: str | None) -> PyOpenSSLContext:
|
|
89
|
+
"""Create PyOpenSSL context configured for CERT_REQUIRED and partial-chain trust."""
|
|
90
|
+
ctx = PyOpenSSLContext(ssl_.PROTOCOL_TLS_CLIENT)
|
|
91
|
+
try:
|
|
92
|
+
ctx.verify_mode = ssl.CERT_REQUIRED
|
|
93
|
+
except Exception:
|
|
94
|
+
pass
|
|
95
|
+
_ensure_partial_chain_on_context(ctx, cafile)
|
|
96
|
+
return ctx
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
# Store a *weak* reference so that the context variable doesn’t prolong the
|
|
100
|
+
# lifetime of the SessionManager. Once all owning connections are GC-ed the
|
|
101
|
+
# weakref goes dead and OCSP will fall back to its local manager (but most
|
|
102
|
+
# likely won't be used ever again anyway).
|
|
103
|
+
_CURRENT_SESSION_MANAGER: ContextVar[weakref.ref[SessionManager] | None] = ContextVar(
|
|
104
|
+
"_CURRENT_SESSION_MANAGER",
|
|
105
|
+
default=None,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def get_current_session_manager(
|
|
110
|
+
create_default_if_missing: bool = True, **clone_kwargs
|
|
111
|
+
) -> SessionManager | None:
|
|
112
|
+
"""Return the SessionManager associated with the current handshake, if any.
|
|
113
|
+
|
|
114
|
+
If the weak reference is dead or no manager was set, returns ``None``.
|
|
115
|
+
"""
|
|
116
|
+
sm_weak_ref = _CURRENT_SESSION_MANAGER.get()
|
|
117
|
+
if sm_weak_ref is None:
|
|
118
|
+
return (
|
|
119
|
+
SessionManagerFactory.get_manager() if create_default_if_missing else None
|
|
120
|
+
)
|
|
121
|
+
context_session_manager = sm_weak_ref()
|
|
122
|
+
|
|
123
|
+
if context_session_manager is None:
|
|
124
|
+
return (
|
|
125
|
+
SessionManagerFactory.get_manager() if create_default_if_missing else None
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
return context_session_manager.clone(**clone_kwargs)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def set_current_session_manager(sm: SessionManager | None) -> Any:
|
|
132
|
+
"""Set the SessionManager for the current execution context.
|
|
133
|
+
|
|
134
|
+
Called from SnowflakeConnection so that OCSP downloads
|
|
135
|
+
use the same proxy / header configuration as the initiating connection.
|
|
136
|
+
|
|
137
|
+
Alternative approach would be moving method inject_into_urllib3() inside
|
|
138
|
+
connection initialization, but in case this delay (from module import time
|
|
139
|
+
to connection initialization time) would cause some code to break we stayed
|
|
140
|
+
with this approach, having in mind soon OCSP deprecation.
|
|
141
|
+
"""
|
|
142
|
+
return _CURRENT_SESSION_MANAGER.set(weakref.ref(sm) if sm is not None else None)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def reset_current_session_manager(token) -> None:
|
|
146
|
+
"""Restore previous SessionManager context stored in *token* (from ContextVar.set)."""
|
|
147
|
+
try:
|
|
148
|
+
_CURRENT_SESSION_MANAGER.reset(token)
|
|
149
|
+
except Exception:
|
|
150
|
+
# ignore invalid token errors
|
|
151
|
+
pass
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def inject_into_urllib3() -> None:
|
|
155
|
+
"""Monkey-patch urllib3 with PyOpenSSL-backed SSL-support and OCSP."""
|
|
156
|
+
log.debug("Injecting ssl_wrap_socket_with_ocsp")
|
|
157
|
+
connection_.ssl_wrap_socket = ssl_wrap_socket_with_cert_revocation_checks
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def _load_trusted_certificates(cafile: str | None) -> list[x509.Certificate]:
|
|
161
|
+
# Use default SSL context to load the CA file and get the certificates
|
|
162
|
+
ctx = ssl.create_default_context()
|
|
163
|
+
ctx.load_verify_locations(cafile=cafile)
|
|
164
|
+
certs = ctx.get_ca_certs(binary_form=True)
|
|
165
|
+
from cryptography.hazmat.backends import default_backend
|
|
166
|
+
from cryptography.x509 import load_der_x509_certificate
|
|
167
|
+
|
|
168
|
+
return [load_der_x509_certificate(cert, default_backend()) for cert in certs]
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
@wraps(ssl_.ssl_wrap_socket)
|
|
172
|
+
def ssl_wrap_socket_with_cert_revocation_checks(
|
|
173
|
+
*args: Any, **kwargs: Any
|
|
174
|
+
) -> WrappedSocket:
|
|
175
|
+
# Bind passed args/kwargs to the underlying signature to support both positional and keyword calls
|
|
176
|
+
bound = _sig(ssl_.ssl_wrap_socket).bind_partial(*args, **kwargs)
|
|
177
|
+
params = bound.arguments
|
|
178
|
+
|
|
179
|
+
server_hostname = params.get("server_hostname")
|
|
180
|
+
|
|
181
|
+
# Ensure CA bundle default if not provided
|
|
182
|
+
if not params.get("ca_certs"):
|
|
183
|
+
params["ca_certs"] = certifi.where()
|
|
184
|
+
|
|
185
|
+
# Ensure PyOpenSSL context with partial-chain is used if none or wrong type provided
|
|
186
|
+
provided_ctx = params.get("ssl_context")
|
|
187
|
+
cafile_for_ctx = _resolve_cafile(params)
|
|
188
|
+
if not isinstance(provided_ctx, PyOpenSSLContext):
|
|
189
|
+
params["ssl_context"] = _build_context_with_partial_chain(cafile_for_ctx)
|
|
190
|
+
else:
|
|
191
|
+
# If a PyOpenSSLContext is provided, ensure it trusts the provided CA and partial-chain is enabled
|
|
192
|
+
_ensure_partial_chain_on_context(provided_ctx, cafile_for_ctx)
|
|
193
|
+
|
|
194
|
+
ret = ssl_.ssl_wrap_socket(**params)
|
|
195
|
+
|
|
196
|
+
log.debug(
|
|
197
|
+
"CRL Check Mode: %s",
|
|
198
|
+
FEATURE_CRL_CONFIG.cert_revocation_check_mode.name,
|
|
199
|
+
)
|
|
200
|
+
if (
|
|
201
|
+
FEATURE_CRL_CONFIG.cert_revocation_check_mode
|
|
202
|
+
!= CertRevocationCheckMode.DISABLED
|
|
203
|
+
):
|
|
204
|
+
crl_validator = CRLValidator.from_config(
|
|
205
|
+
FEATURE_CRL_CONFIG,
|
|
206
|
+
get_current_session_manager(),
|
|
207
|
+
trusted_certificates=_load_trusted_certificates(cafile_for_ctx),
|
|
208
|
+
)
|
|
209
|
+
if not crl_validator.validate_connection(ret.connection):
|
|
210
|
+
raise OperationalError(
|
|
211
|
+
msg=(
|
|
212
|
+
"The certificate is revoked or "
|
|
213
|
+
"could not be validated via CRL: hostname={}".format(
|
|
214
|
+
server_hostname
|
|
215
|
+
)
|
|
216
|
+
),
|
|
217
|
+
errno=ER_OCSP_RESPONSE_CERT_STATUS_REVOKED,
|
|
218
|
+
)
|
|
219
|
+
log.debug(
|
|
220
|
+
"The certificate revocation check was successful. No additional checks will be performed."
|
|
221
|
+
)
|
|
222
|
+
return ret
|
|
223
|
+
|
|
224
|
+
log.debug(
|
|
225
|
+
"OCSP Mode: %s, OCSP response cache file name: %s",
|
|
226
|
+
FEATURE_OCSP_MODE.name,
|
|
227
|
+
FEATURE_OCSP_RESPONSE_CACHE_FILE_NAME,
|
|
228
|
+
)
|
|
229
|
+
if FEATURE_OCSP_MODE != OCSPMode.DISABLE_OCSP_CHECKS:
|
|
230
|
+
from .ocsp_asn1crypto import SnowflakeOCSPAsn1Crypto as SFOCSP
|
|
231
|
+
|
|
232
|
+
v = SFOCSP(
|
|
233
|
+
ocsp_response_cache_uri=FEATURE_OCSP_RESPONSE_CACHE_FILE_NAME,
|
|
234
|
+
use_fail_open=FEATURE_OCSP_MODE == OCSPMode.FAIL_OPEN,
|
|
235
|
+
hostname=server_hostname,
|
|
236
|
+
root_certs_dict_lock_timeout=FEATURE_ROOT_CERTS_DICT_LOCK_TIMEOUT,
|
|
237
|
+
).validate(server_hostname, ret.connection)
|
|
238
|
+
if not v:
|
|
239
|
+
raise OperationalError(
|
|
240
|
+
msg=f"The certificate is revoked or could not be validated: hostname={server_hostname}",
|
|
241
|
+
errno=ER_OCSP_RESPONSE_CERT_STATUS_REVOKED,
|
|
242
|
+
)
|
|
243
|
+
else:
|
|
244
|
+
log.debug(
|
|
245
|
+
"This connection does not perform OCSP checks. "
|
|
246
|
+
"Revocation status of the certificate will not be checked against OCSP Responder."
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
return ret
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def _openssl_connect(
|
|
253
|
+
hostname: str, port: int = 443, max_retry: int = 20, timeout: int | None = None
|
|
254
|
+
) -> OpenSSL.SSL.Connection:
|
|
255
|
+
"""The OpenSSL connection without validating certificates.
|
|
256
|
+
|
|
257
|
+
This is used to diagnose SSL issues.
|
|
258
|
+
"""
|
|
259
|
+
err = None
|
|
260
|
+
sleeping_time = 1
|
|
261
|
+
for _ in range(max_retry):
|
|
262
|
+
try:
|
|
263
|
+
client = socket()
|
|
264
|
+
client.connect((hostname, port))
|
|
265
|
+
context = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD)
|
|
266
|
+
if timeout is not None:
|
|
267
|
+
context.set_timeout(timeout)
|
|
268
|
+
client_ssl = OpenSSL.SSL.Connection(context, client)
|
|
269
|
+
client_ssl.set_connect_state()
|
|
270
|
+
client_ssl.set_tlsext_host_name(hostname.encode("utf-8"))
|
|
271
|
+
client_ssl.do_handshake()
|
|
272
|
+
return client_ssl
|
|
273
|
+
except (
|
|
274
|
+
OpenSSL.SSL.SysCallError,
|
|
275
|
+
OSError,
|
|
276
|
+
) as ex:
|
|
277
|
+
err = ex
|
|
278
|
+
sleeping_time = min(sleeping_time * 2, 16)
|
|
279
|
+
time.sleep(sleeping_time)
|
|
280
|
+
if err:
|
|
281
|
+
raise err
|