/** Converts the header into a String */ public String toString() { return toStringWithRcode(getRcode()); }
/** * Creates a new Message with a random Message ID suitable for sending as a * query. * @param r A record containing the question */ public static Message newQuery(Record r) { Message m = new Message(); m.header.setOpcode(Opcode.QUERY); m.header.setFlag(Flags.RD); m.addRecord(r, Section.QUESTION); return m; }
if (header.getFlag(Flags.QR)) { LOG.debug("returning null"); return null; if (header.getRcode() != Rcode.NOERROR) { return errorMessage(query, Rcode.FORMERR); if (header.getOpcode() != Opcode.QUERY) { return errorMessage(query, Rcode.NOTIMP); Message response = new Message(query.getHeader().getID()); response.getHeader().setFlag(Flags.QR); if (query.getHeader().getFlag(Flags.RD)) { response.getHeader().setFlag(Flags.RD); response.getHeader().setFlag(Flags.RA); if (rcode != Rcode.NOERROR) { rcode = remoteLookup(response, name, type, 0); response.getHeader().setRcode(rcode);
Message(DNSInput in) throws IOException { this(new Header(in)); boolean isUpdate = (header.getOpcode() == Opcode.UPDATE); boolean truncated = header.getFlag(Flags.TC); try { for (int i = 0; i < 4; i++) { int count = header.getCount(i); if (count > 0) sections[i] = new ArrayList(count); for (int j = 0; j < count; j++) { int pos = in.current(); Record rec = Record.fromWire(in, i, isUpdate); sections[i].add(rec); if (rec.getType() == Type.TSIG) tsigstart = pos; } } } catch (WireParseException e) { if (!truncated) throw e; } size = in.current(); }
String toStringWithRcode(int newrcode) { StringBuffer sb = new StringBuffer(); sb.append(";; ->>HEADER<<- "); sb.append("opcode: " + Opcode.string(getOpcode())); sb.append(", status: " + Rcode.string(newrcode)); sb.append(", id: " + getID()); sb.append("\n"); sb.append(";; flags: " + printFlags()); sb.append("; "); for (int i = 0; i < 4; i++) sb.append(Section.string(i) + ": " + getCount(i) + " "); return sb.toString(); }
if ((messages != null) && (messages.length > 0)) header.setRcode(Rcode.NOERROR); header.setOpcode(Opcode.QUERY); header.setFlag(Flags.QR); if (h.getRcode() == Rcode.NOERROR) if (h.getFlag(Flags.AA)) header.setFlag(Flags.AA); if (h.getFlag(Flags.AD)) header.setFlag(Flags.AD); header.setRcode(Rcode.NXDOMAIN);
header.toWire(out); Compression c = new Compression(); for (int i = 0; i < 4; i++) { if (skipped != 0) { if (newheader == null) newheader = (Header) header.clone(); if (i != Section.ADDITIONAL) newheader.setFlag(Flags.TC); int count = newheader.getCount(i); newheader.setCount(i, count - skipped); for (int j = i + 1; j < 4; j++) newheader.setCount(j, 0); newheader.toWire(out); out.restore(); break; newheader = (Header) header.clone(); tsigrec.toWire(out, Section.ADDITIONAL, c); newheader.incCount(Section.ADDITIONAL); newheader.toWire(out); out.restore();
@Override protected void processPacketPayload(Packet packet, byte[] payload) { String protocol = (String)packet.get(Packet.PROTOCOL); if (!PcapReader.PROTOCOL_UDP.equals(protocol) && !PcapReader.PROTOCOL_TCP.equals(protocol)) return; DnsPacket dnsPacket = (DnsPacket)packet; if (DNS_PORT == (Integer)packet.get(Packet.SRC_PORT) || DNS_PORT == (Integer)packet.get(Packet.DST_PORT)) { if (PROTOCOL_TCP.equals(protocol) && payload.length > 2) // TODO Support DNS responses with multiple messages (as used for XFRs) payload = Arrays.copyOfRange(payload, 2, payload.length); // First two bytes denote the size of the DNS message, ignore them try { Message msg = new Message(payload); Header header = msg.getHeader(); dnsPacket.put(DnsPacket.QUERYID, header.getID()); dnsPacket.put(DnsPacket.FLAGS, header.printFlags()); dnsPacket.put(DnsPacket.QR, header.getFlag(Flags.QR)); dnsPacket.put(DnsPacket.OPCODE, Opcode.string(header.getOpcode())); dnsPacket.put(DnsPacket.RCODE, Rcode.string(header.getRcode())); dnsPacket.put(DnsPacket.QUESTION, convertRecordToString(msg.getQuestion())); dnsPacket.put(DnsPacket.QNAME, convertRecordOwnerToString(msg.getQuestion())); dnsPacket.put(DnsPacket.QTYPE, convertRecordTypeToInt(msg.getQuestion())); dnsPacket.put(DnsPacket.ANSWER, convertRecordsToStrings(msg.getSectionArray(Section.ANSWER))); dnsPacket.put(DnsPacket.AUTHORITY, convertRecordsToStrings(msg.getSectionArray(Section.AUTHORITY))); dnsPacket.put(DnsPacket.ADDITIONAL, convertRecordsToStrings(msg.getSectionArray(Section.ADDITIONAL))); } catch (Exception e) { // If we cannot decode a DNS packet we ignore it } } }
/** * Processes a DNS error condition and creates an appropriate DNS response. * @param request The original DNS request. * @param error The error condition that occured. * @return A response to the DNS request. */ protected Message processError(Message request, DNSError<?> error) { Message errorResponse = null; try { Header respHeader = new Header(request.toWire()); Message response = new Message(); response.setHeader(respHeader); for (int i = 0; i < 4; i++) response.removeAllRecords(i); response.addRecord(request.getQuestion(), Section.QUESTION); response.getHeader().setFlag(Flags.QR); if (request.getHeader().getFlag(Flags.RD)) response.getHeader().setFlag(Flags.RD); respHeader.setRcode(Integer.parseInt(error.getError().toString())); return response; } catch (IOException e) {} return errorResponse; }
private Message sendAXFR(Message query) throws IOException { Name qname = query.getQuestion().getName(); ZoneTransferIn xfrin = ZoneTransferIn.newAXFR(qname, address, tsig); xfrin.setTimeout((int)(getTimeout() / 1000)); xfrin.setLocalAddress(localAddress); try { xfrin.run(); } catch (ZoneTransferException e) { throw new WireParseException(e.getMessage()); } List records = xfrin.getAXFR(); Message response = new Message(query.getHeader().getID()); response.getHeader().setFlag(Flags.AA); response.getHeader().setFlag(Flags.QR); response.addRecord(query.getQuestion(), Section.QUESTION); Iterator it = records.iterator(); while (it.hasNext()) response.addRecord((Record)it.next(), Section.ANSWER); return response; }
public static Message newQueryResponse(final Record[] records, final int section) { Message message = new Message(); Header header = message.getHeader(); header.setRcode(Rcode.NOERROR); header.setOpcode(Opcode.QUERY); header.setFlag(Flags.QR); for (int index = 0; index < records.length; index++) { message.addRecord(records[index], section); } return message; }
/** * Returns the message's rcode (error code). This incorporates the EDNS * extended rcode. */ public int getRcode() { int rcode = header.getRcode(); OPTRecord opt = getOPT(); if (opt != null) rcode += (opt.getExtendedRcode() << 4); return rcode; }
/** Creates a new Message with a random Message ID */ public Message() { this(new Header()); }
/** * Converts the Message to a String. */ public String toString() { StringBuffer sb = new StringBuffer(); OPTRecord opt = getOPT(); if (opt != null) sb.append(header.toStringWithRcode(getRcode()) + "\n"); else sb.append(header + "\n"); if (isSigned()) { sb.append(";; TSIG "); if (isVerified()) sb.append("ok"); else sb.append("invalid"); sb.append('\n'); } for (int i = 0; i < 4; i++) { if (header.getOpcode() != Opcode.UPDATE) sb.append(";; " + Section.longString(i) + ":\n"); else sb.append(";; " + Section.updString(i) + ":\n"); sb.append(sectionToString(i) + "\n"); } sb.append(";; Message size: " + numBytes() + " bytes"); return sb.toString(); }