sapling/mercurial
Matt Harbison 96e146ce9c win32: add a method to trigger the Crypto API to complete a certificate chain
I started a thread[1] on the mailing list awhile ago, but the short version is
that Windows doesn't ship with a full list of certificates[2].  Even if the
server sends the whole chain, if Windows doesn't have the appropriate
certificate pre-installed in its "Third-Party Root Certification Authorities"
store, connections mysteriously fail with:

  abort: error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)

Windows expects the application to call the methods invoked here as part of the
certificate verification, triggering a call out to Windows update if necessary,
to complete the trust chain.  The python bug to add this support[3] hasn't had
any recent activity, and isn't targeting py27 anyway.

The only work around that I could find (besides figuring out the certificate and
walking through the import wizard) is to browse to the site in Internet
Explorer.  Opening the page with FireFox or Chrome didn't work.  That's a pretty
obscure way to fix a pretty obscure problem.  We go to great lengths to
demystify various SSL errors, but this case is clearly lacking.  Let's try to
make things easier to diagnose and fix.

When I had trouble figuring out how to get ctypes to work with all of the API
pointers, I found that there are other python projects[4] using this API to
achieve the same thing.

[1] https://www.mercurial-scm.org/pipermail/mercurial-devel/2017-April/096501.html
[2] https://support.microsoft.com/en-us/help/931125/how-to-get-a-root-certificate-update-for-windows
[3] https://bugs.python.org/issue20916
[4] 3b86bce206/source/updateCheck.py (L511)
2017-03-29 23:45:23 -04:00
..
cext parsers: fix invariant bug in find_deepest (issue5623) 2017-07-14 13:48:17 +02:00
cffi
default.d mergetools.rc: find OSX FileMerge in the new location inside Xcode 4.3 2015-10-16 11:37:34 +02:00
help merge with stable 2017-07-05 11:55:26 -04:00
hgweb hgweb: use ui._unset to prevent a warning in configitems 2017-07-03 13:04:35 +02:00
httpclient httpclient: update to 54868ef054d2 of httpplus 2016-06-27 11:53:50 -04:00
pure lazymanifest: write a more efficient, pypy friendly version of lazymanifest 2016-09-12 13:37:14 +02:00
templates hgweb: re-implement followlines UI selection using buttons 2017-07-03 13:49:03 +02:00
__init__.py py3: add pycompat.unicode and add it to importer 2017-04-07 23:35:51 +05:30
ancestor.py py3: add __bool__ to every class defining __nonzero__ 2017-03-13 12:40:14 -07:00
archival.py archival: flag missing files as a dirty wdir() in the metadata file (BC) 2017-07-09 02:46:03 -04:00
bdiff.c bdiff: split bdiff into cpy-aware and cpy-agnostic part 2016-07-13 10:46:26 +02:00
bdiff.h bdiff: split bdiff into cpy-aware and cpy-agnostic part 2016-07-13 10:46:26 +02:00
bitmanipulation.h internals: move the bitmanipulation routines into its own file 2016-06-06 13:08:13 +02:00
bookmarks.py bookmarks: use 'applychanges' for bookmark update 2017-07-10 19:40:23 +02:00
branchmap.py rbc: fix superfluous rebuilding from scratch - don't abuse self._rbcnamescount 2016-07-18 22:25:09 +02:00
bundle2.py phases: remove trace of addednodes in the 'phase-heads' handling 2017-07-13 21:10:55 +02:00
bundlerepo.py configitems: register the 'bundle.mainreporoot' config 2017-06-30 03:31:26 +02:00
byterange.py pycompat: switch to util.urlreq/util.urlerr for py3 compat 2016-04-06 23:22:12 +00:00
changegroup.py changegroup: stop returning and recording added nodes in 'cg.apply' 2017-07-13 21:08:06 +02:00
changelog.py revlog: make 'storedeltachains' a "public" attribute 2016-10-14 02:25:08 +02:00
chgserver.py pager: set some environment variables if they're not set 2017-04-13 08:27:19 -07:00
cmdutil.py codemod: simplify nested withs 2017-07-13 18:31:35 -07:00
color.py configitems: register the 'color.mode' config 2017-06-30 03:32:09 +02:00
commands.py summary: fix type of empty unresolved list 2017-07-07 23:13:04 +09:00
commandserver.py commandserver: update comment about setpgid 2016-07-18 15:59:08 +01:00
compat.h compat: define ssize_t as int on 32bit Windows, silences C4142 warning 2016-07-15 23:54:56 +09:00
config.py config: make config.items() return a copy 2017-05-18 13:38:37 -07:00
configitems.py configitems: register the 'worker.backgroundclose' config 2017-06-30 03:45:57 +02:00
context.py subrepo: consider the parent repo dirty when a file is missing 2017-07-09 02:55:46 -04:00
copies.py merge: avoid superfluous filemerges when grafting through renames (issue5407) 2016-10-25 21:01:53 +02:00
crecord.py patch: rewrite reversehunks (issue5337) 2017-06-20 23:22:38 -07:00
dagop.py followlines: join merge parents line ranges in blockdescendants() (issue5595) 2017-07-05 13:54:53 +02:00
dagparser.py error: get Abort from 'error' instead of 'util' 2015-10-08 12:55:45 -07:00
dagutil.py dagutil: use absolute_import 2015-08-08 19:04:09 -07:00
debugcommands.py codemod: simplify nested withs 2017-07-13 18:31:35 -07:00
destutil.py show: implement "stack" view 2017-07-01 22:38:42 -07:00
dirstate.py dirstate: update backup functions to take full backup filename 2017-07-12 15:24:07 -07:00
dirstateguard.py dirstate: update backup functions to take full backup filename 2017-07-12 15:24:07 -07:00
discovery.py discovery: prevent crash caused by prune marker having no parent data 2017-04-19 23:10:05 +09:00
dispatch.py dispatch: remove unused _loaded 2017-06-24 02:39:21 +09:00
dummycert.pem
encoding.py py3: add utility to forward __str__() to __bytes__() 2017-06-24 13:48:04 +09:00
error.py error: rename RichIOError to PeerTransportError 2017-04-16 11:12:37 -07:00
exchange.py pushrace: avoid crash on bare push when using concurrent push mode 2017-06-28 17:41:25 +02:00
exewrapper.c exewrapper: add .dll to LoadLibrary() argument 2016-04-27 09:23:39 -07:00
extensions.py dispatch: fix typo suggestion for disabled extension 2017-07-07 00:13:53 -07:00
fancyopts.py py3: slice over bytes to prevent getting it's ascii value 2017-06-25 08:36:51 +05:30
filelog.py revlog: merge hash checking subfunctions 2016-12-13 14:21:36 +00:00
filemerge.py filemerge: convert a couple of wvfs calls in internal mergetools to contexts 2017-06-26 22:52:15 -07:00
fileset.py help: clarify quotes are needed for filesets.size expressions 2016-09-21 16:33:37 +00:00
formatter.py formatter: proxy fm.context() through converter 2017-06-26 09:33:01 +09:00
graphmod.py dagop: split module hosting DAG-related algorithms from revset 2016-10-16 18:03:24 +09:00
hbisect.py bisect: move check_state into the bisect module 2016-08-24 04:25:20 +02:00
help.py help: explain how to access subtopics in internals 2017-04-19 17:04:22 -07:00
hg.py py3: check for bytes instead of str in isinstance 2017-06-22 03:20:11 +05:30
hook.py py3: convert keys of kwargs back to bytes using pycompat.byteskwargs() 2017-06-17 15:29:26 +05:30
httpconnection.py httpconnection: allow a global auth.cookiefile config entry 2017-03-09 22:35:10 -08:00
httppeer.py httppeer: unify hint message for PeerTransportError 2017-05-01 05:52:36 +09:00
i18n.py i18n: make the locale directory name the same string type as the datapath 2016-10-08 05:26:18 -04:00
keepalive.py keepalive: send HTTP request headers in a deterministic order 2017-04-13 18:04:38 -07:00
localrepo.py phases: track phase movements in 'advanceboundary' 2017-07-11 02:39:52 +02:00
lock.py lock: avoid unintentional lock acquisition at failure of readlock 2017-05-01 19:59:13 +09:00
lsprof.py lsprof: use print function 2016-01-02 11:40:53 -08:00
lsprofcalltree.py lsprofcalltree: use print function 2016-01-02 11:45:29 -08:00
mail.py mail: handle renamed email.Header 2016-10-07 17:30:11 +02:00
manifest.py manifest: apply checkambig=True only for root 00manifest.i 2017-06-30 01:47:48 +09:00
match.py match: make base matcher return True for visitdir 2017-07-14 10:57:36 -07:00
mdiff.py py3: use pycompat.strkwargs() to convert kwargs keys to str 2017-06-27 00:23:32 +05:30
merge.py sparse: refactor update actions filtering and call from core 2017-07-06 16:29:31 -07:00
mergeutil.py checkunresolved: move to new package to help avoid import cycles 2016-11-21 21:31:45 -05:00
minirst.py help: search section of help topic by translated section name correctly 2016-05-13 07:19:59 +09:00
mpatch.c internals: move the bitmanipulation routines into its own file 2016-06-06 13:08:13 +02:00
mpatch.h mpatch: raise MemoryError instead of mpatchError if lalloc() failed 2016-08-07 10:06:56 +09:00
namespaces.py namespaces: record and expose whether namespace is built-in 2017-06-24 14:52:15 -07:00
node.py node: use byte literals to construct nullid and wdirid 2016-03-12 14:04:57 -08:00
obsolete.py obsstore: keep self._data updated with _addmarkers 2017-06-03 21:56:23 -07:00
obsutil.py obsolete: closest divergent support 2017-06-30 15:27:19 +02:00
parser.py parser: preserve order of keyword arguments 2017-04-09 11:58:27 +09:00
patch.py patch: make parsepatch optionally trim context lines 2017-07-04 16:41:28 -07:00
pathutil.py vfs: allow to pass more argument to audit 2017-07-11 12:27:58 +02:00
peer.py py3: convert to next() function 2016-05-16 21:30:53 +00:00
phases.py phases: remove trace of addednodes in the 'phase-heads' handling 2017-07-13 21:10:55 +02:00
policy.py policy: add cffi policy for PyPy 2016-06-07 15:35:58 +02:00
posix.py merge with stable 2017-01-04 14:52:59 -05:00
profiling.py check-config: syntax to allow inconsistent config values 2017-07-01 20:34:27 -07:00
progress.py configitems: register the 'progress.estimate' config 2017-06-30 03:44:04 +02:00
pushkey.py pushkey: use absolute_import 2015-08-08 19:57:27 -07:00
pvec.py pvec: use absolute_import 2015-12-21 21:32:58 -08:00
pycompat.py pycompat: verify sys.argv exists before forwarding it (issue5493) 2017-03-07 13:24:24 -05:00
rcutil.py pager: use less as a fallback on Unix 2017-04-28 20:51:14 +09:00
registrar.py configitems: add an official API for extensions to register config item 2017-06-17 13:48:20 +02:00
repair.py bookmark: use 'applychanges' in 'repair.strip' 2017-07-10 17:46:47 +02:00
repoview.py cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1 2016-06-10 00:12:33 -04:00
revlog.py revlog: use struct.Struct instances for slight performance wins 2017-07-10 16:41:13 -04:00
revset.py revset: add experimental ancestors/descendants relation subscript 2017-07-08 13:15:17 +09:00
revsetlang.py revset: add experimental relation and subscript operators 2017-07-08 13:07:59 +09:00
scmposix.py pager: use less as a fallback on Unix 2017-04-28 20:51:14 +09:00
scmutil.py cleanupnode: do not use generator for node mapping 2017-07-09 15:11:19 +02:00
scmwindows.py pager: use less as a fallback on Unix 2017-04-28 20:51:14 +09:00
server.py serve: add support for Mercurial subrepositories 2017-04-15 18:05:40 -04:00
setdiscovery.py setdiscovery: use iterbatch interface instead of batch 2016-03-01 17:44:41 -05:00
similar.py similar: remove caching from the module level 2017-01-13 11:42:36 -08:00
simplemerge.py py3: convert kwargs' keys' to str using pycompat.strkwargs() 2017-06-22 03:16:16 +05:30
smartset.py smartset: fix generatorset.last() to not return the first element (issue5609) 2017-06-27 23:50:22 +09:00
sparse.py match: write forceincludematcher using unionmatcher 2017-07-07 14:39:59 -07:00
sshpeer.py py3: use pycompat.byteskwargs() to convert kwargs' keys to bytes 2017-06-27 00:20:55 +05:30
sshserver.py wireproto: compress data from a generator 2016-10-16 11:10:21 -07:00
sslutil.py sslutil: check for missing certificate and key files (issue5598) 2017-07-10 21:09:46 -07:00
statichttprepo.py localrepo: cache types for filtered repos (issue5043) 2017-07-01 20:51:19 -07:00
statprof.py cleanup: use set literals 2017-02-10 16:56:29 -08:00
store.py vfs: rename auditvfs to proxyvfs 2017-07-07 23:40:00 +09:00
streamclone.py streamclone: close large revlog files explicitly in generatev1() 2017-07-07 23:25:16 +09:00
subrepo.py subrepo: make the output references to subrepositories consistent 2017-07-09 16:13:30 -04:00
tagmerge.py tagmerge: use workingfilectx to write merged tags 2017-07-11 16:48:15 -07:00
tags.py tag: make sure the repository is locked when tagging 2017-07-02 01:41:37 +02:00
templatefilters.py templatefilters: fix crash by string formatting of '{x|splitlines}' 2017-04-15 10:51:17 +09:00
templatekw.py templatekw: hide {peerpaths} keyword for 4.3 2017-07-15 00:38:57 +09:00
templater.py py3: convert kwargs' keys' to str using pycompat.strkwargs() 2017-06-22 03:16:16 +05:30
transaction.py transaction: apply checkambig=True only on limited files for similarity 2017-07-04 23:13:47 +09:00
treediscovery.py error: get Abort from 'error' instead of 'util' 2015-10-08 12:55:45 -07:00
txnutil.py
ui.py configitems: handle case were the default value is not static 2017-07-12 23:36:10 +02:00
unionrepo.py configitems: register the 'bundle.mainreporoot' config 2017-06-30 03:31:26 +02:00
upgrade.py codemod: simplify nested withs 2017-07-13 18:31:35 -07:00
url.py url: support auth.cookiesfile for adding cookies to HTTP requests 2017-03-09 22:40:52 -08:00
util.py histedit: extract InterventionRequired transaction handling to utils 2017-07-12 13:57:03 -07:00
verify.py verify: add a config option to skip certain flag processors 2017-05-14 09:38:06 -07:00
vfs.py vfs: allow to pass more argument to audit 2017-07-11 12:27:58 +02:00
win32.py win32: add a method to trigger the Crypto API to complete a certificate chain 2017-03-29 23:45:23 -04:00
windows.py windows: add context manager support to mixedfilemodewrapper 2017-04-11 21:38:11 -04:00
wireproto.py configitems: register the 'server.preferuncompressed' config 2017-06-30 03:44:12 +02:00
worker.py worker: propagate exit code to main process 2017-04-15 13:27:44 +09:00