Mercurial > hg
view mercurial/loggingutil.py @ 52292:085cc409847d
sslutil: bump the default minimum TLS version of the client to 1.2 (BC)
TLS v1.0 and v1.1 are deprecated by RFC8996[1]:
These versions lack support for current and recommended cryptographic
algorithms and mechanisms, and various government and industry profiles of
applications using TLS now mandate avoiding these old TLS versions.
TLS version 1.2 became the recommended version for IETF protocols in
2008 (subsequently being obsoleted by TLS version 1.3 in 2018)...
Various browsers have disabled or removed it[2][3][4], as have various internet
services, and Windows 11 has it disabled by default[5]. We should move on too.
(We should also bump it on the server side, as this config only affects clients
not allowing a server to negotiate down. But the only server-side config is a
`devel` option to pick exactly one protocol version and is commented as a
footgun, so I'm hesitant to touch that. See 7dec5e441bf7 for details, which
states that using `hg serve` directly isn't expected for a web service.)
I'm not knowledgeable enough in this area to know if we should follow up with
disabling certain ciphers too. But this should provide better security on its
own.
[1] https://datatracker.ietf.org/doc/rfc8996/
[2] https://learn.microsoft.com/en-us/DeployEdge/microsoft-edge-policies#sslversionmin
[3] https://hacks.mozilla.org/2020/02/its-the-boot-for-tls-1-0-and-tls-1-1/
[4] https://security.googleblog.com/2018/10/modernizing-transport-security.html
[5] https://techcommunity.microsoft.com/blog/windows-itpro-blog/tls-1-0-and-tls-1-1-soon-to-be-disabled-in-windows/3887947
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Mon, 11 Nov 2024 21:25:03 -0500 |
parents | f4733654f144 |
children |
line wrap: on
line source
# loggingutil.py - utility for logging events # # Copyright 2010 Nicolas Dumazet # Copyright 2013 Facebook, Inc. # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. from __future__ import annotations import errno from . import ( encoding, ) from .utils import ( dateutil, procutil, stringutil, ) def openlogfile(ui, vfs, name, maxfiles=0, maxsize=0): """Open log file in append mode, with optional rotation If maxsize > 0, the log file will be rotated up to maxfiles. """ def rotate(oldpath, newpath): try: vfs.unlink(newpath) except OSError as err: if err.errno != errno.ENOENT: ui.debug( b"warning: cannot remove '%s': %s\n" % (newpath, encoding.strtolocal(err.strerror)) ) try: if newpath: vfs.rename(oldpath, newpath) except OSError as err: if err.errno != errno.ENOENT: ui.debug( b"warning: cannot rename '%s' to '%s': %s\n" % (newpath, oldpath, encoding.strtolocal(err.strerror)) ) if maxsize > 0: try: st = vfs.stat(name) except OSError: pass else: if st.st_size >= maxsize: path = vfs.join(name) for i in range(maxfiles - 1, 1, -1): rotate( oldpath=b'%s.%d' % (path, i - 1), newpath=b'%s.%d' % (path, i), ) rotate(oldpath=path, newpath=maxfiles > 0 and path + b'.1') return vfs(name, b'a', makeparentdirs=False) def _formatlogline(msg): date = dateutil.datestr(format=b'%Y/%m/%d %H:%M:%S') pid = procutil.getpid() return b'%s (%d)> %s' % (date, pid, msg) def _matchevent(event, tracked): return b'*' in tracked or event in tracked class filelogger: """Basic logger backed by physical file with optional rotation""" def __init__(self, vfs, name, tracked, maxfiles=0, maxsize=0): self._vfs = vfs self._name = name self._trackedevents = set(tracked) self._maxfiles = maxfiles self._maxsize = maxsize def tracked(self, event): return _matchevent(event, self._trackedevents) def log(self, ui, event, msg, opts): line = _formatlogline(msg) try: with openlogfile( ui, self._vfs, self._name, maxfiles=self._maxfiles, maxsize=self._maxsize, ) as fp: fp.write(line) except IOError as err: ui.debug( b'cannot write to %s: %s\n' % (self._name, stringutil.forcebytestr(err)) ) class fileobjectlogger: """Basic logger backed by file-like object""" def __init__(self, fp, tracked): self._fp = fp self._trackedevents = set(tracked) def tracked(self, event): return _matchevent(event, self._trackedevents) def log(self, ui, event, msg, opts): line = _formatlogline(msg) try: self._fp.write(line) self._fp.flush() except IOError as err: ui.debug( b'cannot write to %s: %s\n' % ( stringutil.forcebytestr(self._fp.name), stringutil.forcebytestr(err), ) ) class proxylogger: """Forward log events to another logger to be set later""" def __init__(self): self.logger = None def tracked(self, event): return self.logger is not None and self.logger.tracked(event) def log(self, ui, event, msg, opts): assert self.logger is not None self.logger.log(ui, event, msg, opts)