snowflake-connector-python 3.18.0__tar.gz → 3.18.1__tar.gz
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_python-3.18.0 → snowflake_connector_python-3.18.1}/DESCRIPTION.md +4 -2
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/PKG-INFO +5 -3
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/azure_storage_client.py +7 -5
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/pandas_tools.py +1 -1
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/ssl_wrap_socket.py +126 -5
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/util_text.py +4 -2
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/version.py +1 -1
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake_connector_python.egg-info/PKG-INFO +5 -3
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/CONTRIBUTING.md +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/LICENSE.txt +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/MANIFEST.in +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/NOTICE +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/README.md +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/SECURITY.md +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/pyproject.toml +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/setup.cfg +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/setup.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/__init__.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/_utils.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/arrow_context.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/_auth.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/_http_server.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/_oauth_base.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/keypair.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/no_auth.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/oauth_code.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/okta.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/pat.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/webbrowser.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/workload_identity.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/cache.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/compat.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/config_manager.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/connection.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/connection_diagnostic.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/constants.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/converter.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/cursor.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/description.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/errorcode.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/errors.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/externals_utils/__init__.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/file_lock.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/file_transfer_agent.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/interval_util.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/logging_utils/__init__.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/logging_utils/filters.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/network.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/ocsp_snowflake.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/options.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/platform_detection.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/result_batch.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/result_set.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/s3_storage_client.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/secret_detector.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/session_manager.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/sqlstate.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/storage_client.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/telemetry.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/test_util.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/token_cache.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/url_util.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/packages.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/wif_util.py +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake_connector_python.egg-info/requires.txt +0 -0
- {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -7,8 +7,10 @@ https://docs.snowflake.com/
|
|
|
7
7
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
8
8
|
|
|
9
9
|
# Release Notes
|
|
10
|
-
- v3.
|
|
11
|
-
-
|
|
10
|
+
- v3.18.1(July 15,2026)
|
|
11
|
+
- Improved verification of TLS connections (SNOW-3675579).
|
|
12
|
+
- Fixed FIPS environments md5 hash issues with multipart upload on Azure.
|
|
13
|
+
- Fixed a bug where Azure GET commands would incorrectly set the file status to UPLOADED instead of preserving the DOWNLOADED status during metadata retrieval.
|
|
12
14
|
|
|
13
15
|
- v3.18.0(October 03,2025)
|
|
14
16
|
- Added support for pandas conversion for Day-time and Year-Month Interval types
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 3.18.
|
|
3
|
+
Version: 3.18.1
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -86,8 +86,10 @@ https://docs.snowflake.com/
|
|
|
86
86
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
87
87
|
|
|
88
88
|
# Release Notes
|
|
89
|
-
- v3.
|
|
90
|
-
-
|
|
89
|
+
- v3.18.1(July 15,2026)
|
|
90
|
+
- Improved verification of TLS connections (SNOW-3675579).
|
|
91
|
+
- Fixed FIPS environments md5 hash issues with multipart upload on Azure.
|
|
92
|
+
- Fixed a bug where Azure GET commands would incorrectly set the file status to UPLOADED instead of preserving the DOWNLOADED status during metadata retrieval.
|
|
91
93
|
|
|
92
94
|
- v3.18.0(October 03,2025)
|
|
93
95
|
- Added support for pandas conversion for Day-time and Year-Month Interval types
|
|
@@ -14,7 +14,7 @@ from .compat import quote
|
|
|
14
14
|
from .constants import FileHeader, ResultStatus
|
|
15
15
|
from .encryption_util import EncryptionMetadata
|
|
16
16
|
from .storage_client import SnowflakeStorageClient
|
|
17
|
-
from .util_text import
|
|
17
|
+
from .util_text import get_md5_for_integrity
|
|
18
18
|
from .vendored import requests
|
|
19
19
|
|
|
20
20
|
if TYPE_CHECKING: # pragma: no cover
|
|
@@ -124,7 +124,9 @@ class SnowflakeAzureRestClient(SnowflakeStorageClient):
|
|
|
124
124
|
self.retry_count[retry_id] = 0
|
|
125
125
|
r = self._send_request_with_authentication_and_retry("HEAD", url, retry_id)
|
|
126
126
|
if r.status_code == 200:
|
|
127
|
-
|
|
127
|
+
# If we are in download path, do not update to UPLOADED
|
|
128
|
+
if meta.result_status != ResultStatus.DOWNLOADED:
|
|
129
|
+
meta.result_status = ResultStatus.UPLOADED
|
|
128
130
|
enc_data_str = r.headers.get(ENCRYPTION_DATA)
|
|
129
131
|
encryption_data = None if enc_data_str is None else json.loads(enc_data_str)
|
|
130
132
|
encryption_metadata = (
|
|
@@ -241,9 +243,9 @@ class SnowflakeAzureRestClient(SnowflakeStorageClient):
|
|
|
241
243
|
fd.close()
|
|
242
244
|
headers = {
|
|
243
245
|
"x-ms-blob-content-encoding": "utf-8",
|
|
244
|
-
"x-ms-blob-content-md5": base64.b64encode(
|
|
245
|
-
|
|
246
|
-
),
|
|
246
|
+
"x-ms-blob-content-md5": base64.b64encode(
|
|
247
|
+
get_md5_for_integrity(file_content)
|
|
248
|
+
).decode("utf-8"),
|
|
247
249
|
}
|
|
248
250
|
azure_metadata = self._prepare_file_metadata()
|
|
249
251
|
headers.update(azure_metadata)
|
|
@@ -408,7 +408,7 @@ def write_pandas(
|
|
|
408
408
|
):
|
|
409
409
|
warnings.warn(
|
|
410
410
|
"Dataframe contains a datetime with timezone column, but "
|
|
411
|
-
f"'{use_logical_type=}'. This can result in
|
|
411
|
+
f"'{use_logical_type=}'. This can result in datetimes "
|
|
412
412
|
"being incorrectly written to Snowflake. Consider setting "
|
|
413
413
|
"'use_logical_type = True'",
|
|
414
414
|
UserWarning,
|
|
@@ -28,6 +28,7 @@ from .session_manager import SessionManager
|
|
|
28
28
|
from .vendored.urllib3 import connection as connection_
|
|
29
29
|
from .vendored.urllib3.contrib.pyopenssl import PyOpenSSLContext, WrappedSocket
|
|
30
30
|
from .vendored.urllib3.util import ssl_ as ssl_
|
|
31
|
+
from .vendored.urllib3.util.ssl_match_hostname import CertificateError, match_hostname
|
|
31
32
|
|
|
32
33
|
DEFAULT_OCSP_MODE: OCSPMode = OCSPMode.FAIL_OPEN
|
|
33
34
|
FEATURE_OCSP_MODE: OCSPMode = DEFAULT_OCSP_MODE
|
|
@@ -76,13 +77,79 @@ def _ensure_partial_chain_on_context(ctx: PyOpenSSLContext, cafile: str | None)
|
|
|
76
77
|
pass
|
|
77
78
|
|
|
78
79
|
|
|
79
|
-
def
|
|
80
|
-
"""
|
|
80
|
+
def _nonnegative_options(value: int) -> int:
|
|
81
|
+
"""Return *value* as the non-negative bitmask pyOpenSSL/cryptography expects.
|
|
82
|
+
|
|
83
|
+
``ssl.SSLContext.options`` is exposed through a signed, platform-width C
|
|
84
|
+
``long``. On Windows that type is 32 bits, so the common default mask (which
|
|
85
|
+
has bit 31 set, e.g. ``0x82520050``) is returned as a *negative* Python int.
|
|
86
|
+
cryptography's binding marshals the value into an unsigned parameter and
|
|
87
|
+
rejects negatives with ``OverflowError: can't convert negative number to
|
|
88
|
+
unsigned`` -- which previously aborted every Windows TLS handshake the
|
|
89
|
+
moment we carried these options onto the substituted ``PyOpenSSLContext``.
|
|
90
|
+
Recover the intended unsigned 32-bit mask; values that are already
|
|
91
|
+
non-negative (every other platform) pass through unchanged.
|
|
92
|
+
"""
|
|
93
|
+
return value & 0xFFFFFFFF if value < 0 else value
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _apply_stdlib_hardening(dst: PyOpenSSLContext, src: ssl.SSLContext | None) -> None:
|
|
97
|
+
"""Carry TLS hardening from a stdlib ``SSLContext`` onto ``dst``.
|
|
98
|
+
|
|
99
|
+
The connector replaces the stdlib ``ssl.SSLContext`` that urllib3 builds
|
|
100
|
+
(or that a caller supplied) with a ``PyOpenSSLContext``. Without copying the
|
|
101
|
+
original context's hardening forward, the substitution silently drops the
|
|
102
|
+
TLS-version floor and ``OP_NO_*`` options urllib3 configured and
|
|
103
|
+
any hardening a caller set on a supplied context. Copy the
|
|
104
|
+
settings we can read back; fall back to urllib3's default floor when there
|
|
105
|
+
is no source context to mirror.
|
|
106
|
+
|
|
107
|
+
Limitation: cipher restrictions and pinned CA material (``cadata`` /
|
|
108
|
+
``load_verify_locations``) cannot be read back out of an ``ssl.SSLContext``,
|
|
109
|
+
so they cannot be transferred here. Honoring caller-supplied pinning needs a
|
|
110
|
+
dedicated, supported channel and is tracked as a follow-up.
|
|
111
|
+
"""
|
|
112
|
+
if isinstance(src, ssl.SSLContext):
|
|
113
|
+
# Mirror the protocol-version floor/ceiling and OpenSSL options the
|
|
114
|
+
# original context carried (e.g. TLS 1.2 minimum, OP_NO_SSLv3,
|
|
115
|
+
# OP_NO_COMPRESSION) plus any caller hardening (e.g. VERIFY_X509_STRICT).
|
|
116
|
+
for attr in ("minimum_version", "maximum_version", "verify_flags"):
|
|
117
|
+
try:
|
|
118
|
+
setattr(dst, attr, getattr(src, attr))
|
|
119
|
+
except (ValueError, OSError, OpenSSL.SSL.Error):
|
|
120
|
+
# Best-effort; an unsupported value must not break the handshake.
|
|
121
|
+
pass
|
|
122
|
+
try:
|
|
123
|
+
dst.options |= _nonnegative_options(src.options)
|
|
124
|
+
except (ValueError, OSError, OpenSSL.SSL.Error, OverflowError, TypeError):
|
|
125
|
+
# Best-effort; carrying options forward must never break the
|
|
126
|
+
# handshake even if a value can't be marshalled into pyOpenSSL.
|
|
127
|
+
pass
|
|
128
|
+
else:
|
|
129
|
+
# No source context to mirror (no ssl_context was supplied): restore the
|
|
130
|
+
# hardening urllib3's create_urllib3_context() would have applied.
|
|
131
|
+
try:
|
|
132
|
+
dst.minimum_version = ssl.TLSVersion.TLSv1_2
|
|
133
|
+
dst.options |= ssl.OP_NO_COMPRESSION
|
|
134
|
+
except (ValueError, OSError, OpenSSL.SSL.Error, OverflowError, TypeError):
|
|
135
|
+
pass
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def _build_context_with_partial_chain(
|
|
139
|
+
cafile: str | None, src_context: ssl.SSLContext | None = None
|
|
140
|
+
) -> PyOpenSSLContext:
|
|
141
|
+
"""Create PyOpenSSL context configured for CERT_REQUIRED and partial-chain trust.
|
|
142
|
+
|
|
143
|
+
When ``src_context`` is the stdlib context being replaced, its TLS hardening
|
|
144
|
+
(version floor, options, verify flags) is carried forward so the
|
|
145
|
+
substitution does not weaken the connection.
|
|
146
|
+
"""
|
|
81
147
|
ctx = PyOpenSSLContext(ssl_.PROTOCOL_TLS_CLIENT)
|
|
82
148
|
try:
|
|
83
149
|
ctx.verify_mode = ssl.CERT_REQUIRED
|
|
84
150
|
except Exception:
|
|
85
151
|
pass
|
|
152
|
+
_apply_stdlib_hardening(ctx, src_context)
|
|
86
153
|
_ensure_partial_chain_on_context(ctx, cafile)
|
|
87
154
|
return ctx
|
|
88
155
|
|
|
@@ -144,6 +211,54 @@ def inject_into_urllib3() -> None:
|
|
|
144
211
|
connection_.ssl_wrap_socket = ssl_wrap_socket_with_ocsp
|
|
145
212
|
|
|
146
213
|
|
|
214
|
+
def _verify_hostname_after_handshake(
|
|
215
|
+
wrapped_socket: WrappedSocket,
|
|
216
|
+
server_hostname: str | None,
|
|
217
|
+
ssl_context: Any,
|
|
218
|
+
) -> None:
|
|
219
|
+
"""Match the peer certificate against *server_hostname*."""
|
|
220
|
+
# Honor explicitly-disabled certificate verification (CERT_NONE) first; when
|
|
221
|
+
# verification is off there is nothing to assert about server identity, so a
|
|
222
|
+
# missing hostname is acceptable. Check this before the hostname so we only
|
|
223
|
+
# skip when the caller genuinely opted out of verification.
|
|
224
|
+
verify_mode = getattr(ssl_context, "verify_mode", ssl.CERT_REQUIRED)
|
|
225
|
+
if verify_mode == ssl.CERT_NONE:
|
|
226
|
+
return
|
|
227
|
+
|
|
228
|
+
# Verification is required but there is no host to match against (e.g. TLS
|
|
229
|
+
# without SNI). Fail closed rather than accepting the peer: without a
|
|
230
|
+
# hostname we cannot assert server identity.
|
|
231
|
+
if not server_hostname:
|
|
232
|
+
raise CertificateError(
|
|
233
|
+
"no server hostname supplied to match against the peer certificate; "
|
|
234
|
+
"cannot verify server identity"
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
# Normalize bracketed / scoped IPv6 literals the same way urllib3 does:
|
|
238
|
+
# strip the brackets and drop any "%scope" suffix before testing for an IP,
|
|
239
|
+
# since Python's ssl module treats scoped addresses as DNS hostnames.
|
|
240
|
+
normalized = server_hostname.strip("[]")
|
|
241
|
+
if "%" in normalized:
|
|
242
|
+
normalized = normalized[: normalized.rfind("%")]
|
|
243
|
+
if ssl_.is_ipaddress(normalized):
|
|
244
|
+
server_hostname = normalized
|
|
245
|
+
|
|
246
|
+
cert = wrapped_socket.getpeercert()
|
|
247
|
+
try:
|
|
248
|
+
match_hostname(cert, server_hostname)
|
|
249
|
+
except CertificateError as e:
|
|
250
|
+
log.warning(
|
|
251
|
+
"Certificate did not match expected hostname: %s. Certificate: %s",
|
|
252
|
+
server_hostname,
|
|
253
|
+
cert,
|
|
254
|
+
)
|
|
255
|
+
# Attach the cert so callers catching CertificateError can inspect it,
|
|
256
|
+
# matching urllib3's own _match_hostname behavior.
|
|
257
|
+
e._peer_cert = cert
|
|
258
|
+
wrapped_socket.close()
|
|
259
|
+
raise
|
|
260
|
+
|
|
261
|
+
|
|
147
262
|
@wraps(ssl_.ssl_wrap_socket)
|
|
148
263
|
def ssl_wrap_socket_with_ocsp(*args: Any, **kwargs: Any) -> WrappedSocket:
|
|
149
264
|
# Bind passed args/kwargs to the underlying signature to support both positional and keyword calls
|
|
@@ -158,15 +273,21 @@ def ssl_wrap_socket_with_ocsp(*args: Any, **kwargs: Any) -> WrappedSocket:
|
|
|
158
273
|
|
|
159
274
|
# Ensure PyOpenSSL context with partial-chain is used if none or wrong type provided
|
|
160
275
|
provided_ctx = params.get("ssl_context")
|
|
276
|
+
cafile_for_ctx = _resolve_cafile(params)
|
|
161
277
|
if not isinstance(provided_ctx, PyOpenSSLContext):
|
|
162
|
-
|
|
163
|
-
|
|
278
|
+
# Carry the replaced stdlib context's TLS hardening forward so the
|
|
279
|
+
# substitution doesn't silently weaken the connection.
|
|
280
|
+
params["ssl_context"] = _build_context_with_partial_chain(
|
|
281
|
+
cafile_for_ctx, src_context=provided_ctx
|
|
282
|
+
)
|
|
164
283
|
else:
|
|
165
284
|
# If a PyOpenSSLContext is provided, ensure it trusts the provided CA and partial-chain is enabled
|
|
166
|
-
_ensure_partial_chain_on_context(provided_ctx,
|
|
285
|
+
_ensure_partial_chain_on_context(provided_ctx, cafile_for_ctx)
|
|
167
286
|
|
|
168
287
|
ret = ssl_.ssl_wrap_socket(**params)
|
|
169
288
|
|
|
289
|
+
_verify_hostname_after_handshake(ret, server_hostname, params.get("ssl_context"))
|
|
290
|
+
|
|
170
291
|
log.debug(
|
|
171
292
|
"OCSP Mode: %s, OCSP response cache file name: %s",
|
|
172
293
|
FEATURE_OCSP_MODE.name,
|
|
@@ -293,9 +293,11 @@ def _base64_bytes_to_str(x) -> str | None:
|
|
|
293
293
|
return base64.b64encode(x).decode("utf-8") if x else None
|
|
294
294
|
|
|
295
295
|
|
|
296
|
-
def
|
|
296
|
+
def get_md5_for_integrity(text: str | bytes) -> bytes:
|
|
297
|
+
# MD5 should not be used for security reasons - only integrity is safe and allowed
|
|
297
298
|
if isinstance(text, str):
|
|
298
299
|
text = text.encode("utf-8")
|
|
299
|
-
|
|
300
|
+
# Usedforsecurity=False added to support FIPS envs as well
|
|
301
|
+
md5 = hashlib.md5(usedforsecurity=False)
|
|
300
302
|
md5.update(text)
|
|
301
303
|
return md5.digest()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 3.18.
|
|
3
|
+
Version: 3.18.1
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -86,8 +86,10 @@ https://docs.snowflake.com/
|
|
|
86
86
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
87
87
|
|
|
88
88
|
# Release Notes
|
|
89
|
-
- v3.
|
|
90
|
-
-
|
|
89
|
+
- v3.18.1(July 15,2026)
|
|
90
|
+
- Improved verification of TLS connections (SNOW-3675579).
|
|
91
|
+
- Fixed FIPS environments md5 hash issues with multipart upload on Azure.
|
|
92
|
+
- Fixed a bug where Azure GET commands would incorrectly set the file status to UPLOADED instead of preserving the DOWNLOADED status during metadata retrieval.
|
|
91
93
|
|
|
92
94
|
- v3.18.0(October 03,2025)
|
|
93
95
|
- Added support for pandas conversion for Day-time and Year-Month Interval types
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|