1 21 package org.jsmtpd.plugins.dnsServices; 22 23 import java.io.IOException ; 24 import java.net.InetAddress ; 25 import java.net.UnknownHostException ; 26 import java.util.Collections ; 27 import java.util.LinkedList ; 28 import java.util.List ; 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 51 public class DNSJavaResolver implements IDNSResolver { 52 53 private String [] dnsServers; 54 private ExtendedResolver dnsResolver = null; 55 private Log log = LogFactory.getLog(DNSJavaResolver.class); 56 57 public List <InetAddress > doMXLookup(String name) { 58 if ((name==null)||(name.indexOf(".")<=0)) 59 return new LinkedList <InetAddress >(); 60 List <InetAddress > singleResults; 61 singleResults = doSingleMXLookup(name); 62 return singleResults; 63 } 64 65 private List <InetAddress > doSingleMXLookup (String name) { 66 List <InetAddress > results = new LinkedList <InetAddress >(); 67 List <SortableMXRecord> mxRecords = new LinkedList <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 e) { 97 log.error("resolver error: ",e); 98 } 99 return results; 100 } 101 102 public String 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 e) { 114 throw new PluginInitException(e); 115 } 116 } 117 118 public void setDnsServers(String cfg) { 119 if (cfg.contains(",")) 120 dnsServers = cfg.split(","); 121 else { 122 dnsServers = new String [1]; 123 dnsServers[0] = cfg; 124 } 125 } 126 127 public void shutdownPlugin() {} 128 129 public boolean exists(String 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 e) { 139 log.error("error: ",e); 140 } 141 return false; 142 } 143 144 public InetAddress doLookupToIp(String name) { 145 146 return null; 147 } 148 149 public String doReverseLookup(InetAddress 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 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 |