/** * Put refine-rule into hash table with item_id as key. Refine-rules are with same key are merged. * @param refine_rules_internal hash table * @param new_rr refine-rule to add * @param item_id key to hash table */ static void _add_refine_rule(struct oscap_htable* refine_rules_internal, const struct xccdf_refine_rule* new_rr, const char* item_id) { struct xccdf_refine_rule_internal* old = oscap_htable_get(refine_rules_internal, item_id); if (old != NULL) { // modify refine-rule in hash-table _merge_refine_rules(old, new_rr); } else { // add new refine-rule to hash-table struct xccdf_refine_rule_internal* new_internal_rr = _xccdf_refine_rule_internal_new_from_refine_rule(new_rr); oscap_htable_add(refine_rules_internal, item_id, new_internal_rr); } }
struct oscap_source *ds_sds_session_select_tailoring(struct ds_sds_session *session, const char *component_id) { if (ds_sds_session_register_component_with_dependencies(session, "checklists", component_id, "tailoring.xml") != 0) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Could not extract %s with all dependencies from datastream.", component_id); return NULL; } struct oscap_source *tailoring = oscap_htable_get(session->component_sources, "tailoring.xml"); if (tailoring == NULL) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Internal error: Could not acquire handle to tailoring.xml source."); } return tailoring; }
struct oscap_source *ds_rds_session_select_report(struct ds_rds_session *session, const char *report_id) { session->report_id = report_id; if (rds_index_select_report(ds_rds_session_get_rds_idx(session), &(session->report_id)) != 0) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Failed to locate a report with ID matching '%s' ID.", session->report_id == NULL ? "<any>" : session->report_id); return NULL; } if (ds_rds_dump_arf_content(session, "reports", "report", session->report_id) != 0) { return NULL; } return oscap_htable_get(session->component_sources, session->report_id); }
char *ds_sds_session_get_html_guide(struct ds_sds_session *session, const char *profile_id) { const char *params[] = { "show", "", "verbosity", "", "hide-profile-info", NULL, "oscap-version", oscap_get_version(), "pwd", NULL, "profile_id", profile_id, NULL }; struct oscap_source *xccdf = oscap_htable_get(session->component_sources, "xccdf.xml"); if (xccdf == NULL) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Internal error: Could not acquire handle to xccdf.xml source."); } return oscap_source_apply_xslt_path_mem(xccdf, "xccdf-guide.xsl", params, oscap_path_to_xslt()); }
struct oscap_source *ds_rds_session_select_report_request(struct ds_rds_session *session, const char *report_request_id) { if (report_request_id == NULL) { if (session->report_id == NULL) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Internal Error: Not implemented: " "Could not select report-request: '<any>': No report selected."); return NULL; } struct rds_report_index *report = rds_index_get_report(ds_rds_session_get_rds_idx(session), session->report_id); struct rds_report_request_index *request = rds_report_index_get_request(report); if (request == NULL) { return NULL; } report_request_id = rds_report_request_index_get_id(request); } if (ds_rds_dump_arf_content(session, "report-requests", "report-request", report_request_id) != 0) { return NULL; } return oscap_htable_get(session->component_sources, report_request_id); }
struct oscap_source *ds_sds_session_select_checklist(struct ds_sds_session *session, const char *datastream_id, const char *component_id, const char *benchmark_id) { session->datastream_id = datastream_id; session->checklist_id = component_id; // We only use benchmark ID if datastream ID and/or component ID were NOT supplied. if (!datastream_id && !component_id && benchmark_id) { if (ds_sds_index_select_checklist_by_benchmark_id(ds_sds_session_get_sds_idx(session), benchmark_id, (const char **) &(session->datastream_id), (const char **) &(session->checklist_id)) != 0) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Failed to locate a datastream with component-ref " "that points to a component containing Benchmark with ID '%s'.", benchmark_id); return NULL; } } else { if (benchmark_id) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Not using benchmark ID ('%s') for component-ref lookup, " "datastream ID ('%s') and/or component-ref ID ('%s') were supplied, using them instead.", benchmark_id, datastream_id, component_id); } if (ds_sds_index_select_checklist(ds_sds_session_get_sds_idx(session), (const char **) &(session->datastream_id), (const char **) &(session->checklist_id)) != 0) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Failed to locate a datastream with ID matching " "'%s' ID and checklist inside matching '%s' ID.", datastream_id == NULL ? "<any>" : datastream_id, component_id == NULL ? "<any>" : component_id); return NULL; } } if (ds_sds_session_register_component_with_dependencies(session, "checklists", session->checklist_id, session->checklist_id) != 0) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Could not extract %s with all dependencies from datastream.", session->checklist_id); return NULL; } struct oscap_source *xccdf = oscap_htable_get(session->component_sources, session->checklist_id); if (xccdf == NULL) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Internal error: Could not acquire handle to '%s' source.", session->checklist_id); } return xccdf; }
struct oscap_source *ds_sds_session_get_component_by_href(struct ds_sds_session *session, const char *href) { struct oscap_source *component = oscap_htable_get(session->component_sources, href); return component; }
static int ds_sds_compose_add_component_dependencies(xmlDocPtr doc, xmlNodePtr datastream, struct oscap_source *component_source, xmlNodePtr catalog, int component_type) { xmlDocPtr component_doc = oscap_source_get_xmlDoc(component_source); if (component_doc == NULL) { return -1; } xmlXPathContextPtr xpathCtx = xmlXPathNewContext(component_doc); if (xpathCtx == NULL) { oscap_seterr(OSCAP_EFAMILY_XML, "Error: unable to create new XPath context."); return -1; } xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression( // we want robustness and support for future versions, this expression // retrieves check-content-refs from any namespace BAD_CAST _get_dep_xpath_for_type(component_type), xpathCtx); if (xpathObj == NULL) { oscap_seterr(OSCAP_EFAMILY_XML, "Error: Unable to evalute XPath expression."); xmlXPathFreeContext(xpathCtx); return -1; } xmlNsPtr cat_ns = xmlSearchNsByHref(doc, datastream, BAD_CAST cat_ns_uri); xmlNodeSetPtr nodeset = xpathObj->nodesetval; if (nodeset != NULL) { struct oscap_htable *exported = oscap_htable_new(); char* filepath_cpy = oscap_strdup(oscap_source_readable_origin(component_source)); const char* dir = dirname(filepath_cpy); for (int i = 0; i < nodeset->nodeNr; i++) { xmlNodePtr node = nodeset->nodeTab[i]; if (node->type != XML_ELEMENT_NODE) continue; if (xmlHasProp(node, BAD_CAST "href")) { char* href = (char*)xmlGetProp(node, BAD_CAST "href"); if (oscap_htable_get(exported, href) != NULL) { // This path has been already exported. Do not export duplicate. xmlFree(href); continue; } oscap_htable_add(exported, href, ""); if (oscap_acquire_url_is_supported(href)) { /* If the referenced component is remote one, do not include * it within the DataStream. Such component shall only be * downloaded once the scan is run. */ xmlFree(href); continue; } char* real_path = (strcmp(dir, "") == 0 || strcmp(dir, ".") == 0) ? oscap_strdup(href) : oscap_sprintf("%s/%s", dir, href); char* mangled_path = ds_sds_mangle_filepath(real_path); char* cref_id = oscap_sprintf("scap_org.open-scap_cref_%s", mangled_path); int counter = 0; while (ds_sds_find_component_ref(datastream, cref_id) != NULL) { // While the given component ID already exists in the document. oscap_free(cref_id); cref_id = oscap_sprintf("scap_org.open-scap_cref_%s%03d", mangled_path, counter++); } oscap_free(mangled_path); char* uri = oscap_sprintf("#%s", cref_id); // we don't want duplicated uri elements in the catalog if (ds_sds_compose_catalog_has_uri(doc, catalog, uri) == 0) { oscap_free(uri); oscap_free(cref_id); oscap_free(real_path); xmlFree(href); continue; } int ret = ds_sds_compose_add_component_with_ref(doc, datastream, real_path, cref_id); if (ret == 0) { xmlNodePtr catalog_uri = xmlNewNode(cat_ns, BAD_CAST "uri"); xmlSetProp(catalog_uri, BAD_CAST "name", BAD_CAST href); xmlSetProp(catalog_uri, BAD_CAST "uri", BAD_CAST uri); xmlAddChild(catalog, catalog_uri); } oscap_free(cref_id); oscap_free(uri); oscap_free(real_path); xmlFree(href); if (ret < 0) { // oscap_seterr has already been called oscap_htable_free0(exported); return -1; } } } oscap_htable_free0(exported); oscap_free(filepath_cpy); } xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); return 0; }
struct xccdf_refine_rule_internal* xccdf_policy_get_refine_rule_by_item(struct xccdf_policy* policy, struct xccdf_item* rule) { const char* item_id = xccdf_item_get_id(rule); return oscap_htable_get(policy->refine_rules_internal, item_id); }