1// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) 2 3package org.xbill.DNS; 4 5import java.util.HashMap; 6 7/** 8 * Constants and functions relating to DNS Types 9 * 10 * @author Brian Wellington 11 */ 12 13public final class Type { 14 15/** Address */ 16public static final int A = 1; 17 18/** Name server */ 19public static final int NS = 2; 20 21/** Mail destination */ 22public static final int MD = 3; 23 24/** Mail forwarder */ 25public static final int MF = 4; 26 27/** Canonical name (alias) */ 28public static final int CNAME = 5; 29 30/** Start of authority */ 31public static final int SOA = 6; 32 33/** Mailbox domain name */ 34public static final int MB = 7; 35 36/** Mail group member */ 37public static final int MG = 8; 38 39/** Mail rename name */ 40public static final int MR = 9; 41 42/** Null record */ 43public static final int NULL = 10; 44 45/** Well known services */ 46public static final int WKS = 11; 47 48/** Domain name pointer */ 49public static final int PTR = 12; 50 51/** Host information */ 52public static final int HINFO = 13; 53 54/** Mailbox information */ 55public static final int MINFO = 14; 56 57/** Mail routing information */ 58public static final int MX = 15; 59 60/** Text strings */ 61public static final int TXT = 16; 62 63/** Responsible person */ 64public static final int RP = 17; 65 66/** AFS cell database */ 67public static final int AFSDB = 18; 68 69/** X.25 calling address */ 70public static final int X25 = 19; 71 72/** ISDN calling address */ 73public static final int ISDN = 20; 74 75/** Router */ 76public static final int RT = 21; 77 78/** NSAP address */ 79public static final int NSAP = 22; 80 81/** Reverse NSAP address (deprecated) */ 82public static final int NSAP_PTR = 23; 83 84/** Signature */ 85public static final int SIG = 24; 86 87/** Key */ 88public static final int KEY = 25; 89 90/** X.400 mail mapping */ 91public static final int PX = 26; 92 93/** Geographical position (withdrawn) */ 94public static final int GPOS = 27; 95 96/** IPv6 address */ 97public static final int AAAA = 28; 98 99/** Location */ 100public static final int LOC = 29; 101 102/** Next valid name in zone */ 103public static final int NXT = 30; 104 105/** Endpoint identifier */ 106public static final int EID = 31; 107 108/** Nimrod locator */ 109public static final int NIMLOC = 32; 110 111/** Server selection */ 112public static final int SRV = 33; 113 114/** ATM address */ 115public static final int ATMA = 34; 116 117/** Naming authority pointer */ 118public static final int NAPTR = 35; 119 120/** Key exchange */ 121public static final int KX = 36; 122 123/** Certificate */ 124public static final int CERT = 37; 125 126/** IPv6 address (experimental) */ 127public static final int A6 = 38; 128 129/** Non-terminal name redirection */ 130public static final int DNAME = 39; 131 132/** Options - contains EDNS metadata */ 133public static final int OPT = 41; 134 135/** Address Prefix List */ 136public static final int APL = 42; 137 138/** Delegation Signer */ 139public static final int DS = 43; 140 141/** SSH Key Fingerprint */ 142public static final int SSHFP = 44; 143 144/** IPSEC key */ 145public static final int IPSECKEY = 45; 146 147/** Resource Record Signature */ 148public static final int RRSIG = 46; 149 150/** Next Secure Name */ 151public static final int NSEC = 47; 152 153/** DNSSEC Key */ 154public static final int DNSKEY = 48; 155 156/** Dynamic Host Configuration Protocol (DHCP) ID */ 157public static final int DHCID = 49; 158 159/** Next SECure, 3rd edition, RFC 5155 */ 160public static final int NSEC3 = 50; 161 162/** Next SECure PARAMeter, RFC 5155 */ 163public static final int NSEC3PARAM = 51; 164 165/** Transport Layer Security Authentication, draft-ietf-dane-protocol-23 */ 166public static final int TLSA = 52; 167 168/** Sender Policy Framework (experimental) */ 169public static final int SPF = 99; 170 171/** Transaction key - used to compute a shared secret or exchange a key */ 172public static final int TKEY = 249; 173 174/** Transaction signature */ 175public static final int TSIG = 250; 176 177/** Incremental zone transfer */ 178public static final int IXFR = 251; 179 180/** Zone transfer */ 181public static final int AXFR = 252; 182 183/** Transfer mailbox records */ 184public static final int MAILB = 253; 185 186/** Transfer mail agent records */ 187public static final int MAILA = 254; 188 189/** Matches any type */ 190public static final int ANY = 255; 191 192/** DNSSEC Lookaside Validation, RFC 4431 . */ 193public static final int DLV = 32769; 194 195 196private 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 224private static TypeMnemonic types = new TypeMnemonic(); 225 226static { 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 289private 290Type() { 291} 292 293/** 294 * Checks that a numeric Type is valid. 295 * @throws InvalidTypeException The type is out of range. 296 */ 297public static void 298check(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 */ 309public static String 310string(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 */ 320public static int 321value(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 */ 333public static int 334value(String s) { 335 return value(s, false); 336} 337 338static Record 339getProto(int val) { 340 return types.getProto(val); 341} 342 343/** Is this type valid for a record (a non-meta type)? */ 344public static boolean 345isRR(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