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>