1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
From: YOKOTA Hiroshi <yokota.hgml@gmail.com>
Date: Sat, 10 Jul 2021 03:18:50 +0900
Subject: Drop monkey patch to work with older zeroconf module
Forwarded: not-needed
This patch adds "15 characters service name limit" as side-effect.
---
src/calibre/devices/smart_device_app/driver.py | 136 +------------------------
1 file changed, 2 insertions(+), 134 deletions(-)
diff --git a/src/calibre/devices/smart_device_app/driver.py b/src/calibre/devices/smart_device_app/driver.py
index 87608f3..e4e9336 100644
--- a/src/calibre/devices/smart_device_app/driver.py
+++ b/src/calibre/devices/smart_device_app/driver.py
@@ -2038,138 +2038,6 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin):
def is_running(self):
return getattr(self, 'listen_socket', None) is not None
-# Function to monkeypatch zeroconf to remove the 15 character name length restriction.
-# Copied from https://github.com/jstasiak/python-zeroconf version 0.28.1
-
-
-def monkeypatched_service_type_name(type_: str, *, strict: bool = True) -> str:
- """
- Validate a fully qualified service name, instance or subtype. [rfc6763]
-
- Returns fully qualified service name.
-
- Domain names used by mDNS-SD take the following forms:
-
- <sn> . <_tcp|_udp> . local.
- <Instance> . <sn> . <_tcp|_udp> . local.
- <sub>._sub . <sn> . <_tcp|_udp> . local.
-
- 1) must end with 'local.'
-
- This is true because we are implementing mDNS and since the 'm' means
- multi-cast, the 'local.' domain is mandatory.
-
- 2) local is preceded with either '_udp.' or '_tcp.' unless
- strict is False
-
- 3) service name <sn> precedes <_tcp|_udp> unless
- strict is False
-
- The rules for Service Names [RFC6335] state that they may be no more
- than fifteen characters long (not counting the mandatory underscore),
- consisting of only letters, digits, and hyphens, must begin and end
- with a letter or digit, must not contain consecutive hyphens, and
- must contain at least one letter.
-
- The instance name <Instance> and sub type <sub> may be up to 63 bytes.
-
- The portion of the Service Instance Name is a user-
- friendly name consisting of arbitrary Net-Unicode text [RFC5198]. It
- MUST NOT contain ASCII control characters (byte values 0x00-0x1F and
- 0x7F) [RFC20] but otherwise is allowed to contain any characters,
- without restriction, including spaces, uppercase, lowercase,
- punctuation -- including dots -- accented characters, non-Roman text,
- and anything else that may be represented using Net-Unicode.
-
- :param type_: Type, SubType or service name to validate
- :return: fully qualified service name (eg: _http._tcp.local.)
- """
-
- from zeroconf import (
- _HAS_A_TO_Z, _HAS_ASCII_CONTROL_CHARS, _HAS_ONLY_A_TO_Z_NUM_HYPHEN,
- _HAS_ONLY_A_TO_Z_NUM_HYPHEN_UNDERSCORE, _LOCAL_TRAILER,
- _NONTCP_PROTOCOL_LOCAL_TRAILER, _TCP_PROTOCOL_LOCAL_TRAILER,
- BadTypeInNameException
- )
-
- if type_.endswith(_TCP_PROTOCOL_LOCAL_TRAILER) or type_.endswith(_NONTCP_PROTOCOL_LOCAL_TRAILER):
- remaining = type_[: -len(_TCP_PROTOCOL_LOCAL_TRAILER)].split('.')
- trailer = type_[-len(_TCP_PROTOCOL_LOCAL_TRAILER) :]
- has_protocol = True
- elif strict:
- raise BadTypeInNameException(
- "Type '%s' must end with '%s' or '%s'"
- % (type_, _TCP_PROTOCOL_LOCAL_TRAILER, _NONTCP_PROTOCOL_LOCAL_TRAILER)
- )
- elif type_.endswith(_LOCAL_TRAILER):
- remaining = type_[: -len(_LOCAL_TRAILER)].split('.')
- trailer = type_[-len(_LOCAL_TRAILER) + 1 :]
- has_protocol = False
- else:
- raise BadTypeInNameException(f"Type '{type_}' must end with '{_LOCAL_TRAILER}'")
-
- if strict or has_protocol:
- service_name = remaining.pop()
- if not service_name:
- raise BadTypeInNameException("No Service name found")
-
- if len(remaining) == 1 and len(remaining[0]) == 0:
- raise BadTypeInNameException("Type '%s' must not start with '.'" % type_)
-
- if service_name[0] != '_':
- raise BadTypeInNameException("Service name (%s) must start with '_'" % service_name)
-
- test_service_name = service_name[1:]
-
- # if len(test_service_name) > 15:
- # raise BadTypeInNameException("Service name (%s) must be <= 15 bytes" % test_service_name)
-
- if '--' in test_service_name:
- raise BadTypeInNameException("Service name (%s) must not contain '--'" % test_service_name)
-
- if '-' in (test_service_name[0], test_service_name[-1]):
- raise BadTypeInNameException(
- "Service name (%s) may not start or end with '-'" % test_service_name
- )
-
- if not _HAS_A_TO_Z.search(test_service_name):
- raise BadTypeInNameException(
- "Service name (%s) must contain at least one letter (eg: 'A-Z')" % test_service_name
- )
-
- allowed_characters_re = (
- _HAS_ONLY_A_TO_Z_NUM_HYPHEN if strict else _HAS_ONLY_A_TO_Z_NUM_HYPHEN_UNDERSCORE
- )
-
- if not allowed_characters_re.search(test_service_name):
- raise BadTypeInNameException(
- "Service name (%s) must contain only these characters: "
- "A-Z, a-z, 0-9, hyphen ('-')%s" % (test_service_name, "" if strict else ", underscore ('_')")
- )
- else:
- service_name = ''
-
- if remaining and remaining[-1] == '_sub':
- remaining.pop()
- if len(remaining) == 0 or len(remaining[0]) == 0:
- raise BadTypeInNameException("_sub requires a subtype name")
-
- if len(remaining) > 1:
- remaining = ['.'.join(remaining)]
-
- if remaining:
- length = len(remaining[0].encode('utf-8'))
- if length > 63:
- raise BadTypeInNameException("Too long: '%s'" % remaining[0])
-
- if _HAS_ASCII_CONTROL_CHARS.search(remaining[0]):
- raise BadTypeInNameException(
- "Ascii control character 0x00-0x1F and 0x7F illegal in '%s'" % remaining[0]
- )
-
- return service_name + trailer
-
-
def monkeypatch_zeroconf():
# Hack to work around the newly-enforced 15 character service name limit.
# "monkeypatch" zeroconf with a function without the check
@@ -2177,5 +2045,5 @@ def monkeypatch_zeroconf():
from zeroconf._utils.name import service_type_name
service_type_name.__kwdefaults__['strict'] = False
except ImportError:
- import zeroconf
- zeroconf.service_type_name = monkeypatched_service_type_name
+ # Can't remove name limit.
+ pass
|