91 lines
2.7 KiB
Python
91 lines
2.7 KiB
Python
# -*- coding: utf-8 -*- #
|
|
# Copyright 2021 Google LLC. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""Stub implementation of SVCB and HTTPS records.
|
|
|
|
This module can be removed after updating to dnspython 2.x, which has built-in
|
|
support for these types. (dnspython 2.x only supports Python 3, but this
|
|
codebase requires support for Python 2, so it is still using dnspython 1.x.)
|
|
"""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import unicode_literals
|
|
|
|
from dns import rdata
|
|
from dns.name import Name
|
|
from dns.tokenizer import Tokenizer
|
|
|
|
|
|
class _StubSVCB(rdata.Rdata):
|
|
|
|
"""Stub implementation of SVCB RDATA.
|
|
|
|
Wire format support is not needed here, so only trivial storage of the
|
|
presentation format is implemented.
|
|
"""
|
|
|
|
def __init__(self, rdclass, rdtype, priority, target, params):
|
|
# type: (int, int, int, Name, list[str]) -> None
|
|
super(_StubSVCB, self).__init__(rdclass, rdtype)
|
|
self._priority = priority
|
|
self._target = target
|
|
self._params = params
|
|
|
|
def to_text(self, origin=None, relativize=True, **kwargs):
|
|
tokens = [
|
|
'%d' % self._priority,
|
|
self._target.choose_relativity(origin, relativize).to_text(),
|
|
] + self._params
|
|
return ' '.join(tokens)
|
|
|
|
@classmethod
|
|
def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
|
|
# type: (int, int, Tokenizer) -> _StubSVCB
|
|
priority = tok.get_uint16()
|
|
target = tok.get_name(origin).choose_relativity(origin, relativize)
|
|
params = [] # type: list[str]
|
|
while True:
|
|
token = tok.get().unescape()
|
|
if token.is_eol_or_eof():
|
|
break
|
|
params.append(token.value)
|
|
|
|
return cls(rdclass, rdtype, priority, target, params)
|
|
|
|
|
|
class _FakeModule:
|
|
|
|
"""Fake module corresponding to dns.rdtypes.IN.SVCB.
|
|
|
|
This is needed due to the calling convention of rdata.register_type().
|
|
"""
|
|
|
|
SVCB = _StubSVCB
|
|
HTTPS = _StubSVCB
|
|
|
|
SVCB = 64
|
|
HTTPS = 65
|
|
|
|
|
|
def register():
|
|
try:
|
|
rdata.register_type(_FakeModule, SVCB, 'SVCB')
|
|
rdata.register_type(_FakeModule, HTTPS, 'HTTPS')
|
|
except rdata.RdatatypeExists:
|
|
# Either this registration has already run, or we are using dnspython 2.1+,
|
|
# which already implements these types.
|
|
pass
|