56 xmlDocPtr rngdoc = NULL;
57 xmlRelaxNGParserCtxtPtr rngpctx = NULL;
58 xmlRelaxNGValidCtxtPtr rngctx = NULL;
59 xmlRelaxNGPtr schema = NULL;
62 if (!cfgfile || !rngfile) {
63 ods_log_error(
"[%s] no cfgfile or rngfile", parser_str);
64 return ODS_STATUS_ASSERT_ERR;
66 ods_log_assert(cfgfile);
67 ods_log_assert(rngfile);
68 ods_log_debug(
"[%s] check cfgfile %s with rngfile %s", parser_str,
72 doc = xmlParseFile(cfgfile);
74 ods_log_error(
"[%s] unable to read cfgfile %s", parser_str,
76 return ODS_STATUS_XML_ERR;
79 rngdoc = xmlParseFile(rngfile);
81 ods_log_error(
"[%s] unable to read rngfile %s", parser_str,
84 return ODS_STATUS_XML_ERR;
87 rngpctx = xmlRelaxNGNewDocParserCtxt(rngdoc);
88 if (rngpctx == NULL) {
91 ods_log_error(
"[%s] unable to create XML RelaxNGs parser context",
93 return ODS_STATUS_XML_ERR;
98 schema = xmlRelaxNGParse(rngpctx);
100 ods_log_error(
"[%s] unable to parse a schema definition resource",
102 xmlRelaxNGFreeParserCtxt(rngpctx);
105 return ODS_STATUS_PARSE_ERR;
108 rngctx = xmlRelaxNGNewValidCtxt(schema);
109 if (rngctx == NULL) {
110 ods_log_error(
"[%s] unable to create RelaxNGs validation context",
112 xmlRelaxNGFree(schema);
113 xmlRelaxNGFreeParserCtxt(rngpctx);
116 return ODS_STATUS_RNG_ERR;
119 status = xmlRelaxNGValidateDoc(rngctx,doc);
121 ods_log_error(
"[%s] cfgfile validation failed %s", parser_str,
123 xmlRelaxNGFreeValidCtxt(rngctx);
124 xmlRelaxNGFree(schema);
125 xmlRelaxNGFreeParserCtxt(rngpctx);
128 return ODS_STATUS_RNG_ERR;
131 xmlRelaxNGFreeValidCtxt(rngctx);
132 xmlRelaxNGFree(schema);
133 xmlRelaxNGFreeParserCtxt(rngpctx);
136 return ODS_STATUS_OK;
148 xmlDocPtr doc = NULL;
149 xmlXPathContextPtr xpathCtx = NULL;
150 xmlXPathObjectPtr xpathObj = NULL;
151 xmlChar *xexpr = NULL;
152 const char*
string = NULL;
154 ods_log_assert(expr);
155 ods_log_assert(cfgfile);
158 doc = xmlParseFile(cfgfile);
163 xpathCtx = xmlXPathNewContext(doc);
164 if (xpathCtx == NULL) {
165 ods_log_error(
"[%s] unable to create new XPath context for cfgile "
166 "%s expr %s", parser_str, cfgfile, (
char*) expr);
171 xexpr = (
unsigned char*) expr;
172 xpathObj = xmlXPathEvalExpression(xexpr, xpathCtx);
173 if (xpathObj == NULL || xpathObj->nodesetval == NULL ||
174 xpathObj->nodesetval->nodeNr <= 0) {
176 ods_log_error(
"[%s] unable to evaluate required element %s in "
177 "cfgfile %s", parser_str, (
char*) xexpr, cfgfile);
179 xmlXPathFreeContext(xpathCtx);
181 xmlXPathFreeObject(xpathObj);
186 if (xpathObj->nodesetval != NULL &&
187 xpathObj->nodesetval->nodeNr > 0) {
188 string = (
const char*) xmlXPathCastToString(xpathObj);
189 xmlXPathFreeContext(xpathCtx);
190 xmlXPathFreeObject(xpathObj);
194 xmlXPathFreeContext(xpathCtx);
195 xmlXPathFreeObject(xpathObj);
207 xmlDocPtr doc = NULL;
208 xmlXPathContextPtr xpathCtx = NULL;
209 xmlXPathObjectPtr xpathObj = NULL;
210 xmlNode* curNode = NULL;
211 xmlChar* xexpr = NULL;
219 uint8_t allowextract;
221 hsm_repository_t* rlist = NULL;
222 hsm_repository_t* repo = NULL;
225 doc = xmlParseFile(cfgfile);
227 ods_log_error(
"[%s] could not parse <RepositoryList>: "
228 "xmlParseFile() failed", parser_str);
232 xpathCtx = xmlXPathNewContext(doc);
233 if(xpathCtx == NULL) {
235 ods_log_error(
"[%s] could not parse <RepositoryList>: "
236 "xmlXPathNewContext() failed", parser_str);
240 xexpr = (xmlChar*)
"//Configuration/RepositoryList/Repository";
241 xpathObj = xmlXPathEvalExpression(xexpr, xpathCtx);
242 if(xpathObj == NULL) {
243 xmlXPathFreeContext(xpathCtx);
245 ods_log_error(
"[%s] could not parse <RepositoryList>: "
246 "xmlXPathEvalExpression failed", parser_str);
250 if (xpathObj->nodesetval && xpathObj->nodesetval->nodeNr > 0) {
251 for (i = 0; i < xpathObj->nodesetval->nodeNr; i++) {
261 curNode = xpathObj->nodesetval->nodeTab[i]->xmlChildrenNode;
262 name = (
char *) xmlGetProp(xpathObj->nodesetval->nodeTab[i],
263 (
const xmlChar *)
"name");
265 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"RequireBackup"))
267 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Module"))
268 module = (
char *) xmlNodeGetContent(curNode);
269 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"TokenLabel"))
270 tokenlabel = (
char *) xmlNodeGetContent(curNode);
271 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"PIN"))
272 pin = (
char *) xmlNodeGetContent(curNode);
273 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"SkipPublicKey"))
275 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"AllowExtraction"))
278 curNode = curNode->next;
280 if (name && module && tokenlabel) {
281 repo = hsm_repository_new(name, module, tokenlabel, pin,
282 use_pubkey, allowextract, require_backup);
285 ods_log_error(
"[%s] unable to add %s repository: "
286 "hsm_repository_new() failed", parser_str, name?name:
"-");
290 ods_log_debug(
"[%s] added %s repository to repositorylist",
295 free((
void*)tokenlabel);
299 xmlXPathFreeObject(xpathObj);
300 xmlXPathFreeContext(xpathCtx);