Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/dns/flags.py: 54%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

59 statements  

1# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license 

2 

3# Copyright (C) 2001-2017 Nominum, Inc. 

4# 

5# Permission to use, copy, modify, and distribute this software and its 

6# documentation for any purpose with or without fee is hereby granted, 

7# provided that the above copyright notice and this permission notice 

8# appear in all copies. 

9# 

10# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES 

11# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 

12# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR 

13# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 

14# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 

15# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 

16# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 

17 

18"""DNS Message Flags.""" 

19 

20import enum 

21from typing import Any 

22 

23import dns._text_util 

24 

25# Standard DNS flags 

26 

27 

28class Flag(enum.IntFlag): 

29 #: Query Response 

30 QR = 0x8000 

31 #: Authoritative Answer 

32 AA = 0x0400 

33 #: Truncated Response 

34 TC = 0x0200 

35 #: Recursion Desired 

36 RD = 0x0100 

37 #: Recursion Available 

38 RA = 0x0080 

39 #: Authentic Data 

40 AD = 0x0020 

41 #: Checking Disabled 

42 CD = 0x0010 

43 

44 

45# EDNS flags 

46 

47 

48class EDNSFlag(enum.IntFlag): 

49 #: DNSSEC answer OK 

50 DO = 0x8000 

51 #: Compact nonexistence, restore NXDOMAIN requested 

52 CO = 0x4000 

53 

54 

55# Flags Mask (excludes opcode and rcode) 

56FLAGS_MASK = 0x87F0 

57 

58# EDNS Flags Mask (excludes extended rcode and version) 

59EDNS_FLAGS_MASK = 0x0000FFFF 

60 

61 

62def _from_text(text: str, enum_class: Any) -> int: 

63 flags = 0 

64 tokens = text.split() 

65 for t in tokens: 

66 token = t.upper() 

67 if token.startswith("FLAG") and dns._text_util.is_ascii_digits(token[4:]): 

68 # An unnamed flag, rendered by _to_text() as FLAGn (see below). 

69 flags |= 1 << int(token[4:]) 

70 else: 

71 flags |= enum_class[token] 

72 return flags 

73 

74 

75def _to_text(flags: int, enum_class: Any) -> str: 

76 text_flags = [] 

77 known = 0 

78 for k, v in enum_class.__members__.items(): 

79 known |= int(v) 

80 if flags & v != 0: 

81 text_flags.append(k) 

82 # Render any set bits that do not have a named flag as FLAGn, where n is 

83 # the bit position, so that they are not silently dropped. These tokens 

84 # round-trip through _from_text(). 

85 unknown = flags & ~known 

86 bit = 0 

87 while unknown: 

88 if unknown & 1: 

89 text_flags.append(f"FLAG{bit}") 

90 unknown >>= 1 

91 bit += 1 

92 return " ".join(text_flags) 

93 

94 

95def from_text(text: str) -> int: 

96 """Convert a space-separated list of flag text values into a flags 

97 value. 

98 

99 :rtype: int 

100 """ 

101 

102 return _from_text(text, Flag) 

103 

104 

105def to_text(flags: int) -> str: 

106 """Convert a flags value into a space-separated list of flag text 

107 values. 

108 

109 :rtype: str 

110 """ 

111 

112 # We & with 0xff0 to mask out rcode. 

113 return _to_text(flags & FLAGS_MASK, Flag) 

114 

115 

116def edns_from_text(text: str) -> int: 

117 """Convert a space-separated list of EDNS flag text values into a EDNS 

118 flags value. 

119 

120 :rtype: int 

121 """ 

122 

123 return _from_text(text, EDNSFlag) 

124 

125 

126def edns_to_text(flags: int) -> str: 

127 """Convert an EDNS flags value into a space-separated list of EDNS flag 

128 text values. 

129 

130 :rtype: str 

131 """ 

132 

133 return _to_text(flags & EDNS_FLAGS_MASK, EDNSFlag) 

134 

135 

136### BEGIN generated Flag constants 

137 

138QR = Flag.QR 

139AA = Flag.AA 

140TC = Flag.TC 

141RD = Flag.RD 

142RA = Flag.RA 

143AD = Flag.AD 

144CD = Flag.CD 

145 

146### END generated Flag constants 

147 

148### BEGIN generated EDNSFlag constants 

149 

150DO = EDNSFlag.DO 

151CO = EDNSFlag.CO 

152 

153### END generated EDNSFlag constants