snowflake-connector-python 4.4.0__cp314-cp314-win_amd64.whl

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