diff options
author | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:16:14 +0300 |
---|---|---|
committer | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:43:30 +0300 |
commit | b8cf9e88f4c5c64d9406af533d8948deb050d695 (patch) | |
tree | 218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py2/twisted/names/_rfc1982.py | |
parent | 523f645a83a0ec97a0332dbc3863bb354c92a328 (diff) | |
download | ydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz |
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py2/twisted/names/_rfc1982.py')
-rw-r--r-- | contrib/python/Twisted/py2/twisted/names/_rfc1982.py | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py2/twisted/names/_rfc1982.py b/contrib/python/Twisted/py2/twisted/names/_rfc1982.py new file mode 100644 index 0000000000..a895d82c4e --- /dev/null +++ b/contrib/python/Twisted/py2/twisted/names/_rfc1982.py @@ -0,0 +1,278 @@ +# -*- test-case-name: twisted.names.test.test_rfc1982 -*- +# Copyright (c) Twisted Matrix Laboratories. +# See LICENSE for details. + +""" +Utilities for handling RFC1982 Serial Number Arithmetic. + +@see: U{http://tools.ietf.org/html/rfc1982} + +@var RFC4034_TIME_FORMAT: RRSIG Time field presentation format. The Signature + Expiration Time and Inception Time field values MUST be represented either + as an unsigned decimal integer indicating seconds since 1 January 1970 + 00:00:00 UTC, or in the form YYYYMMDDHHmmSS in UTC. See U{RRSIG Presentation + Format<https://tools.ietf.org/html/rfc4034#section-3.2>} +""" + +from __future__ import division, absolute_import + +import calendar +from datetime import datetime, timedelta + +from twisted.python.compat import nativeString +from twisted.python.util import FancyStrMixin + + +RFC4034_TIME_FORMAT = '%Y%m%d%H%M%S' + + + +class SerialNumber(FancyStrMixin, object): + """ + An RFC1982 Serial Number. + + This class implements RFC1982 DNS Serial Number Arithmetic. + + SNA is used in DNS and specifically in DNSSEC as defined in RFC4034 in the + DNSSEC Signature Expiration and Inception Fields. + + @see: U{https://tools.ietf.org/html/rfc1982} + @see: U{https://tools.ietf.org/html/rfc4034} + + @ivar _serialBits: See C{serialBits} of L{__init__}. + @ivar _number: See C{number} of L{__init__}. + @ivar _modulo: The value at which wrapping will occur. + @ivar _halfRing: Half C{_modulo}. If another L{SerialNumber} value is larger + than this, it would lead to a wrapped value which is larger than the + first and comparisons are therefore ambiguous. + @ivar _maxAdd: Half C{_modulo} plus 1. If another L{SerialNumber} value is + larger than this, it would lead to a wrapped value which is larger than + the first. Comparisons with the original value would therefore be + ambiguous. + """ + + showAttributes = ( + ('_number', 'number', '%d'), + ('_serialBits', 'serialBits', '%d'), + ) + + def __init__(self, number, serialBits=32): + """ + Construct an L{SerialNumber} instance. + + @param number: An L{int} which will be stored as the modulo + C{number % 2 ^ serialBits} + @type number: L{int} + + @param serialBits: The size of the serial number space. The power of two + which results in one larger than the largest integer corresponding + to a serial number value. + @type serialBits: L{int} + """ + self._serialBits = serialBits + self._modulo = 2 ** serialBits + self._halfRing = 2 ** (serialBits - 1) + self._maxAdd = 2 ** (serialBits - 1) - 1 + self._number = int(number) % self._modulo + + + def _convertOther(self, other): + """ + Check that a foreign object is suitable for use in the comparison or + arithmetic magic methods of this L{SerialNumber} instance. Raise + L{TypeError} if not. + + @param other: The foreign L{object} to be checked. + @return: C{other} after compatibility checks and possible coercion. + @raises: L{TypeError} if C{other} is not compatible. + """ + if not isinstance(other, SerialNumber): + raise TypeError( + 'cannot compare or combine %r and %r' % (self, other)) + + if self._serialBits != other._serialBits: + raise TypeError( + 'cannot compare or combine SerialNumber instances with ' + 'different serialBits. %r and %r' % (self, other)) + + return other + + + def __str__(self): + """ + Return a string representation of this L{SerialNumber} instance. + + @rtype: L{nativeString} + """ + return nativeString('%d' % (self._number,)) + + + def __int__(self): + """ + @return: The integer value of this L{SerialNumber} instance. + @rtype: L{int} + """ + return self._number + + + def __eq__(self, other): + """ + Allow rich equality comparison with another L{SerialNumber} instance. + + @type other: L{SerialNumber} + """ + other = self._convertOther(other) + return other._number == self._number + + + def __ne__(self, other): + """ + Allow rich equality comparison with another L{SerialNumber} instance. + + @type other: L{SerialNumber} + """ + return not self.__eq__(other) + + + def __lt__(self, other): + """ + Allow I{less than} comparison with another L{SerialNumber} instance. + + @type other: L{SerialNumber} + """ + other = self._convertOther(other) + return ( + (self._number < other._number + and (other._number - self._number) < self._halfRing) + or + (self._number > other._number + and (self._number - other._number) > self._halfRing) + ) + + + def __gt__(self, other): + """ + Allow I{greater than} comparison with another L{SerialNumber} instance. + + @type other: L{SerialNumber} + @rtype: L{bool} + """ + other = self._convertOther(other) + return ( + (self._number < other._number + and (other._number - self._number) > self._halfRing) + or + (self._number > other._number + and (self._number - other._number) < self._halfRing) + ) + + + def __le__(self, other): + """ + Allow I{less than or equal} comparison with another L{SerialNumber} + instance. + + @type other: L{SerialNumber} + @rtype: L{bool} + """ + other = self._convertOther(other) + return self == other or self < other + + + def __ge__(self, other): + """ + Allow I{greater than or equal} comparison with another L{SerialNumber} + instance. + + @type other: L{SerialNumber} + @rtype: L{bool} + """ + other = self._convertOther(other) + return self == other or self > other + + + def __add__(self, other): + """ + Allow I{addition} with another L{SerialNumber} instance. + + Serial numbers may be incremented by the addition of a positive + integer n, where n is taken from the range of integers + [0 .. (2^(SERIAL_BITS - 1) - 1)]. For a sequence number s, the + result of such an addition, s', is defined as + + s' = (s + n) modulo (2 ^ SERIAL_BITS) + + where the addition and modulus operations here act upon values that are + non-negative values of unbounded size in the usual ways of integer + arithmetic. + + Addition of a value outside the range + [0 .. (2^(SERIAL_BITS - 1) - 1)] is undefined. + + @see: U{http://tools.ietf.org/html/rfc1982#section-3.1} + + @type other: L{SerialNumber} + @rtype: L{SerialNumber} + @raises: L{ArithmeticError} if C{other} is more than C{_maxAdd} + ie more than half the maximum value of this serial number. + """ + other = self._convertOther(other) + if other._number <= self._maxAdd: + return SerialNumber( + (self._number + other._number) % self._modulo, + serialBits=self._serialBits) + else: + raise ArithmeticError( + 'value %r outside the range 0 .. %r' % ( + other._number, self._maxAdd,)) + + + def __hash__(self): + """ + Allow L{SerialNumber} instances to be hashed for use as L{dict} keys. + + @rtype: L{int} + """ + return hash(self._number) + + + @classmethod + def fromRFC4034DateString(cls, utcDateString): + """ + Create an L{SerialNumber} instance from a date string in format + 'YYYYMMDDHHMMSS' described in U{RFC4034 + 3.2<https://tools.ietf.org/html/rfc4034#section-3.2>}. + + The L{SerialNumber} instance stores the date as a 32bit UNIX timestamp. + + @see: U{https://tools.ietf.org/html/rfc4034#section-3.1.5} + + @param utcDateString: A UTC date/time string of format I{YYMMDDhhmmss} + which will be converted to seconds since the UNIX epoch. + @type utcDateString: L{unicode} + + @return: An L{SerialNumber} instance containing the supplied date as a + 32bit UNIX timestamp. + """ + parsedDate = datetime.strptime(utcDateString, RFC4034_TIME_FORMAT) + secondsSinceEpoch = calendar.timegm(parsedDate.utctimetuple()) + return cls(secondsSinceEpoch, serialBits=32) + + + def toRFC4034DateString(self): + """ + Calculate a date by treating the current L{SerialNumber} value as a UNIX + timestamp and return a date string in the format described in + U{RFC4034 3.2<https://tools.ietf.org/html/rfc4034#section-3.2>}. + + @return: The date string. + """ + # Can't use datetime.utcfromtimestamp, because it seems to overflow the + # signed 32bit int used in the underlying C library. SNA is unsigned + # and capable of handling all timestamps up to 2**32. + d = datetime(1970, 1, 1) + timedelta(seconds=self._number) + return nativeString(d.strftime(RFC4034_TIME_FORMAT)) + + + +__all__ = ['SerialNumber'] |