mgmt: Add addDelegatedRrset to automatically create AUTH records
Change-Id: I4d87ca52d3d176a8541236ec31526f1ca6033e34
diff --git a/src/mgmt/management-tool.cpp b/src/mgmt/management-tool.cpp
index 9ac19e5..b2f9d44 100644
--- a/src/mgmt/management-tool.cpp
+++ b/src/mgmt/management-tool.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
- * Copyright (c) 2014-2016, Regents of the University of California.
+ * Copyright (c) 2014-2017, Regents of the University of California.
*
* This file is part of NDNS (Named Data Networking Domain Name Service).
* See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -197,8 +197,73 @@
}
void
+ManagementTool::addMultiLevelLabelRrset(Rrset& rrset,
+ RrsetFactory& zoneRrFactory,
+ const time::seconds& authTtl)
+{
+ const Name& label = rrset.getLabel();
+
+ // Check whether it is legal to insert the rrset
+ for (size_t i = 1; i <= label.size() - 1; i++) {
+ Name prefix = label.getPrefix(i);
+ Rrset prefixNsRr(rrset.getZone());
+ prefixNsRr.setLabel(prefix);
+ prefixNsRr.setType(label::NS_RR_TYPE);
+ if (m_dbMgr.find(prefixNsRr)) {
+ Data data(prefixNsRr.getData());
+ if (data.getContentType() == NDNS_LINK) {
+ BOOST_THROW_EXCEPTION(Error("Cannot override " + boost::lexical_cast<std::string>(prefixNsRr) + " (NDNS_LINK)"));
+ }
+ }
+ }
+
+ // check that it does not override existing AUTH
+ if (rrset.getType() == label::NS_RR_TYPE) {
+ Rrset rrsetCopy = rrset;
+ if (m_dbMgr.find(rrsetCopy)) {
+ if (Data(rrsetCopy.getData()).getContentType() == NDNS_AUTH) {
+ BOOST_THROW_EXCEPTION(Error("Cannot override " + boost::lexical_cast<std::string>(rrsetCopy) + " (NDNS_AUTH)"));
+ }
+ }
+ }
+
+ for (size_t i = 1; i <= label.size() - 1; i++) {
+ Name prefix = label.getPrefix(i);
+ Rrset prefixNsRr(rrset.getZone());
+ prefixNsRr.setLabel(prefix);
+ prefixNsRr.setType(label::NS_RR_TYPE);
+ if (m_dbMgr.find(prefixNsRr)) {
+ NDNS_LOG_INFO("NDNS_AUTH Rrset Label=" << prefix << " is already existed, insertion skipped");
+ continue;
+ }
+
+ Rrset authRr = zoneRrFactory.generateAuthRrset(prefix, label::NS_RR_TYPE,
+ VERSION_USE_UNIX_TIMESTAMP, authTtl);
+ NDNS_LOG_INFO("Adding NDNS_AUTH " << authRr);
+ m_dbMgr.insert(authRr);
+ }
+
+ checkRrsetVersion(rrset);
+ NDNS_LOG_INFO("Adding " << rrset);
+ m_dbMgr.insert(rrset);
+}
+
+void
ManagementTool::addRrset(Rrset& rrset)
{
+ if (rrset.getLabel().size() > 1) {
+ throw Error("Cannot add rrset with label size > 1, should use addMultiLevelLabelRrset instead");
+ }
+
+ // check that it does not override existing AUTH
+ Rrset rrsetCopy = rrset;
+ rrsetCopy.setType(label::NS_RR_TYPE);
+ if (m_dbMgr.find(rrsetCopy)) {
+ if (Data(rrsetCopy.getData()).getContentType() == NDNS_AUTH) {
+ BOOST_THROW_EXCEPTION(Error("Can not add this Rrset: it overrides a NDNS_AUTH record"));
+ }
+ }
+
checkRrsetVersion(rrset);
NDNS_LOG_INFO("Added " << rrset);
m_dbMgr.insert(rrset);