-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDNSPacketImpl.java
More file actions
283 lines (245 loc) · 7.77 KB
/
DNSPacketImpl.java
File metadata and controls
283 lines (245 loc) · 7.77 KB
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
import java.util.List;
import java.util.ArrayList;
/**
* Basic Implementation of DNSPacket, acts as a container for other DNSObjects.
*
* @author Chris Blades
* @version 3/16/2010
*/
public class DNSPacketImpl extends AbstractDNSObject implements DNSPacket {
/** The header of this packet */
private DNSHeader header;
/** list of questions contained in this packet */
private List<DNSQuestion> questions;
/** list of answers contained in this packet */
private List<DNSAnswer> answers;
/** list of authority answers contained in this packet */
private List<DNSAnswer> authoritativeAnswers;
/** list of additional answers contained in this packet */
private List<DNSAnswer> additionalAnswers;
/**
* Creates a new DNSPacket with no header, questions, or answers.
*/
public DNSPacketImpl() {
this.questions = new ArrayList<DNSQuestion>();
this.answers = new ArrayList<DNSAnswer>();
this.authoritativeAnswers = new ArrayList<DNSAnswer>();
this.additionalAnswers = new ArrayList<DNSAnswer>();
}
/**
* Returns the header of this DNSPacket.
*
* @return This packet's header
*/
public DNSHeader getHeader() {
return this.header;
}
/**
* Returns a list of all the questions contained in this packet.
*
* @return a list of all the questions in this packet
*/
public List<DNSQuestion> getQuestions() {
return this.questions;
}
/**
* Returns a list of all the answers contained in this packet.
*
* @return a list of all the answers in this packet
*/
public List<DNSAnswer> getAnswers() {
return this.answers;
}
/**
* Returns a list of all the authority answers contained in this packet.
*
* @return a list of all the authority answers in this packet
*/
public List<DNSAnswer> getAuthoritativeAnswers() {
return this.authoritativeAnswers;
}
/**
* Returns a list of all the additional answers contained in this packet.
*
* @return a list of all the additional answers in this packet
*/
public List<DNSAnswer> getAdditionalAnswers() {
return this.additionalAnswers;
}
/**
* Sets the header of this DNSPacket.
*
* @param header the new header of this DNSpacket.
*/
public void setHeader(DNSHeader header) {
this.header = header;
changed = true;
}
/**
* Sets the question contained in this packet.
*
* @param question the question contained in this packet.
*/
public void setQuestion(DNSQuestion question) {
this.questions.add(question);
changed = true;
}
/**
* adds an answer to this packet
*
* @param answer the answer to add
*/
public void addAnswer(DNSAnswer answer) {
this.answers.add(answer);
changed = true;
}
/**
* adds an authority answer to this packet
*
* @param answer the authority answer to add
*/
public void addAuthoritativeAnswer(DNSAnswer answer) {
this.authoritativeAnswers.add(answer);
changed = true;
}
/**
* adds an additional answer to this packet
*
* @param answer the additional answer to add
*/
public void addAdditionalAnswer(DNSAnswer answer) {
this.additionalAnswers.add(answer);
changed = true;
}
/**
* Returns the length of this DNSPacket when serialized.
*
* @return the length of the serialized version of this packet.
*/
public int getLength() {
generateTransient();
return serialized.length;
}
/**
* Returns a byte array containing this packet serialized as per the
* DNS protocol
*
* @return this packet serialized as per the DNS protol
*/
public byte[] serialize() {
generateTransient();
return this.serialized;
}
/**
* Returns a mapping of state values of this DNSPacket
*
* @return the state values of this DNSPacket
*/
public Map stateValues() {
generateTransient();
return this.values;
}
/**
* Re-generates serialized and values when changes are made to the state
* of this packet
*/
protected void generateTransient() {
if (changed) {
//
// generate values
//
// find size
int size = header.getLength();
for (DNSObject o : questions) {
size += o.getLength();
}
for (DNSObject o : answers) {
size += o.getLength();
}
for (DNSObject o : authoritativeAnswers) {
size += o.getLength();
}
for (DNSObject o : additionalAnswers) {
size += o.getLength();
}
serialized = new byte[size];
int index = 0;
// copy header bytes
byte[] tempBytes = header.serialize();
for (int i = 0; i < tempBytes.length; i++) {
serialized[index] = tempBytes[i];
index++;
}
// copy question bytes
for (DNSObject o : questions) {
tempBytes = o.serialize();
for (int i = 0; i < tempBytes.length; i++) {
serialized[index] = tempBytes[i];
index++;
}
}
// copy answer bytes
for (DNSAnswer o : answers) {
tempBytes = o.serialize();
for (int i = 0; i < tempBytes.length; i++) {
serialized[index++] = tempBytes[i];
}
}
// copy authoritative answer bytes
for (DNSObject o : authoritativeAnswers) {
tempBytes = o.serialize();
for (int i = 0; i < tempBytes.length; i++) {
serialized[index] = tempBytes[i];
index++;
}
}
// copy additional answer bytes
for (DNSObject o : additionalAnswers) {
tempBytes = o.serialize();
for (int i = 0; i < tempBytes.length; i++) {
serialized[index] = tempBytes[i];
index++;
}
}
//
// generate values
//
// build header string
values.clear();
values.put("Header", header.stateValues());
// build question strings
Map<Object, Object> temp = new Map<Object, Object>();
int i = 1;
for (DNSObject o : questions) {
temp.put(i, o.stateValues());
i++;
}
values.put("Questions", temp);
// build answer strings
temp = new Map<Object, Object>();
i = 1;
for (DNSObject o : answers) {
temp.put(i, o.stateValues());
i++;
}
values.put("Answers", temp);
// build authoritative answer strings
temp = new Map<Object, Object>();
i = 1;
for (DNSObject o : authoritativeAnswers) {
temp.put(i, o.stateValues());
i++;
}
values.put("Authoritative Answers", temp);
// build additional answer strings
temp = new Map<Object, Object>();
i = 1;
for (DNSObject o : additionalAnswers) {
temp.put(i, o.stateValues());
i++;
}
values.put("Additional Answers", temp);
changed = false;
}
}
}