@@ -827,6 +827,23 @@ class Session:
827
827
_session : Any
828
828
829
829
830
+ def _require_not_used (f ):
831
+ @wraps (f )
832
+ def inner (self , * args , ** kwargs ):
833
+ if self ._used :
834
+ warnings .warn (
835
+ (
836
+ "Attempting to mutate a Context after a Connection was "
837
+ "created. In the future, this will raise an exception"
838
+ ),
839
+ DeprecationWarning ,
840
+ stacklevel = 2 ,
841
+ )
842
+ return f (self , * args , ** kwargs )
843
+
844
+ return inner
845
+
846
+
830
847
class Context :
831
848
"""
832
849
:class:`OpenSSL.SSL.Context` instances define the parameters for setting
@@ -870,6 +887,7 @@ def __init__(self, method: int) -> None:
870
887
context = _ffi .gc (context , _lib .SSL_CTX_free )
871
888
872
889
self ._context = context
890
+ self ._used = False
873
891
self ._passphrase_helper : _PassphraseHelper | None = None
874
892
self ._passphrase_callback : _PassphraseCallback [Any ] | None = None
875
893
self ._passphrase_userdata : Any | None = None
@@ -898,6 +916,7 @@ def __init__(self, method: int) -> None:
898
916
self .set_min_proto_version (version )
899
917
self .set_max_proto_version (version )
900
918
919
+ @_require_not_used
901
920
def set_min_proto_version (self , version : int ) -> None :
902
921
"""
903
922
Set the minimum supported protocol version. Setting the minimum
@@ -911,6 +930,7 @@ def set_min_proto_version(self, version: int) -> None:
911
930
_lib .SSL_CTX_set_min_proto_version (self ._context , version ) == 1
912
931
)
913
932
933
+ @_require_not_used
914
934
def set_max_proto_version (self , version : int ) -> None :
915
935
"""
916
936
Set the maximum supported protocol version. Setting the maximum
@@ -924,6 +944,7 @@ def set_max_proto_version(self, version: int) -> None:
924
944
_lib .SSL_CTX_set_max_proto_version (self ._context , version ) == 1
925
945
)
926
946
947
+ @_require_not_used
927
948
def load_verify_locations (
928
949
self ,
929
950
cafile : _StrOrBytesPath | None ,
@@ -971,6 +992,7 @@ def wrapper(size: int, verify: bool, userdata: Any) -> bytes:
971
992
FILETYPE_PEM , wrapper , more_args = True , truncate = True
972
993
)
973
994
995
+ @_require_not_used
974
996
def set_passwd_cb (
975
997
self ,
976
998
callback : _PassphraseCallback [_T ],
@@ -1004,6 +1026,7 @@ def set_passwd_cb(
1004
1026
)
1005
1027
self ._passphrase_userdata = userdata
1006
1028
1029
+ @_require_not_used
1007
1030
def set_default_verify_paths (self ) -> None :
1008
1031
"""
1009
1032
Specify that the platform provided CA certificates are to be used for
@@ -1079,6 +1102,7 @@ def _fallback_default_verify_paths(
1079
1102
self .load_verify_locations (None , capath )
1080
1103
break
1081
1104
1105
+ @_require_not_used
1082
1106
def use_certificate_chain_file (self , certfile : _StrOrBytesPath ) -> None :
1083
1107
"""
1084
1108
Load a certificate chain from a file.
@@ -1096,6 +1120,7 @@ def use_certificate_chain_file(self, certfile: _StrOrBytesPath) -> None:
1096
1120
if not result :
1097
1121
_raise_current_error ()
1098
1122
1123
+ @_require_not_used
1099
1124
def use_certificate_file (
1100
1125
self , certfile : _StrOrBytesPath , filetype : int = FILETYPE_PEM
1101
1126
) -> None :
@@ -1120,6 +1145,7 @@ def use_certificate_file(
1120
1145
if not use_result :
1121
1146
_raise_current_error ()
1122
1147
1148
+ @_require_not_used
1123
1149
def use_certificate (self , cert : X509 | x509 .Certificate ) -> None :
1124
1150
"""
1125
1151
Load a certificate from a X509 object
@@ -1144,6 +1170,7 @@ def use_certificate(self, cert: X509 | x509.Certificate) -> None:
1144
1170
if not use_result :
1145
1171
_raise_current_error ()
1146
1172
1173
+ @_require_not_used
1147
1174
def add_extra_chain_cert (self , certobj : X509 | x509 .Certificate ) -> None :
1148
1175
"""
1149
1176
Add certificate to chain
@@ -1176,6 +1203,7 @@ def _raise_passphrase_exception(self) -> None:
1176
1203
1177
1204
_raise_current_error ()
1178
1205
1206
+ @_require_not_used
1179
1207
def use_privatekey_file (
1180
1208
self , keyfile : _StrOrBytesPath , filetype : int = FILETYPE_PEM
1181
1209
) -> None :
@@ -1200,6 +1228,7 @@ def use_privatekey_file(
1200
1228
if not use_result :
1201
1229
self ._raise_passphrase_exception ()
1202
1230
1231
+ @_require_not_used
1203
1232
def use_privatekey (self , pkey : _PrivateKey | PKey ) -> None :
1204
1233
"""
1205
1234
Load a private key from a PKey object
@@ -1234,6 +1263,7 @@ def check_privatekey(self) -> None:
1234
1263
if not _lib .SSL_CTX_check_private_key (self ._context ):
1235
1264
_raise_current_error ()
1236
1265
1266
+ @_require_not_used
1237
1267
def load_client_ca (self , cafile : bytes ) -> None :
1238
1268
"""
1239
1269
Load the trusted certificates that will be sent to the client. Does
@@ -1249,6 +1279,7 @@ def load_client_ca(self, cafile: bytes) -> None:
1249
1279
_openssl_assert (ca_list != _ffi .NULL )
1250
1280
_lib .SSL_CTX_set_client_CA_list (self ._context , ca_list )
1251
1281
1282
+ @_require_not_used
1252
1283
def set_session_id (self , buf : bytes ) -> None :
1253
1284
"""
1254
1285
Set the session id to *buf* within which a session can be reused for
@@ -1266,6 +1297,7 @@ def set_session_id(self, buf: bytes) -> None:
1266
1297
== 1
1267
1298
)
1268
1299
1300
+ @_require_not_used
1269
1301
def set_session_cache_mode (self , mode : int ) -> int :
1270
1302
"""
1271
1303
Set the behavior of the session cache used by all connections using
@@ -1293,6 +1325,7 @@ def get_session_cache_mode(self) -> int:
1293
1325
"""
1294
1326
return _lib .SSL_CTX_get_session_cache_mode (self ._context )
1295
1327
1328
+ @_require_not_used
1296
1329
def set_verify (
1297
1330
self , mode : int , callback : _VerifyCallback | None = None
1298
1331
) -> None :
@@ -1330,6 +1363,7 @@ def set_verify(
1330
1363
self ._verify_callback = self ._verify_helper .callback
1331
1364
_lib .SSL_CTX_set_verify (self ._context , mode , self ._verify_callback )
1332
1365
1366
+ @_require_not_used
1333
1367
def set_verify_depth (self , depth : int ) -> None :
1334
1368
"""
1335
1369
Set the maximum depth for the certificate chain verification that shall
@@ -1361,6 +1395,7 @@ def get_verify_depth(self) -> int:
1361
1395
"""
1362
1396
return _lib .SSL_CTX_get_verify_depth (self ._context )
1363
1397
1398
+ @_require_not_used
1364
1399
def load_tmp_dh (self , dhfile : _StrOrBytesPath ) -> None :
1365
1400
"""
1366
1401
Load parameters for Ephemeral Diffie-Hellman
@@ -1382,6 +1417,7 @@ def load_tmp_dh(self, dhfile: _StrOrBytesPath) -> None:
1382
1417
res = _lib .SSL_CTX_set_tmp_dh (self ._context , dh )
1383
1418
_openssl_assert (res == 1 )
1384
1419
1420
+ @_require_not_used
1385
1421
def set_tmp_ecdh (self , curve : _EllipticCurve | ec .EllipticCurve ) -> None :
1386
1422
"""
1387
1423
Select a curve to use for ECDHE key exchange.
@@ -1421,6 +1457,7 @@ def set_tmp_ecdh(self, curve: _EllipticCurve | ec.EllipticCurve) -> None:
1421
1457
ec = _ffi .gc (ec , _lib .EC_KEY_free )
1422
1458
_lib .SSL_CTX_set_tmp_ecdh (self ._context , ec )
1423
1459
1460
+ @_require_not_used
1424
1461
def set_cipher_list (self , cipher_list : bytes ) -> None :
1425
1462
"""
1426
1463
Set the list of ciphers to be used in this context.
@@ -1460,6 +1497,7 @@ def set_cipher_list(self, cipher_list: bytes) -> None:
1460
1497
],
1461
1498
)
1462
1499
1500
+ @_require_not_used
1463
1501
def set_client_ca_list (
1464
1502
self , certificate_authorities : Sequence [X509Name ]
1465
1503
) -> None :
@@ -1497,6 +1535,7 @@ def set_client_ca_list(
1497
1535
1498
1536
_lib .SSL_CTX_set_client_CA_list (self ._context , name_stack )
1499
1537
1538
+ @_require_not_used
1500
1539
def add_client_ca (
1501
1540
self , certificate_authority : X509 | x509 .Certificate
1502
1541
) -> None :
@@ -1531,6 +1570,7 @@ def add_client_ca(
1531
1570
)
1532
1571
_openssl_assert (add_result == 1 )
1533
1572
1573
+ @_require_not_used
1534
1574
def set_timeout (self , timeout : int ) -> None :
1535
1575
"""
1536
1576
Set the timeout for newly created sessions for this Context object to
@@ -1554,6 +1594,7 @@ def get_timeout(self) -> int:
1554
1594
"""
1555
1595
return _lib .SSL_CTX_get_timeout (self ._context )
1556
1596
1597
+ @_require_not_used
1557
1598
def set_info_callback (
1558
1599
self , callback : Callable [[Connection , int , int ], None ]
1559
1600
) -> None :
@@ -1579,6 +1620,7 @@ def wrapper(ssl, where, return_code): # type: ignore[no-untyped-def]
1579
1620
_lib .SSL_CTX_set_info_callback (self ._context , self ._info_callback )
1580
1621
1581
1622
@_requires_keylog
1623
+ @_require_not_used
1582
1624
def set_keylog_callback (
1583
1625
self , callback : Callable [[Connection , bytes ], None ]
1584
1626
) -> None :
@@ -1613,6 +1655,7 @@ def get_app_data(self) -> Any:
1613
1655
"""
1614
1656
return self ._app_data
1615
1657
1658
+ @_require_not_used
1616
1659
def set_app_data (self , data : Any ) -> None :
1617
1660
"""
1618
1661
Set the application data (will be returned from get_app_data())
@@ -1639,6 +1682,7 @@ def get_cert_store(self) -> X509Store | None:
1639
1682
pystore ._store = store
1640
1683
return pystore
1641
1684
1685
+ @_require_not_used
1642
1686
def set_options (self , options : int ) -> int :
1643
1687
"""
1644
1688
Add options. Options set before are not cleared!
@@ -1652,6 +1696,7 @@ def set_options(self, options: int) -> int:
1652
1696
1653
1697
return _lib .SSL_CTX_set_options (self ._context , options )
1654
1698
1699
+ @_require_not_used
1655
1700
def set_mode (self , mode : int ) -> int :
1656
1701
"""
1657
1702
Add modes via bitmask. Modes set before are not cleared! This method
@@ -1665,6 +1710,7 @@ def set_mode(self, mode: int) -> int:
1665
1710
1666
1711
return _lib .SSL_CTX_set_mode (self ._context , mode )
1667
1712
1713
+ @_require_not_used
1668
1714
def set_tlsext_servername_callback (
1669
1715
self , callback : Callable [[Connection ], None ]
1670
1716
) -> None :
@@ -1690,6 +1736,7 @@ def wrapper(ssl, alert, arg): # type: ignore[no-untyped-def]
1690
1736
self ._context , self ._tlsext_servername_callback
1691
1737
)
1692
1738
1739
+ @_require_not_used
1693
1740
def set_tlsext_use_srtp (self , profiles : bytes ) -> None :
1694
1741
"""
1695
1742
Enable support for negotiating SRTP keying material.
@@ -1705,6 +1752,7 @@ def set_tlsext_use_srtp(self, profiles: bytes) -> None:
1705
1752
_lib .SSL_CTX_set_tlsext_use_srtp (self ._context , profiles ) == 0
1706
1753
)
1707
1754
1755
+ @_require_not_used
1708
1756
def set_alpn_protos (self , protos : list [bytes ]) -> None :
1709
1757
"""
1710
1758
Specify the protocols that the client is prepared to speak after the
@@ -1742,6 +1790,7 @@ def set_alpn_protos(self, protos: list[bytes]) -> None:
1742
1790
== 0
1743
1791
)
1744
1792
1793
+ @_require_not_used
1745
1794
def set_alpn_select_callback (self , callback : _ALPNSelectCallback ) -> None :
1746
1795
"""
1747
1796
Specify a callback function that will be called on the server when a
@@ -1786,6 +1835,7 @@ def _set_ocsp_callback(
1786
1835
rc = _lib .SSL_CTX_set_tlsext_status_arg (self ._context , self ._ocsp_data )
1787
1836
_openssl_assert (rc == 1 )
1788
1837
1838
+ @_require_not_used
1789
1839
def set_ocsp_server_callback (
1790
1840
self ,
1791
1841
callback : _OCSPServerCallback [_T ],
@@ -1808,6 +1858,7 @@ def set_ocsp_server_callback(
1808
1858
helper = _OCSPServerCallbackHelper (callback )
1809
1859
self ._set_ocsp_callback (helper , data )
1810
1860
1861
+ @_require_not_used
1811
1862
def set_ocsp_client_callback (
1812
1863
self ,
1813
1864
callback : _OCSPClientCallback [_T ],
@@ -1832,6 +1883,7 @@ def set_ocsp_client_callback(
1832
1883
helper = _OCSPClientCallbackHelper (callback )
1833
1884
self ._set_ocsp_callback (helper , data )
1834
1885
1886
+ @_require_not_used
1835
1887
def set_cookie_generate_callback (
1836
1888
self , callback : _CookieGenerateCallback
1837
1889
) -> None :
@@ -1841,6 +1893,7 @@ def set_cookie_generate_callback(
1841
1893
self ._cookie_generate_helper .callback ,
1842
1894
)
1843
1895
1896
+ @_require_not_used
1844
1897
def set_cookie_verify_callback (
1845
1898
self , callback : _CookieVerifyCallback
1846
1899
) -> None :
@@ -1869,6 +1922,8 @@ def __init__(
1869
1922
if not isinstance (context , Context ):
1870
1923
raise TypeError ("context must be a Context instance" )
1871
1924
1925
+ context ._used = True
1926
+
1872
1927
ssl = _lib .SSL_new (context ._context )
1873
1928
self ._ssl = _ffi .gc (ssl , _lib .SSL_free )
1874
1929
# We set SSL_MODE_AUTO_RETRY to handle situations where OpenSSL returns
@@ -2000,6 +2055,7 @@ def set_context(self, context: Context) -> None:
2000
2055
2001
2056
_lib .SSL_set_SSL_CTX (self ._ssl , context ._context )
2002
2057
self ._context = context
2058
+ self ._context ._used = True
2003
2059
2004
2060
def get_servername (self ) -> bytes | None :
2005
2061
"""
0 commit comments