flags.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. # Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
  2. # Copyright (C) 2001-2017 Nominum, Inc.
  3. #
  4. # Permission to use, copy, modify, and distribute this software and its
  5. # documentation for any purpose with or without fee is hereby granted,
  6. # provided that the above copyright notice and this permission notice
  7. # appear in all copies.
  8. #
  9. # THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
  10. # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  11. # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
  12. # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  13. # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  14. # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  15. # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  16. """DNS Message Flags."""
  17. import enum
  18. # Standard DNS flags
  19. class Flag(enum.IntFlag):
  20. #: Query Response
  21. QR = 0x8000
  22. #: Authoritative Answer
  23. AA = 0x0400
  24. #: Truncated Response
  25. TC = 0x0200
  26. #: Recursion Desired
  27. RD = 0x0100
  28. #: Recursion Available
  29. RA = 0x0080
  30. #: Authentic Data
  31. AD = 0x0020
  32. #: Checking Disabled
  33. CD = 0x0010
  34. # EDNS flags
  35. class EDNSFlag(enum.IntFlag):
  36. #: DNSSEC answer OK
  37. DO = 0x8000
  38. def _from_text(text, enum_class):
  39. flags = 0
  40. tokens = text.split()
  41. for t in tokens:
  42. flags |= enum_class[t.upper()]
  43. return flags
  44. def _to_text(flags, enum_class):
  45. text_flags = []
  46. for k, v in enum_class.__members__.items():
  47. if flags & v != 0:
  48. text_flags.append(k)
  49. return ' '.join(text_flags)
  50. def from_text(text):
  51. """Convert a space-separated list of flag text values into a flags
  52. value.
  53. Returns an ``int``
  54. """
  55. return _from_text(text, Flag)
  56. def to_text(flags):
  57. """Convert a flags value into a space-separated list of flag text
  58. values.
  59. Returns a ``str``.
  60. """
  61. return _to_text(flags, Flag)
  62. def edns_from_text(text):
  63. """Convert a space-separated list of EDNS flag text values into a EDNS
  64. flags value.
  65. Returns an ``int``
  66. """
  67. return _from_text(text, EDNSFlag)
  68. def edns_to_text(flags):
  69. """Convert an EDNS flags value into a space-separated list of EDNS flag
  70. text values.
  71. Returns a ``str``.
  72. """
  73. return _to_text(flags, EDNSFlag)
  74. ### BEGIN generated Flag constants
  75. QR = Flag.QR
  76. AA = Flag.AA
  77. TC = Flag.TC
  78. RD = Flag.RD
  79. RA = Flag.RA
  80. AD = Flag.AD
  81. CD = Flag.CD
  82. ### END generated Flag constants
  83. ### BEGIN generated EDNSFlag constants
  84. DO = EDNSFlag.DO
  85. ### END generated EDNSFlag constants