Comments
Patch
@@ -150,26 +150,31 @@ def wrapsocket(sock, keyfile, certfile,
if certfile is not None:
def password():
f = keyfile or certfile
return ui.getpass(_('passphrase for %s: ') % f, '')
sslcontext.load_cert_chain(certfile, keyfile, password)
if ca_certs is not None:
sslcontext.load_verify_locations(cafile=ca_certs)
+ caloaded = True
else:
# This is a no-op on old Python.
sslcontext.load_default_certs()
+ caloaded = _canloaddefaultcerts
sslsocket = sslcontext.wrap_socket(sock, server_hostname=serverhostname)
# check if wrap_socket failed silently because socket had been
# closed
# - see http://bugs.python.org/issue13721
if not sslsocket.cipher():
raise error.Abort(_('ssl connection failed'))
+
+ sslsocket._hgcaloaded = caloaded
+
return sslsocket
def _verifycert(cert, hostname):
'''Verify that cert (in socket.getpeercert() format) matches hostname.
CRLs is not handled.
Returns error message if any problems are found and None on success.
'''
@@ -275,22 +280,16 @@ def sslkwargs(ui, host):
'cert_reqs': ssl.CERT_REQUIRED})
return kws
# FUTURE this can disappear once wrapsocket() is secure by default.
if _canloaddefaultcerts:
kws['cert_reqs'] = ssl.CERT_REQUIRED
return kws
- # This is effectively indicating that no CAs can be loaded because
- # we can't get here if web.cacerts is set or if we can find
- # CA certs elsewhere. Using a config option (which is later
- # consulted by validator.__call__ is not very obvious).
- # FUTURE fix this
- ui.setconfig('web', 'cacerts', '!', 'defaultcacerts')
return kws
class validator(object):
def __init__(self, ui, host):
self.ui = ui
self.host = host
def __call__(self, sock, strict=False):
@@ -337,28 +336,28 @@ class validator(object):
# the same as below for BC.
if self.ui.insecureconnections:
self.ui.warn(_('warning: %s certificate with fingerprint %s not '
'verified (check hostfingerprints or web.cacerts '
'config setting)\n') %
(host, nicefingerprint))
return
- # No pinned fingerprint. Establish trust by looking at the CAs.
- cacerts = self.ui.config('web', 'cacerts')
- if cacerts != '!':
- msg = _verifycert(peercert2, host)
- if msg:
- raise error.Abort(_('%s certificate error: %s') % (host, msg),
- hint=_('configure hostfingerprint %s or use '
- '--insecure to connect insecurely') %
- nicefingerprint)
- self.ui.debug('%s certificate successfully verified\n' % host)
- elif strict:
- raise error.Abort(_('%s certificate with fingerprint %s not '
- 'verified') % (host, nicefingerprint),
- hint=_('check hostfingerprints or web.cacerts '
- 'config setting'))
- else:
- self.ui.warn(_('warning: %s certificate with fingerprint %s not '
- 'verified (check hostfingerprints or web.cacerts '
- 'config setting)\n') %
- (host, nicefingerprint))
+ if not sock._hgcaloaded:
+ if strict:
+ raise error.Abort(_('%s certificate with fingerprint %s not '
+ 'verified') % (host, nicefingerprint),
+ hint=_('check hostfingerprints or '
+ 'web.cacerts config setting'))
+ else:
+ self.ui.warn(_('warning: %s certificate with fingerprint %s '
+ 'not verified (check hostfingerprints or '
+ 'web.cacerts config setting)\n') %
+ (host, nicefingerprint))
+
+ return
+
+ msg = _verifycert(peercert2, host)
+ if msg:
+ raise error.Abort(_('%s certificate error: %s') % (host, msg),
+ hint=_('configure hostfingerprint %s or use '
+ '--insecure to connect insecurely') %
+ nicefingerprint)