Home | History | Annotate | Download | only in DNS
      1 // Copyright (c) 1999-2004 Brian Wellington (bwelling (at) xbill.org)
      2 
      3 package org.xbill.DNS;
      4 
      5 import java.util.HashMap;
      6 
      7 /**
      8  * Constants and functions relating to DNS Types
      9  *
     10  * @author Brian Wellington
     11  */
     12 
     13 public final class Type {
     14 
     15 /** Address */
     16 public static final int A		= 1;
     17 
     18 /** Name server */
     19 public static final int NS		= 2;
     20 
     21 /** Mail destination */
     22 public static final int MD		= 3;
     23 
     24 /** Mail forwarder */
     25 public static final int MF		= 4;
     26 
     27 /** Canonical name (alias) */
     28 public static final int CNAME		= 5;
     29 
     30 /** Start of authority */
     31 public static final int SOA		= 6;
     32 
     33 /** Mailbox domain name */
     34 public static final int MB		= 7;
     35 
     36 /** Mail group member */
     37 public static final int MG		= 8;
     38 
     39 /** Mail rename name */
     40 public static final int MR		= 9;
     41 
     42 /** Null record */
     43 public static final int NULL		= 10;
     44 
     45 /** Well known services */
     46 public static final int WKS		= 11;
     47 
     48 /** Domain name pointer */
     49 public static final int PTR		= 12;
     50 
     51 /** Host information */
     52 public static final int HINFO		= 13;
     53 
     54 /** Mailbox information */
     55 public static final int MINFO		= 14;
     56 
     57 /** Mail routing information */
     58 public static final int MX		= 15;
     59 
     60 /** Text strings */
     61 public static final int TXT		= 16;
     62 
     63 /** Responsible person */
     64 public static final int RP		= 17;
     65 
     66 /** AFS cell database */
     67 public static final int AFSDB		= 18;
     68 
     69 /** X.25 calling address */
     70 public static final int X25		= 19;
     71 
     72 /** ISDN calling address */
     73 public static final int ISDN		= 20;
     74 
     75 /** Router */
     76 public static final int RT		= 21;
     77 
     78 /** NSAP address */
     79 public static final int NSAP		= 22;
     80 
     81 /** Reverse NSAP address (deprecated) */
     82 public static final int NSAP_PTR	= 23;
     83 
     84 /** Signature */
     85 public static final int SIG		= 24;
     86 
     87 /** Key */
     88 public static final int KEY		= 25;
     89 
     90 /** X.400 mail mapping */
     91 public static final int PX		= 26;
     92 
     93 /** Geographical position (withdrawn) */
     94 public static final int GPOS		= 27;
     95 
     96 /** IPv6 address */
     97 public static final int AAAA		= 28;
     98 
     99 /** Location */
    100 public static final int LOC		= 29;
    101 
    102 /** Next valid name in zone */
    103 public static final int NXT		= 30;
    104 
    105 /** Endpoint identifier */
    106 public static final int EID		= 31;
    107 
    108 /** Nimrod locator */
    109 public static final int NIMLOC		= 32;
    110 
    111 /** Server selection */
    112 public static final int SRV		= 33;
    113 
    114 /** ATM address */
    115 public static final int ATMA		= 34;
    116 
    117 /** Naming authority pointer */
    118 public static final int NAPTR		= 35;
    119 
    120 /** Key exchange */
    121 public static final int KX		= 36;
    122 
    123 /** Certificate */
    124 public static final int CERT		= 37;
    125 
    126 /** IPv6 address (experimental) */
    127 public static final int A6		= 38;
    128 
    129 /** Non-terminal name redirection */
    130 public static final int DNAME		= 39;
    131 
    132 /** Options - contains EDNS metadata */
    133 public static final int OPT		= 41;
    134 
    135 /** Address Prefix List */
    136 public static final int APL		= 42;
    137 
    138 /** Delegation Signer */
    139 public static final int DS		= 43;
    140 
    141 /** SSH Key Fingerprint */
    142 public static final int SSHFP		= 44;
    143 
    144 /** IPSEC key */
    145 public static final int IPSECKEY	= 45;
    146 
    147 /** Resource Record Signature */
    148 public static final int RRSIG		= 46;
    149 
    150 /** Next Secure Name */
    151 public static final int NSEC		= 47;
    152 
    153 /** DNSSEC Key */
    154 public static final int DNSKEY		= 48;
    155 
    156 /** Dynamic Host Configuration Protocol (DHCP) ID */
    157 public static final int DHCID		= 49;
    158 
    159 /** Next SECure, 3rd edition, RFC 5155 */
    160 public static final int NSEC3		= 50;
    161 
    162 /** Next SECure PARAMeter, RFC 5155 */
    163 public static final int NSEC3PARAM	= 51;
    164 
    165 /** Transport Layer Security Authentication, draft-ietf-dane-protocol-23 */
    166 public static final int TLSA		= 52;
    167 
    168 /** Sender Policy Framework (experimental) */
    169 public static final int SPF		= 99;
    170 
    171 /** Transaction key - used to compute a shared secret or exchange a key */
    172 public static final int TKEY		= 249;
    173 
    174 /** Transaction signature */
    175 public static final int TSIG		= 250;
    176 
    177 /** Incremental zone transfer */
    178 public static final int IXFR		= 251;
    179 
    180 /** Zone transfer */
    181 public static final int AXFR		= 252;
    182 
    183 /** Transfer mailbox records */
    184 public static final int MAILB		= 253;
    185 
    186 /** Transfer mail agent records */
    187 public static final int MAILA		= 254;
    188 
    189 /** Matches any type */
    190 public static final int ANY		= 255;
    191 
    192 /** DNSSEC Lookaside Validation, RFC 4431 . */
    193 public static final int DLV		= 32769;
    194 
    195 
    196 private static class TypeMnemonic extends Mnemonic {
    197 	private HashMap objects;
    198 
    199 	public
    200 	TypeMnemonic() {
    201 		super("Type", CASE_UPPER);
    202 		setPrefix("TYPE");
    203 		objects = new HashMap();
    204 	}
    205 
    206 	public void
    207 	add(int val, String str, Record proto) {
    208 		super.add(val, str);
    209 		objects.put(Mnemonic.toInteger(val), proto);
    210 	}
    211 
    212 	public void
    213 	check(int val) {
    214 		Type.check(val);
    215 	}
    216 
    217 	public Record
    218 	getProto(int val) {
    219 		check(val);
    220 		return (Record) objects.get(toInteger(val));
    221 	}
    222 }
    223 
    224 private static TypeMnemonic types = new TypeMnemonic();
    225 
    226 static {
    227 	types.add(A, "A", new ARecord());
    228 	types.add(NS, "NS", new NSRecord());
    229 	types.add(MD, "MD", new MDRecord());
    230 	types.add(MF, "MF", new MFRecord());
    231 	types.add(CNAME, "CNAME", new CNAMERecord());
    232 	types.add(SOA, "SOA", new SOARecord());
    233 	types.add(MB, "MB", new MBRecord());
    234 	types.add(MG, "MG", new MGRecord());
    235 	types.add(MR, "MR", new MRRecord());
    236 	types.add(NULL, "NULL", new NULLRecord());
    237 	types.add(WKS, "WKS", new WKSRecord());
    238 	types.add(PTR, "PTR", new PTRRecord());
    239 	types.add(HINFO, "HINFO", new HINFORecord());
    240 	types.add(MINFO, "MINFO", new MINFORecord());
    241 	types.add(MX, "MX", new MXRecord());
    242 	types.add(TXT, "TXT", new TXTRecord());
    243 	types.add(RP, "RP", new RPRecord());
    244 	types.add(AFSDB, "AFSDB", new AFSDBRecord());
    245 	types.add(X25, "X25", new X25Record());
    246 	types.add(ISDN, "ISDN", new ISDNRecord());
    247 	types.add(RT, "RT", new RTRecord());
    248 	types.add(NSAP, "NSAP", new NSAPRecord());
    249 	types.add(NSAP_PTR, "NSAP-PTR", new NSAP_PTRRecord());
    250 	types.add(SIG, "SIG", new SIGRecord());
    251 	types.add(KEY, "KEY", new KEYRecord());
    252 	types.add(PX, "PX", new PXRecord());
    253 	types.add(GPOS, "GPOS", new GPOSRecord());
    254 	types.add(AAAA, "AAAA", new AAAARecord());
    255 	types.add(LOC, "LOC", new LOCRecord());
    256 	types.add(NXT, "NXT", new NXTRecord());
    257 	types.add(EID, "EID");
    258 	types.add(NIMLOC, "NIMLOC");
    259 	types.add(SRV, "SRV", new SRVRecord());
    260 	types.add(ATMA, "ATMA");
    261 	types.add(NAPTR, "NAPTR", new NAPTRRecord());
    262 	types.add(KX, "KX", new KXRecord());
    263 	types.add(CERT, "CERT", new CERTRecord());
    264 	types.add(A6, "A6", new A6Record());
    265 	types.add(DNAME, "DNAME", new DNAMERecord());
    266 	types.add(OPT, "OPT", new OPTRecord());
    267 	types.add(APL, "APL", new APLRecord());
    268 	types.add(DS, "DS", new DSRecord());
    269 	types.add(SSHFP, "SSHFP", new SSHFPRecord());
    270 	types.add(IPSECKEY, "IPSECKEY", new IPSECKEYRecord());
    271 	types.add(RRSIG, "RRSIG", new RRSIGRecord());
    272 	types.add(NSEC, "NSEC", new NSECRecord());
    273 	types.add(DNSKEY, "DNSKEY", new DNSKEYRecord());
    274 	types.add(DHCID, "DHCID", new DHCIDRecord());
    275 	types.add(NSEC3, "NSEC3", new NSEC3Record());
    276 	types.add(NSEC3PARAM, "NSEC3PARAM", new NSEC3PARAMRecord());
    277 	types.add(TLSA, "TLSA", new TLSARecord());
    278 	types.add(SPF, "SPF", new SPFRecord());
    279 	types.add(TKEY, "TKEY", new TKEYRecord());
    280 	types.add(TSIG, "TSIG", new TSIGRecord());
    281 	types.add(IXFR, "IXFR");
    282 	types.add(AXFR, "AXFR");
    283 	types.add(MAILB, "MAILB");
    284 	types.add(MAILA, "MAILA");
    285 	types.add(ANY, "ANY");
    286 	types.add(DLV, "DLV", new DLVRecord());
    287 }
    288 
    289 private
    290 Type() {
    291 }
    292 
    293 /**
    294  * Checks that a numeric Type is valid.
    295  * @throws InvalidTypeException The type is out of range.
    296  */
    297 public static void
    298 check(int val) {
    299 	if (val < 0 || val > 0xFFFF)
    300 		throw new InvalidTypeException(val);
    301 }
    302 
    303 /**
    304  * Converts a numeric Type into a String
    305  * @param val The type value.
    306  * @return The canonical string representation of the type
    307  * @throws InvalidTypeException The type is out of range.
    308  */
    309 public static String
    310 string(int val) {
    311 	return types.getText(val);
    312 }
    313 
    314 /**
    315  * Converts a String representation of an Type into its numeric value.
    316  * @param s The string representation of the type
    317  * @param numberok Whether a number will be accepted or not.
    318  * @return The type code, or -1 on error.
    319  */
    320 public static int
    321 value(String s, boolean numberok) {
    322 	int val = types.getValue(s);
    323 	if (val == -1 && numberok) {
    324 		val = types.getValue("TYPE" + s);
    325 	}
    326 	return val;
    327 }
    328 
    329 /**
    330  * Converts a String representation of an Type into its numeric value
    331  * @return The type code, or -1 on error.
    332  */
    333 public static int
    334 value(String s) {
    335 	return value(s, false);
    336 }
    337 
    338 static Record
    339 getProto(int val) {
    340 	return types.getProto(val);
    341 }
    342 
    343 /** Is this type valid for a record (a non-meta type)? */
    344 public static boolean
    345 isRR(int type) {
    346 	switch (type) {
    347 		case OPT:
    348 		case TKEY:
    349 		case TSIG:
    350 		case IXFR:
    351 		case AXFR:
    352 		case MAILB:
    353 		case MAILA:
    354 		case ANY:
    355 			return false;
    356 		default:
    357 			return true;
    358 	}
    359 }
    360 
    361 }
    362