package org.limewire.security.certificate; import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.xbill.DNS.Lookup; import org.xbill.DNS.Record; import org.xbill.DNS.Type; import com.google.inject.Singleton; /** * DNS lookup-backed provider, takes given keys and does a DNS lookup for a TXT * record matching the key. We'd expect the key to be something like * 'something.auth.limewire.com'. */ @Singleton public class HashLookupProviderDNSTXTImpl implements HashLookupProvider { private static final Log LOG = LogFactory.getLog(HashLookupProviderDNSTXTImpl.class); public String lookup(String key) { try { Lookup lookup = new Lookup(key, Type.TXT); lookup.run(); int result = lookup.getResult(); if (result != Lookup.SUCCESSFUL) throw new IOException("Error during lookup: " + lookup.getErrorString()); Record[] answers = lookup.getAnswers(); if (answers == null || answers.length != 1) throw new IOException("Incorrect number of answers, expected 1."); return stripLeadingTrailingQuotes(answers[0].rdataToString()); } catch (IOException ex) { LOG.error("Failed lookup for key '" + key + "'", ex); return null; } } String stripLeadingTrailingQuotes(String incoming) { if (incoming == null || incoming.length() == 0) return incoming; boolean start = incoming.charAt(0) == '\"'; boolean end = incoming.charAt(incoming.length() - 1) == '\"'; return incoming.substring(start ? 1 : 0, incoming.length() - (end ? 1 : 0)); } }