Blame utils/oscap-cpe.c

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