diff --git a/pom.xml b/pom.xml index 013a8ee7b..63cfa39b6 100644 --- a/pom.xml +++ b/pom.xml @@ -198,6 +198,17 @@ + + org.slf4j + slf4j-api + 1.7.28 + + + org.projectlombok + lombok + 1.18.8 + provided + org.bouncycastle bcprov-jdk15on diff --git a/src/main/java/org/xbill/DNS/Cache.java b/src/main/java/org/xbill/DNS/Cache.java index 5d0f43a7e..706059dfa 100644 --- a/src/main/java/org/xbill/DNS/Cache.java +++ b/src/main/java/org/xbill/DNS/Cache.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import lombok.extern.slf4j.Slf4j; /** * A cache of DNS records. The cache obeys TTLs, so items are purged after their validity period is @@ -20,6 +21,7 @@ * @see Credibility * @author Brian Wellington */ +@Slf4j public class Cache { private interface Element { @@ -604,7 +606,6 @@ public SetResponse addMessage(Message in) { boolean completed = false; RRset[] answers, auth, addl; SetResponse response = null; - boolean verbose = Options.check("verbosecache"); HashSet additionalNames; if ((rcode != Rcode.NOERROR && rcode != Rcode.NXDOMAIN) || question == null) { @@ -720,9 +721,7 @@ public SetResponse addMessage(Message in) { cred = getCred(Section.ADDITIONAL, isAuth); addRRset(rRset, cred); } - if (verbose) { - System.out.println("addMessage: " + response); - } + log.debug("addMessage: {}", response); return (response); } diff --git a/src/main/java/org/xbill/DNS/Client.java b/src/main/java/org/xbill/DNS/Client.java index 132d70815..c97daaa00 100644 --- a/src/main/java/org/xbill/DNS/Client.java +++ b/src/main/java/org/xbill/DNS/Client.java @@ -8,8 +8,10 @@ import java.nio.channels.SelectableChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; +import lombok.extern.slf4j.Slf4j; import org.xbill.DNS.utils.hexdump; +@Slf4j class Client { protected long endTime; @@ -52,8 +54,8 @@ protected static void blockUntil(SelectionKey key, long endTime) throws IOExcept protected static void verboseLog( String prefix, SocketAddress local, SocketAddress remote, byte[] data) { - if (Options.check("verbosemsg")) { - System.err.println(hexdump.dump(prefix, data)); + if (log.isDebugEnabled()) { + log.debug(hexdump.dump(prefix, data)); } if (packetLogger != null) { packetLogger.log(prefix, local, remote, data); diff --git a/src/main/java/org/xbill/DNS/Compression.java b/src/main/java/org/xbill/DNS/Compression.java index b6484ef7b..8f4f06517 100644 --- a/src/main/java/org/xbill/DNS/Compression.java +++ b/src/main/java/org/xbill/DNS/Compression.java @@ -2,6 +2,8 @@ package org.xbill.DNS; +import lombok.extern.slf4j.Slf4j; + /** * DNS Name Compression object. * @@ -9,6 +11,7 @@ * @see Name * @author Brian Wellington */ +@Slf4j public class Compression { private static class Entry { @@ -20,7 +23,6 @@ private static class Entry { private static final int TABLE_SIZE = 17; private static final int MAX_POINTER = 0x3FFF; private Entry[] table; - private boolean verbose = Options.check("verbosecompression"); /** Creates a new Compression object. */ public Compression() { @@ -43,9 +45,7 @@ public void add(int pos, Name name) { entry.pos = pos; entry.next = table[row]; table[row] = entry; - if (verbose) { - System.err.println("Adding " + name + " at " + pos); - } + log.debug("Adding {} at {}", name, pos); } /** @@ -62,9 +62,7 @@ public int get(Name name) { pos = entry.pos; } } - if (verbose) { - System.err.println("Looking for " + name + ", found " + pos); - } + log.debug("Looking for {}, found {}", name, pos); return pos; } } diff --git a/src/main/java/org/xbill/DNS/ExtendedResolver.java b/src/main/java/org/xbill/DNS/ExtendedResolver.java index cfbeec50c..c56bde05d 100644 --- a/src/main/java/org/xbill/DNS/ExtendedResolver.java +++ b/src/main/java/org/xbill/DNS/ExtendedResolver.java @@ -8,6 +8,7 @@ import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; +import lombok.extern.slf4j.Slf4j; /** * An implementation of Resolver that can send queries to multiple servers, sending the queries @@ -16,6 +17,7 @@ * @see Resolver * @author Brian Wellington */ +@Slf4j public class ExtendedResolver implements Resolver { private static class Resolution implements ResolverListener { @@ -137,9 +139,7 @@ public void startAsync(ResolverListener listener) { */ @Override public void receiveMessage(Object id, Message m) { - if (Options.check("verbose")) { - System.err.println("ExtendedResolver: " + "received message"); - } + log.debug("received message"); synchronized (this) { if (done) { return; @@ -160,9 +160,7 @@ public void receiveMessage(Object id, Message m) { */ @Override public void handleException(Object id, Exception e) { - if (Options.check("verbose")) { - System.err.println("ExtendedResolver: got " + e); - } + log.debug("resolving failed", e); synchronized (this) { outstanding--; if (done) { diff --git a/src/main/java/org/xbill/DNS/Lookup.java b/src/main/java/org/xbill/DNS/Lookup.java index 9c69fadc1..1d6f026b2 100644 --- a/src/main/java/org/xbill/DNS/Lookup.java +++ b/src/main/java/org/xbill/DNS/Lookup.java @@ -9,6 +9,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import lombok.extern.slf4j.Slf4j; /** * The Lookup object issues queries to caching DNS servers. The input consists of a name, an @@ -25,6 +26,7 @@ * @see ResolverConfig * @author Brian Wellington */ +@Slf4j public final class Lookup { private static Resolver defaultResolver; @@ -40,7 +42,6 @@ public final class Lookup { private Name name; private int type; private int dclass; - private boolean verbose; private int iterations; private boolean foundAlias; private boolean done; @@ -232,7 +233,6 @@ public Lookup(Name name, int type, int dclass) { this.cache = getDefaultCache(dclass); } this.credibility = Credibility.NORMAL; - this.verbose = Options.check("verbose"); this.result = -1; } @@ -436,9 +436,9 @@ private void processResponse(Name name, SetResponse response) { private void lookup(Name current) { SetResponse sr = cache.lookupRecords(current, type, credibility); - if (verbose) { - System.err.println("lookup " + current + " " + Type.string(type)); - System.err.println(sr); + if (log.isDebugEnabled()) { + log.debug("lookup {} {}", current, Type.string(type)); + log.debug(sr.toString()); } processResponse(current, sr); if (done || doneCurrent) { @@ -451,6 +451,8 @@ private void lookup(Name current) { try { response = resolver.send(query); } catch (IOException e) { + log.debug("Lookup failed", e); + // A network error occurred. Press on. if (e instanceof InterruptedIOException) { timedout = true; @@ -479,9 +481,9 @@ private void lookup(Name current) { if (sr == null) { sr = cache.lookupRecords(current, type, credibility); } - if (verbose) { - System.err.println("queried " + current + " " + Type.string(type)); - System.err.println(sr); + if (log.isDebugEnabled()) { + log.debug("queried {} {}", current, Type.string(type)); + log.debug(sr.toString()); } processResponse(current, sr); } diff --git a/src/main/java/org/xbill/DNS/Name.java b/src/main/java/org/xbill/DNS/Name.java index 8e635731a..8dc894de5 100644 --- a/src/main/java/org/xbill/DNS/Name.java +++ b/src/main/java/org/xbill/DNS/Name.java @@ -5,12 +5,14 @@ import java.io.IOException; import java.io.Serializable; import java.text.DecimalFormat; +import lombok.extern.slf4j.Slf4j; /** * A representation of a domain name. It may either be absolute (fully qualified) or relative. * * @author Brian Wellington */ +@Slf4j public class Name implements Comparable, Serializable { private static final long serialVersionUID = -7257019940971525644L; @@ -369,9 +371,7 @@ public Name(DNSInput in) throws WireParseException { case LABEL_COMPRESSION: pos = in.readU8(); pos += ((len & ~LABEL_MASK) << 8); - if (Options.check("verbosecompression")) { - System.err.println("currently " + in.current() + ", pointer to " + pos); - } + log.debug("currently {}, pointer to {}", in.current(), pos); if (pos >= in.current() - 2) { throw new WireParseException("bad compression"); @@ -381,9 +381,7 @@ public Name(DNSInput in) throws WireParseException { savedState = true; } in.jump(pos); - if (Options.check("verbosecompression")) { - System.err.println("current name '" + this + "', seeking to " + pos); - } + log.debug("current name '{}', seeking to {}", this, pos); break; default: throw new WireParseException("bad label type"); diff --git a/src/main/java/org/xbill/DNS/Options.java b/src/main/java/org/xbill/DNS/Options.java index 785e329e6..275f2e112 100644 --- a/src/main/java/org/xbill/DNS/Options.java +++ b/src/main/java/org/xbill/DNS/Options.java @@ -8,14 +8,9 @@ /** * Boolean options:
- * bindttl - Print TTLs in BIND format
+ * BINDTTL - Print TTLs in BIND format
* multiline - Print records in multiline format
- * noprintin - Don't print the class of a record if it's IN
- * verbose - Turn on general debugging statements
- * verbosemsg - Print all messages sent or received by SimpleResolver
- * verbosecompression - Print messages related to name compression
- * verbosesec - Print messages related to signature verification
- * verbosecache - Print messages related to cache lookups
+ * noPrintIN - Don't print the class of a record if it's IN
*
* Valued options:
* tsigfudge=n - Sets the default TSIG fudge value (in seconds)
diff --git a/src/main/java/org/xbill/DNS/ResolverConfig.java b/src/main/java/org/xbill/DNS/ResolverConfig.java index cf1eb77d1..3d21c0fbd 100644 --- a/src/main/java/org/xbill/DNS/ResolverConfig.java +++ b/src/main/java/org/xbill/DNS/ResolverConfig.java @@ -15,6 +15,7 @@ import java.util.Locale; import java.util.ResourceBundle; import java.util.StringTokenizer; +import lombok.extern.slf4j.Slf4j; /** * A class that tries to locate name servers and the search path to be appended to unqualified @@ -40,6 +41,7 @@ * @author Yannick Meudal * @author Arnt Gulbrandsen */ +@Slf4j public class ResolverConfig { public static final String DNS_SERVER_PROP = "dns.server"; @@ -81,17 +83,13 @@ private void addServer(String server, List list) { if (list.contains(server)) { return; } - if (Options.check("verbose")) { - System.out.println("adding server " + server); - } + log.debug("adding server {}", server); list.add(server); } private void addSearch(String search, List list) { Name name; - if (Options.check("verbose")) { - System.out.println("adding search " + search); - } + log.debug("adding search {}", search); try { name = Name.fromString(search, Name.root); } catch (TextParseException e) { @@ -108,9 +106,7 @@ private int parseNdots(String token) { try { int ndots = Integer.parseInt(token); if (ndots >= 0) { - if (Options.check("verbose")) { - System.out.println("setting ndots " + token); - } + log.debug("setting ndots {}", token); return ndots; } } catch (NumberFormatException e) { diff --git a/src/main/java/org/xbill/DNS/SimpleResolver.java b/src/main/java/org/xbill/DNS/SimpleResolver.java index a35c4f445..67e90072c 100644 --- a/src/main/java/org/xbill/DNS/SimpleResolver.java +++ b/src/main/java/org/xbill/DNS/SimpleResolver.java @@ -7,6 +7,7 @@ import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.util.List; +import lombok.extern.slf4j.Slf4j; /** * An implementation of Resolver that sends one query to one server. SimpleResolver handles TCP @@ -17,6 +18,7 @@ * @see OPTRecord * @author Brian Wellington */ +@Slf4j public class SimpleResolver implements Resolver { /** The default port to send queries to */ @@ -178,9 +180,6 @@ private Message parseMessage(byte[] b) throws WireParseException { try { return (new Message(b)); } catch (IOException e) { - if (Options.check("verbose")) { - e.printStackTrace(); - } if (!(e instanceof WireParseException)) { e = new WireParseException("Error parsing message"); } @@ -193,9 +192,7 @@ private void verifyTSIG(Message query, Message response, byte[] b, TSIG tsig) { return; } int error = tsig.verify(response, b, query.getTSIG()); - if (Options.check("verbose")) { - System.err.println("TSIG verify: " + Rcode.TSIGstring(error)); - } + log.debug("TSIG verify: {}", Rcode.TSIGstring(error)); } private void applyEDNS(Message query) { @@ -224,10 +221,7 @@ private int maxUDPSize(Message query) { */ @Override public Message send(Message query) throws IOException { - if (Options.check("verbose")) { - System.err.println( - "Sending to " + address.getAddress().getHostAddress() + ":" + address.getPort()); - } + log.debug("Sending to {}:{}", address.getAddress().getHostAddress(), address.getPort()); if (query.getHeader().getOpcode() == Opcode.QUERY) { Record question = query.getQuestion(); @@ -277,9 +271,7 @@ public Message send(Message query) throws IOException { if (tcp) { throw new WireParseException(error); } else { - if (Options.check("verbose")) { - System.err.println(error); - } + log.debug(error); continue; } } diff --git a/src/main/java/org/xbill/DNS/TSIG.java b/src/main/java/org/xbill/DNS/TSIG.java index 52034d2a6..294b0cbec 100644 --- a/src/main/java/org/xbill/DNS/TSIG.java +++ b/src/main/java/org/xbill/DNS/TSIG.java @@ -11,6 +11,7 @@ import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; +import lombok.extern.slf4j.Slf4j; import org.xbill.DNS.utils.base64; /** @@ -20,6 +21,7 @@ * @see TSIGRecord * @author Brian Wellington */ +@Slf4j public class TSIG { /** The domain name representing the HMAC-MD5 algorithm. */ @@ -442,18 +444,14 @@ public byte verify(Message m, byte[] b, int length, TSIGRecord old) { } if (!tsig.getName().equals(name) || !tsig.getAlgorithm().equals(alg)) { - if (Options.check("verbose")) { - System.err.println("BADKEY failure"); - } + log.debug("BADKEY failure"); return Rcode.BADKEY; } long now = System.currentTimeMillis(); long then = tsig.getTimeSigned().getTime(); long fudge = tsig.getFudge(); if (Math.abs(now - then) > fudge * 1000) { - if (Options.check("verbose")) { - System.err.println("BADTIME failure"); - } + log.debug("BADTIME failure"); return Rcode.BADTIME; } @@ -502,19 +500,13 @@ public byte verify(Message m, byte[] b, int length, TSIGRecord old) { } if (signature.length > digestLength) { - if (Options.check("verbose")) { - System.err.println("BADSIG: signature too long"); - } + log.debug("BADSIG: signature too long"); return Rcode.BADSIG; } else if (signature.length < minDigestLength) { - if (Options.check("verbose")) { - System.err.println("BADSIG: signature too short"); - } + log.debug("BADSIG: signature too short"); return Rcode.BADSIG; } else if (!verify(hmac, signature, true)) { - if (Options.check("verbose")) { - System.err.println("BADSIG: signature verification"); - } + log.debug("BADSIG: signature verification"); return Rcode.BADSIG; } @@ -633,9 +625,7 @@ public int verify(Message m, byte[] b) { } if (!tsig.getName().equals(key.name) || !tsig.getAlgorithm().equals(key.alg)) { - if (Options.check("verbose")) { - System.err.println("BADKEY failure"); - } + log.debug("BADKEY failure"); m.tsigState = Message.TSIG_FAILED; return Rcode.BADKEY; } @@ -650,9 +640,7 @@ public int verify(Message m, byte[] b) { verifier.update(out.toByteArray()); if (!TSIG.verify(verifier, tsig.getSignature())) { - if (Options.check("verbose")) { - System.err.println("BADSIG failure"); - } + log.debug("BADSIG failure"); m.tsigState = Message.TSIG_FAILED; return Rcode.BADSIG; } diff --git a/src/main/java/org/xbill/DNS/ZoneTransferIn.java b/src/main/java/org/xbill/DNS/ZoneTransferIn.java index 383a91a1a..1ae574710 100644 --- a/src/main/java/org/xbill/DNS/ZoneTransferIn.java +++ b/src/main/java/org/xbill/DNS/ZoneTransferIn.java @@ -27,6 +27,7 @@ import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; +import lombok.extern.slf4j.Slf4j; /** * An incoming DNS Zone Transfer. To use this class, first initialize an object, then call the run() @@ -35,6 +36,7 @@ * * @author Brian Wellington */ +@Slf4j public class ZoneTransferIn { private static final int INITIALSOA = 0; @@ -349,9 +351,7 @@ private static long getSOASerial(Record rec) { } private void logxfr(String s) { - if (Options.check("verbose")) { - System.out.println(zname + ": " + s); - } + log.debug("{}: {}", zname, s); } private void fail(String s) throws ZoneTransferException { diff --git a/src/main/java/org/xbill/DNS/spi/DNSJavaNameService.java b/src/main/java/org/xbill/DNS/spi/DNSJavaNameService.java index bc9952c9d..aec70e5ae 100644 --- a/src/main/java/org/xbill/DNS/spi/DNSJavaNameService.java +++ b/src/main/java/org/xbill/DNS/spi/DNSJavaNameService.java @@ -7,6 +7,7 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.util.StringTokenizer; +import lombok.extern.slf4j.Slf4j; import org.xbill.DNS.AAAARecord; import org.xbill.DNS.ARecord; import org.xbill.DNS.ExtendedResolver; @@ -31,6 +32,7 @@ * @author Brian Wellington * @author Paul Cowan (pwc21@yahoo.com) */ +@Slf4j public class DNSJavaNameService implements InvocationHandler { private static final String nsProperty = "sun.net.spi.nameservice.nameservers"; @@ -61,7 +63,7 @@ protected DNSJavaNameService() { Resolver res = new ExtendedResolver(servers); Lookup.setDefaultResolver(res); } catch (UnknownHostException e) { - System.err.println("DNSJavaNameService: invalid " + nsProperty); + log.error("DNSJavaNameService: invalid {}", nsProperty); } } @@ -69,7 +71,7 @@ protected DNSJavaNameService() { try { Lookup.setDefaultSearchPath(new String[] {domain}); } catch (TextParseException e) { - System.err.println("DNSJavaNameService: invalid " + domainProperty); + log.error("DNSJavaNameService: invalid {}", domainProperty); } } @@ -80,32 +82,26 @@ protected DNSJavaNameService() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - try { - if (method.getName().equals("getHostByAddr")) { - return this.getHostByAddr((byte[]) args[0]); - } else if (method.getName().equals("lookupAllHostAddr")) { - InetAddress[] addresses; - addresses = this.lookupAllHostAddr((String) args[0]); - Class returnType = method.getReturnType(); - if (returnType.equals(InetAddress[].class)) { - // method for Java >= 1.6 - return addresses; - } else if (returnType.equals(byte[][].class)) { - // method for Java <= 1.5 - int naddrs = addresses.length; - byte[][] byteAddresses = new byte[naddrs][]; - byte[] addr; - for (int i = 0; i < naddrs; i++) { - addr = addresses[i].getAddress(); - byteAddresses[i] = addr; - } - return byteAddresses; + if (method.getName().equals("getHostByAddr")) { + return this.getHostByAddr((byte[]) args[0]); + } else if (method.getName().equals("lookupAllHostAddr")) { + InetAddress[] addresses; + addresses = this.lookupAllHostAddr((String) args[0]); + Class returnType = method.getReturnType(); + if (returnType.equals(InetAddress[].class)) { + // method for Java >= 1.6 + return addresses; + } else if (returnType.equals(byte[][].class)) { + // method for Java <= 1.5 + int naddrs = addresses.length; + byte[][] byteAddresses = new byte[naddrs][]; + byte[] addr; + for (int i = 0; i < naddrs; i++) { + addr = addresses[i].getAddress(); + byteAddresses[i] = addr; } + return byteAddresses; } - } catch (Throwable e) { - System.err.println("DNSJavaNameService: Unexpected error."); - e.printStackTrace(); - throw e; } throw new IllegalArgumentException("Unknown function name or arguments."); } diff --git a/src/test/java/org/xbill/DNS/CompressionTest.java b/src/test/java/org/xbill/DNS/CompressionTest.java index b5f0c5783..ad357d99f 100644 --- a/src/test/java/org/xbill/DNS/CompressionTest.java +++ b/src/test/java/org/xbill/DNS/CompressionTest.java @@ -36,15 +36,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; class CompressionTest { - @BeforeEach - void setUp() { - Options.set("verbosecompression"); - } - @Test void test() throws TextParseException { Compression c = new Compression(); diff --git a/src/test/java/org/xbill/DNS/NameTest.java b/src/test/java/org/xbill/DNS/NameTest.java index 3b2e9d2dd..34fe542b0 100644 --- a/src/test/java/org/xbill/DNS/NameTest.java +++ b/src/test/java/org/xbill/DNS/NameTest.java @@ -654,9 +654,7 @@ void test_basic_compression() throws TextParseException, WireParseException { DNSInput in = new DNSInput(raw); in.jump(6); - Options.set("verbosecompression"); Name n = new Name(in); - Options.unset("verbosecompression"); assertEquals(e, n); }