|
Packit |
517ee8 |
/*
|
|
Packit |
517ee8 |
* Copyright 2010--2014 Red Hat Inc., Durham, North Carolina.
|
|
Packit |
517ee8 |
* All Rights Reserved.
|
|
Packit |
517ee8 |
*
|
|
Packit |
517ee8 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
517ee8 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
517ee8 |
* License as published by the Free Software Foundation; either
|
|
Packit |
517ee8 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
517ee8 |
*
|
|
Packit |
517ee8 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
517ee8 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
517ee8 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
517ee8 |
* Lesser General Public License for more details.
|
|
Packit |
517ee8 |
*
|
|
Packit |
517ee8 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
517ee8 |
* License along with this library; if not, write to the Free Software
|
|
Packit |
517ee8 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
517ee8 |
*
|
|
Packit |
517ee8 |
* Authors:
|
|
Packit |
517ee8 |
* Peter Vrabec <pvrabec@redhat.com>
|
|
Packit |
517ee8 |
*/
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
517ee8 |
#include <config.h>
|
|
Packit |
517ee8 |
#endif
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
/* Standard header files */
|
|
Packit |
517ee8 |
#include <stdio.h>
|
|
Packit |
517ee8 |
#include <stdlib.h>
|
|
Packit |
517ee8 |
#include <string.h>
|
|
Packit |
517ee8 |
#ifdef HAVE_GETOPT_H
|
|
Packit |
517ee8 |
#include <getopt.h>
|
|
Packit |
517ee8 |
#endif
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
/* CPE */
|
|
Packit |
517ee8 |
#include <cpe_name.h>
|
|
Packit |
517ee8 |
#include <cpe_dict.h>
|
|
Packit |
517ee8 |
#include <cpe_lang.h>
|
|
Packit |
517ee8 |
#include <oscap_source.h>
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
#include "oscap-tool.h"
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
#define CPE_SUBMODULES_NUM 4 /* See actual CPE_SUBMODULES array
|
|
Packit |
517ee8 |
initialization below. */
|
|
Packit |
517ee8 |
static struct oscap_module* CPE_SUBMODULES[CPE_SUBMODULES_NUM];
|
|
Packit |
517ee8 |
bool getopt_cpe(int argc, char **argv, struct oscap_action *action);
|
|
Packit |
517ee8 |
int app_cpe_check(const struct oscap_action *action);
|
|
Packit |
517ee8 |
int app_cpe_match(const struct oscap_action *action);
|
|
Packit |
517ee8 |
int app_cpe_validate(const struct oscap_action *action);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oscap_module OSCAP_CPE_MODULE = {
|
|
Packit |
517ee8 |
.name = "cpe",
|
|
Packit |
517ee8 |
.parent = &OSCAP_ROOT_MODULE,
|
|
Packit |
517ee8 |
.summary = "Common Platform Enumeration",
|
|
Packit |
517ee8 |
.submodules = CPE_SUBMODULES
|
|
Packit |
517ee8 |
};
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
static struct oscap_module CPE_MATCH_MODULE = {
|
|
Packit |
517ee8 |
.name = "match",
|
|
Packit |
517ee8 |
.parent = &OSCAP_CPE_MODULE,
|
|
Packit |
517ee8 |
.summary = "Match CPE name against provided dictionary",
|
|
Packit |
517ee8 |
.usage = "name dictionary.xml",
|
|
Packit |
517ee8 |
.help = NULL,
|
|
Packit |
517ee8 |
.opt_parser = getopt_cpe,
|
|
Packit |
517ee8 |
.func = app_cpe_match
|
|
Packit |
517ee8 |
};
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
static struct oscap_module CPE_CHECK_MODULE = {
|
|
Packit |
517ee8 |
.name = "check",
|
|
Packit |
517ee8 |
.parent = &OSCAP_CPE_MODULE,
|
|
Packit |
517ee8 |
.summary = "Check if CPE name is valid",
|
|
Packit |
517ee8 |
.usage = "name",
|
|
Packit |
517ee8 |
.help = NULL,
|
|
Packit |
517ee8 |
.opt_parser = getopt_cpe,
|
|
Packit |
517ee8 |
.func = app_cpe_check
|
|
Packit |
517ee8 |
};
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
static struct oscap_module CPE_VALIDATE = {
|
|
Packit |
517ee8 |
.name = "validate",
|
|
Packit |
517ee8 |
.parent = &OSCAP_CPE_MODULE,
|
|
Packit |
517ee8 |
.summary = "Validate CPE Dictionary content",
|
|
Packit |
517ee8 |
.usage = "cpe-dict.xml",
|
|
Packit |
517ee8 |
.help = NULL,
|
|
Packit |
517ee8 |
.opt_parser = getopt_cpe,
|
|
Packit |
517ee8 |
.func = app_cpe_validate
|
|
Packit |
517ee8 |
};
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
static struct oscap_module* CPE_SUBMODULES[CPE_SUBMODULES_NUM] = {
|
|
Packit |
517ee8 |
&CPE_MATCH_MODULE,
|
|
Packit |
517ee8 |
&CPE_CHECK_MODULE,
|
|
Packit |
517ee8 |
&CPE_VALIDATE,
|
|
Packit |
517ee8 |
NULL
|
|
Packit |
517ee8 |
};
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
bool getopt_cpe(int argc, char **argv, struct oscap_action *action) {
|
|
Packit |
517ee8 |
|
|
Packit Service |
deda86 |
if (action->module == &CPE_MATCH_MODULE) {
|
|
Packit |
517ee8 |
if( argc != 5 ) {
|
|
Packit |
517ee8 |
oscap_module_usage(action->module, stderr, "Wrong number of parameters.\n");
|
|
Packit |
517ee8 |
return false;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
action->cpe_action = malloc(sizeof(struct cpe_action));
|
|
Packit |
517ee8 |
action->cpe_action->name=argv[3];
|
|
Packit |
517ee8 |
action->cpe_action->dict=argv[4];
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit Service |
deda86 |
if (action->module == &CPE_CHECK_MODULE) {
|
|
Packit |
517ee8 |
if( argc != 4 ) {
|
|
Packit |
517ee8 |
oscap_module_usage(action->module, stderr, "Wrong number of parameters.\n");
|
|
Packit |
517ee8 |
return false;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
action->cpe_action = malloc(sizeof(struct cpe_action));
|
|
Packit |
517ee8 |
action->cpe_action->name=argv[3];
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
if (action->module == &CPE_VALIDATE) {
|
|
Packit |
517ee8 |
if( argc != 4 ) {
|
|
Packit |
517ee8 |
oscap_module_usage(action->module, stderr, "Wrong number of parameters.\n");
|
|
Packit |
517ee8 |
return false;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
action->cpe_action = malloc(sizeof(struct cpe_action));
|
|
Packit |
517ee8 |
action->cpe_action->dict=argv[3];
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
return true;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
int app_cpe_check(const struct oscap_action *action) {
|
|
Packit |
517ee8 |
int ret;
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
if (!cpe_name_check(action->cpe_action->name)) {
|
|
Packit |
517ee8 |
fprintf(stdout,"'%s' is NOT Valid CPE name.\n", action->cpe_action->name);
|
|
Packit |
517ee8 |
ret = OSCAP_FAIL;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
else {
|
|
Packit |
517ee8 |
fprintf(stdout,"'%s' is Valid CPE name.\n", action->cpe_action->name);
|
|
Packit |
517ee8 |
ret = OSCAP_OK;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
free(action->cpe_action);
|
|
Packit |
517ee8 |
return ret;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
int app_cpe_match(const struct oscap_action *action) {
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
int ret;
|
|
Packit |
517ee8 |
struct cpe_name *candidate_cpe = NULL;
|
|
Packit |
517ee8 |
struct cpe_dict_model *dict = NULL;
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oscap_source *source = NULL;
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
/* is CPE well formated? */
|
|
Packit |
517ee8 |
if( ! cpe_name_check(action->cpe_action->name) ) {
|
|
Packit |
517ee8 |
fprintf(stdout, "%s is not in valid CPE format.\n", action->cpe_action->name);
|
|
Packit |
517ee8 |
ret = OSCAP_ERROR;
|
|
Packit |
517ee8 |
goto clean;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
candidate_cpe = cpe_name_new(action->cpe_action->name);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
/* load dictionary */
|
|
Packit |
517ee8 |
source = oscap_source_new_from_file(action->cpe_action->dict);
|
|
Packit |
517ee8 |
if( (dict = cpe_dict_model_import_source(source)) == NULL ) {
|
|
Packit |
517ee8 |
fprintf(stdout, "can't load CPE dictionary from: %s.\n", action->cpe_action->dict);
|
|
Packit |
517ee8 |
ret = OSCAP_ERROR;
|
|
Packit |
517ee8 |
goto clean;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
/* matching */
|
|
Packit |
517ee8 |
if( cpe_name_match_dict(candidate_cpe, dict) ) {
|
|
Packit |
517ee8 |
fprintf(stdout, "The exact CPE match is found.\n");
|
|
Packit |
517ee8 |
ret = OSCAP_OK;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
else {
|
|
Packit |
517ee8 |
fprintf(stdout, "No match found.\n");
|
|
Packit |
517ee8 |
ret = OSCAP_FAIL;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
/* clean up */
|
|
Packit |
517ee8 |
clean:
|
|
Packit |
517ee8 |
cpe_name_free(candidate_cpe);
|
|
Packit |
517ee8 |
cpe_dict_model_free(dict);
|
|
Packit |
517ee8 |
free(action->cpe_action);
|
|
Packit |
517ee8 |
oscap_source_free(source);
|
|
Packit |
517ee8 |
return ret;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
int app_cpe_validate(const struct oscap_action *action) {
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
int ret;
|
|
Packit |
517ee8 |
int result;
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oscap_source *source = oscap_source_new_from_file(action->cpe_action->dict);
|
|
Packit |
517ee8 |
ret = oscap_source_validate(source, reporter, (void *) action);
|
|
Packit |
517ee8 |
oscap_source_free(source);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
if (ret==-1) {
|
|
Packit |
517ee8 |
result=OSCAP_ERROR;
|
|
Packit |
517ee8 |
goto cleanup;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
else if (ret==1) {
|
|
Packit |
517ee8 |
result=OSCAP_FAIL;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
else {
|
|
Packit |
517ee8 |
result=OSCAP_OK;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
cleanup:
|
|
Packit |
517ee8 |
if (oscap_err())
|
|
Packit |
517ee8 |
fprintf(stderr, "%s %s\n", OSCAP_ERR_MSG, oscap_err_desc());
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
free(action->cpe_action);
|
|
Packit |
517ee8 |
return result;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|