|
Packit Service |
569379 |
/**
|
|
Packit Service |
569379 |
* @file oval_resultItem.c
|
|
Packit Service |
569379 |
* \brief Open Vulnerability and Assessment Language
|
|
Packit Service |
569379 |
*
|
|
Packit Service |
569379 |
* See more details at http://oval.mitre.org/
|
|
Packit Service |
569379 |
*/
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
/*
|
|
Packit Service |
569379 |
* Copyright 2009--2013 Red Hat Inc., Durham, North Carolina.
|
|
Packit Service |
569379 |
* All Rights Reserved.
|
|
Packit Service |
569379 |
*
|
|
Packit Service |
569379 |
* This library is free software; you can redistribute it and/or
|
|
Packit Service |
569379 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit Service |
569379 |
* License as published by the Free Software Foundation; either
|
|
Packit Service |
569379 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit Service |
569379 |
*
|
|
Packit Service |
569379 |
* This library is distributed in the hope that it will be useful,
|
|
Packit Service |
569379 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
569379 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
569379 |
* Lesser General Public License for more details.
|
|
Packit Service |
569379 |
*
|
|
Packit Service |
569379 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit Service |
569379 |
* License along with this library; if not, write to the Free Software
|
|
Packit Service |
569379 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit Service |
569379 |
*
|
|
Packit Service |
569379 |
* Authors:
|
|
Packit Service |
569379 |
* "David Niemoller" <David.Niemoller@g2-inc.com>
|
|
Packit Service |
569379 |
*/
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
569379 |
#include <config.h>
|
|
Packit Service |
569379 |
#endif
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
#include <stdlib.h>
|
|
Packit Service |
569379 |
#include <stdio.h>
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
#include "oval_agent_api_impl.h"
|
|
Packit Service |
569379 |
#include "results/oval_results_impl.h"
|
|
Packit Service |
569379 |
#include "adt/oval_collection_impl.h"
|
|
Packit Service |
569379 |
#include "oval_system_characteristics_impl.h"
|
|
Packit Service |
569379 |
#include "common/util.h"
|
|
Packit Service |
569379 |
#include "common/debug_priv.h"
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
typedef struct oval_result_item {
|
|
Packit Service |
569379 |
struct oval_result_system *sys;
|
|
Packit Service |
569379 |
oval_result_t result;
|
|
Packit Service |
569379 |
struct oval_collection *messages;
|
|
Packit Service |
569379 |
struct oval_sysitem *sysitem;
|
|
Packit Service |
569379 |
} oval_result_item_t;
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
struct oval_result_item *oval_result_item_new(struct oval_result_system *sys, char *item_id) {
|
|
Packit Service |
569379 |
oval_result_item_t *item = (oval_result_item_t *)
|
|
Packit Service |
569379 |
malloc(sizeof(oval_result_item_t));
|
|
Packit Service |
569379 |
if (item == NULL)
|
|
Packit Service |
569379 |
return NULL;
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
struct oval_syschar_model *syschar_model = oval_result_system_get_syschar_model(sys);
|
|
Packit Service |
569379 |
struct oval_sysitem *sysitem = oval_syschar_model_get_new_sysitem(syschar_model, item_id);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
item->sysitem = sysitem;
|
|
Packit Service |
569379 |
item->messages = oval_collection_new();
|
|
Packit Service |
569379 |
item->result = OVAL_RESULT_NOT_EVALUATED;
|
|
Packit Service |
569379 |
item->sys = sys;
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
return item;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
struct oval_result_item *oval_result_item_clone
|
|
Packit Service |
569379 |
(struct oval_result_system *new_system, struct oval_result_item *old_item) {
|
|
Packit Service |
569379 |
struct oval_sysitem *old_sysitem = oval_result_item_get_sysitem(old_item);
|
|
Packit Service |
569379 |
char *datid = oval_sysitem_get_id(old_sysitem);
|
|
Packit Service |
569379 |
struct oval_result_item *new_item = oval_result_item_new(new_system, datid);
|
|
Packit Service |
569379 |
struct oval_message_iterator *old_messages = oval_result_item_get_messages(old_item);
|
|
Packit Service |
569379 |
while (oval_message_iterator_has_more(old_messages)) {
|
|
Packit Service |
569379 |
struct oval_message *old_message = oval_message_iterator_next(old_messages);
|
|
Packit Service |
569379 |
struct oval_message *new_message = oval_message_clone(old_message);
|
|
Packit Service |
569379 |
oval_result_item_add_message(new_item, new_message);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
oval_message_iterator_free(old_messages);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
oval_result_item_set_result(old_item, oval_result_item_get_result(old_item));
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
return new_item;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
void oval_result_item_free(struct oval_result_item *item)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
if (item == NULL)
|
|
Packit Service |
569379 |
return;
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
oval_collection_free_items(item->messages, (oscap_destruct_func) oval_message_free);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
item->messages = NULL;
|
|
Packit Service |
569379 |
item->result = OVAL_RESULT_NOT_EVALUATED;
|
|
Packit Service |
569379 |
item->sysitem = NULL;
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
free(item);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
bool oval_result_item_iterator_has_more(struct oval_result_item_iterator * oc_result_item)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
return oval_collection_iterator_has_more((struct oval_iterator *)
|
|
Packit Service |
569379 |
oc_result_item);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
struct oval_result_item *oval_result_item_iterator_next(struct
|
|
Packit Service |
569379 |
oval_result_item_iterator
|
|
Packit Service |
569379 |
*oc_result_item)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
return (struct oval_result_item *)
|
|
Packit Service |
569379 |
oval_collection_iterator_next((struct oval_iterator *)
|
|
Packit Service |
569379 |
oc_result_item);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
void oval_result_item_iterator_free(struct
|
|
Packit Service |
569379 |
oval_result_item_iterator
|
|
Packit Service |
569379 |
*oc_result_item)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
oval_collection_iterator_free((struct oval_iterator *)
|
|
Packit Service |
569379 |
oc_result_item);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
struct oval_sysitem *oval_result_item_get_sysitem(struct oval_result_item *item)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
__attribute__nonnull__(item);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
return item->sysitem;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
oval_result_t oval_result_item_get_result(struct oval_result_item * item)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
__attribute__nonnull__(item);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
return ((struct oval_result_item *)item)->result;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
struct oval_message_iterator *oval_result_item_get_messages(struct oval_result_item *item) {
|
|
Packit Service |
569379 |
__attribute__nonnull__(item);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
return (struct oval_message_iterator *)
|
|
Packit Service |
569379 |
oval_collection_iterator(item->messages);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
void oval_result_item_set_result(struct oval_result_item *item, oval_result_t result)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
__attribute__nonnull__(item);
|
|
Packit Service |
569379 |
item->result = result;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
void oval_result_item_add_message(struct oval_result_item *item, struct oval_message *message)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
__attribute__nonnull__(item);
|
|
Packit Service |
569379 |
oval_collection_add(item->messages, message);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
static void _oval_result_item_message_consumer(struct oval_message *message, struct oval_result_item *item) {
|
|
Packit Service |
569379 |
oval_result_item_add_message(item, message);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
static int _oval_result_item_message_parse
|
|
Packit Service |
569379 |
(xmlTextReaderPtr reader, struct oval_parser_context *context, struct oval_result_item *item) {
|
|
Packit Service |
569379 |
return oval_message_parse_tag(reader, context, (oscap_consumer_func) _oval_result_item_message_consumer, item);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
int oval_result_item_parse_tag
|
|
Packit Service |
569379 |
(xmlTextReaderPtr reader, struct oval_parser_context *context,
|
|
Packit Service |
569379 |
struct oval_result_system *sys, oscap_consumer_func consumer, void *user) {
|
|
Packit Service |
569379 |
int return_code = 0;
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
xmlChar *item_id = xmlTextReaderGetAttribute(reader, BAD_CAST "item_id");
|
|
Packit Service |
569379 |
struct oval_result_item *item = oval_result_item_new(sys, (char *)item_id);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
oval_result_t result = oval_result_parse(reader, "result", 0);
|
|
Packit Service |
569379 |
oval_result_item_set_result(item, result);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
return_code = oval_parser_parse_tag
|
|
Packit Service |
569379 |
(reader, context, (oval_xml_tag_parser) _oval_result_item_message_parse, item);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
(*consumer) (item, user);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
free(item_id);
|
|
Packit Service |
569379 |
return return_code;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
xmlNode *oval_result_item_to_dom(struct oval_result_item * rslt_item, xmlDocPtr doc, xmlNode * parent) {
|
|
Packit Service |
569379 |
xmlNs *ns_results = xmlSearchNsByHref(doc, parent, OVAL_RESULTS_NAMESPACE);
|
|
Packit Service |
569379 |
xmlNode *item_node = xmlNewTextChild(parent, ns_results, BAD_CAST "tested_item", NULL);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
struct oval_sysitem *oval_sysitem = oval_result_item_get_sysitem(rslt_item);
|
|
Packit Service |
569379 |
char *item_id = oval_sysitem_get_id(oval_sysitem);
|
|
Packit Service |
569379 |
xmlNewProp(item_node, BAD_CAST "item_id", BAD_CAST item_id);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
oval_result_t result = oval_result_item_get_result(rslt_item);
|
|
Packit Service |
569379 |
xmlNewProp(item_node, BAD_CAST "result", BAD_CAST oval_result_get_text(result));
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
return item_node;
|
|
Packit Service |
569379 |
}
|