// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) package org.xbill.DNS; import java.util.HashMap; /** * Constants and functions relating to DNS Types * * @author Brian Wellington */ public final class Type { /** Address */ public static final int A = 1; /** Name server */ public static final int NS = 2; /** Mail destination */ public static final int MD = 3; /** Mail forwarder */ public static final int MF = 4; /** Canonical name (alias) */ public static final int CNAME = 5; /** Start of authority */ public static final int SOA = 6; /** Mailbox domain name */ public static final int MB = 7; /** Mail group member */ public static final int MG = 8; /** Mail rename name */ public static final int MR = 9; /** Null record */ public static final int NULL = 10; /** Well known services */ public static final int WKS = 11; /** Domain name pointer */ public static final int PTR = 12; /** Host information */ public static final int HINFO = 13; /** Mailbox information */ public static final int MINFO = 14; /** Mail routing information */ public static final int MX = 15; /** Text strings */ public static final int TXT = 16; /** Responsible person */ public static final int RP = 17; /** AFS cell database */ public static final int AFSDB = 18; /** X.25 calling address */ public static final int X25 = 19; /** ISDN calling address */ public static final int ISDN = 20; /** Router */ public static final int RT = 21; /** NSAP address */ public static final int NSAP = 22; /** Reverse NSAP address (deprecated) */ public static final int NSAP_PTR = 23; /** Signature */ public static final int SIG = 24; /** Key */ public static final int KEY = 25; /** X.400 mail mapping */ public static final int PX = 26; /** Geographical position (withdrawn) */ public static final int GPOS = 27; /** IPv6 address */ public static final int AAAA = 28; /** Location */ public static final int LOC = 29; /** Next valid name in zone */ public static final int NXT = 30; /** Endpoint identifier */ public static final int EID = 31; /** Nimrod locator */ public static final int NIMLOC = 32; /** Server selection */ public static final int SRV = 33; /** ATM address */ public static final int ATMA = 34; /** Naming authority pointer */ public static final int NAPTR = 35; /** Key exchange */ public static final int KX = 36; /** Certificate */ public static final int CERT = 37; /** IPv6 address (experimental) */ public static final int A6 = 38; /** Non-terminal name redirection */ public static final int DNAME = 39; /** Options - contains EDNS metadata */ public static final int OPT = 41; /** Address Prefix List */ public static final int APL = 42; /** Delegation Signer */ public static final int DS = 43; /** SSH Key Fingerprint */ public static final int SSHFP = 44; /** IPSEC key */ public static final int IPSECKEY = 45; /** Resource Record Signature */ public static final int RRSIG = 46; /** Next Secure Name */ public static final int NSEC = 47; /** DNSSEC Key */ public static final int DNSKEY = 48; /** Dynamic Host Configuration Protocol (DHCP) ID */ public static final int DHCID = 49; /** Next SECure, 3rd edition, RFC 5155 */ public static final int NSEC3 = 50; /** Next SECure PARAMeter, RFC 5155 */ public static final int NSEC3PARAM = 51; /** Transport Layer Security Authentication, draft-ietf-dane-protocol-23 */ public static final int TLSA = 52; /** Sender Policy Framework (experimental) */ public static final int SPF = 99; /** Transaction key - used to compute a shared secret or exchange a key */ public static final int TKEY = 249; /** Transaction signature */ public static final int TSIG = 250; /** Incremental zone transfer */ public static final int IXFR = 251; /** Zone transfer */ public static final int AXFR = 252; /** Transfer mailbox records */ public static final int MAILB = 253; /** Transfer mail agent records */ public static final int MAILA = 254; /** Matches any type */ public static final int ANY = 255; /** DNSSEC Lookaside Validation, RFC 4431 . */ public static final int DLV = 32769; private static class TypeMnemonic extends Mnemonic { private HashMap objects; public TypeMnemonic() { super("Type", CASE_UPPER); setPrefix("TYPE"); objects = new HashMap(); } public void add(int val, String str, Record proto) { super.add(val, str); objects.put(Mnemonic.toInteger(val), proto); } public void check(int val) { Type.check(val); } public Record getProto(int val) { check(val); return (Record) objects.get(toInteger(val)); } } private static TypeMnemonic types = new TypeMnemonic(); static { types.add(A, "A", new ARecord()); types.add(NS, "NS", new NSRecord()); types.add(MD, "MD", new MDRecord()); types.add(MF, "MF", new MFRecord()); types.add(CNAME, "CNAME", new CNAMERecord()); types.add(SOA, "SOA", new SOARecord()); types.add(MB, "MB", new MBRecord()); types.add(MG, "MG", new MGRecord()); types.add(MR, "MR", new MRRecord()); types.add(NULL, "NULL", new NULLRecord()); types.add(WKS, "WKS", new WKSRecord()); types.add(PTR, "PTR", new PTRRecord()); types.add(HINFO, "HINFO", new HINFORecord()); types.add(MINFO, "MINFO", new MINFORecord()); types.add(MX, "MX", new MXRecord()); types.add(TXT, "TXT", new TXTRecord()); types.add(RP, "RP", new RPRecord()); types.add(AFSDB, "AFSDB", new AFSDBRecord()); types.add(X25, "X25", new X25Record()); types.add(ISDN, "ISDN", new ISDNRecord()); types.add(RT, "RT", new RTRecord()); types.add(NSAP, "NSAP", new NSAPRecord()); types.add(NSAP_PTR, "NSAP-PTR", new NSAP_PTRRecord()); types.add(SIG, "SIG", new SIGRecord()); types.add(KEY, "KEY", new KEYRecord()); types.add(PX, "PX", new PXRecord()); types.add(GPOS, "GPOS", new GPOSRecord()); types.add(AAAA, "AAAA", new AAAARecord()); types.add(LOC, "LOC", new LOCRecord()); types.add(NXT, "NXT", new NXTRecord()); types.add(EID, "EID"); types.add(NIMLOC, "NIMLOC"); types.add(SRV, "SRV", new SRVRecord()); types.add(ATMA, "ATMA"); types.add(NAPTR, "NAPTR", new NAPTRRecord()); types.add(KX, "KX", new KXRecord()); types.add(CERT, "CERT", new CERTRecord()); types.add(A6, "A6", new A6Record()); types.add(DNAME, "DNAME", new DNAMERecord()); types.add(OPT, "OPT", new OPTRecord()); types.add(APL, "APL", new APLRecord()); types.add(DS, "DS", new DSRecord()); types.add(SSHFP, "SSHFP", new SSHFPRecord()); types.add(IPSECKEY, "IPSECKEY", new IPSECKEYRecord()); types.add(RRSIG, "RRSIG", new RRSIGRecord()); types.add(NSEC, "NSEC", new NSECRecord()); types.add(DNSKEY, "DNSKEY", new DNSKEYRecord()); types.add(DHCID, "DHCID", new DHCIDRecord()); types.add(NSEC3, "NSEC3", new NSEC3Record()); types.add(NSEC3PARAM, "NSEC3PARAM", new NSEC3PARAMRecord()); types.add(TLSA, "TLSA", new TLSARecord()); types.add(SPF, "SPF", new SPFRecord()); types.add(TKEY, "TKEY", new TKEYRecord()); types.add(TSIG, "TSIG", new TSIGRecord()); types.add(IXFR, "IXFR"); types.add(AXFR, "AXFR"); types.add(MAILB, "MAILB"); types.add(MAILA, "MAILA"); types.add(ANY, "ANY"); types.add(DLV, "DLV", new DLVRecord()); } private Type() { } /** * Checks that a numeric Type is valid. * @throws InvalidTypeException The type is out of range. */ public static void check(int val) { if (val < 0 || val > 0xFFFF) throw new InvalidTypeException(val); } /** * Converts a numeric Type into a String * @param val The type value. * @return The canonical string representation of the type * @throws InvalidTypeException The type is out of range. */ public static String string(int val) { return types.getText(val); } /** * Converts a String representation of an Type into its numeric value. * @param s The string representation of the type * @param numberok Whether a number will be accepted or not. * @return The type code, or -1 on error. */ public static int value(String s, boolean numberok) { int val = types.getValue(s); if (val == -1 && numberok) { val = types.getValue("TYPE" + s); } return val; } /** * Converts a String representation of an Type into its numeric value * @return The type code, or -1 on error. */ public static int value(String s) { return value(s, false); } static Record getProto(int val) { return types.getProto(val); } /** Is this type valid for a record (a non-meta type)? */ public static boolean isRR(int type) { switch (type) { case OPT: case TKEY: case TSIG: case IXFR: case AXFR: case MAILB: case MAILA: case ANY: return false; default: return true; } } }