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.
Files changed (259) hide show
  1. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/DESCRIPTION.md +4 -2
  2. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/PKG-INFO +5 -3
  3. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/azure_storage_client.py +7 -5
  4. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/pandas_tools.py +1 -1
  5. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/ssl_wrap_socket.py +126 -5
  6. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/util_text.py +4 -2
  7. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/version.py +1 -1
  8. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake_connector_python.egg-info/PKG-INFO +5 -3
  9. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/CONTRIBUTING.md +0 -0
  10. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/LICENSE.txt +0 -0
  11. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/MANIFEST.in +0 -0
  12. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/NOTICE +0 -0
  13. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/README.md +0 -0
  14. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/SECURITY.md +0 -0
  15. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/pyproject.toml +0 -0
  16. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/setup.cfg +0 -0
  17. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/setup.py +0 -0
  18. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/__init__.py +0 -0
  19. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/_query_context_cache.py +0 -0
  20. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/_sql_util.py +0 -0
  21. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/_utils.py +0 -0
  22. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/arrow_context.py +0 -0
  23. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/__init__.py +0 -0
  24. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/_auth.py +0 -0
  25. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/_http_server.py +0 -0
  26. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/_oauth_base.py +0 -0
  27. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/by_plugin.py +0 -0
  28. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/default.py +0 -0
  29. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/idtoken.py +0 -0
  30. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/keypair.py +0 -0
  31. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/no_auth.py +0 -0
  32. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/oauth.py +0 -0
  33. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/oauth_code.py +0 -0
  34. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
  35. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/okta.py +0 -0
  36. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/pat.py +0 -0
  37. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  38. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/webbrowser.py +0 -0
  39. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/auth/workload_identity.py +0 -0
  40. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/backoff_policies.py +0 -0
  41. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/bind_upload_agent.py +0 -0
  42. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/cache.py +0 -0
  43. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/compat.py +0 -0
  44. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/config_manager.py +0 -0
  45. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/connection.py +0 -0
  46. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/connection_diagnostic.py +0 -0
  47. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/constants.py +0 -0
  48. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/converter.py +0 -0
  49. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/converter_issue23517.py +0 -0
  50. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/converter_null.py +0 -0
  51. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/converter_snowsql.py +0 -0
  52. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/cursor.py +0 -0
  53. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/dbapi.py +0 -0
  54. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/description.py +0 -0
  55. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
  56. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/encryption_util.py +0 -0
  57. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/errorcode.py +0 -0
  58. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/errors.py +0 -0
  59. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/externals_utils/__init__.py +0 -0
  60. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
  61. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/feature.py +0 -0
  62. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/file_compression_type.py +0 -0
  63. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/file_lock.py +0 -0
  64. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/file_transfer_agent.py +0 -0
  65. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/file_util.py +0 -0
  66. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/gcs_storage_client.py +0 -0
  67. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/gzip_decoder.py +0 -0
  68. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/interval_util.py +0 -0
  69. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/local_storage_client.py +0 -0
  70. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/log_configuration.py +0 -0
  71. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/logging_utils/__init__.py +0 -0
  72. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/logging_utils/filters.py +0 -0
  73. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
  74. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
  75. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
  76. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
  77. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
  78. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
  79. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
  80. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
  81. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
  82. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
  83. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
  84. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
  85. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
  86. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
  87. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
  88. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
  89. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
  90. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
  91. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
  92. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
  93. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
  94. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
  95. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
  96. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
  97. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
  98. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
  99. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
  100. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  101. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
  102. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
  103. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
  104. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
  105. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
  106. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
  107. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
  108. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
  109. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
  110. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
  111. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
  112. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
  113. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
  114. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
  115. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
  116. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
  117. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  118. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
  119. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
  120. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  121. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  122. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  123. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  124. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  125. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  126. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  127. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  128. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  129. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  130. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  131. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  132. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  133. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  134. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  135. {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
  136. {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
  137. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  138. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  139. {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
  140. {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
  141. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  142. {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
  143. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  144. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  145. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  146. {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
  147. {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
  148. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  149. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  150. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  151. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  152. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  153. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
  154. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
  155. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
  156. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
  157. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
  158. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
  159. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
  160. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
  161. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
  162. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
  163. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
  164. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/network.py +0 -0
  165. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
  166. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/ocsp_snowflake.py +0 -0
  167. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/options.py +0 -0
  168. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/platform_detection.py +0 -0
  169. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/proxy.py +0 -0
  170. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/py.typed +0 -0
  171. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/result_batch.py +0 -0
  172. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/result_set.py +0 -0
  173. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/s3_storage_client.py +0 -0
  174. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/secret_detector.py +0 -0
  175. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/session_manager.py +0 -0
  176. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/sf_dirs.py +0 -0
  177. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/sfbinaryformat.py +0 -0
  178. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/sfdatetime.py +0 -0
  179. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/snow_logging.py +0 -0
  180. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/sqlstate.py +0 -0
  181. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  182. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/storage_client.py +0 -0
  183. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/telemetry.py +0 -0
  184. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/telemetry_oob.py +0 -0
  185. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/test_util.py +0 -0
  186. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/time_util.py +0 -0
  187. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/token_cache.py +0 -0
  188. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/tool/__init__.py +0 -0
  189. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/tool/dump_certs.py +0 -0
  190. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  191. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
  192. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/tool/probe_connection.py +0 -0
  193. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/url_util.py +0 -0
  194. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/__init__.py +0 -0
  195. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  196. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
  197. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  198. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  199. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  200. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/api.py +0 -0
  201. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  202. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  203. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  204. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  205. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  206. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/help.py +0 -0
  207. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  208. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/models.py +0 -0
  209. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/packages.py +0 -0
  210. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  211. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  212. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  213. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  214. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  215. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  216. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
  217. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
  218. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
  219. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
  220. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
  221. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
  222. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  223. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
  224. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
  225. {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
  226. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
  227. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
  228. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
  229. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
  230. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
  231. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  232. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  233. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  234. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
  235. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
  236. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
  237. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
  238. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
  239. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
  240. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  241. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  242. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  243. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
  244. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  245. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
  246. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
  247. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  248. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  249. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  250. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
  251. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
  252. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  253. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake/connector/wif_util.py +0 -0
  254. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
  255. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  256. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  257. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  258. {snowflake_connector_python-3.18.0 → snowflake_connector_python-3.18.1}/src/snowflake_connector_python.egg-info/requires.txt +0 -0
  259. {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.19.0(TBD)
11
- - N/A
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.0
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.19.0(TBD)
90
- - N/A
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 get_md5
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
- meta.result_status = ResultStatus.UPLOADED
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(get_md5(file_content)).decode(
245
- "utf-8"
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 dateimes "
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 _build_context_with_partial_chain(cafile: str | None) -> PyOpenSSLContext:
80
- """Create PyOpenSSL context configured for CERT_REQUIRED and partial-chain trust."""
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
- cafile_for_ctx = _resolve_cafile(params)
163
- params["ssl_context"] = _build_context_with_partial_chain(cafile_for_ctx)
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, _resolve_cafile(params))
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 get_md5(text: str | bytes) -> bytes:
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
- md5 = hashlib.md5()
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,3 +1,3 @@
1
1
  # Update this for the versions
2
2
  # Don't change the forth version number from None
3
- VERSION = (3, 18, 0, None)
3
+ VERSION = (3, 18, 1, None)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-connector-python
3
- Version: 3.18.0
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.19.0(TBD)
90
- - N/A
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