41 #include <libxml/parser.h>
42 #include <libxml/xpath.h>
43 #include <libxml/xpathInternals.h>
44 #include <libxml/xmlreader.h>
47 static const char* parser_str =
"parser";
58 xmlXPathContextPtr xpathCtx = NULL;
59 xmlXPathObjectPtr xpathObj = NULL;
60 xmlNode* curNode = NULL;
61 xmlChar* xexpr = NULL;
66 char* algorithm = NULL;
67 int ksk, zsk, publish, i;
70 ods_log_error(
"[%s] could not parse <Keys>, no cfgfile given",
77 doc = xmlParseFile(cfgfile);
79 ods_log_error(
"[%s] could not parse <Keys>, xmlParseFile failed",
84 xpathCtx = xmlXPathNewContext(doc);
85 if(xpathCtx == NULL) {
87 ods_log_error(
"[%s] could not parse <Keys>, xmlXPathNewContext failed",
92 xexpr = (xmlChar*)
"//SignerConfiguration/Zone/Keys/Key";
93 xpathObj = xmlXPathEvalExpression(xexpr, xpathCtx);
94 if(xpathObj == NULL) {
95 xmlXPathFreeContext(xpathCtx);
97 ods_log_error(
"[%s] could not parse <Keys>, xmlXPathEvalExpression "
98 "failed", parser_str);
103 if (xpathObj->nodesetval && xpathObj->nodesetval->nodeNr > 0) {
104 for (i = 0; i < xpathObj->nodesetval->nodeNr; i++) {
112 curNode = xpathObj->nodesetval->nodeTab[i]->xmlChildrenNode;
114 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Locator")) {
115 locator = (
char *) xmlNodeGetContent(curNode);
116 }
else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Algorithm")) {
117 algorithm = (
char *) xmlNodeGetContent(curNode);
118 }
else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Flags")) {
119 flags = (
char *) xmlNodeGetContent(curNode);
120 }
else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"KSK")) {
122 }
else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"ZSK")) {
124 }
else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Publish")) {
127 curNode = curNode->next;
129 if (locator && algorithm && flags) {
133 new_key->
algorithm == (uint8_t) atoi(algorithm) &&
134 new_key->
flags == (uint32_t) atoi(flags) &&
136 new_key->
ksk == ksk &&
137 new_key->
zsk == zsk) {
140 parser_str, locator);
143 (uint8_t) atoi(algorithm), (uint32_t) atoi(flags),
147 parser_str, locator);
151 ods_log_error(
"[%s] Key missing required elements, skipping",
154 free((
void*)locator);
155 free((
void*)algorithm);
160 xmlXPathFreeObject(xpathObj);
161 xmlXPathFreeContext(xpathCtx);
178 "//SignerConfiguration/Zone/Signatures/Resign",
194 "//SignerConfiguration/Zone/Signatures/Refresh",
210 "//SignerConfiguration/Zone/Signatures/Validity/Default",
226 "//SignerConfiguration/Zone/Signatures/Validity/Denial",
242 "//SignerConfiguration/Zone/Signatures/Jitter",
258 "//SignerConfiguration/Zone/Signatures/InceptionOffset",
274 "//SignerConfiguration/Zone/Keys/TTL",
290 "//SignerConfiguration/Zone/SOA/TTL",
306 "//SignerConfiguration/Zone/SOA/Minimum",
325 "//SignerConfiguration/Zone/Denial/NSEC3",
329 return LDNS_RR_TYPE_NSEC3;
333 "//SignerConfiguration/Zone/Denial/NSEC",
337 return LDNS_RR_TYPE_NSEC;
340 return LDNS_RR_TYPE_FIRST;
353 "//SignerConfiguration/Zone/Denial/NSEC3/Hash/Algorithm",
356 if (strlen(str) > 0) {
370 "//SignerConfiguration/Zone/Denial/NSEC3/Hash/Iterations",
373 if (strlen(str) > 0) {
387 "//SignerConfiguration/Zone/Denial/NSEC3/OptOut",
402 "//SignerConfiguration/Zone/Audit",
419 const char* dup = NULL;
422 "//SignerConfiguration/Zone/SOA/Serial",
436 const char* dup = NULL;
439 "//SignerConfiguration/Zone/Denial/NSEC3/Hash/Salt",