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