static int app_oval_validate(const struct oscap_action *action) { int ret; int result = OSCAP_ERROR; struct oscap_source *source = oscap_source_new_from_file(action->f_oval); ret = oscap_source_validate(source, reporter, (void *) action); if (ret == -1) { result = OSCAP_ERROR; goto cleanup; } else { result = ret == 1 ? OSCAP_FAIL : OSCAP_OK; } /* schematron-based validation requested We can only do schematron validation if the file isn't a source datastream */ if (action->schematron && oscap_source_get_scap_type(source) != OSCAP_DOCUMENT_SDS) { ret = oscap_source_validate_schematron(source, NULL); if (ret==-1) { result=OSCAP_ERROR; } else if (ret>0) { result=OSCAP_FAIL; } } cleanup: oscap_source_free(source); if (oscap_err()) fprintf(stderr, "%s %s\n", OSCAP_ERR_MSG, oscap_err_desc()); return result; }
void oscap_print_error(void) { if (oscap_err()) { char *err = oscap_err_get_full_error(); fprintf(stderr, "%s %s\n", OSCAP_ERR_MSG, err); free(err); } }
static SEXP_t *oval_probe_cmd_obj_eval(SEXP_t *sexp, void *arg) { char *id_str; struct oval_definition_model *defs; struct oval_object *obj; struct oval_syschar *res; oval_pext_t *pext = (oval_pext_t *) arg; SEXP_t *ret, *ret_code; int r; if (sexp == NULL || arg == NULL) { return NULL; } if (!SEXP_stringp(sexp)) { dE("Invalid argument: type=%s.", SEXP_strtype(sexp)); return (NULL); } id_str = SEXP_string_cstr(sexp); defs = oval_syschar_model_get_definition_model(*(pext->model)); obj = oval_definition_model_get_object(defs, id_str); ret = SEXP_list_new (sexp, NULL); dI("Get_object: %s.", id_str); if (obj == NULL) { dE("Can't find obj: id=%s.", id_str); free(id_str); SEXP_free(ret); return (NULL); } oscap_clearerr(); r = oval_probe_query_object(pext->sess_ptr, obj, OVAL_PDFLAG_NOREPLY|OVAL_PDFLAG_SLAVE, &res); if (r < 0) ret_code = SEXP_number_newu((unsigned int) SYSCHAR_FLAG_COMPLETE); else ret_code = SEXP_number_newu((unsigned int) oval_syschar_get_flag(res)); SEXP_list_add(ret, ret_code); SEXP_free(ret_code); if (oscap_err()) { dE("Failed: id: %s, err: %d, %s.", id_str, oscap_err_family(), oscap_err_desc()); oscap_clearerr(); free(id_str); SEXP_free(ret); return (NULL); } free(id_str); return (ret); }
static int _test_error(void) { if (oscap_err ()) { oscap_errfamily_t f; const char *d; fprintf (stderr, "GOT error: %d, %s.\n", f = oscap_err_family (), d = oscap_err_desc ()); } return 0; }
static int app_cvrf_export(const struct oscap_action *action) { struct oscap_source *import_source = oscap_source_new_from_file(action->cvrf_action->f_cvrf); if (import_source == NULL) return OSCAP_ERROR; int result = OSCAP_OK; if (action->cvrf_action->index == 1) { struct cvrf_index *index = cvrf_index_import(import_source); if (index == NULL) { result = OSCAP_ERROR; goto cleanup; } struct oscap_source *export_source = cvrf_index_get_export_source(index); if (oscap_source_save_as(export_source, action->cvrf_action->f_output) != 0) result = OSCAP_ERROR; oscap_source_free(export_source); cvrf_index_free(index); } else { struct cvrf_model *model = cvrf_model_import(import_source); if(model == NULL) { result = OSCAP_ERROR; goto cleanup; } struct oscap_source *export_source = cvrf_model_get_export_source(model); if (oscap_source_save_as(export_source, action->cvrf_action->f_output) != 0) result = OSCAP_ERROR; oscap_source_free(export_source); cvrf_model_free(model); } cleanup: if (oscap_err()) fprintf(stderr, "%s %s\n", OSCAP_ERR_MSG, oscap_err_desc()); /* TODO: Refactor, cvrf_index_parse_xml (called by oscap_source_new_from_file) frees its argument as an unexpected side-effect. * oscap_source_free(import_source); */ free(action->cvrf_action); return result; }
static int app_cvrf_evaluate(const struct oscap_action *action) { int result = OSCAP_OK; // Temporary hardcoded CPE until CPE name can be found without input by CVRF functions // themselves const char *os_name = "Red Hat Enterprise Linux Desktop Supplementary (v. 6)"; struct oscap_source *import_source = oscap_source_new_from_file(action->cvrf_action->f_cvrf); struct oscap_source *export_source = cvrf_model_get_results_source(import_source, os_name); if (export_source == NULL) return -1; if (oscap_source_save_as(export_source, action->cvrf_action->f_results) == -1) { result = OSCAP_ERROR; goto cleanup; } cleanup: if (oscap_err()) fprintf(stderr, "%s %s\n", OSCAP_ERR_MSG, oscap_err_desc()); oscap_source_free(export_source); free(action->cvrf_action); return result; }
static int app_analyse_oval(const struct oscap_action *action) { struct oval_definition_model *def_model = NULL; struct oval_syschar_model *sys_model = NULL; struct oval_results_model *res_model = NULL; struct oval_variable_model *var_model = NULL; struct oval_directives_model *dir_model = NULL; struct oval_syschar_model *sys_models[2]; struct oval_generator *generator = NULL; int ret = OSCAP_ERROR; /* Turn on verbosity */ if (!oscap_set_verbose(action->verbosity_level, action->f_verbose_log, false)) { goto cleanup; } /* validate inputs */ if (action->validate) { if (!valid_inputs(action)) { goto cleanup; } } /* load defnitions */ struct oscap_source *source = oscap_source_new_from_file(action->f_oval); def_model = oval_definition_model_import_source(source); oscap_source_free(source); if (def_model == NULL) { fprintf(stderr, "Failed to import the OVAL Definitions from '%s'.\n", action->f_oval); goto cleanup; } /* bind external variables */ if(action->f_variables) { struct oscap_source *var_source = oscap_source_new_from_file(action->f_variables); var_model = oval_variable_model_import_source(var_source); oscap_source_free(var_source); if (var_model == NULL) { fprintf(stderr, "Failed to import the OVAL Variables from '%s'.\n", action->f_variables); goto cleanup; } if (oval_definition_model_bind_variable_model(def_model, var_model)) { fprintf(stderr, "Failed to bind Variables to Definitions\n"); goto cleanup; } } /* load system characteristics */ sys_model = oval_syschar_model_new(def_model); source = oscap_source_new_from_file(action->f_syschar); if (oval_syschar_model_import_source(sys_model, source) == -1 ) { fprintf(stderr, "Failed to import the System Characteristics from '%s'.\n", action->f_syschar); oscap_source_free(source); goto cleanup; } oscap_source_free(source); /* evaluate */ sys_models[0] = sys_model; sys_models[1] = NULL; res_model = oval_results_model_new(def_model, sys_models); /* set product name */ generator = oval_results_model_get_generator(res_model); oval_generator_set_product_name(generator, OSCAP_PRODUCTNAME); oval_generator_set_product_version(generator, oscap_get_version()); oval_results_model_eval(res_model); /* export results */ if (action->f_results != NULL) { /* import directives */ if (action->f_directives != NULL) { dir_model = oval_directives_model_new(); struct oscap_source *dir_source = oscap_source_new_from_file(action->f_directives); oval_directives_model_import_source(dir_model, dir_source); oscap_source_free(dir_source); } /* export result model to XML */ oval_results_model_export(res_model, dir_model, action->f_results); const char* full_validation = getenv("OSCAP_FULL_VALIDATION"); /* validate OVAL Results */ if (action->validate && full_validation) { struct oscap_source *result_source = oscap_source_new_from_file(action->f_results); if (oscap_source_validate(result_source, reporter, (void *) action)) { oscap_source_free(result_source); goto cleanup; } fprintf(stdout, "OVAL Results are exported correctly.\n"); oscap_source_free(result_source); } } ret = OSCAP_OK; /* clean up */ cleanup: if(oscap_err()) fprintf(stderr, "%s %s\n", OSCAP_ERR_MSG, oscap_err_desc()); if(res_model) oval_results_model_free(res_model); if(sys_model) oval_syschar_model_free(sys_model); if(def_model) oval_definition_model_free(def_model); if(dir_model) oval_directives_model_free(dir_model); return ret; }
int app_collect_oval(const struct oscap_action *action) { struct oval_definition_model *def_model = NULL; struct oval_variable_model *var_model = NULL; struct oval_syschar_model *sys_model = NULL; struct oval_sysinfo *sysinfo = NULL; struct oval_probe_session *pb_sess = NULL; struct oval_generator *generator = NULL; int ret = OSCAP_ERROR; /* Turn on verbosity */ if (!oscap_set_verbose(action->verbosity_level, action->f_verbose_log, false)) { goto cleanup; } /* validate inputs */ if (action->validate) { if (!valid_inputs(action)) { goto cleanup; } } /* import definitions */ struct oscap_source *source = oscap_source_new_from_file(action->f_oval); def_model = oval_definition_model_import_source(source); oscap_source_free(source); if (def_model == NULL) { fprintf(stderr, "Failed to import the OVAL Definitions from '%s'.\n", action->f_oval); goto cleanup; } /* bind external variables */ if(action->f_variables) { struct oscap_source *var_source = oscap_source_new_from_file(action->f_variables); var_model = oval_variable_model_import_source(var_source); oscap_source_free(var_source); if (var_model == NULL) { fprintf(stderr, "Failed to import the OVAL Variables from '%s'.\n", action->f_variables); goto cleanup; } if (oval_definition_model_bind_variable_model(def_model, var_model)) { fprintf(stderr, "Failed to bind Variables to Definitions\n"); goto cleanup; } } /* create empty syschar model */ sys_model = oval_syschar_model_new(def_model); /* set product name */ generator = oval_syschar_model_get_generator(sys_model); oval_generator_set_product_name(generator, OSCAP_PRODUCTNAME); /* create probe session */ pb_sess = oval_probe_session_new(sys_model); /* query sysinfo */ ret = oval_probe_query_sysinfo(pb_sess, &sysinfo); if (ret != 0) { fprintf(stderr, "Failed to query sysinfo\n"); goto cleanup; } oval_syschar_model_set_sysinfo(sys_model, sysinfo); /* query objects */ struct oval_object *object; struct oval_syschar *syschar; oval_syschar_collection_flag_t sc_flg; if (action->id) { object = oval_definition_model_get_object(def_model, action->id); if (!object) { fprintf(stderr, "Object ID(%s) does not exist in '%s'.\n", action->id, action->f_oval); goto cleanup; } printf("Collected: \"%s\" : ", oval_object_get_id(object)); oval_probe_query_object(pb_sess, object, 0, &syschar); sc_flg = oval_syschar_get_flag(syschar); printf("%s\n", oval_syschar_collection_flag_get_text(sc_flg)); } else { struct oval_object_iterator *objects = oval_definition_model_get_objects(def_model); while (oval_object_iterator_has_more(objects)) { object = oval_object_iterator_next(objects); printf("Collected: \"%s\" : ", oval_object_get_id(object)); oval_probe_query_object(pb_sess, object, 0, &syschar); sc_flg = oval_syschar_get_flag(syschar); printf("%s\n", oval_syschar_collection_flag_get_text(sc_flg)); } oval_object_iterator_free(objects); } const char* full_validation = getenv("OSCAP_FULL_VALIDATION"); /* output */ if (action->f_syschar != NULL) { /* export OVAL System Characteristics */ oval_syschar_model_export(sys_model, action->f_syschar); /* validate OVAL System Characteristics */ if (action->validate && full_validation) { struct oscap_source *syschar_source = oscap_source_new_from_file(action->f_syschar); if (oscap_source_validate(syschar_source, reporter, (void *)action)) { oscap_source_free(syschar_source); goto cleanup; } fprintf(stdout, "OVAL System Characteristics are exported correctly.\n"); oscap_source_free(syschar_source); } } ret = OSCAP_OK; cleanup: if(oscap_err()) fprintf(stderr, "%s %s\n", OSCAP_ERR_MSG, oscap_err_desc()); if (sysinfo) oval_sysinfo_free(sysinfo); if (pb_sess) oval_probe_session_destroy(pb_sess); if (sys_model) oval_syschar_model_free(sys_model); if (def_model) oval_definition_model_free(def_model); return ret; }