Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Macos certif #447

Merged
merged 17 commits into from
Oct 10, 2020
9 changes: 6 additions & 3 deletions cibuildwheel/macos.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from .environment import ParsedEnvironment
from .util import (BuildOptions, BuildSelector, NonPlatformWheelError, download,
get_build_verbosity_extra_flags, get_pip_script,
prepare_command)
prepare_command, install_certifi_script)


def call(args: Union[str, Sequence[Union[str, PathLike]]], env: Optional[Dict[str, str]] = None, cwd: Optional[str] = None, shell: bool = False) -> int:
Expand Down Expand Up @@ -72,6 +72,9 @@ def install_cpython(version: str, url: str) -> Path:

# if this version of python isn't installed, get it from python.org and install
python_package_identifier = f'org.python.Python.PythonFramework-{version}'
python_executable = 'python3' if version[0] == '3' else 'python'
installation_bin_path = Path(f'/Library/Frameworks/Python.framework/Versions/{version}/bin')
YannickJadoul marked this conversation as resolved.
Show resolved Hide resolved

if python_package_identifier not in installed_system_packages:
# download the pkg
download(url, Path('/tmp/Python.pkg'))
Expand All @@ -83,8 +86,8 @@ def install_cpython(version: str, url: str) -> Path:
download(open_ssl_patch_url, Path('/tmp/python-patch.tar.gz'))
call(['sudo', 'tar', '-C', f'/Library/Frameworks/Python.framework/Versions/{version}/', '-xmf', '/tmp/python-patch.tar.gz'])

installation_bin_path = Path(f'/Library/Frameworks/Python.framework/Versions/{version}/bin')
python_executable = 'python3' if version[0] == '3' else 'python'
call(["sudo", str(installation_bin_path/python_executable), str(install_certifi_script)])

pip_executable = 'pip3' if version[0] == '3' else 'pip'
make_symlinks(installation_bin_path, python_executable, pip_executable)

Expand Down
52 changes: 52 additions & 0 deletions cibuildwheel/resources/install_certifi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Based on: https://github.com/python/cpython/blob/master/Mac/BuildScript/resources/install_certificates.command

# install_certifi.py
#
# sample script to install or update a set of default Root Certificates
# for the ssl module. Uses the certificates provided by the certifi package:
# https://pypi.org/project/certifi/

import os
Czaki marked this conversation as resolved.
Show resolved Hide resolved
import os.path
import ssl
import stat
import subprocess
import sys

STAT_0o775 = (stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
| stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP
| stat.S_IROTH | stat.S_IXOTH)

if sys.version_info[0] == 2:
FileNotFoundError = OSError


def main():
YannickJadoul marked this conversation as resolved.
Show resolved Hide resolved
openssl_dir, openssl_cafile = os.path.split(
ssl.get_default_verify_paths().openssl_cafile)
print(" -- pip install --upgrade certifi")
subprocess.check_call([sys.executable,
"-E", "-s", "-m", "pip", "install", "--upgrade", "certifi"])

import certifi
YannickJadoul marked this conversation as resolved.
Show resolved Hide resolved
# change working directory to the default SSL directory
if sys.version_info[0:2] == (3, 5):
os.makedirs(openssl_dir, exist_ok=True, mode=0o775)
os.chdir(openssl_dir)
relpath_to_certifi_cafile = os.path.relpath(certifi.where())

print(" -- removing any existing file or link")
try:
os.remove(openssl_cafile)
except FileNotFoundError:
pass
print(" -- creating symlink to certifi certificate bundle")
os.symlink(relpath_to_certifi_cafile, openssl_cafile)

print(" -- setting permissions")
os.chmod(openssl_cafile, STAT_0o775)
print(" -- update complete")


if __name__ == '__main__':
Czaki marked this conversation as resolved.
Show resolved Hide resolved
main()
1 change: 1 addition & 0 deletions cibuildwheel/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ class BuildOptions(NamedTuple):

resources_dir = Path(__file__).resolve().parent / 'resources'
get_pip_script = resources_dir / 'get-pip.py'
install_certifi_script = resources_dir / "install_certifi.py"


class NonPlatformWheelError(Exception):
Expand Down
9 changes: 4 additions & 5 deletions test/test_ssl.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,10 @@
else:
from urllib.request import urlopen

if sys.version_info[0:2] == (3, 3):
data = urlopen("https://www.nist.gov")
else:
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
data = urlopen("https://www.nist.gov", context=context)
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
data = urlopen("https://www.nist.gov", context=context)
data = urlopen("https://raw.githubusercontent.com/joerick/cibuildwheel/master/CI.md", context=context)
data = urlopen("https://raw.githubusercontent.com/joerick/cibuildwheel/master/CI.md")
''')
)

Expand Down