(
&self,
_purpose: OptionalArg<i32>,
vm: &VirtualMachine,
)
| 1434 | |
| 1435 | #[pymethod] |
| 1436 | fn load_default_certs( |
| 1437 | &self, |
| 1438 | _purpose: OptionalArg<i32>, |
| 1439 | vm: &VirtualMachine, |
| 1440 | ) -> PyResult<()> { |
| 1441 | let mut store = self.root_certs.write(); |
| 1442 | |
| 1443 | #[cfg(windows)] |
| 1444 | { |
| 1445 | // Windows: Load system certificates first, then additionally load from env |
| 1446 | // see: test_load_default_certs_env_windows |
| 1447 | let _ = self.load_system_certificates(&mut store, vm); |
| 1448 | |
| 1449 | let mut lazy_ca_certs = Vec::new(); |
| 1450 | let mut loader = cert::CertLoader::new(&mut store, &mut lazy_ca_certs); |
| 1451 | let _ = self.try_load_from_python_environ(&mut loader, vm)?; |
| 1452 | } |
| 1453 | |
| 1454 | #[cfg(not(windows))] |
| 1455 | { |
| 1456 | // Non-Windows: Try env vars first; only fallback to system certs if not set |
| 1457 | // see: test_load_default_certs_env |
| 1458 | let mut lazy_ca_certs = Vec::new(); |
| 1459 | let mut loader = cert::CertLoader::new(&mut store, &mut lazy_ca_certs); |
| 1460 | let loaded = self.try_load_from_python_environ(&mut loader, vm)?; |
| 1461 | |
| 1462 | if !loaded { |
| 1463 | let _ = self.load_system_certificates(&mut store, vm); |
| 1464 | } |
| 1465 | } |
| 1466 | |
| 1467 | // If no certificates were loaded from system, fallback to webpki-roots (Mozilla CA bundle) |
| 1468 | // This ensures we always have some trusted root certificates even if system cert loading fails |
| 1469 | if *self.x509_cert_count.read() == 0 { |
| 1470 | use webpki_roots; |
| 1471 | |
| 1472 | // webpki_roots provides TLS_SERVER_ROOTS as &[TrustAnchor] |
| 1473 | // We can use extend() to add them to the RootCertStore |
| 1474 | let webpki_count = webpki_roots::TLS_SERVER_ROOTS.len(); |
| 1475 | store.extend(webpki_roots::TLS_SERVER_ROOTS.iter().cloned()); |
| 1476 | |
| 1477 | *self.x509_cert_count.write() += webpki_count; |
| 1478 | *self.ca_cert_count.write() += webpki_count; |
| 1479 | } |
| 1480 | |
| 1481 | Ok(()) |
| 1482 | } |
| 1483 | |
| 1484 | #[pymethod] |
| 1485 | fn set_alpn_protocols(&self, protocols: PyListRef, vm: &VirtualMachine) -> PyResult<()> { |
no test coverage detected