mirror of
https://github.com/josegonzalez/python-github-backup.git
synced 2025-12-05 08:08:02 +01:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72d35a9b94 | ||
|
|
3eae9d78ed | ||
|
|
90ba839c7d |
30
CHANGES.rst
30
CHANGES.rst
@@ -1,10 +1,38 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
0.51.1 (2025-11-16)
|
||||
0.51.2 (2025-11-16)
|
||||
-------------------
|
||||
------------------------
|
||||
|
||||
Fix
|
||||
~~~
|
||||
- Improve CA certificate detection with fallback chain. [Rodos]
|
||||
|
||||
The previous implementation incorrectly assumed empty get_ca_certs()
|
||||
meant broken SSL, causing false failures in GitHub Codespaces and other
|
||||
directory-based cert systems where certificates exist but aren't pre-loaded.
|
||||
It would then attempt to import certifi as a workaround, but certifi wasn't
|
||||
listed in requirements.txt, causing the fallback to fail with ImportError
|
||||
even though the system certificates would have worked fine.
|
||||
|
||||
This commit replaces the naive check with a layered fallback approach that
|
||||
checks multiple certificate sources. First it checks for pre-loaded system
|
||||
certs (file-based systems). Then it verifies system cert paths exist
|
||||
(directory-based systems like Ubuntu/Debian/Codespaces). Finally it attempts
|
||||
to use certifi as an optional fallback only if needed.
|
||||
|
||||
This approach eliminates hard dependencies (certifi is now optional), works
|
||||
in GitHub Codespaces without any setup, and fails gracefully with clear hints
|
||||
for resolution when SSL is actually broken rather than failing with
|
||||
ModuleNotFoundError.
|
||||
|
||||
Fixes #444
|
||||
|
||||
|
||||
0.51.1 (2025-11-16)
|
||||
-------------------
|
||||
|
||||
Fix
|
||||
~~~
|
||||
- Prevent duplicate attachment downloads. [Rodos]
|
||||
|
||||
@@ -1 +1 @@
|
||||
__version__ = "0.51.1"
|
||||
__version__ = "0.51.2"
|
||||
|
||||
@@ -37,22 +37,33 @@ FNULL = open(os.devnull, "w")
|
||||
FILE_URI_PREFIX = "file://"
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Setup SSL context with fallback chain
|
||||
https_ctx = ssl.create_default_context()
|
||||
if not https_ctx.get_ca_certs():
|
||||
import warnings
|
||||
if https_ctx.get_ca_certs():
|
||||
# Layer 1: Certificates pre-loaded from system (file-based)
|
||||
pass
|
||||
else:
|
||||
paths = ssl.get_default_verify_paths()
|
||||
if (paths.cafile and os.path.exists(paths.cafile)) or (
|
||||
paths.capath and os.path.exists(paths.capath)
|
||||
):
|
||||
# Layer 2: Cert paths exist, will be lazy-loaded on first use (directory-based)
|
||||
pass
|
||||
else:
|
||||
# Layer 3: Try certifi package as optional fallback
|
||||
try:
|
||||
import certifi
|
||||
|
||||
warnings.warn(
|
||||
"\n\nYOUR DEFAULT CA CERTS ARE EMPTY.\n"
|
||||
+ "PLEASE POPULATE ANY OF:"
|
||||
+ "".join(
|
||||
["\n - " + x for x in ssl.get_default_verify_paths() if type(x) is str]
|
||||
)
|
||||
+ "\n",
|
||||
stacklevel=2,
|
||||
)
|
||||
import certifi
|
||||
|
||||
https_ctx = ssl.create_default_context(cafile=certifi.where())
|
||||
https_ctx = ssl.create_default_context(cafile=certifi.where())
|
||||
except ImportError:
|
||||
# All layers failed - no certificates available anywhere
|
||||
sys.exit(
|
||||
"\nERROR: No CA certificates found. Cannot connect to GitHub over SSL.\n\n"
|
||||
"Solutions you can explore:\n"
|
||||
" 1. pip install certifi\n"
|
||||
" 2. Alpine: apk add ca-certificates\n"
|
||||
" 3. Debian/Ubuntu: apt-get install ca-certificates\n\n"
|
||||
)
|
||||
|
||||
|
||||
def logging_subprocess(
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
|
||||
Reference in New Issue
Block a user