static inline void _xccdf_policy_add_xccdf_refine_rule_internal(struct xccdf_policy* policy, struct xccdf_benchmark* benchmark, const struct xccdf_refine_rule* refine_rule) { const char* rr_item_id = xccdf_refine_rule_get_item(refine_rule); struct xccdf_item* item = xccdf_benchmark_get_member(benchmark, XCCDF_ITEM, rr_item_id); if (item != NULL) { // get item by id _add_refine_rule(policy->refine_rules_internal, refine_rule, rr_item_id); return; } // try to get items by cluster-id struct oscap_htable_iterator* hit = xccdf_benchmark_get_cluster_items(benchmark, rr_item_id); if (hit == NULL) { oscap_seterr(OSCAP_EFAMILY_XCCDF, "Selector ID(%s) does not exist in Benchmark.", rr_item_id); return; } while (oscap_htable_iterator_has_more(hit)) { // iterate through every item in cluster const char* item_id = oscap_htable_iterator_next_key(hit); if (item_id == NULL) { assert(item_id != NULL); continue; } _add_refine_rule(policy->refine_rules_internal,refine_rule, item_id); } oscap_htable_iterator_free(hit); }
int ds_dump_component_sources(struct oscap_htable *component_sources, const char *target_dir) { struct oscap_htable_iterator *hit = oscap_htable_iterator_new(component_sources); while (oscap_htable_iterator_has_more(hit)) { struct oscap_source *s = oscap_htable_iterator_next_value(hit); char *filename = target_dir == NULL ? oscap_strdup(oscap_source_readable_origin(s)) : oscap_sprintf("%s/%s", target_dir, oscap_source_readable_origin(s)); int ret = oscap_acquire_ensure_parent_dir(filename); if (ret != 0) { oscap_htable_iterator_free(hit); return ret; } ret = oscap_source_save_as(s, filename); free(filename); if (ret != 0) { oscap_htable_iterator_free(hit); return ret; } } oscap_htable_iterator_free(hit); return 0; }
static int ds_rds_create_from_dom(xmlDocPtr* ret, xmlDocPtr sds_doc, xmlDocPtr xccdf_result_file_doc, struct oscap_htable* oval_result_sources) { *ret = NULL; xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); xmlNodePtr root = xmlNewNode(NULL, BAD_CAST "asset-report-collection"); xmlDocSetRootElement(doc, root); xmlNsPtr arf_ns = xmlNewNs(root, BAD_CAST arf_ns_uri, BAD_CAST "arf"); xmlSetNs(root, arf_ns); xmlNsPtr core_ns = xmlNewNs(root, BAD_CAST core_ns_uri, BAD_CAST "core"); xmlNewNs(root, BAD_CAST ai_ns_uri, BAD_CAST "ai"); xmlNodePtr relationships = xmlNewNode(core_ns, BAD_CAST "relationships"); xmlNewNs(relationships, BAD_CAST arfvocab_ns_uri, BAD_CAST "arfvocab"); xmlNewNs(relationships, BAD_CAST arfrel_ns_uri, BAD_CAST "arfrel"); xmlAddChild(root, relationships); xmlNodePtr report_requests = xmlNewNode(arf_ns, BAD_CAST "report-requests"); xmlAddChild(root, report_requests); xmlNodePtr assets = xmlNewNode(arf_ns, BAD_CAST "assets"); xmlAddChild(root, assets); xmlNodePtr report_request = xmlNewNode(arf_ns, BAD_CAST "report-request"); xmlSetProp(report_request, BAD_CAST "id", BAD_CAST "collection1"); xmlNodePtr arf_content = xmlNewNode(arf_ns, BAD_CAST "content"); xmlDOMWrapCtxtPtr sds_wrap_ctxt = xmlDOMWrapNewCtxt(); xmlNodePtr sds_res_node = NULL; xmlDOMWrapCloneNode(sds_wrap_ctxt, sds_doc, xmlDocGetRootElement(sds_doc), &sds_res_node, doc, NULL, 1, 0); xmlAddChild(arf_content, sds_res_node); xmlDOMWrapReconcileNamespaces(sds_wrap_ctxt, sds_res_node, 0); xmlDOMWrapFreeCtxt(sds_wrap_ctxt); xmlAddChild(report_request, arf_content); xmlAddChild(report_requests, report_request); xmlNodePtr reports = xmlNewNode(arf_ns, BAD_CAST "reports"); ds_rds_add_xccdf_test_results(doc, reports, xccdf_result_file_doc, relationships, assets, "collection1"); unsigned int oval_report_suffix = 2; struct oscap_htable_iterator *hit = oscap_htable_iterator_new(oval_result_sources); while (oscap_htable_iterator_has_more(hit)) { struct oscap_source *oval_source = oscap_htable_iterator_next_value(hit); xmlDoc *oval_result_doc = oscap_source_get_xmlDoc(oval_source); char* report_id = oscap_sprintf("oval%i", oval_report_suffix++); ds_rds_create_report(doc, reports, oval_result_doc, report_id); oscap_free(report_id); } oscap_htable_iterator_free(hit); xmlAddChild(root, reports); *ret = doc; return 0; }