Mercurial > hg
view contrib/dirstatenonnormalcheck.py @ 29258:6315c1e14f75
sslutil: introduce a function for determining host-specific settings
This patch marks the beginning of a series that introduces a new,
more configurable, per-host security settings mechanism. Currently,
we have global settings (like web.cacerts and the --insecure argument).
We also have per-host settings via [hostfingerprints].
Global security settings are good for defaults, but they don't
provide the amount of control often wanted. For example, an
organization may want to require a particular CA is used for a
particular hostname.
[hostfingerprints] is nice. But it currently assumes SHA-1.
Furthermore, there is no obvious place to put additional per-host
settings.
Subsequent patches will be introducing new mechanisms for defining
security settings, some on a per-host basis. This commits starts
the transition to that world by introducing the _hostsettings
function. It takes a ui and hostname and returns a dict of security
settings. Currently, it limits itself to returning host fingerprint
info.
We foreshadow the future support of non-SHA1 hashing algorithms
for verifying the host fingerprint by making the "certfingerprints"
key a list of tuples instead of a list of hashes.
We add this dict to the hgstate property on the socket and use it
during socket validation for checking fingerprints. There should be
no change in behavior.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sat, 28 May 2016 11:12:02 -0700 |
parents | 3fd94f603190 |
children | 60927b19ed65 |
line wrap: on
line source
# dirstatenonnormalcheck.py - extension to check the consistency of the # dirstate's non-normal map # # For most operations on dirstate, this extensions checks that the nonnormalset # contains the right entries. # It compares the nonnormal file to a nonnormalset built from the map of all # the files in the dirstate to check that they contain the same files. from __future__ import absolute_import from mercurial import ( dirstate, extensions, ) def nonnormalentries(dmap): """Compute nonnormal entries from dirstate's dmap""" res = set() for f, e in dmap.iteritems(): if e[0] != 'n' or e[3] == -1: res.add(f) return res def checkconsistency(ui, orig, dmap, _nonnormalset, label): """Compute nonnormalset from dmap, check that it matches _nonnormalset""" nonnormalcomputedmap = nonnormalentries(dmap) if _nonnormalset != nonnormalcomputedmap: ui.develwarn("%s call to %s\n" % (label, orig), config='dirstate') ui.develwarn("inconsistency in nonnormalset\n", config='dirstate') ui.develwarn("[nonnormalset] %s\n" % _nonnormalset, config='dirstate') ui.develwarn("[map] %s\n" % nonnormalcomputedmap, config='dirstate') def _checkdirstate(orig, self, arg): """Check nonnormal set consistency before and after the call to orig""" checkconsistency(self._ui, orig, self._map, self._nonnormalset, "before") r = orig(self, arg) checkconsistency(self._ui, orig, self._map, self._nonnormalset, "after") return r def extsetup(ui): """Wrap functions modifying dirstate to check nonnormalset consistency""" dirstatecl = dirstate.dirstate devel = ui.configbool('devel', 'all-warnings') paranoid = ui.configbool('experimental', 'nonnormalparanoidcheck') if devel: extensions.wrapfunction(dirstatecl, '_writedirstate', _checkdirstate) if paranoid: # We don't do all these checks when paranoid is disable as it would # make the extension run very slowly on large repos extensions.wrapfunction(dirstatecl, 'normallookup', _checkdirstate) extensions.wrapfunction(dirstatecl, 'otherparent', _checkdirstate) extensions.wrapfunction(dirstatecl, 'normal', _checkdirstate) extensions.wrapfunction(dirstatecl, 'write', _checkdirstate) extensions.wrapfunction(dirstatecl, 'add', _checkdirstate) extensions.wrapfunction(dirstatecl, 'remove', _checkdirstate) extensions.wrapfunction(dirstatecl, 'merge', _checkdirstate) extensions.wrapfunction(dirstatecl, 'drop', _checkdirstate)