Skip to content

Commit b4a5554

Browse files
sfc-gh-turbaszekcursoragent
authored andcommitted
Bump up version to 4.8.0
Co-authored-by: Cursor <cursoragent@cursor.com> GitOrigin-RevId: c099da57415d08e06f2d643f9d4feae575da3edf
1 parent e147a72 commit b4a5554

8 files changed

Lines changed: 91 additions & 64 deletions

File tree

‎DESCRIPTION.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ https://docs.snowflake.com/
77
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
88

99
# Release Notes
10-
- v4.7.6 (Unreleased)
10+
- v4.8.0(Sep 30,2026)
1111
- Fixed external-browser (SSO) authentication to validate the `Origin` header on the local callback server, rejecting tokens delivered from unexpected origins. A trailing slash in the origin (e.g. `https://account.snowflakecomputing.com/`) is now accepted on par with the bare origin, matching JDBC and other driver behaviour. Preconnect probe connections (empty recv) no longer count against the retry budget and no longer abort the login flow.
1212
- Added the `SNOWFLAKE_TLS_CIPHERS` environment variable to restrict which TLS ciphers the connector offers. It takes a colon-separated list; names beginning with `TLS_` are applied as TLS 1.3 cipher suites and the remainder as the cipher list for TLS 1.2 and below, so a single variable covers both. Leaving it unset keeps OpenSSL's defaults unchanged, and an unrecognized cipher name is rejected rather than silently ignored. The restriction covers Snowflake API traffic, cloud-storage (stage) transfers, OCSP/CRL fetches and IdP requests. Requests issued by the AWS and Azure SDKs, and asynchronous connections, are not covered — for TLS 1.3 suites specifically they cannot be, because the Python standard library exposes no API for restricting them.
1313
- Raised the minimum `pyOpenSSL` requirement to 25.3.0, the first version providing `set_tls13_ciphersuites`. This does not narrow the set of installable versions in practice: earlier releases cap `cryptography` below 46 and so were already uninstallable alongside the connector's own `cryptography>=46.0.5` requirement.

‎src/snowflake/connector/version.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# Update this for the versions
22
# Don't change the fourth version number from None
3-
VERSION = (4, 7, 5, None)
3+
VERSION = (4, 8, 0, None)

‎test/integ/test_connection.py‎

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,23 @@
7171
logger = logging.getLogger(__name__)
7272

7373

74+
@pytest.fixture
75+
def isolate_feature_ocsp_mode():
76+
"""Reset process-global FEATURE_OCSP_MODE around OCSP mode tests.
77+
78+
FEATURE_OCSP_MODE is sticky: a prior opt-in (FAIL_OPEN/FAIL_CLOSED) in the
79+
same pytest-xdist worker is not overwritten by a later DISABLE connection,
80+
which makes disable/insecure_mode integ assertions flake under -n auto.
81+
"""
82+
from snowflake.connector import ssl_wrap_socket
83+
84+
ssl_wrap_socket.FEATURE_OCSP_MODE = ssl_wrap_socket.DEFAULT_OCSP_MODE
85+
try:
86+
yield
87+
finally:
88+
ssl_wrap_socket.FEATURE_OCSP_MODE = ssl_wrap_socket.DEFAULT_OCSP_MODE
89+
90+
7491
def test_basic(conn_testaccount):
7592
"""Basic Connection test."""
7693
assert conn_testaccount, "invalid cnx"
@@ -1449,7 +1466,7 @@ def test_server_session_keep_alive(conn_cnx):
14491466

14501467
@pytest.mark.skipolddriver
14511468
def test_ocsp_mode_disable_ocsp_checks(
1452-
conn_cnx, is_public_test, is_local_dev_setup, caplog
1469+
conn_cnx, is_public_test, is_local_dev_setup, caplog, isolate_feature_ocsp_mode
14531470
):
14541471
caplog.set_level(logging.DEBUG, "snowflake.connector.ocsp_snowflake")
14551472
with conn_cnx(disable_ocsp_checks=True) as conn, conn.cursor() as cur:
@@ -1474,7 +1491,13 @@ def test_ocsp_mode_disable_ocsp_checks(
14741491
"ocsp_fail_open,expected_mode", [(True, "FAIL_OPEN"), (False, "FAIL_CLOSED")]
14751492
)
14761493
def test_ocsp_mode_opt_in_fail_open(
1477-
conn_cnx, is_public_test, is_local_dev_setup, caplog, ocsp_fail_open, expected_mode
1494+
conn_cnx,
1495+
is_public_test,
1496+
is_local_dev_setup,
1497+
caplog,
1498+
ocsp_fail_open,
1499+
expected_mode,
1500+
isolate_feature_ocsp_mode,
14781501
):
14791502
caplog.set_level(logging.DEBUG, "snowflake.connector.ocsp_snowflake")
14801503
with conn_cnx(ocsp_fail_open=ocsp_fail_open) as conn, conn.cursor() as cur:
@@ -1489,7 +1512,9 @@ def test_ocsp_mode_opt_in_fail_open(
14891512

14901513

14911514
@pytest.mark.skipolddriver
1492-
def test_ocsp_cache_filename_ignored_when_ocsp_off(conn_cnx, tmp_path, caplog):
1515+
def test_ocsp_cache_filename_ignored_when_ocsp_off(
1516+
conn_cnx, tmp_path, caplog, isolate_feature_ocsp_mode
1517+
):
14931518
caplog.set_level(logging.WARNING, "snowflake.connector.connection")
14941519
cache_file = tmp_path / "ocsp_cache.json"
14951520
with (
@@ -1503,7 +1528,9 @@ def test_ocsp_cache_filename_ignored_when_ocsp_off(conn_cnx, tmp_path, caplog):
15031528

15041529

15051530
@pytest.mark.skipolddriver
1506-
def test_ocsp_mode_insecure_mode(conn_cnx, is_public_test, is_local_dev_setup, caplog):
1531+
def test_ocsp_mode_insecure_mode(
1532+
conn_cnx, is_public_test, is_local_dev_setup, caplog, isolate_feature_ocsp_mode
1533+
):
15071534
caplog.set_level(logging.DEBUG, "snowflake.connector.ocsp_snowflake")
15081535
with conn_cnx(insecure_mode=True) as conn, conn.cursor() as cur:
15091536
assert cur.execute("select 1").fetchall() == [(1,)]
@@ -1514,7 +1541,7 @@ def test_ocsp_mode_insecure_mode(conn_cnx, is_public_test, is_local_dev_setup, c
15141541

15151542
@pytest.mark.skipolddriver
15161543
def test_ocsp_mode_insecure_mode_and_disable_ocsp_checks_match(
1517-
conn_cnx, is_public_test, is_local_dev_setup, caplog
1544+
conn_cnx, is_public_test, is_local_dev_setup, caplog, isolate_feature_ocsp_mode
15181545
):
15191546
caplog.set_level(logging.DEBUG, "snowflake.connector.ocsp_snowflake")
15201547
with (
@@ -1533,7 +1560,7 @@ def test_ocsp_mode_insecure_mode_and_disable_ocsp_checks_match(
15331560

15341561
@pytest.mark.skipolddriver
15351562
def test_ocsp_mode_insecure_mode_and_disable_ocsp_checks_mismatch_ocsp_disabled(
1536-
conn_cnx, is_public_test, is_local_dev_setup, caplog
1563+
conn_cnx, is_public_test, is_local_dev_setup, caplog, isolate_feature_ocsp_mode
15371564
):
15381565
caplog.set_level(logging.DEBUG, "snowflake.connector.ocsp_snowflake")
15391566
with (
@@ -1722,7 +1749,7 @@ def test_no_new_warnings_or_errors_on_successful_basic_select(conn_cnx, caplog):
17221749

17231750
@pytest.mark.skipolddriver
17241751
def test_ocsp_mode_insecure_mode_and_disable_ocsp_checks_mismatch_ocsp_enabled(
1725-
conn_cnx, is_public_test, is_local_dev_setup, caplog
1752+
conn_cnx, is_public_test, is_local_dev_setup, caplog, isolate_feature_ocsp_mode
17261753
):
17271754
caplog.set_level(logging.DEBUG, "snowflake.connector.ocsp_snowflake")
17281755
with (
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
# Generated on: Python 3.10.21
1+
# Generated on: Python 3.10.11
22
asn1crypto==1.5.1
3-
boto3==1.43.86
4-
botocore==1.43.86
3+
boto3==1.43.105
4+
botocore==1.43.105
55
certifi==2026.7.22
66
cffi==2.1.1
7-
charset-normalizer==3.5.1
7+
charset-normalizer==3.5.2
88
cryptography==50.0.1
9-
filelock==3.32.5
10-
idna==3.19
9+
filelock==3.32.7
10+
idna==3.20
1111
jmespath==1.1.0
1212
packaging==26.3
13-
platformdirs==4.11.7
13+
platformdirs==4.12.2
1414
pycparser==3.0
15-
PyJWT==2.13.0
15+
PyJWT==2.15.1
1616
pyOpenSSL==26.4.0
1717
python-dateutil==2.9.0.post0
18-
pytz==2026.3.post1
18+
pytz==2026.4
1919
requests==2.34.2
2020
s3transfer==0.19.2
2121
six==1.17.0
2222
sortedcontainers==2.4.0
2323
tomlkit==0.15.1
2424
typing_extensions==4.16.0
25-
urllib3==2.7.0
26-
snowflake-connector-python==4.7.5
25+
urllib3==2.8.0
26+
snowflake-connector-python==4.8.0
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
# Generated on: Python 3.11.16
1+
# Generated on: Python 3.11.6
22
asn1crypto==1.5.1
3-
boto3==1.43.86
4-
botocore==1.43.86
3+
boto3==1.43.105
4+
botocore==1.43.105
55
certifi==2026.7.22
66
cffi==2.1.1
7-
charset-normalizer==3.5.1
7+
charset-normalizer==3.5.2
88
cryptography==50.0.1
9-
filelock==3.32.5
10-
idna==3.19
9+
filelock==3.32.7
10+
idna==3.20
1111
jmespath==1.1.0
1212
packaging==26.3
13-
platformdirs==4.11.7
13+
platformdirs==4.12.2
1414
pycparser==3.0
15-
PyJWT==2.13.0
15+
PyJWT==2.15.1
1616
pyOpenSSL==26.4.0
1717
python-dateutil==2.9.0.post0
18-
pytz==2026.3.post1
18+
pytz==2026.4
1919
requests==2.34.2
2020
s3transfer==0.19.2
2121
six==1.17.0
2222
sortedcontainers==2.4.0
2323
tomlkit==0.15.1
2424
typing_extensions==4.16.0
25-
urllib3==2.7.0
26-
snowflake-connector-python==4.7.5
25+
urllib3==2.8.0
26+
snowflake-connector-python==4.8.0
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
1-
# Generated on: Python 3.12.14
1+
# Generated on: Python 3.12.9
22
asn1crypto==1.5.1
3-
boto3==1.43.86
4-
botocore==1.43.86
3+
boto3==1.43.105
4+
botocore==1.43.105
55
certifi==2026.7.22
66
cffi==2.1.1
7-
charset-normalizer==3.5.1
7+
charset-normalizer==3.5.2
88
cryptography==50.0.1
9-
filelock==3.32.5
10-
idna==3.19
9+
filelock==3.32.7
10+
idna==3.20
1111
jmespath==1.1.0
1212
packaging==26.3
13-
platformdirs==4.11.7
13+
platformdirs==4.12.2
1414
pycparser==3.0
15-
PyJWT==2.13.0
15+
PyJWT==2.15.1
1616
pyOpenSSL==26.4.0
1717
python-dateutil==2.9.0.post0
18-
pytz==2026.3.post1
18+
pytz==2026.4
1919
requests==2.34.2
2020
s3transfer==0.19.2
2121
setuptools==84.0.0
2222
six==1.17.0
2323
sortedcontainers==2.4.0
2424
tomlkit==0.15.1
2525
typing_extensions==4.16.0
26-
urllib3==2.7.0
26+
urllib3==2.8.0
2727
wheel==0.48.0
28-
snowflake-connector-python==4.7.5
28+
snowflake-connector-python==4.8.0
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
1-
# Generated on: Python 3.13.15
1+
# Generated on: Python 3.13.2
22
asn1crypto==1.5.1
3-
boto3==1.43.86
4-
botocore==1.43.86
3+
boto3==1.43.105
4+
botocore==1.43.105
55
certifi==2026.7.22
66
cffi==2.1.1
7-
charset-normalizer==3.5.1
7+
charset-normalizer==3.5.2
88
cryptography==50.0.1
9-
filelock==3.32.5
10-
idna==3.19
9+
filelock==3.32.7
10+
idna==3.20
1111
jmespath==1.1.0
1212
packaging==26.3
13-
platformdirs==4.11.7
13+
platformdirs==4.12.2
1414
pycparser==3.0
15-
PyJWT==2.13.0
15+
PyJWT==2.15.1
1616
pyOpenSSL==26.4.0
1717
python-dateutil==2.9.0.post0
18-
pytz==2026.3.post1
18+
pytz==2026.4
1919
requests==2.34.2
2020
s3transfer==0.19.2
2121
setuptools==84.0.0
2222
six==1.17.0
2323
sortedcontainers==2.4.0
2424
tomlkit==0.15.1
2525
typing_extensions==4.16.0
26-
urllib3==2.7.0
26+
urllib3==2.8.0
2727
wheel==0.48.0
28-
snowflake-connector-python==4.7.5
28+
snowflake-connector-python==4.8.0
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
1-
# Generated on: Python 3.14.7
1+
# Generated on: Python 3.14.0
22
asn1crypto==1.5.1
3-
boto3==1.43.86
4-
botocore==1.43.86
3+
boto3==1.43.105
4+
botocore==1.43.105
55
certifi==2026.7.22
66
cffi==2.1.1
7-
charset-normalizer==3.5.1
7+
charset-normalizer==3.5.2
88
cryptography==50.0.1
9-
filelock==3.32.5
10-
idna==3.19
9+
filelock==3.32.7
10+
idna==3.20
1111
jmespath==1.1.0
1212
packaging==26.3
13-
platformdirs==4.11.7
13+
platformdirs==4.12.2
1414
pycparser==3.0
15-
PyJWT==2.13.0
15+
PyJWT==2.15.1
1616
pyOpenSSL==26.4.0
1717
python-dateutil==2.9.0.post0
18-
pytz==2026.3.post1
18+
pytz==2026.4
1919
requests==2.34.2
2020
s3transfer==0.19.2
2121
setuptools==84.0.0
2222
six==1.17.0
2323
sortedcontainers==2.4.0
2424
tomlkit==0.15.1
2525
typing_extensions==4.16.0
26-
urllib3==2.7.0
26+
urllib3==2.8.0
2727
wheel==0.48.0
28-
snowflake-connector-python==4.7.5
28+
snowflake-connector-python==4.8.0

0 commit comments

Comments
 (0)