AzerothCore-website/venv/lib/python3.12/site-packages/dns/ttl.py
Aaron Barbas 9bbeb35c08 Added support link to download game client, link for addons.
Fixed an issue that prevented the password reset tokens from working.
Added email templates for password reset success and new account creation.
Added more dynamic email template support.
2024-10-03 22:00:40 -05:00

92 lines
2.9 KiB
Python

# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
# Copyright (C) 2003-2017 Nominum, Inc.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose with or without fee is hereby granted,
# provided that the above copyright notice and this permission notice
# appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
"""DNS TTL conversion."""
from typing import Union
import dns.exception
# Technically TTLs are supposed to be between 0 and 2**31 - 1, with values
# greater than that interpreted as 0, but we do not impose this policy here
# as values > 2**31 - 1 occur in real world data.
#
# We leave it to applications to impose tighter bounds if desired.
MAX_TTL = 2**32 - 1
class BadTTL(dns.exception.SyntaxError):
"""DNS TTL value is not well-formed."""
def from_text(text: str) -> int:
"""Convert the text form of a TTL to an integer.
The BIND 8 units syntax for TTLs (e.g. '1w6d4h3m10s') is supported.
*text*, a ``str``, the textual TTL.
Raises ``dns.ttl.BadTTL`` if the TTL is not well-formed.
Returns an ``int``.
"""
if text.isdigit():
total = int(text)
elif len(text) == 0:
raise BadTTL
else:
total = 0
current = 0
need_digit = True
for c in text:
if c.isdigit():
current *= 10
current += int(c)
need_digit = False
else:
if need_digit:
raise BadTTL
c = c.lower()
if c == "w":
total += current * 604800
elif c == "d":
total += current * 86400
elif c == "h":
total += current * 3600
elif c == "m":
total += current * 60
elif c == "s":
total += current
else:
raise BadTTL("unknown unit '%s'" % c)
current = 0
need_digit = True
if not current == 0:
raise BadTTL("trailing integer")
if total < 0 or total > MAX_TTL:
raise BadTTL("TTL should be between 0 and 2**32 - 1 (inclusive)")
return total
def make(value: Union[int, str]) -> int:
if isinstance(value, int):
return value
elif isinstance(value, str):
return dns.ttl.from_text(value)
else:
raise ValueError("cannot convert value to TTL")