KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jsmtpd > plugins > dnsServices > DNSJavaResolver


1 /*
2  *
3  * Jsmtpd, Java SMTP daemon
4  * Copyright (C) 2005 Jean-Francois POUX, jf.poux@laposte.net
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  *
20  */

21 package org.jsmtpd.plugins.dnsServices;
22
23 import java.io.IOException JavaDoc;
24 import java.net.InetAddress JavaDoc;
25 import java.net.UnknownHostException JavaDoc;
26 import java.util.Collections JavaDoc;
27 import java.util.LinkedList JavaDoc;
28 import java.util.List JavaDoc;
29
30 import org.apache.commons.logging.Log;
31 import org.apache.commons.logging.LogFactory;
32 import org.jsmtpd.core.common.PluginInitException;
33 import org.jsmtpd.core.common.dnsService.IDNSResolver;
34 import org.xbill.DNS.ARecord;
35 import org.xbill.DNS.DClass;
36 import org.xbill.DNS.ExtendedResolver;
37 import org.xbill.DNS.Lookup;
38 import org.xbill.DNS.MXRecord;
39 import org.xbill.DNS.Message;
40 import org.xbill.DNS.Name;
41 import org.xbill.DNS.Record;
42 import org.xbill.DNS.ReverseMap;
43 import org.xbill.DNS.Section;
44 import org.xbill.DNS.SimpleResolver;
45 import org.xbill.DNS.Type;
46
47 /**
48  * A mx resolver plugin, this one uses dnsjava, http://www.xbill.org/dnsjava/
49  * @author Jean-Francois POUX
50  */

51 public class DNSJavaResolver implements IDNSResolver {
52
53     private String JavaDoc[] dnsServers;
54     private ExtendedResolver dnsResolver = null;
55     private Log log = LogFactory.getLog(DNSJavaResolver.class);
56     
57     public List JavaDoc<InetAddress JavaDoc> doMXLookup(String JavaDoc name) {
58        if ((name==null)||(name.indexOf(".")<=0))
59            return new LinkedList JavaDoc<InetAddress JavaDoc>();
60        List JavaDoc<InetAddress JavaDoc> singleResults;
61        singleResults = doSingleMXLookup(name);
62        return singleResults;
63     }
64
65     private List JavaDoc<InetAddress JavaDoc> doSingleMXLookup (String JavaDoc name) {
66         List JavaDoc<InetAddress JavaDoc> results = new LinkedList JavaDoc<InetAddress JavaDoc>();
67         List JavaDoc<SortableMXRecord> mxRecords = new LinkedList JavaDoc<SortableMXRecord>();
68         try {
69             Lookup look = new Lookup(name, Type.MX);
70             look.setResolver(dnsResolver);
71             Record[] records = look.run();
72             if (records == null)
73                 return results;
74             for (int i = 0; i < records.length; i++) {
75                 if (records[i] instanceof MXRecord) {
76                     MXRecord mx = (MXRecord) records[i];
77                     mxRecords.add(new SortableMXRecord(mx));
78                 }
79             }
80             Collections.sort(mxRecords);
81             for (int i = 0; i < mxRecords.size(); i++) {
82                 SortableMXRecord smx = (SortableMXRecord) mxRecords.get(i);
83                 MXRecord mx = smx.getMXRecord();
84                 Lookup tmp = new Lookup(mx.getTarget(), Type.A);
85                 tmp.setResolver(dnsResolver);
86                 Record[] partial = tmp.run();
87                 if (partial != null) {
88                     for (int j = 0; j < partial.length; j++) {
89                         if (partial[j] instanceof ARecord) {
90                             ARecord re = (ARecord) partial[j];
91                             results.add(re.getAddress());
92                         }
93                     }
94                 }
95             }
96         } catch (Exception JavaDoc e) {
97             log.error("resolver error: ",e);
98         }
99         return results;
100     }
101     
102     public String JavaDoc getPluginName() {
103         return "DNSJava resolver plugin for jsmptd";
104     }
105
106     public void initPlugin() throws PluginInitException {
107         SimpleResolver[] srez = new SimpleResolver[dnsServers.length];
108         try {
109             for (int i = 0; i < dnsServers.length; i++) {
110                 srez[i] = new SimpleResolver(dnsServers[i]);
111             }
112             dnsResolver = new ExtendedResolver(srez);
113         } catch (UnknownHostException JavaDoc e) {
114             throw new PluginInitException(e);
115         }
116     }
117     
118     public void setDnsServers(String JavaDoc cfg) {
119         if (cfg.contains(","))
120             dnsServers = cfg.split(",");
121         else {
122             dnsServers = new String JavaDoc[1];
123             dnsServers[0] = cfg;
124         }
125     }
126
127     public void shutdownPlugin() {}
128
129     public boolean exists(String JavaDoc name) {
130         try {
131             Lookup look = new Lookup(name, Type.ANY);
132             look.setResolver(dnsResolver);
133             Record[] records = look.run();
134             if ((records == null) || (records.length == 0))
135                 return false;
136             else
137                 return true;
138         } catch (Exception JavaDoc e) {
139             log.error("error: ",e);
140         }
141         return false;
142     }
143
144     public InetAddress JavaDoc doLookupToIp(String JavaDoc name) {
145
146         return null;
147     }
148
149     public String JavaDoc doReverseLookup(InetAddress JavaDoc in) {
150         Name name = ReverseMap.fromAddress(in);
151         int type = Type.PTR;
152         int dclass = DClass.IN;
153         Record rec = Record.newRecord(name, type, dclass);
154         Message query = Message.newQuery(rec);
155         Message response;
156         try {
157             response = dnsResolver.send(query);
158         } catch (IOException JavaDoc e) {
159            return "";
160         }
161     
162         Record[] answers = response.getSectionArray(Section.ANSWER);
163         if (answers.length == 0)
164            return "";
165         else
166            return answers[0].rdataToString();
167     }
168
169 }
Popular Tags