diff options
Diffstat (limited to 'src/libimcv/swid_gen/swid_gen_info.c')
-rw-r--r-- | src/libimcv/swid_gen/swid_gen_info.c | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/src/libimcv/swid_gen/swid_gen_info.c b/src/libimcv/swid_gen/swid_gen_info.c new file mode 100644 index 000000000..bdaeedce7 --- /dev/null +++ b/src/libimcv/swid_gen/swid_gen_info.c @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2017 Andreas Steffen + * HSR Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#define _GNU_SOURCE +#include <stdio.h> + +#include "swid_gen_info.h" + +#include <library.h> +#include <utils/lexparser.h> + +typedef struct private_swid_gen_info_t private_swid_gen_info_t; + +/** + * Private data of an swid_gen_info_t object. + */ +struct private_swid_gen_info_t { + + /** + * Public members of swid_gen_info_state_t + */ + swid_gen_info_t public; + + /** + * tagCreator + */ + char *tag_creator; + + /** + * OS string 'Name_Version-Arch' + */ + char *os; + + /** + * Product string 'Name Version Arch' + */ + char *product; + + /** + * OS info about endpoint + */ + imc_os_info_t *os_info; + +}; + +/** + * Replaces invalid character by a valid one + */ +static void sanitize_uri(char *uri, char a, char b) +{ + char *pos = uri; + + while (TRUE) + { + pos = strchr(pos, a); + if (!pos) + { + break; + } + *pos = b; + pos++; + } +} + +METHOD(swid_gen_info_t, get_os_type, os_type_t, + private_swid_gen_info_t *this) +{ + return this->os_info->get_type(this->os_info); +} + +METHOD(swid_gen_info_t, get_os, char*, + private_swid_gen_info_t *this, char **product) +{ + if (product) + { + *product = this->product; + } + return this->os; +} + +METHOD(swid_gen_info_t, create_sw_id, char*, + private_swid_gen_info_t *this, char *package, char *version) +{ + char *sw_id; + + if (asprintf(&sw_id, "%s__%s-%s%s%s", this->tag_creator, this->os, + package, strlen(version) ? "-" : "", version) == -1) + { + return NULL; + } + sanitize_uri(sw_id, ':', '~'); + sanitize_uri(sw_id, '+', '~'); + + return sw_id; +} + +METHOD(swid_gen_info_t, destroy, void, + private_swid_gen_info_t *this) +{ + this->os_info->destroy(this->os_info); + free(this->os); + free(this->product); + free(this->tag_creator); + free(this); +} + +/** + * Described in header. + */ +swid_gen_info_t *swid_gen_info_create(void) +{ + private_swid_gen_info_t *this; + chunk_t os_name, os_version, os_arch; + char *tag_creator; + + tag_creator = lib->settings->get_str(lib->settings, + "libimcv.swid_gen.tag_creator.regid", "strongswan.org"); + + INIT(this, + .public = { + .get_os_type = _get_os_type, + .get_os = _get_os, + .create_sw_id = _create_sw_id, + .destroy = _destroy, + }, + .os_info = imc_os_info_create(), + .tag_creator = strdup(tag_creator), + ); + + os_name = this->os_info->get_name(this->os_info); + os_arch = this->os_info->get_version(this->os_info); + + /* get_version() returns version followed by arch */ + if (!extract_token(&os_version, ' ', &os_arch)) + { + DBG1(DBG_IMC, "separation of OS version from arch failed"); + destroy(this); + return NULL; + } + + /* construct OS string */ + if (asprintf(&this->os, "%.*s_%.*s-%.*s", (int)os_name.len, os_name.ptr, + (int)os_version.len, os_version.ptr, (int)os_arch.len, + os_arch.ptr) == -1) + { + DBG1(DBG_IMC, "constructon of OS string failed"); + destroy(this); + return NULL; + } + + /* construct product string */ + if (asprintf(&this->product, "%.*s %.*s %.*s", (int)os_name.len, + os_name.ptr, (int)os_version.len, os_version.ptr, + (int)os_arch.len, os_arch.ptr) == -1) + { + DBG1(DBG_IMC, "constructon of product string failed"); + destroy(this); + return NULL; + } + + return &this->public; +} |