54 xmlXPathContextPtr xpathCtx = NULL;
55 xmlXPathObjectPtr xpathObj = NULL;
56 xmlNode* curNode = NULL;
57 xmlChar* xexpr = NULL;
65 int ksk, zsk, publish, i;
67 if (!cfgfile || !sc) {
71 doc = xmlParseFile(cfgfile);
73 ods_log_error(
"[%s] unable to parse <Keys>: "
74 "xmlParseFile() failed", parser_str);
78 xpathCtx = xmlXPathNewContext(doc);
79 if(xpathCtx == NULL) {
81 ods_log_error(
"[%s] unable to parse <Keys>: "
82 "xmlXPathNewContext() failed", parser_str);
86 xexpr = (xmlChar*)
"//SignerConfiguration/Zone/Keys/Key";
87 xpathObj = xmlXPathEvalExpression(xexpr, xpathCtx);
88 if(xpathObj == NULL) {
89 xmlXPathFreeContext(xpathCtx);
91 ods_log_error(
"[%s] unable to parse <Keys>: "
92 "xmlXPathEvalExpression() failed", parser_str);
98 if (xpathObj->nodesetval && xpathObj->nodesetval->nodeNr > 0) {
99 for (i = 0; i < xpathObj->nodesetval->nodeNr; i++) {
100 resourcerecord = NULL;
109 curNode = xpathObj->nodesetval->nodeTab[i]->xmlChildrenNode;
111 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Locator")) {
112 locator = (
char *) xmlNodeGetContent(curNode);
113 }
else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Algorithm")) {
114 algorithm = (
char *) xmlNodeGetContent(curNode);
115 }
else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Flags")) {
116 flags = (
char *) xmlNodeGetContent(curNode);
117 }
else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"KSK")) {
119 }
else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"ZSK")) {
121 }
else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Publish")) {
123 }
else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"ResourceRecord")) {
124 resourcerecord = (
char *) xmlNodeGetContent(curNode);
126 curNode = curNode->next;
132 if (!locator && !resourcerecord)
138 new_key->
algorithm == (uint8_t) atoi(algorithm) &&
139 new_key->
flags == (uint32_t) atoi(flags) &&
141 new_key->
ksk == ksk &&
142 new_key->
zsk == zsk) {
144 ods_log_warning(
"[%s] unable to push duplicate key %s "
145 "to keylist, skipping", parser_str, locator);
148 (uint8_t) atoi(algorithm), (uint32_t) atoi(flags),
152 ods_log_error(
"[%s] unable to push key to keylist: <Key> "
153 "is missing required elements, skipping",
156 free((
void*)algorithm);
160 xmlXPathFreeObject(xpathObj);
161 xmlXPathFreeContext(xpathCtx);
306 xmlDocPtr doc = NULL;
307 xmlXPathContextPtr xpathCtx = NULL;
308 xmlXPathObjectPtr xpathObj = NULL;
309 xmlNode* curNode = NULL;
310 xmlChar* xexpr = NULL;
311 const char **signatureresourcerecords;
318 doc = xmlParseFile(cfgfile);
320 ods_log_error(
"[%s] unable to parse <Keys>: "
321 "xmlParseFile() failed", parser_str);
325 xpathCtx = xmlXPathNewContext(doc);
326 if(xpathCtx == NULL) {
328 ods_log_error(
"[%s] unable to parse <Keys>: "
329 "xmlXPathNewContext() failed", parser_str);
333 xexpr = (xmlChar*)
"//SignerConfiguration/Zone/Keys/SignatureResourceRecord";
334 xpathObj = xmlXPathEvalExpression(xexpr, xpathCtx);
335 if(xpathObj == NULL) {
336 xmlXPathFreeContext(xpathCtx);
338 ods_log_error(
"[%s] unable to parse <Keys>: "
339 "xmlXPathEvalExpression() failed", parser_str);
343 if (xpathObj->nodesetval && xpathObj->nodesetval->nodeNr > 0) {
344 signatureresourcerecords = malloc(
sizeof(
char*) * (xpathObj->nodesetval->nodeNr + 1));
345 for (i = 0; i < xpathObj->nodesetval->nodeNr; i++) {
346 curNode = xpathObj->nodesetval->nodeTab[i];
347 signatureresourcerecords[i] = (
char *) xmlNodeGetContent(curNode);
349 signatureresourcerecords[i] = NULL;
351 signatureresourcerecords = NULL;
353 xmlXPathFreeObject(xpathObj);
354 xmlXPathFreeContext(xpathCtx);
358 return signatureresourcerecords;
key_type * keylist_push(keylist_type *kl, const char *locator, const char *resourcerecord, uint8_t algorithm, uint32_t flags, int publish, int ksk, int zsk)