]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
sdig: add rudimentary EDE output 13293/head
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Fri, 22 Sep 2023 22:30:34 +0000 (00:30 +0200)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Fri, 22 Sep 2023 22:36:33 +0000 (00:36 +0200)
pdns/Makefile.am
pdns/ednsextendederror.cc [new file with mode: 0644]
pdns/ednsextendederror.hh [new file with mode: 0644]
pdns/recursordist/ednsextendederror.cc [changed from file to symlink]
pdns/recursordist/ednsextendederror.hh [changed from file to symlink]
pdns/sdig.cc

index b5eef7a5444a31f32792e50219d2bed3bd2e90a6..b22bcfdc3cc8d57bc139c330e51d7697ff190382 100644 (file)
@@ -554,6 +554,7 @@ sdig_SOURCES = \
        dnsrecords.cc \
        dnswriter.cc dnswriter.hh \
        dolog.hh \
+       ednsextendederror.cc ednsextendederror.hh \
        ednssubnet.cc iputils.cc \
        libssl.cc libssl.hh \
        logger.cc \
diff --git a/pdns/ednsextendederror.cc b/pdns/ednsextendederror.cc
new file mode 100644 (file)
index 0000000..5010e3d
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * This file is part of PowerDNS or dnsdist.
+ * Copyright -- PowerDNS.COM B.V. and its contributors
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * In addition, for the avoidance of any doubt, permission is granted to
+ * link this program with OpenSSL and to (re)distribute the binaries
+ * produced as the result of such linking.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+#include <limits>
+
+#include "ednsextendederror.hh"
+
+static bool getEDNSExtendedErrorOptFromStringView(const std::string_view& option, EDNSExtendedError& eee)
+{
+  if (option.size() < sizeof(uint16_t)) {
+    return false;
+  }
+  eee.infoCode = static_cast<uint8_t>(option.at(0)) * 256 + static_cast<uint8_t>(option.at(1));
+
+  if (option.size() > sizeof(uint16_t)) {
+    eee.extraText = std::string(&option.at(sizeof(uint16_t)), option.size() - sizeof(uint16_t));
+  }
+
+  return true;
+}
+
+bool getEDNSExtendedErrorOptFromString(const string& option, EDNSExtendedError& eee)
+{
+  return getEDNSExtendedErrorOptFromStringView(std::string_view(option), eee);
+}
+
+bool getEDNSExtendedErrorOptFromString(const char* option, unsigned int len, EDNSExtendedError& eee)
+{
+  return getEDNSExtendedErrorOptFromStringView(std::string_view(option, len), eee);
+}
+
+string makeEDNSExtendedErrorOptString(const EDNSExtendedError& eee)
+{
+  if (eee.extraText.size() > static_cast<size_t>(std::numeric_limits<uint16_t>::max() - 2)) {
+    throw std::runtime_error("Trying to create an EDNS Extended Error option with an extra text of size " + std::to_string(eee.extraText.size()));
+  }
+
+  string ret;
+  ret.reserve(sizeof(uint16_t) + eee.extraText.size());
+  ret.resize(sizeof(uint16_t));
+
+  ret[0] = static_cast<char>(static_cast<uint16_t>(eee.infoCode) / 256);
+  ret[1] = static_cast<char>(static_cast<uint16_t>(eee.infoCode) % 256);
+  ret.append(eee.extraText);
+
+  return ret;
+}
diff --git a/pdns/ednsextendederror.hh b/pdns/ednsextendederror.hh
new file mode 100644 (file)
index 0000000..5b264fc
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * This file is part of PowerDNS or dnsdist.
+ * Copyright -- PowerDNS.COM B.V. and its contributors
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * In addition, for the avoidance of any doubt, permission is granted to
+ * link this program with OpenSSL and to (re)distribute the binaries
+ * produced as the result of such linking.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+#pragma once
+#include "namespaces.hh"
+
+struct EDNSExtendedError
+{
+  enum class code : uint16_t
+  {
+    Other = 0,
+    UnsupportedDNSKEYAlgorithm = 1,
+    UnsupportedDSDigestType = 2,
+    StaleAnswer = 3,
+    ForgedAnswer = 4,
+    DNSSECIndeterminate = 5,
+    DNSSECBogus = 6,
+    SignatureExpired = 7,
+    SignatureNotYetValid = 8,
+    DNSKEYMissing = 9,
+    RRSIGsMissing = 10,
+    NoZoneKeyBitSet = 11,
+    NSECMissing = 12,
+    CachedError = 13,
+    NotReady = 14,
+    Blocked = 15,
+    Censored = 16,
+    Filtered = 17,
+    Prohibited = 18,
+    StaleNXDOMAINAnswer = 19,
+    NotAuthoritative = 20,
+    NotSupported = 21,
+    NoReachableAuthority = 22,
+    NetworkError = 23,
+    InvalidData = 24,
+    SignatureExpiredBeforeValid = 25,
+    TooEarly = 26,
+    UnsupportedNSEC3IterationsValue = 27,
+    UnableToConformToPolicy = 28,
+    Synthesized = 29,
+  };
+  uint16_t infoCode;
+  std::string extraText;
+};
+
+bool getEDNSExtendedErrorOptFromString(const char* option, unsigned int len, EDNSExtendedError& eee);
+bool getEDNSExtendedErrorOptFromString(const string& option, EDNSExtendedError& eee);
+string makeEDNSExtendedErrorOptString(const EDNSExtendedError& eee);
deleted file mode 100644 (file)
index 5010e3dba52dc87a3dab238d7fa081adcf8f1ad2..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * This file is part of PowerDNS or dnsdist.
- * Copyright -- PowerDNS.COM B.V. and its contributors
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * In addition, for the avoidance of any doubt, permission is granted to
- * link this program with OpenSSL and to (re)distribute the binaries
- * produced as the result of such linking.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-#include <limits>
-
-#include "ednsextendederror.hh"
-
-static bool getEDNSExtendedErrorOptFromStringView(const std::string_view& option, EDNSExtendedError& eee)
-{
-  if (option.size() < sizeof(uint16_t)) {
-    return false;
-  }
-  eee.infoCode = static_cast<uint8_t>(option.at(0)) * 256 + static_cast<uint8_t>(option.at(1));
-
-  if (option.size() > sizeof(uint16_t)) {
-    eee.extraText = std::string(&option.at(sizeof(uint16_t)), option.size() - sizeof(uint16_t));
-  }
-
-  return true;
-}
-
-bool getEDNSExtendedErrorOptFromString(const string& option, EDNSExtendedError& eee)
-{
-  return getEDNSExtendedErrorOptFromStringView(std::string_view(option), eee);
-}
-
-bool getEDNSExtendedErrorOptFromString(const char* option, unsigned int len, EDNSExtendedError& eee)
-{
-  return getEDNSExtendedErrorOptFromStringView(std::string_view(option, len), eee);
-}
-
-string makeEDNSExtendedErrorOptString(const EDNSExtendedError& eee)
-{
-  if (eee.extraText.size() > static_cast<size_t>(std::numeric_limits<uint16_t>::max() - 2)) {
-    throw std::runtime_error("Trying to create an EDNS Extended Error option with an extra text of size " + std::to_string(eee.extraText.size()));
-  }
-
-  string ret;
-  ret.reserve(sizeof(uint16_t) + eee.extraText.size());
-  ret.resize(sizeof(uint16_t));
-
-  ret[0] = static_cast<char>(static_cast<uint16_t>(eee.infoCode) / 256);
-  ret[1] = static_cast<char>(static_cast<uint16_t>(eee.infoCode) % 256);
-  ret.append(eee.extraText);
-
-  return ret;
-}
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..4f6ced0eb166a10aaeda9107936822805996c6a9
--- /dev/null
@@ -0,0 +1 @@
+../ednsextendederror.cc
\ No newline at end of file
deleted file mode 100644 (file)
index 5b264fcf69b6f2985ac39d8b5ba9a01e25ff924a..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * This file is part of PowerDNS or dnsdist.
- * Copyright -- PowerDNS.COM B.V. and its contributors
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * In addition, for the avoidance of any doubt, permission is granted to
- * link this program with OpenSSL and to (re)distribute the binaries
- * produced as the result of such linking.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-#pragma once
-#include "namespaces.hh"
-
-struct EDNSExtendedError
-{
-  enum class code : uint16_t
-  {
-    Other = 0,
-    UnsupportedDNSKEYAlgorithm = 1,
-    UnsupportedDSDigestType = 2,
-    StaleAnswer = 3,
-    ForgedAnswer = 4,
-    DNSSECIndeterminate = 5,
-    DNSSECBogus = 6,
-    SignatureExpired = 7,
-    SignatureNotYetValid = 8,
-    DNSKEYMissing = 9,
-    RRSIGsMissing = 10,
-    NoZoneKeyBitSet = 11,
-    NSECMissing = 12,
-    CachedError = 13,
-    NotReady = 14,
-    Blocked = 15,
-    Censored = 16,
-    Filtered = 17,
-    Prohibited = 18,
-    StaleNXDOMAINAnswer = 19,
-    NotAuthoritative = 20,
-    NotSupported = 21,
-    NoReachableAuthority = 22,
-    NetworkError = 23,
-    InvalidData = 24,
-    SignatureExpiredBeforeValid = 25,
-    TooEarly = 26,
-    UnsupportedNSEC3IterationsValue = 27,
-    UnableToConformToPolicy = 28,
-    Synthesized = 29,
-  };
-  uint16_t infoCode;
-  std::string extraText;
-};
-
-bool getEDNSExtendedErrorOptFromString(const char* option, unsigned int len, EDNSExtendedError& eee);
-bool getEDNSExtendedErrorOptFromString(const string& option, EDNSExtendedError& eee);
-string makeEDNSExtendedErrorOptString(const EDNSExtendedError& eee);
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..2e5eee19272470aa9125455ddd519f006c21c574
--- /dev/null
@@ -0,0 +1 @@
+../ednsextendederror.hh
\ No newline at end of file
index 87b4f558e47161da6130c08cee1223ee807a8676..05bfc7d6e8e37be866cefa2952c7ba017829c3ff 100644 (file)
@@ -6,6 +6,7 @@
 #include "dnswriter.hh"
 #include "ednsoptions.hh"
 #include "ednssubnet.hh"
+#include "ednsextendederror.hh"
 #include "misc.hh"
 #include "proxy-protocol.hh"
 #include "sstuff.hh"
@@ -185,6 +186,11 @@ static void printReply(const string& reply, bool showflags, bool hidesoadetails,
         }
       } else if (iter->first == EDNSOptionCode::PADDING) {
         cerr << "EDNS Padding size: " << (iter->second.size()) << endl;
+      } else if (iter->first == EDNSOptionCode::EXTENDEDERROR) {
+        EDNSExtendedError eee;
+        if (getEDNSExtendedErrorOptFromString(iter->second, eee)) {
+          cerr << "EDNS Extended Error response: " << eee.infoCode << "/" << eee.extraText << endl;
+        }
       } else {
         cerr << "Have unknown option " << (int)iter->first << endl;
       }