Search in sources :

Example 1 with TSIGRecord

use of org.xbill.DNS.TSIGRecord in project opennms by OpenNMS.

the class DNSServer method generateReply.

/*
     * Note: a null return value means that the caller doesn't need to do
     * anything. Currently this only happens if this is an AXFR request over
     * TCP.
     */
byte[] generateReply(final Message query, final byte[] in, final int length, final Socket s) {
    final Header header = query.getHeader();
    int maxLength;
    int flags = 0;
    if (header.getFlag(Flags.QR))
        return null;
    if (header.getRcode() != Rcode.NOERROR)
        return errorMessage(query, Rcode.FORMERR);
    if (header.getOpcode() != Opcode.QUERY)
        return errorMessage(query, Rcode.NOTIMP);
    final Record queryRecord = query.getQuestion();
    final TSIGRecord queryTSIG = query.getTSIG();
    TSIG tsig = null;
    if (queryTSIG != null) {
        tsig = m_TSIGs.get(queryTSIG.getName());
        if (tsig == null || tsig.verify(query, in, length, null) != Rcode.NOERROR)
            return formerrMessage(in);
    }
    final OPTRecord queryOPT = query.getOPT();
    if (s != null)
        maxLength = 65535;
    else if (queryOPT != null)
        maxLength = Math.max(queryOPT.getPayloadSize(), 512);
    else
        maxLength = 512;
    if (queryOPT != null && (queryOPT.getFlags() & ExtendedFlags.DO) != 0)
        flags = FLAG_DNSSECOK;
    final Message response = new Message(query.getHeader().getID());
    response.getHeader().setFlag(Flags.QR);
    if (query.getHeader().getFlag(Flags.RD)) {
        response.getHeader().setFlag(Flags.RD);
    }
    response.addRecord(queryRecord, Section.QUESTION);
    final Name name = queryRecord.getName();
    final int type = queryRecord.getType();
    final int dclass = queryRecord.getDClass();
    if ((type == Type.AXFR || type == Type.IXFR) && s != null)
        return doAXFR(name, query, tsig, queryTSIG, s);
    if (!Type.isRR(type) && type != Type.ANY)
        return errorMessage(query, Rcode.NOTIMP);
    final byte rcode = addAnswer(response, name, type, dclass, 0, flags);
    if (rcode != Rcode.NOERROR && rcode != Rcode.NXDOMAIN)
        return errorMessage(query, rcode);
    addAdditional(response, flags);
    if (queryOPT != null) {
        final int optflags = (flags == FLAG_DNSSECOK) ? ExtendedFlags.DO : 0;
        final OPTRecord opt = new OPTRecord((short) 4096, rcode, (byte) 0, optflags);
        response.addRecord(opt, Section.ADDITIONAL);
    }
    response.setTSIG(tsig, Rcode.NOERROR, queryTSIG);
    return response.toWire(maxLength);
}
Also used : Header(org.xbill.DNS.Header) Message(org.xbill.DNS.Message) OPTRecord(org.xbill.DNS.OPTRecord) CNAMERecord(org.xbill.DNS.CNAMERecord) TSIGRecord(org.xbill.DNS.TSIGRecord) OPTRecord(org.xbill.DNS.OPTRecord) Record(org.xbill.DNS.Record) DNAMERecord(org.xbill.DNS.DNAMERecord) TSIGRecord(org.xbill.DNS.TSIGRecord) TSIG(org.xbill.DNS.TSIG) Name(org.xbill.DNS.Name)

Aggregations

CNAMERecord (org.xbill.DNS.CNAMERecord)1 DNAMERecord (org.xbill.DNS.DNAMERecord)1 Header (org.xbill.DNS.Header)1 Message (org.xbill.DNS.Message)1 Name (org.xbill.DNS.Name)1 OPTRecord (org.xbill.DNS.OPTRecord)1 Record (org.xbill.DNS.Record)1 TSIG (org.xbill.DNS.TSIG)1 TSIGRecord (org.xbill.DNS.TSIGRecord)1