@@ -827,6 +827,26 @@ class Session:
827
827
_session : Any
828
828
829
829
830
+ F = TypeVar ("F" , bound = Callable [..., Any ])
831
+
832
+
833
+ def _require_not_used (f : F ) -> F :
834
+ @wraps (f )
835
+ def inner (self : Context , * args : Any , ** kwargs : Any ) -> Any :
836
+ if self ._used :
837
+ warnings .warn (
838
+ (
839
+ "Attempting to mutate a Context after a Connection was "
840
+ "created. In the future, this will raise an exception"
841
+ ),
842
+ DeprecationWarning ,
843
+ stacklevel = 2 ,
844
+ )
845
+ return f (self , * args , ** kwargs )
846
+
847
+ return typing .cast (F , inner )
848
+
849
+
830
850
class Context :
831
851
"""
832
852
:class:`OpenSSL.SSL.Context` instances define the parameters for setting
@@ -870,6 +890,7 @@ def __init__(self, method: int) -> None:
870
890
context = _ffi .gc (context , _lib .SSL_CTX_free )
871
891
872
892
self ._context = context
893
+ self ._used = False
873
894
self ._passphrase_helper : _PassphraseHelper | None = None
874
895
self ._passphrase_callback : _PassphraseCallback [Any ] | None = None
875
896
self ._passphrase_userdata : Any | None = None
@@ -898,6 +919,7 @@ def __init__(self, method: int) -> None:
898
919
self .set_min_proto_version (version )
899
920
self .set_max_proto_version (version )
900
921
922
+ @_require_not_used
901
923
def set_min_proto_version (self , version : int ) -> None :
902
924
"""
903
925
Set the minimum supported protocol version. Setting the minimum
@@ -911,6 +933,7 @@ def set_min_proto_version(self, version: int) -> None:
911
933
_lib .SSL_CTX_set_min_proto_version (self ._context , version ) == 1
912
934
)
913
935
936
+ @_require_not_used
914
937
def set_max_proto_version (self , version : int ) -> None :
915
938
"""
916
939
Set the maximum supported protocol version. Setting the maximum
@@ -924,6 +947,7 @@ def set_max_proto_version(self, version: int) -> None:
924
947
_lib .SSL_CTX_set_max_proto_version (self ._context , version ) == 1
925
948
)
926
949
950
+ @_require_not_used
927
951
def load_verify_locations (
928
952
self ,
929
953
cafile : _StrOrBytesPath | None ,
@@ -971,6 +995,7 @@ def wrapper(size: int, verify: bool, userdata: Any) -> bytes:
971
995
FILETYPE_PEM , wrapper , more_args = True , truncate = True
972
996
)
973
997
998
+ @_require_not_used
974
999
def set_passwd_cb (
975
1000
self ,
976
1001
callback : _PassphraseCallback [_T ],
@@ -1004,6 +1029,7 @@ def set_passwd_cb(
1004
1029
)
1005
1030
self ._passphrase_userdata = userdata
1006
1031
1032
+ @_require_not_used
1007
1033
def set_default_verify_paths (self ) -> None :
1008
1034
"""
1009
1035
Specify that the platform provided CA certificates are to be used for
@@ -1079,6 +1105,7 @@ def _fallback_default_verify_paths(
1079
1105
self .load_verify_locations (None , capath )
1080
1106
break
1081
1107
1108
+ @_require_not_used
1082
1109
def use_certificate_chain_file (self , certfile : _StrOrBytesPath ) -> None :
1083
1110
"""
1084
1111
Load a certificate chain from a file.
@@ -1096,6 +1123,7 @@ def use_certificate_chain_file(self, certfile: _StrOrBytesPath) -> None:
1096
1123
if not result :
1097
1124
_raise_current_error ()
1098
1125
1126
+ @_require_not_used
1099
1127
def use_certificate_file (
1100
1128
self , certfile : _StrOrBytesPath , filetype : int = FILETYPE_PEM
1101
1129
) -> None :
@@ -1120,6 +1148,7 @@ def use_certificate_file(
1120
1148
if not use_result :
1121
1149
_raise_current_error ()
1122
1150
1151
+ @_require_not_used
1123
1152
def use_certificate (self , cert : X509 | x509 .Certificate ) -> None :
1124
1153
"""
1125
1154
Load a certificate from a X509 object
@@ -1144,6 +1173,7 @@ def use_certificate(self, cert: X509 | x509.Certificate) -> None:
1144
1173
if not use_result :
1145
1174
_raise_current_error ()
1146
1175
1176
+ @_require_not_used
1147
1177
def add_extra_chain_cert (self , certobj : X509 | x509 .Certificate ) -> None :
1148
1178
"""
1149
1179
Add certificate to chain
@@ -1176,6 +1206,7 @@ def _raise_passphrase_exception(self) -> None:
1176
1206
1177
1207
_raise_current_error ()
1178
1208
1209
+ @_require_not_used
1179
1210
def use_privatekey_file (
1180
1211
self , keyfile : _StrOrBytesPath , filetype : int = FILETYPE_PEM
1181
1212
) -> None :
@@ -1200,6 +1231,7 @@ def use_privatekey_file(
1200
1231
if not use_result :
1201
1232
self ._raise_passphrase_exception ()
1202
1233
1234
+ @_require_not_used
1203
1235
def use_privatekey (self , pkey : _PrivateKey | PKey ) -> None :
1204
1236
"""
1205
1237
Load a private key from a PKey object
@@ -1234,6 +1266,7 @@ def check_privatekey(self) -> None:
1234
1266
if not _lib .SSL_CTX_check_private_key (self ._context ):
1235
1267
_raise_current_error ()
1236
1268
1269
+ @_require_not_used
1237
1270
def load_client_ca (self , cafile : bytes ) -> None :
1238
1271
"""
1239
1272
Load the trusted certificates that will be sent to the client. Does
@@ -1249,6 +1282,7 @@ def load_client_ca(self, cafile: bytes) -> None:
1249
1282
_openssl_assert (ca_list != _ffi .NULL )
1250
1283
_lib .SSL_CTX_set_client_CA_list (self ._context , ca_list )
1251
1284
1285
+ @_require_not_used
1252
1286
def set_session_id (self , buf : bytes ) -> None :
1253
1287
"""
1254
1288
Set the session id to *buf* within which a session can be reused for
@@ -1266,6 +1300,7 @@ def set_session_id(self, buf: bytes) -> None:
1266
1300
== 1
1267
1301
)
1268
1302
1303
+ @_require_not_used
1269
1304
def set_session_cache_mode (self , mode : int ) -> int :
1270
1305
"""
1271
1306
Set the behavior of the session cache used by all connections using
@@ -1293,6 +1328,7 @@ def get_session_cache_mode(self) -> int:
1293
1328
"""
1294
1329
return _lib .SSL_CTX_get_session_cache_mode (self ._context )
1295
1330
1331
+ @_require_not_used
1296
1332
def set_verify (
1297
1333
self , mode : int , callback : _VerifyCallback | None = None
1298
1334
) -> None :
@@ -1330,6 +1366,7 @@ def set_verify(
1330
1366
self ._verify_callback = self ._verify_helper .callback
1331
1367
_lib .SSL_CTX_set_verify (self ._context , mode , self ._verify_callback )
1332
1368
1369
+ @_require_not_used
1333
1370
def set_verify_depth (self , depth : int ) -> None :
1334
1371
"""
1335
1372
Set the maximum depth for the certificate chain verification that shall
@@ -1361,6 +1398,7 @@ def get_verify_depth(self) -> int:
1361
1398
"""
1362
1399
return _lib .SSL_CTX_get_verify_depth (self ._context )
1363
1400
1401
+ @_require_not_used
1364
1402
def load_tmp_dh (self , dhfile : _StrOrBytesPath ) -> None :
1365
1403
"""
1366
1404
Load parameters for Ephemeral Diffie-Hellman
@@ -1382,6 +1420,7 @@ def load_tmp_dh(self, dhfile: _StrOrBytesPath) -> None:
1382
1420
res = _lib .SSL_CTX_set_tmp_dh (self ._context , dh )
1383
1421
_openssl_assert (res == 1 )
1384
1422
1423
+ @_require_not_used
1385
1424
def set_tmp_ecdh (self , curve : _EllipticCurve | ec .EllipticCurve ) -> None :
1386
1425
"""
1387
1426
Select a curve to use for ECDHE key exchange.
@@ -1421,6 +1460,7 @@ def set_tmp_ecdh(self, curve: _EllipticCurve | ec.EllipticCurve) -> None:
1421
1460
ec = _ffi .gc (ec , _lib .EC_KEY_free )
1422
1461
_lib .SSL_CTX_set_tmp_ecdh (self ._context , ec )
1423
1462
1463
+ @_require_not_used
1424
1464
def set_cipher_list (self , cipher_list : bytes ) -> None :
1425
1465
"""
1426
1466
Set the list of ciphers to be used in this context.
@@ -1460,6 +1500,7 @@ def set_cipher_list(self, cipher_list: bytes) -> None:
1460
1500
],
1461
1501
)
1462
1502
1503
+ @_require_not_used
1463
1504
def set_client_ca_list (
1464
1505
self , certificate_authorities : Sequence [X509Name ]
1465
1506
) -> None :
@@ -1497,6 +1538,7 @@ def set_client_ca_list(
1497
1538
1498
1539
_lib .SSL_CTX_set_client_CA_list (self ._context , name_stack )
1499
1540
1541
+ @_require_not_used
1500
1542
def add_client_ca (
1501
1543
self , certificate_authority : X509 | x509 .Certificate
1502
1544
) -> None :
@@ -1531,6 +1573,7 @@ def add_client_ca(
1531
1573
)
1532
1574
_openssl_assert (add_result == 1 )
1533
1575
1576
+ @_require_not_used
1534
1577
def set_timeout (self , timeout : int ) -> None :
1535
1578
"""
1536
1579
Set the timeout for newly created sessions for this Context object to
@@ -1554,6 +1597,7 @@ def get_timeout(self) -> int:
1554
1597
"""
1555
1598
return _lib .SSL_CTX_get_timeout (self ._context )
1556
1599
1600
+ @_require_not_used
1557
1601
def set_info_callback (
1558
1602
self , callback : Callable [[Connection , int , int ], None ]
1559
1603
) -> None :
@@ -1579,6 +1623,7 @@ def wrapper(ssl, where, return_code): # type: ignore[no-untyped-def]
1579
1623
_lib .SSL_CTX_set_info_callback (self ._context , self ._info_callback )
1580
1624
1581
1625
@_requires_keylog
1626
+ @_require_not_used
1582
1627
def set_keylog_callback (
1583
1628
self , callback : Callable [[Connection , bytes ], None ]
1584
1629
) -> None :
@@ -1613,6 +1658,7 @@ def get_app_data(self) -> Any:
1613
1658
"""
1614
1659
return self ._app_data
1615
1660
1661
+ @_require_not_used
1616
1662
def set_app_data (self , data : Any ) -> None :
1617
1663
"""
1618
1664
Set the application data (will be returned from get_app_data())
@@ -1639,6 +1685,7 @@ def get_cert_store(self) -> X509Store | None:
1639
1685
pystore ._store = store
1640
1686
return pystore
1641
1687
1688
+ @_require_not_used
1642
1689
def set_options (self , options : int ) -> int :
1643
1690
"""
1644
1691
Add options. Options set before are not cleared!
@@ -1652,6 +1699,7 @@ def set_options(self, options: int) -> int:
1652
1699
1653
1700
return _lib .SSL_CTX_set_options (self ._context , options )
1654
1701
1702
+ @_require_not_used
1655
1703
def set_mode (self , mode : int ) -> int :
1656
1704
"""
1657
1705
Add modes via bitmask. Modes set before are not cleared! This method
@@ -1665,6 +1713,7 @@ def set_mode(self, mode: int) -> int:
1665
1713
1666
1714
return _lib .SSL_CTX_set_mode (self ._context , mode )
1667
1715
1716
+ @_require_not_used
1668
1717
def set_tlsext_servername_callback (
1669
1718
self , callback : Callable [[Connection ], None ]
1670
1719
) -> None :
@@ -1690,6 +1739,7 @@ def wrapper(ssl, alert, arg): # type: ignore[no-untyped-def]
1690
1739
self ._context , self ._tlsext_servername_callback
1691
1740
)
1692
1741
1742
+ @_require_not_used
1693
1743
def set_tlsext_use_srtp (self , profiles : bytes ) -> None :
1694
1744
"""
1695
1745
Enable support for negotiating SRTP keying material.
@@ -1705,6 +1755,7 @@ def set_tlsext_use_srtp(self, profiles: bytes) -> None:
1705
1755
_lib .SSL_CTX_set_tlsext_use_srtp (self ._context , profiles ) == 0
1706
1756
)
1707
1757
1758
+ @_require_not_used
1708
1759
def set_alpn_protos (self , protos : list [bytes ]) -> None :
1709
1760
"""
1710
1761
Specify the protocols that the client is prepared to speak after the
@@ -1742,6 +1793,7 @@ def set_alpn_protos(self, protos: list[bytes]) -> None:
1742
1793
== 0
1743
1794
)
1744
1795
1796
+ @_require_not_used
1745
1797
def set_alpn_select_callback (self , callback : _ALPNSelectCallback ) -> None :
1746
1798
"""
1747
1799
Specify a callback function that will be called on the server when a
@@ -1786,6 +1838,7 @@ def _set_ocsp_callback(
1786
1838
rc = _lib .SSL_CTX_set_tlsext_status_arg (self ._context , self ._ocsp_data )
1787
1839
_openssl_assert (rc == 1 )
1788
1840
1841
+ @_require_not_used
1789
1842
def set_ocsp_server_callback (
1790
1843
self ,
1791
1844
callback : _OCSPServerCallback [_T ],
@@ -1808,6 +1861,7 @@ def set_ocsp_server_callback(
1808
1861
helper = _OCSPServerCallbackHelper (callback )
1809
1862
self ._set_ocsp_callback (helper , data )
1810
1863
1864
+ @_require_not_used
1811
1865
def set_ocsp_client_callback (
1812
1866
self ,
1813
1867
callback : _OCSPClientCallback [_T ],
@@ -1832,6 +1886,7 @@ def set_ocsp_client_callback(
1832
1886
helper = _OCSPClientCallbackHelper (callback )
1833
1887
self ._set_ocsp_callback (helper , data )
1834
1888
1889
+ @_require_not_used
1835
1890
def set_cookie_generate_callback (
1836
1891
self , callback : _CookieGenerateCallback
1837
1892
) -> None :
@@ -1841,6 +1896,7 @@ def set_cookie_generate_callback(
1841
1896
self ._cookie_generate_helper .callback ,
1842
1897
)
1843
1898
1899
+ @_require_not_used
1844
1900
def set_cookie_verify_callback (
1845
1901
self , callback : _CookieVerifyCallback
1846
1902
) -> None :
@@ -1869,6 +1925,8 @@ def __init__(
1869
1925
if not isinstance (context , Context ):
1870
1926
raise TypeError ("context must be a Context instance" )
1871
1927
1928
+ context ._used = True
1929
+
1872
1930
ssl = _lib .SSL_new (context ._context )
1873
1931
self ._ssl = _ffi .gc (ssl , _lib .SSL_free )
1874
1932
# We set SSL_MODE_AUTO_RETRY to handle situations where OpenSSL returns
@@ -2000,6 +2058,7 @@ def set_context(self, context: Context) -> None:
2000
2058
2001
2059
_lib .SSL_set_SSL_CTX (self ._ssl , context ._context )
2002
2060
self ._context = context
2061
+ self ._context ._used = True
2003
2062
2004
2063
def get_servername (self ) -> bytes | None :
2005
2064
"""
0 commit comments