Skip to content

Commit e260141

Browse files
authored
CM-38532 - Fix certificate issues on macOS; fix homebrew build (#241)
1 parent 9dbbddb commit e260141

File tree

4 files changed

+34
-101
lines changed

4 files changed

+34
-101
lines changed

cycode/cli/main.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
from multiprocessing import freeze_support
22

3-
# DO NOT REMOVE OR MOVE THIS LINE
4-
# this is required to use certificates system store with requests packaged with PyInstaller
5-
import pip_system_certs.wrapt_requests # noqa: F401
6-
73
from cycode.cli.commands.main_cli import main_cli
84

95
if __name__ == '__main__':

cycode/cyclient/cycode_client_base.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,42 @@
1-
from typing import ClassVar, Dict, Optional
1+
import os
2+
import platform
3+
import ssl
4+
from typing import Callable, ClassVar, Dict, Optional
25

3-
from requests import Response, exceptions, request
6+
import requests
7+
from requests import Response, exceptions
8+
from requests.adapters import HTTPAdapter
49

510
from cycode.cli.exceptions.custom_exceptions import HttpUnauthorizedError, NetworkError
611
from cycode.cyclient import config, logger
712
from cycode.cyclient.headers import get_cli_user_agent, get_correlation_id
813

914

15+
class SystemStorageSslContext(HTTPAdapter):
16+
def init_poolmanager(self, *args, **kwargs) -> None:
17+
default_context = ssl.create_default_context()
18+
default_context.load_default_certs()
19+
kwargs['ssl_context'] = default_context
20+
return super().init_poolmanager(*args, **kwargs)
21+
22+
def cert_verify(self, *args, **kwargs) -> None:
23+
super().cert_verify(*args, **kwargs)
24+
conn = kwargs['conn'] if 'conn' in kwargs else args[0]
25+
conn.ca_certs = None
26+
27+
28+
def _get_request_function() -> Callable:
29+
if platform.system() == 'Darwin':
30+
return requests.request
31+
32+
if os.environ.get('REQUESTS_CA_BUNDLE') or os.environ.get('CURL_CA_BUNDLE'):
33+
return requests.request
34+
35+
session = requests.Session()
36+
session.mount('https://', SystemStorageSslContext())
37+
return session.request
38+
39+
1040
class CycodeClientBase:
1141
MANDATORY_HEADERS: ClassVar[Dict[str, str]] = {
1242
'User-Agent': get_cli_user_agent(),
@@ -56,6 +86,7 @@ def _execute(
5686

5787
try:
5888
headers = self.get_request_headers(headers, without_auth=without_auth)
89+
request = _get_request_function()
5990
response = request(method=method, url=url, timeout=timeout, headers=headers, **kwargs)
6091

6192
content = 'HIDDEN' if hide_response_content_log else response.text

poetry.lock

Lines changed: 1 addition & 94 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ requests = ">=2.24,<3.0"
4141
urllib3 = "1.26.19" # lock v1 to avoid issues with openssl and old Python versions (<3.9.11) on macOS
4242
sentry-sdk = ">=2.8.0,<3.0"
4343
pyjwt = ">=2.8.0,<3.0"
44-
pip-system-certs = ">=4.0,<5.0"
4544

4645
[tool.poetry.group.test.dependencies]
4746
mock = ">=4.0.3,<4.1.0"

0 commit comments

Comments
 (0)