Skip to content

Commit a05de67

Browse files
committed
Ensure PTR questions asked in uppercase are answered
1 parent c3365e1 commit a05de67

2 files changed

Lines changed: 33 additions & 2 deletions

File tree

zeroconf/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2967,7 +2967,7 @@ def _answer_service_type_enumeration_query(self, msg: DNSIncoming, out: DNSOutgo
29672967

29682968
def _answer_ptr_query(self, msg: DNSIncoming, out: DNSOutgoing, question: DNSQuestion) -> None:
29692969
"""Answer a PTR query."""
2970-
for service in self.registry.get_infos_type(question.name):
2970+
for service in self.registry.get_infos_type(question.name.lower()):
29712971
out.add_answer(msg, service.dns_pointer())
29722972
# Add recommended additional answers according to
29732973
# https://tools.ietf.org/html/rfc6763#section-12.1.
@@ -3014,7 +3014,7 @@ def handle_query(self, msg: DNSIncoming, addr: Optional[str], port: int) -> None
30143014

30153015
for question in msg.questions:
30163016
if question.type == _TYPE_PTR:
3017-
if question.name == _SERVICE_TYPE_ENUMERATION_NAME:
3017+
if question.name.lower() == _SERVICE_TYPE_ENUMERATION_NAME:
30183018
self._answer_service_type_enumeration_query(msg, out)
30193019
else:
30203020
self._answer_ptr_query(msg, out, question)

zeroconf/test.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,37 @@ def test_name_conflicts(self):
10041004
zc.register_service(conflicting_info)
10051005
zc.close()
10061006

1007+
def test_register_and_lookup_type_by_uppercase_name(self):
1008+
# instantiate a zeroconf instance
1009+
zc = Zeroconf(interfaces=['127.0.0.1'])
1010+
type_ = "_mylowertype._tcp.local."
1011+
name = "Home"
1012+
registration_name = "%s.%s" % (name, type_)
1013+
1014+
info = ServiceInfo(
1015+
type_,
1016+
name=registration_name,
1017+
server="random123.local.",
1018+
addresses=[socket.inet_pton(socket.AF_INET, "1.2.3.4")],
1019+
port=80,
1020+
properties={"version": "1.0"},
1021+
)
1022+
zc.register_service(info)
1023+
_clear_cache(zc)
1024+
info = ServiceInfo(type_, registration_name)
1025+
info.load_from_cache(zc)
1026+
assert info.addresses == []
1027+
1028+
out = r.DNSOutgoing(r._FLAGS_QR_QUERY)
1029+
out.add_question(r.DNSQuestion(type_.upper(), r._TYPE_PTR, r._CLASS_IN))
1030+
zc.send(out)
1031+
time.sleep(0.5)
1032+
info = ServiceInfo(type_, registration_name)
1033+
info.load_from_cache(zc)
1034+
assert info.addresses == [socket.inet_pton(socket.AF_INET, "1.2.3.4")]
1035+
assert info.properties == {b"version": b"1.0"}
1036+
zc.close()
1037+
10071038

10081039
class TestServiceRegistry(unittest.TestCase):
10091040
def test_only_register_once(self):

0 commit comments

Comments
 (0)