Annotation of embedaddon/strongswan/src/libimcv/swid_gen/swid_gen_info.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2017 Andreas Steffen
                      3:  * HSR Hochschule fuer Technik Rapperswil
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify it
                      6:  * under the terms of the GNU General Public License as published by the
                      7:  * Free Software Foundation; either version 2 of the License, or (at your
                      8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     13:  * for more details.
                     14:  */
                     15: 
                     16: #define _GNU_SOURCE
                     17: #include <stdio.h>
                     18: 
                     19: #include "swid_gen_info.h"
                     20: 
                     21: #include <library.h>
                     22: #include <utils/lexparser.h>
                     23: 
                     24: typedef struct private_swid_gen_info_t private_swid_gen_info_t;
                     25: 
                     26: /**
                     27:  * Private data of an swid_gen_info_t object.
                     28:  */
                     29: struct private_swid_gen_info_t {
                     30: 
                     31:        /**
                     32:         * Public members of swid_gen_info_state_t
                     33:         */
                     34:        swid_gen_info_t public;
                     35: 
                     36:        /**
                     37:         * tagCreator
                     38:         */
                     39:        char *tag_creator;
                     40: 
                     41:        /**
                     42:         * OS string 'Name_Version-Arch'
                     43:         */
                     44:        char *os;
                     45: 
                     46:        /**
                     47:         * Product string 'Name Version Arch'
                     48:         */
                     49:        char *product;
                     50: 
                     51:        /**
                     52:         * OS info about endpoint
                     53:         */
                     54:        imc_os_info_t *os_info;
                     55: 
                     56: };
                     57: 
                     58: /**
                     59:  * Replaces invalid character by a valid one
                     60:  */
                     61: static void sanitize_uri(char *uri, char a, char b)
                     62: {
                     63:        char *pos = uri;
                     64: 
                     65:        while (TRUE)
                     66:        {
                     67:                pos = strchr(pos, a);
                     68:                if (!pos)
                     69:                {
                     70:                        break;
                     71:                }
                     72:                *pos = b;
                     73:                pos++;
                     74:        }
                     75: }
                     76: 
                     77: METHOD(swid_gen_info_t, get_os_type, os_type_t,
                     78:        private_swid_gen_info_t *this)
                     79: {
                     80:        return this->os_info->get_type(this->os_info);
                     81: }
                     82: 
                     83: METHOD(swid_gen_info_t, get_os, char*,
                     84:        private_swid_gen_info_t *this, char **product)
                     85: {
                     86:        if (product)
                     87:        {
                     88:                *product = this->product;
                     89:        }
                     90:        return this->os;
                     91: }
                     92: 
                     93: METHOD(swid_gen_info_t, create_sw_id, char*,
                     94:        private_swid_gen_info_t *this, char *package, char *version)
                     95: {
                     96:        char *sw_id;
                     97: 
                     98:        if (asprintf(&sw_id, "%s__%s-%s%s%s", this->tag_creator, this->os,
                     99:                                 package, strlen(version) ? "-" : "", version) == -1)
                    100:        {
                    101:                return NULL;
                    102:        }
                    103:        sanitize_uri(sw_id, ':', '~');
                    104:        sanitize_uri(sw_id, '+', '~');
                    105: 
                    106:        return sw_id;
                    107: }
                    108: 
                    109: METHOD(swid_gen_info_t, destroy, void,
                    110:        private_swid_gen_info_t *this)
                    111: {
                    112:        this->os_info->destroy(this->os_info);
                    113:        free(this->os);
                    114:        free(this->product);
                    115:        free(this->tag_creator);
                    116:        free(this);
                    117: }
                    118: 
                    119: /**
                    120:  * Described in header.
                    121:  */
                    122: swid_gen_info_t *swid_gen_info_create(void)
                    123: {
                    124:        private_swid_gen_info_t *this;
                    125:        chunk_t os_name, os_version, os_arch;
                    126:        char *tag_creator;
                    127: 
                    128:        tag_creator = lib->settings->get_str(lib->settings,
                    129:                                        "libimcv.swid_gen.tag_creator.regid", "strongswan.org");
                    130: 
                    131:        INIT(this,
                    132:                .public = {
                    133:                        .get_os_type = _get_os_type,
                    134:                        .get_os = _get_os,
                    135:                        .create_sw_id = _create_sw_id,
                    136:                        .destroy = _destroy,
                    137:                },
                    138:                .os_info = imc_os_info_create(),
                    139:                .tag_creator = strdup(tag_creator),
                    140:        );
                    141: 
                    142:        os_name = this->os_info->get_name(this->os_info);
                    143:        os_arch = this->os_info->get_version(this->os_info);
                    144: 
                    145:        /* get_version() returns version followed by arch */
                    146:        if (!extract_token(&os_version, ' ', &os_arch))
                    147:        {
                    148:                DBG1(DBG_IMC, "separation of OS version from arch failed");
                    149:                destroy(this);
                    150:                return NULL;
                    151:        }
                    152: 
                    153:        /* construct OS string */
                    154:        if (asprintf(&this->os, "%.*s_%.*s-%.*s", (int)os_name.len, os_name.ptr,
                    155:                                 (int)os_version.len, os_version.ptr, (int)os_arch.len,
                    156:                                 os_arch.ptr) == -1)
                    157:        {
                    158:                DBG1(DBG_IMC, "construction of OS string failed");
                    159:                destroy(this);
                    160:                return NULL;
                    161:        }
                    162: 
                    163:        /* construct product string */
                    164:        if (asprintf(&this->product, "%.*s %.*s %.*s", (int)os_name.len,
                    165:                                 os_name.ptr, (int)os_version.len, os_version.ptr,
                    166:                                 (int)os_arch.len, os_arch.ptr) == -1)
                    167:        {
                    168:                DBG1(DBG_IMC, "construction of product string failed");
                    169:                destroy(this);
                    170:                return NULL;
                    171:        }
                    172: 
                    173:        return &this->public;
                    174: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>