summaryrefslogtreecommitdiff
path: root/project2/proj2_s4498062/dns/domainname.py
diff options
context:
space:
mode:
authorCamil Staps2016-05-30 15:47:13 +0200
committerCamil Staps2016-05-30 15:47:13 +0200
commitf194d597422d2092578701d0f7ed2bf6958dd14c (patch)
treef264f8a6a577a12e9d961f0989d3083406977a3a /project2/proj2_s4498062/dns/domainname.py
parentAssignment 7 (diff)
Remove old project 2
Diffstat (limited to 'project2/proj2_s4498062/dns/domainname.py')
-rw-r--r--project2/proj2_s4498062/dns/domainname.py112
1 files changed, 0 insertions, 112 deletions
diff --git a/project2/proj2_s4498062/dns/domainname.py b/project2/proj2_s4498062/dns/domainname.py
deleted file mode 100644
index 6dbb039..0000000
--- a/project2/proj2_s4498062/dns/domainname.py
+++ /dev/null
@@ -1,112 +0,0 @@
-""" Parsing and composing domain names
-
-This module contains two classes for converting domain names to and from bytes.
-You won't have to use these classes. They're used internally in Message,
-Question, ResourceRecord and RecordData. You can read section 4.1.4 of RFC 1035
-if you want more info.
-"""
-
-import struct
-
-
-class Composer(object):
- def __init__(self):
- self.offsets = dict()
-
- def to_bytes(self, offset, dnames):
- # Convert each domain name in to bytes
- result = b""
- for _, dname in enumerate(dnames):
- # Split domain name into labels
- labels = dname.split(".")
-
- # Determine keys of subdomains in offset dict
- keys = []
- for label in reversed(labels):
- name = label
- if keys:
- name += "." + keys[-1]
- keys.append(name)
- keys.reverse()
-
- # Convert label to bytes
- add_null = True
- for j, label in enumerate(labels):
- if keys[j] in self.offsets:
- offset = self.offsets[keys[j]]
- pointer = (3 << 14) + offset
- result += struct.pack("!H", pointer)
- add_null = False
- offset += 2
- break
- else:
- self.offsets[keys[j]] = offset
- result += struct.pack(
- "!B{}s".format(len(label)),
- len(label),
- label)
- offset += 1 + len(label)
-
- # Add null character at end
- if add_null:
- result += b"\x00"
- offset += 1
-
- return result
-
-
-class Parser(object):
- def __init__(self):
- self.labels = dict()
-
- def from_bytes(self, packet, offset, num):
- dnames = []
-
- # Read the domain names
- for _ in range(num):
- # Read a new domain name
- dname = ""
- prev_offsets = []
- done = False
- while done is False:
- # Read length of next label
- llength = struct.unpack_from("!B", packet, offset)[0]
-
- # Done reading domain when length is zero
- if llength == 0:
- offset += 1
- break
-
- # Compression label
- elif (llength >> 6) == 3:
- new_offset = offset + 2
- target = struct.unpack_from("!H", packet, offset)[0]
- target -= 3 << 14
- label = self.labels[target]
- done = True
-
- # Normal label
- else:
- new_offset = offset + llength + 1
- label = struct.unpack_from(
- "{}s".format(llength),
- packet, offset+1)[0]
-
- # Add label to dictionary
- self.labels[offset] = label
- for prev_offset in prev_offsets:
- self.labels[prev_offset] += "." + label
- prev_offsets.append(offset)
-
- # Update offset
- offset = new_offset
-
- # Append label to domain name
- if len(dname) > 0:
- dname += "."
- dname += label
-
- # Append domain name to list
- dnames.append(dname)
-
- return dnames, offset