You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.8 KiB
79 lines
1.8 KiB
"""
|
|
@author Georg Hopp
|
|
|
|
"""
|
|
import struct
|
|
import random
|
|
|
|
from ..Message import Message as BaseMessage
|
|
|
|
class Message(BaseMessage):
|
|
TYPE_A = 1
|
|
TYPE_NS = 2
|
|
TYPE_CNAME = 5
|
|
TYPE_SOA = 6
|
|
TYPE_WKS = 11
|
|
TYPE_PTR = 12
|
|
TYPE_HINFO = 13
|
|
TYPE_MINFO = 14
|
|
TYPE_MX = 15
|
|
TYPE_TXT = 16
|
|
|
|
CLASS_IN = 1
|
|
CLASS_CH = 3
|
|
CLASS_HS = 4
|
|
|
|
OP_QUERY = 1
|
|
|
|
FLAG_QR = int('1000000000000000', 2)
|
|
|
|
def __init__(self, remote, msg=None):
|
|
super(Message, self).__init__(remote)
|
|
"""
|
|
if we want to create a response we initialize the message with the request.
|
|
"""
|
|
if msg:
|
|
if not msg.isRequest():
|
|
raise Exception('initialize with non request')
|
|
|
|
self._msg_id = msg._msg_id
|
|
self._flags = msg._flags | Message.FLAG_QR
|
|
self._queries = list(msg._queries)
|
|
else:
|
|
random.seed
|
|
self._msg_id = random.randint(0, 0xffff)
|
|
self._flags = 0
|
|
self._queries = []
|
|
|
|
self._answers = []
|
|
self._authoritys = []
|
|
self._additionals = []
|
|
|
|
def isRequest(self):
|
|
return 0 == self._flags & Message.FLAG_QR
|
|
|
|
def isResponse(self):
|
|
return not self.isRequest()
|
|
|
|
def isCloseMessage(self):
|
|
return False
|
|
|
|
def isUpgradeMessage(self):
|
|
return False
|
|
|
|
def setRepsonse(self):
|
|
self._flags |= Message.FLAG_QR
|
|
|
|
def addQuery(self, name, typ=TYPE_A, cls=CLASS_IN):
|
|
self._queries.append((name, typ, cls))
|
|
|
|
def addAnswer(self, name, typ, cls, ttl, data):
|
|
self._answers.append((name, typ, cls, ttl, data))
|
|
|
|
def getResponseCode(self):
|
|
return 0
|
|
|
|
def getResponseMessage(self):
|
|
return None
|
|
|
|
# vim: set ft=python et ts=4 sw=4 sts=4:
|