Mercurial > hg
view mercurial/scmposix.py @ 31290:f819aa9dbbf9
sslutil: issue warning when [hostfingerprint] is used
Mercurial 3.9 added the [hostsecurity] section, which is better
than [hostfingerprints] in every way.
One of the ways that [hostsecurity] is better is that it supports
SHA-256 and SHA-512 fingerprints, not just SHA-1 fingerprints.
The world is moving away from SHA-1 because it is borderline
secure. Mercurial should be part of that movement.
This patch adds a warning when a valid SHA-1 fingerprint from
the [hostfingerprints] section is being used. The warning informs
users to switch to [hostsecurity]. It even prints the config
option they should set. It uses the SHA-256 fingerprint because
recommending a SHA-1 fingerprint in 2017 would be ill-advised.
The warning will print itself on every connection to a server until
it is fixed. There is no way to suppress the warning. I admit this
is annoying. But given the security implications of sticking with
SHA-1, I think this is justified. If this patch is accepted,
I'll likely send a follow-up to start warning on SHA-1
certificates in [hostsecurity] as well. Then sometime down
the road, we can drop support for SHA-1 fingerprints.
Credit for this idea comes from timeless in issue 5466.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Thu, 09 Mar 2017 20:33:29 -0800 |
parents | 354020079723 |
children | 7c09b071318a |
line wrap: on
line source
from __future__ import absolute_import import array import errno import fcntl import os import sys from . import ( encoding, osutil, pycompat, ) def _rcfiles(path): rcs = [os.path.join(path, 'hgrc')] rcdir = os.path.join(path, 'hgrc.d') try: rcs.extend([os.path.join(rcdir, f) for f, kind in osutil.listdir(rcdir) if f.endswith(".rc")]) except OSError: pass return rcs def systemrcpath(): path = [] if pycompat.sysplatform == 'plan9': root = 'lib/mercurial' else: root = 'etc/mercurial' # old mod_python does not set sys.argv if len(getattr(sys, 'argv', [])) > 0: p = os.path.dirname(os.path.dirname(pycompat.sysargv[0])) if p != '/': path.extend(_rcfiles(os.path.join(p, root))) path.extend(_rcfiles('/' + root)) return path def userrcpath(): if pycompat.sysplatform == 'plan9': return [encoding.environ['home'] + '/lib/hgrc'] elif pycompat.sysplatform == 'darwin': return [os.path.expanduser('~/.hgrc')] else: confighome = encoding.environ.get('XDG_CONFIG_HOME') if confighome is None or not os.path.isabs(confighome): confighome = os.path.expanduser('~/.config') return [os.path.expanduser('~/.hgrc'), os.path.join(confighome, 'hg', 'hgrc')] def termsize(ui): try: import termios TIOCGWINSZ = termios.TIOCGWINSZ # unavailable on IRIX (issue3449) except (AttributeError, ImportError): return 80, 24 for dev in (ui.ferr, ui.fout, ui.fin): try: try: fd = dev.fileno() except AttributeError: continue if not os.isatty(fd): continue arri = fcntl.ioctl(fd, TIOCGWINSZ, '\0' * 8) height, width = array.array('h', arri)[:2] if width > 0 and height > 0: return width, height except ValueError: pass except IOError as e: if e[0] == errno.EINVAL: pass else: raise return 80, 24