snowflake-connector-python 3.14.1__tar.gz → 3.15.0__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.14.1 → snowflake_connector_python-3.15.0}/DESCRIPTION.md +11 -2
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/PKG-INFO +14 -5
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/setup.cfg +2 -2
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/oauth_code.py +4 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/connection.py +47 -30
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/connection_diagnostic.py +1 -1
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/errorcode.py +1 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/ocsp_asn1crypto.py +10 -3
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/tool/dump_ocsp_response.py +38 -21
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/version.py +1 -1
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake_connector_python.egg-info/PKG-INFO +14 -5
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake_connector_python.egg-info/requires.txt +2 -2
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/CONTRIBUTING.md +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/LICENSE.txt +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/MANIFEST.in +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/NOTICE +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/README.md +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/SECURITY.md +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/pyproject.toml +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/setup.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/__init__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/_utils.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/arrow_context.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/_auth.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/_http_server.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/_oauth_base.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/keypair.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/no_auth.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/okta.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/pat.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/webbrowser.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/auth/workload_identity.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/azure_storage_client.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/cache.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/compat.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/config_manager.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/constants.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/converter.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/cursor.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/description.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/errors.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/externals_utils/__init__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/file_lock.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/file_transfer_agent.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/logging_utils/__init__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/logging_utils/filters.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/network.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/ocsp_snowflake.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/options.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/pandas_tools.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/result_batch.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/result_set.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/s3_storage_client.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/secret_detector.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/sqlstate.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/storage_client.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/telemetry.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/test_util.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/token_cache.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/url_util.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/util_text.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/contrib/_appengine_environ.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/__init__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/bindings.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/low_level.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/contrib/appengine.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/contrib/ntlmpool.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/contrib/securetransport.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/packages/__init__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/packages/backports/__init__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/packages/backports/makefile.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/packages/backports/weakref_finalize.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/packages/six.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/request.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/util/queue.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake/connector/wif_util.py +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-3.14.1 → snowflake_connector_python-3.15.0}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -7,8 +7,17 @@ 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.15(
|
|
11
|
-
-
|
|
10
|
+
- v3.15.0(Apr 29,2025)
|
|
11
|
+
- Bumped up min boto and botocore version to 1.24.
|
|
12
|
+
- OCSP: terminate certificates chain traversal if a trusted certificate already reached.
|
|
13
|
+
- Added new authentication methods support for programmatic access tokens (PATs), OAuth 2.0 Authorization Code Flow, OAuth 2.0 Client Credentials Flow, and OAuth Token caching.
|
|
14
|
+
- For OAuth 2.0 Authorization Code Flow:
|
|
15
|
+
- Added the `oauth_client_id`, `oauth_client_secret`, `oauth_authorization_url`, `oauth_token_request_url`, `oauth_redirect_uri`, `oauth_scope`, `oauth_disable_pkce`, `oauth_enable_refresh_tokens` and `oauth_enable_single_use_refresh_tokens` parameters.
|
|
16
|
+
- Added the `OAUTH_AUTHORIZATION_CODE` value for the parameter authenticator.
|
|
17
|
+
- For OAuth 2.0 Client Credentials Flow:
|
|
18
|
+
- Added the `oauth_client_id`, `oauth_client_secret`, `oauth_token_request_url`, and `oauth_scope` parameters.
|
|
19
|
+
- Added the `OAUTH_CLIENT_CREDENTIALS` value for the parameter authenticator.
|
|
20
|
+
- For OAuth Token caching: Passing a username to driver configuration is required, and the `client_store_temporary_credential property` is to be set to `true`.
|
|
12
21
|
|
|
13
22
|
- v3.14.1(April 21, 2025)
|
|
14
23
|
- Added support for Python 3.13.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.15.0
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -39,8 +39,8 @@ Description-Content-Type: text/markdown
|
|
|
39
39
|
License-File: LICENSE.txt
|
|
40
40
|
License-File: NOTICE
|
|
41
41
|
Requires-Dist: asn1crypto<2.0.0,>0.24.0
|
|
42
|
-
Requires-Dist: boto3>=1.
|
|
43
|
-
Requires-Dist: botocore>=1.
|
|
42
|
+
Requires-Dist: boto3>=1.24
|
|
43
|
+
Requires-Dist: botocore>=1.24
|
|
44
44
|
Requires-Dist: cffi<2.0.0,>=1.9
|
|
45
45
|
Requires-Dist: cryptography>=3.1.0
|
|
46
46
|
Requires-Dist: pyOpenSSL<26.0.0,>=22.0.0
|
|
@@ -86,8 +86,17 @@ 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.15(
|
|
90
|
-
-
|
|
89
|
+
- v3.15.0(Apr 29,2025)
|
|
90
|
+
- Bumped up min boto and botocore version to 1.24.
|
|
91
|
+
- OCSP: terminate certificates chain traversal if a trusted certificate already reached.
|
|
92
|
+
- Added new authentication methods support for programmatic access tokens (PATs), OAuth 2.0 Authorization Code Flow, OAuth 2.0 Client Credentials Flow, and OAuth Token caching.
|
|
93
|
+
- For OAuth 2.0 Authorization Code Flow:
|
|
94
|
+
- Added the `oauth_client_id`, `oauth_client_secret`, `oauth_authorization_url`, `oauth_token_request_url`, `oauth_redirect_uri`, `oauth_scope`, `oauth_disable_pkce`, `oauth_enable_refresh_tokens` and `oauth_enable_single_use_refresh_tokens` parameters.
|
|
95
|
+
- Added the `OAUTH_AUTHORIZATION_CODE` value for the parameter authenticator.
|
|
96
|
+
- For OAuth 2.0 Client Credentials Flow:
|
|
97
|
+
- Added the `oauth_client_id`, `oauth_client_secret`, `oauth_token_request_url`, and `oauth_scope` parameters.
|
|
98
|
+
- Added the `OAUTH_CLIENT_CREDENTIALS` value for the parameter authenticator.
|
|
99
|
+
- For OAuth Token caching: Passing a username to driver configuration is required, and the `client_store_temporary_credential property` is to be set to `true`.
|
|
91
100
|
|
|
92
101
|
- v3.14.1(April 21, 2025)
|
|
93
102
|
- Added support for Python 3.13.
|
|
@@ -58,6 +58,7 @@ class AuthByOauthCode(AuthByOAuthBase):
|
|
|
58
58
|
token_cache: TokenCache | None = None,
|
|
59
59
|
refresh_token_enabled: bool = False,
|
|
60
60
|
external_browser_timeout: int | None = None,
|
|
61
|
+
enable_single_use_refresh_tokens: bool = False,
|
|
61
62
|
**kwargs,
|
|
62
63
|
) -> None:
|
|
63
64
|
super().__init__(
|
|
@@ -81,6 +82,7 @@ class AuthByOauthCode(AuthByOAuthBase):
|
|
|
81
82
|
logger.debug("oauth pkce is going to be used")
|
|
82
83
|
self._verifier: str | None = None
|
|
83
84
|
self._external_browser_timeout = external_browser_timeout
|
|
85
|
+
self._enable_single_use_refresh_tokens = enable_single_use_refresh_tokens
|
|
84
86
|
|
|
85
87
|
def _get_oauth_type_id(self) -> str:
|
|
86
88
|
return OAUTH_TYPE_AUTHORIZATION_CODE
|
|
@@ -296,6 +298,8 @@ You can close this window now and go back where you started from.
|
|
|
296
298
|
"code": code,
|
|
297
299
|
"redirect_uri": callback_server.url,
|
|
298
300
|
}
|
|
301
|
+
if self._enable_single_use_refresh_tokens:
|
|
302
|
+
fields["enable_single_use_refresh_tokens"] = "true"
|
|
299
303
|
if self._pkce_enabled:
|
|
300
304
|
assert self._verifier is not None
|
|
301
305
|
fields["code_verifier"] = self._verifier
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
4
|
import atexit
|
|
5
|
-
import collections.abc
|
|
6
5
|
import logging
|
|
7
6
|
import os
|
|
8
7
|
import pathlib
|
|
@@ -94,6 +93,7 @@ from .errorcode import (
|
|
|
94
93
|
ER_INVALID_WIF_SETTINGS,
|
|
95
94
|
ER_NO_ACCOUNT_NAME,
|
|
96
95
|
ER_NO_CLIENT_ID,
|
|
96
|
+
ER_NO_CLIENT_SECRET,
|
|
97
97
|
ER_NO_NUMPY,
|
|
98
98
|
ER_NO_PASSWORD,
|
|
99
99
|
ER_NO_USER,
|
|
@@ -346,11 +346,20 @@ DEFAULT_CONFIGURATION: dict[str, tuple[Any, type | tuple[type, ...]]] = {
|
|
|
346
346
|
str,
|
|
347
347
|
# SNOW-1825621: OAUTH implementation
|
|
348
348
|
),
|
|
349
|
-
"
|
|
350
|
-
|
|
351
|
-
|
|
349
|
+
"oauth_disable_pkce": (
|
|
350
|
+
False,
|
|
351
|
+
bool,
|
|
352
352
|
# SNOW-1825621: OAUTH PKCE
|
|
353
353
|
),
|
|
354
|
+
"oauth_enable_refresh_tokens": (
|
|
355
|
+
False,
|
|
356
|
+
bool,
|
|
357
|
+
),
|
|
358
|
+
"oauth_enable_single_use_refresh_tokens": (
|
|
359
|
+
False,
|
|
360
|
+
bool,
|
|
361
|
+
# Client-side opt-in to single-use refresh tokens.
|
|
362
|
+
),
|
|
354
363
|
"check_arrow_conversion_error_on_every_column": (
|
|
355
364
|
True,
|
|
356
365
|
bool,
|
|
@@ -838,21 +847,6 @@ class SnowflakeConnection:
|
|
|
838
847
|
def unsafe_file_write(self, value: bool) -> None:
|
|
839
848
|
self._unsafe_file_write = value
|
|
840
849
|
|
|
841
|
-
class _OAuthSecurityFeatures(NamedTuple):
|
|
842
|
-
pkce_enabled: bool
|
|
843
|
-
refresh_token_enabled: bool
|
|
844
|
-
|
|
845
|
-
@property
|
|
846
|
-
def oauth_security_features(self) -> _OAuthSecurityFeatures:
|
|
847
|
-
features = self._oauth_security_features
|
|
848
|
-
if isinstance(features, str):
|
|
849
|
-
features = features.split(" ")
|
|
850
|
-
features = [feat.lower() for feat in features]
|
|
851
|
-
return self._OAuthSecurityFeatures(
|
|
852
|
-
pkce_enabled="pkce" in features,
|
|
853
|
-
refresh_token_enabled="refresh_token" in features,
|
|
854
|
-
)
|
|
855
|
-
|
|
856
850
|
@property
|
|
857
851
|
def check_arrow_conversion_error_on_every_column(self) -> bool:
|
|
858
852
|
return self._check_arrow_conversion_error_on_every_column
|
|
@@ -1210,9 +1204,7 @@ class SnowflakeConnection:
|
|
|
1210
1204
|
backoff_generator=self._backoff_generator,
|
|
1211
1205
|
)
|
|
1212
1206
|
elif self._authenticator == OAUTH_AUTHORIZATION_CODE:
|
|
1213
|
-
self.
|
|
1214
|
-
self._check_oauth_required_parameters()
|
|
1215
|
-
features = self.oauth_security_features
|
|
1207
|
+
self._check_oauth_parameters()
|
|
1216
1208
|
if self._role and (self._oauth_scope == ""):
|
|
1217
1209
|
# if role is known then let's inject it into scope
|
|
1218
1210
|
self._oauth_scope = _OAUTH_DEFAULT_SCOPE.format(role=self._role)
|
|
@@ -1228,19 +1220,18 @@ class SnowflakeConnection:
|
|
|
1228
1220
|
),
|
|
1229
1221
|
redirect_uri=self._oauth_redirect_uri,
|
|
1230
1222
|
scope=self._oauth_scope,
|
|
1231
|
-
pkce_enabled=
|
|
1223
|
+
pkce_enabled=not self._oauth_disable_pkce,
|
|
1232
1224
|
token_cache=(
|
|
1233
1225
|
auth.get_token_cache()
|
|
1234
1226
|
if self._client_store_temporary_credential
|
|
1235
1227
|
else None
|
|
1236
1228
|
),
|
|
1237
|
-
refresh_token_enabled=
|
|
1229
|
+
refresh_token_enabled=self._oauth_enable_refresh_tokens,
|
|
1238
1230
|
external_browser_timeout=self._external_browser_timeout,
|
|
1231
|
+
enable_single_use_refresh_tokens=self._oauth_enable_single_use_refresh_tokens,
|
|
1239
1232
|
)
|
|
1240
1233
|
elif self._authenticator == OAUTH_CLIENT_CREDENTIALS:
|
|
1241
|
-
self.
|
|
1242
|
-
self._check_oauth_required_parameters()
|
|
1243
|
-
features = self.oauth_security_features
|
|
1234
|
+
self._check_oauth_parameters()
|
|
1244
1235
|
if self._role and (self._oauth_scope == ""):
|
|
1245
1236
|
# if role is known then let's inject it into scope
|
|
1246
1237
|
self._oauth_scope = _OAUTH_DEFAULT_SCOPE.format(role=self._role)
|
|
@@ -1257,7 +1248,7 @@ class SnowflakeConnection:
|
|
|
1257
1248
|
if self._client_store_temporary_credential
|
|
1258
1249
|
else None
|
|
1259
1250
|
),
|
|
1260
|
-
refresh_token_enabled=
|
|
1251
|
+
refresh_token_enabled=self._oauth_enable_refresh_tokens,
|
|
1261
1252
|
)
|
|
1262
1253
|
elif self._authenticator == USR_PWD_MFA_AUTHENTICATOR:
|
|
1263
1254
|
self._session_parameters[PARAMETER_CLIENT_REQUEST_MFA_TOKEN] = (
|
|
@@ -2245,7 +2236,7 @@ class SnowflakeConnection:
|
|
|
2245
2236
|
},
|
|
2246
2237
|
)
|
|
2247
2238
|
|
|
2248
|
-
def
|
|
2239
|
+
def _check_oauth_parameters(self) -> None:
|
|
2249
2240
|
if self._oauth_client_id is None:
|
|
2250
2241
|
Error.errorhandler_wrapper(
|
|
2251
2242
|
self,
|
|
@@ -2263,6 +2254,32 @@ class SnowflakeConnection:
|
|
|
2263
2254
|
ProgrammingError,
|
|
2264
2255
|
{
|
|
2265
2256
|
"msg": "Oauth code flow requirement 'client_secret' is empty",
|
|
2266
|
-
"errno":
|
|
2257
|
+
"errno": ER_NO_CLIENT_SECRET,
|
|
2258
|
+
},
|
|
2259
|
+
)
|
|
2260
|
+
if (
|
|
2261
|
+
self._oauth_authorization_url
|
|
2262
|
+
and not self._oauth_authorization_url.startswith("https://")
|
|
2263
|
+
):
|
|
2264
|
+
Error.errorhandler_wrapper(
|
|
2265
|
+
self,
|
|
2266
|
+
None,
|
|
2267
|
+
ProgrammingError,
|
|
2268
|
+
{
|
|
2269
|
+
"msg": "OAuth supports only authorization urls that use 'https' scheme",
|
|
2270
|
+
"errno": ER_INVALID_VALUE,
|
|
2271
|
+
},
|
|
2272
|
+
)
|
|
2273
|
+
if self._oauth_redirect_uri and not (
|
|
2274
|
+
self._oauth_redirect_uri.startswith("http://")
|
|
2275
|
+
or self._oauth_redirect_uri.startswith("https://")
|
|
2276
|
+
):
|
|
2277
|
+
Error.errorhandler_wrapper(
|
|
2278
|
+
self,
|
|
2279
|
+
None,
|
|
2280
|
+
ProgrammingError,
|
|
2281
|
+
{
|
|
2282
|
+
"msg": "OAuth supports only authorization urls that use 'http(s)' scheme",
|
|
2283
|
+
"errno": ER_INVALID_VALUE,
|
|
2267
2284
|
},
|
|
2268
2285
|
)
|
|
@@ -579,7 +579,7 @@ class ConnectionDiagnostic:
|
|
|
579
579
|
cert_reqs=cert_reqs,
|
|
580
580
|
)
|
|
581
581
|
resp = http.request(
|
|
582
|
-
"GET", "https://nonexistentdomain.
|
|
582
|
+
"GET", "https://nonexistentdomain.invalid", timeout=10.0
|
|
583
583
|
)
|
|
584
584
|
|
|
585
585
|
# squid does not throw exception. Check HTML
|
|
@@ -34,6 +34,7 @@ ER_OAUTH_SERVER_TIMEOUT = 251016
|
|
|
34
34
|
ER_INVALID_WIF_SETTINGS = 251017
|
|
35
35
|
ER_WIF_CREDENTIALS_NOT_FOUND = 251018
|
|
36
36
|
ER_EXPERIMENTAL_AUTHENTICATION_NOT_SUPPORTED = 251019
|
|
37
|
+
ER_NO_CLIENT_SECRET = 251020
|
|
37
38
|
|
|
38
39
|
# cursor
|
|
39
40
|
ER_FAILED_TO_REWRITE_MULTI_ROW_INSERT = 252001
|
|
@@ -394,15 +394,22 @@ class SnowflakeOCSPAsn1Crypto(SnowflakeOCSP):
|
|
|
394
394
|
from OpenSSL.crypto import FILETYPE_ASN1, dump_certificate
|
|
395
395
|
|
|
396
396
|
cert_map = OrderedDict()
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
397
|
+
cert_chain = connection.get_peer_cert_chain()
|
|
398
|
+
logger.debug("# of certificates: %s", len(cert_chain))
|
|
399
|
+
self._lazy_read_ca_bundle()
|
|
400
|
+
for cert_openssl in cert_chain:
|
|
400
401
|
cert_der = dump_certificate(FILETYPE_ASN1, cert_openssl)
|
|
401
402
|
cert = Certificate.load(cert_der)
|
|
402
403
|
logger.debug(
|
|
403
404
|
"subject: %s, issuer: %s", cert.subject.native, cert.issuer.native
|
|
404
405
|
)
|
|
405
406
|
cert_map[cert.subject.sha256] = cert
|
|
407
|
+
if cert.issuer.sha256 in SnowflakeOCSP.ROOT_CERTIFICATES_DICT:
|
|
408
|
+
logger.debug(
|
|
409
|
+
"A trusted root certificate found: %s, stopping chain traversal here",
|
|
410
|
+
cert.subject.native,
|
|
411
|
+
)
|
|
412
|
+
break
|
|
406
413
|
|
|
407
414
|
return self.create_pair_issuer_subject(cert_map)
|
|
408
415
|
|
|
@@ -1,38 +1,55 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
|
+
import logging
|
|
5
|
+
import sys
|
|
4
6
|
import time
|
|
5
|
-
from
|
|
7
|
+
from argparse import ArgumentParser, Namespace
|
|
6
8
|
from time import gmtime, strftime
|
|
7
9
|
|
|
8
10
|
from asn1crypto import ocsp as asn1crypto_ocsp
|
|
9
11
|
|
|
10
12
|
from snowflake.connector.compat import urlsplit
|
|
11
13
|
from snowflake.connector.ocsp_asn1crypto import SnowflakeOCSPAsn1Crypto as SFOCSP
|
|
14
|
+
from snowflake.connector.ocsp_snowflake import OCSPTelemetryData
|
|
12
15
|
from snowflake.connector.ssl_wrap_socket import _openssl_connect
|
|
13
16
|
|
|
14
17
|
|
|
18
|
+
def _parse_args() -> Namespace:
|
|
19
|
+
parser = ArgumentParser(
|
|
20
|
+
prog="dump_ocsp_response",
|
|
21
|
+
description="Dump OCSP Response for the URLs (an internal tool).",
|
|
22
|
+
)
|
|
23
|
+
parser.add_argument(
|
|
24
|
+
"-o",
|
|
25
|
+
"--output-file",
|
|
26
|
+
required=False,
|
|
27
|
+
help="Dump output file",
|
|
28
|
+
type=str,
|
|
29
|
+
default=None,
|
|
30
|
+
)
|
|
31
|
+
parser.add_argument(
|
|
32
|
+
"--log-level",
|
|
33
|
+
required=False,
|
|
34
|
+
help="Log level",
|
|
35
|
+
choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
|
|
36
|
+
)
|
|
37
|
+
parser.add_argument("--log-file", required=False, help="Log file", default=None)
|
|
38
|
+
parser.add_argument("urls", nargs="+", help="URLs to dump OCSP Response for")
|
|
39
|
+
return parser.parse_args()
|
|
40
|
+
|
|
41
|
+
|
|
15
42
|
def main() -> None:
|
|
16
43
|
"""Internal Tool: OCSP response dumper."""
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
Usage: {} <url> [<url> ...]
|
|
23
|
-
""".format(
|
|
24
|
-
path.basename(sys.argv[0])
|
|
44
|
+
args = _parse_args()
|
|
45
|
+
if args.log_level:
|
|
46
|
+
if args.log_file:
|
|
47
|
+
logging.basicConfig(
|
|
48
|
+
filename=args.log_file, level=getattr(logging, args.log_level.upper())
|
|
25
49
|
)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
import sys
|
|
30
|
-
|
|
31
|
-
if len(sys.argv) < 2:
|
|
32
|
-
help()
|
|
33
|
-
|
|
34
|
-
urls = sys.argv[1:]
|
|
35
|
-
dump_ocsp_response(urls, output_filename=None)
|
|
50
|
+
else:
|
|
51
|
+
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
|
|
52
|
+
dump_ocsp_response(args.urls, output_filename=args.output_file)
|
|
36
53
|
|
|
37
54
|
|
|
38
55
|
def dump_good_status(current_time, single_response) -> None:
|
|
@@ -87,7 +104,7 @@ def dump_ocsp_response(urls, output_filename):
|
|
|
87
104
|
for issuer, subject in cert_data:
|
|
88
105
|
_, _ = ocsp.create_ocsp_request(issuer, subject)
|
|
89
106
|
_, _, _, cert_id, ocsp_response_der = ocsp.validate_by_direct_connection(
|
|
90
|
-
issuer, subject
|
|
107
|
+
issuer, subject, OCSPTelemetryData()
|
|
91
108
|
)
|
|
92
109
|
ocsp_response = asn1crypto_ocsp.OCSPResponse.load(ocsp_response_der)
|
|
93
110
|
print("------------------------------------------------------------")
|
|
@@ -115,7 +132,7 @@ def dump_ocsp_response(urls, output_filename):
|
|
|
115
132
|
|
|
116
133
|
if output_filename:
|
|
117
134
|
SFOCSP.OCSP_CACHE.write_ocsp_response_cache_file(ocsp, output_filename)
|
|
118
|
-
return SFOCSP.OCSP_CACHE
|
|
135
|
+
return SFOCSP.OCSP_CACHE
|
|
119
136
|
|
|
120
137
|
|
|
121
138
|
if __name__ == "__main__":
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.15.0
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -39,8 +39,8 @@ Description-Content-Type: text/markdown
|
|
|
39
39
|
License-File: LICENSE.txt
|
|
40
40
|
License-File: NOTICE
|
|
41
41
|
Requires-Dist: asn1crypto<2.0.0,>0.24.0
|
|
42
|
-
Requires-Dist: boto3>=1.
|
|
43
|
-
Requires-Dist: botocore>=1.
|
|
42
|
+
Requires-Dist: boto3>=1.24
|
|
43
|
+
Requires-Dist: botocore>=1.24
|
|
44
44
|
Requires-Dist: cffi<2.0.0,>=1.9
|
|
45
45
|
Requires-Dist: cryptography>=3.1.0
|
|
46
46
|
Requires-Dist: pyOpenSSL<26.0.0,>=22.0.0
|
|
@@ -86,8 +86,17 @@ 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.15(
|
|
90
|
-
-
|
|
89
|
+
- v3.15.0(Apr 29,2025)
|
|
90
|
+
- Bumped up min boto and botocore version to 1.24.
|
|
91
|
+
- OCSP: terminate certificates chain traversal if a trusted certificate already reached.
|
|
92
|
+
- Added new authentication methods support for programmatic access tokens (PATs), OAuth 2.0 Authorization Code Flow, OAuth 2.0 Client Credentials Flow, and OAuth Token caching.
|
|
93
|
+
- For OAuth 2.0 Authorization Code Flow:
|
|
94
|
+
- Added the `oauth_client_id`, `oauth_client_secret`, `oauth_authorization_url`, `oauth_token_request_url`, `oauth_redirect_uri`, `oauth_scope`, `oauth_disable_pkce`, `oauth_enable_refresh_tokens` and `oauth_enable_single_use_refresh_tokens` parameters.
|
|
95
|
+
- Added the `OAUTH_AUTHORIZATION_CODE` value for the parameter authenticator.
|
|
96
|
+
- For OAuth 2.0 Client Credentials Flow:
|
|
97
|
+
- Added the `oauth_client_id`, `oauth_client_secret`, `oauth_token_request_url`, and `oauth_scope` parameters.
|
|
98
|
+
- Added the `OAUTH_CLIENT_CREDENTIALS` value for the parameter authenticator.
|
|
99
|
+
- For OAuth Token caching: Passing a username to driver configuration is required, and the `client_store_temporary_credential property` is to be set to `true`.
|
|
91
100
|
|
|
92
101
|
- v3.14.1(April 21, 2025)
|
|
93
102
|
- Added support for Python 3.13.
|
|
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
|