aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Steffen <andreas.steffen@strongswan.org>2017-06-26 18:07:11 +0200
committerAndreas Steffen <andreas.steffen@strongswan.org>2017-07-08 23:19:51 +0200
commit8ba6bf511e5955460f2179945848ba0b3bffe241 (patch)
tree49a313fcd2b3225a24f4a6c771d5ce42b9fe2f75
parent7e796bba678a61e9206a9080d70ec7367f639a93 (diff)
downloadstrongswan-8ba6bf511e5955460f2179945848ba0b3bffe241.tar.bz2
strongswan-8ba6bf511e5955460f2179945848ba0b3bffe241.tar.xz
libimcv: Moved REST API from imv_swid and imv_swima to libimcv
-rw-r--r--configure.ac5
-rw-r--r--src/libimcv/Makefile.am7
-rw-r--r--src/libimcv/plugins/imv_swid/Makefile.am3
-rw-r--r--src/libimcv/plugins/imv_swid/imv_swid_agent.c8
-rw-r--r--src/libimcv/plugins/imv_swid/imv_swid_rest.c124
-rw-r--r--src/libimcv/plugins/imv_swid/imv_swid_rest.h63
-rw-r--r--src/libimcv/plugins/imv_swima/Makefile.am3
-rw-r--r--src/libimcv/plugins/imv_swima/imv_swima_agent.c6
-rw-r--r--src/libimcv/rest/rest.c (renamed from src/libimcv/plugins/imv_swima/imv_swima_rest.c)99
-rw-r--r--src/libimcv/rest/rest.h (renamed from src/libimcv/plugins/imv_swima/imv_swima_rest.h)37
10 files changed, 114 insertions, 241 deletions
diff --git a/configure.ac b/configure.ac
index e6e0402e9..4c45200c4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1003,7 +1003,7 @@ if test x$tss_tss2 = xtrue; then
AC_SUBST(tss2_LIBS)
fi
-if test x$imv_swid = xtrue -o x$imv_swima = xtrue; then
+if test x$imc_swima = xtrue -o $imv_swima = xtrue -o x$imv_swid = xtrue; then
PKG_CHECK_MODULES(json, [json-c], [],
[PKG_CHECK_MODULES(json, [json])])
AC_SUBST(json_CFLAGS)
@@ -1711,6 +1711,9 @@ fi
if test x$fuzzing = xtrue; then
AC_DEFINE([USE_FUZZING], [], [build code for fuzzing])
fi
+if test x$imc_swima = xtrue -o x$imv_swima = xtrue -o x$imv_swid = xtrue ; then
+ AC_DEFINE([USE_JSON], [], [build code for JSON])
+fi
# ====================================================
# options for enabled modules (see conf/Makefile.am)
diff --git a/src/libimcv/Makefile.am b/src/libimcv/Makefile.am
index ab66bccba..dda0c2cd8 100644
--- a/src/libimcv/Makefile.am
+++ b/src/libimcv/Makefile.am
@@ -5,6 +5,9 @@ AM_CPPFLAGS = \
-DIPSEC_SCRIPT=\"${ipsec_script}\" \
-DSWID_DIRECTORY=\"${prefix}/share\"
+AM_CFLAGS = \
+ $(json_CFLAGS)
+
ipseclib_LTLIBRARIES = libimcv.la
libimcv_la_LDFLAGS = \
@@ -13,7 +16,8 @@ libimcv_la_LDFLAGS = \
libimcv_la_LIBADD = \
$(top_builddir)/src/libstrongswan/libstrongswan.la \
$(top_builddir)/src/libtncif/libtncif.la \
- $(top_builddir)/src/libtpmtss/libtpmtss.la
+ $(top_builddir)/src/libtpmtss/libtpmtss.la \
+ $(json_LIBS)
if USE_WINDOWS
libimcv_la_LIBADD += -lws2_32
@@ -88,6 +92,7 @@ libimcv_la_SOURCES = \
pts/components/tcg/tcg_comp_func_name.h pts/components/tcg/tcg_comp_func_name.c \
pwg/pwg_attr.h pwg/pwg_attr.c \
pwg/pwg_attr_vendor_smi_code.h pwg/pwg_attr_vendor_smi_code.c \
+ rest/rest.h rest/rest.c \
seg/seg_contract.h seg/seg_contract.c \
seg/seg_contract_manager.h seg/seg_contract_manager.c \
seg/seg_env.h seg/seg_env.c \
diff --git a/src/libimcv/plugins/imv_swid/Makefile.am b/src/libimcv/plugins/imv_swid/Makefile.am
index 73da84b55..e573ea0d8 100644
--- a/src/libimcv/plugins/imv_swid/Makefile.am
+++ b/src/libimcv/plugins/imv_swid/Makefile.am
@@ -16,7 +16,6 @@ imv_swid_la_LIBADD = \
imv_swid_la_SOURCES = \
imv_swid.c imv_swid_state.h imv_swid_state.c \
- imv_swid_agent.h imv_swid_agent.c \
- imv_swid_rest.h imv_swid_rest.c
+ imv_swid_agent.h imv_swid_agent.c
imv_swid_la_LDFLAGS = -module -avoid-version -no-undefined
diff --git a/src/libimcv/plugins/imv_swid/imv_swid_agent.c b/src/libimcv/plugins/imv_swid/imv_swid_agent.c
index c057e7ed1..09a387fd3 100644
--- a/src/libimcv/plugins/imv_swid/imv_swid_agent.c
+++ b/src/libimcv/plugins/imv_swid/imv_swid_agent.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2016 Andreas Steffen
+ * Copyright (C) 2013-2017 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
@@ -18,12 +18,12 @@
#include "imv_swid_agent.h"
#include "imv_swid_state.h"
-#include "imv_swid_rest.h"
#include <imcv.h>
#include <imv/imv_agent.h>
#include <imv/imv_msg.h>
#include <ietf/ietf_attr_pa_tnc_error.h>
+#include "rest/rest.h"
#include "tcg/seg/tcg_seg_attr_max_size.h"
#include "tcg/seg/tcg_seg_attr_seg_env.h"
#include "tcg/swid/tcg_swid_attr_req.h"
@@ -72,7 +72,7 @@ struct private_imv_swid_agent_t {
/**
* REST API to strongTNC manager
*/
- imv_swid_rest_t *rest_api;
+ rest_t *rest_api;
};
@@ -719,7 +719,7 @@ imv_agent_if_t *imv_swid_agent_create(const char *name, TNC_IMVID id,
"%s.plugins.imv-swid.rest_api_timeout", 120, lib->ns);
if (rest_api_uri)
{
- this->rest_api = imv_swid_rest_create(rest_api_uri, rest_api_timeout);
+ this->rest_api = rest_create(rest_api_uri, rest_api_timeout);
}
return &this->public;
diff --git a/src/libimcv/plugins/imv_swid/imv_swid_rest.c b/src/libimcv/plugins/imv_swid/imv_swid_rest.c
deleted file mode 100644
index 0fe96edef..000000000
--- a/src/libimcv/plugins/imv_swid/imv_swid_rest.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2014 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 "imv_swid_rest.h"
-
-typedef struct private_imv_swid_rest_t private_imv_swid_rest_t;
-
-/**
- * Private data of an imv_swid_rest_t object.
- */
-struct private_imv_swid_rest_t {
-
- /**
- * Public members of imv_swid_rest_t
- */
- imv_swid_rest_t public;
-
- /**
- * URI of REST API
- */
- char *uri;
-
- /**
- * Timeout of REST API connection
- */
- u_int timeout;
-
-};
-
-#define HTTP_STATUS_CODE_PRECONDITION_FAILED 412
-
-METHOD(imv_swid_rest_t, post, status_t,
- private_imv_swid_rest_t *this, char *command, json_object *jrequest,
- json_object **jresponse)
-{
- struct json_tokener *tokener;
- chunk_t data, response = chunk_empty;
- status_t status;
- char *uri;
- int code;
-
- if (asprintf(&uri, "%s%s",this->uri, command) < 0)
- {
- return FAILED;
- }
- data = chunk_from_str((char*)json_object_to_json_string(jrequest));
-
- status = lib->fetcher->fetch(lib->fetcher, uri, &response,
- FETCH_TIMEOUT, this->timeout,
- FETCH_REQUEST_DATA, data,
- FETCH_REQUEST_TYPE, "application/json; charset=utf-8",
- FETCH_REQUEST_HEADER, "Accept: application/json",
- FETCH_REQUEST_HEADER, "Expect:",
- FETCH_RESPONSE_CODE, &code,
- FETCH_END);
- free(uri);
-
- if (status != SUCCESS)
- {
- if (code != HTTP_STATUS_CODE_PRECONDITION_FAILED || !response.ptr)
- {
- DBG2(DBG_IMV, "REST http request failed with status code: %d", code);
- status = FAILED;
- }
- else
- {
- if (jresponse)
- {
- /* Parse HTTP response into a JSON object */
- tokener = json_tokener_new();
- *jresponse = json_tokener_parse_ex(tokener, response.ptr,
- response.len);
- json_tokener_free(tokener);
- }
- status = NEED_MORE;
- }
- }
- free(response.ptr);
-
- return status;
-}
-
-METHOD(imv_swid_rest_t, destroy, void,
- private_imv_swid_rest_t *this)
-{
- free(this->uri);
- free(this);
-}
-
-/**
- * Described in header.
- */
-imv_swid_rest_t *imv_swid_rest_create(char *uri, u_int timeout)
-{
- private_imv_swid_rest_t *this;
-
- INIT(this,
- .public = {
- .post = _post,
- .destroy = _destroy,
- },
- .uri = strdup(uri),
- .timeout = timeout,
- );
-
- return &this->public;
-}
-
-
diff --git a/src/libimcv/plugins/imv_swid/imv_swid_rest.h b/src/libimcv/plugins/imv_swid/imv_swid_rest.h
deleted file mode 100644
index 32392cbe6..000000000
--- a/src/libimcv/plugins/imv_swid/imv_swid_rest.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2013-2014 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.
- */
-
-/**
- * @defgroup imv_swid imv_swid
- * @ingroup libimcv_plugins
- *
- * @defgroup imv_swid_rest_t imv_swid_rest
- * @{ @ingroup imv_swid
- */
-
-#ifndef IMV_SWID_REST_H_
-#define IMV_SWID_REST_H_
-
-#include <library.h>
-
-#include <json.h>
-
-typedef struct imv_swid_rest_t imv_swid_rest_t;
-
-/**
- * Public REST interface
- */
-struct imv_swid_rest_t {
-
- /**
- * Post a HTTP request including a JSON object
- *
- * @param jreq JSON object in HTTP request
- * @param jresp JSON object in HTTP response if NEED_MORE
- * @return Status (SUCCESS, NEED_MORE or FAILED)
- */
- status_t (*post)(imv_swid_rest_t *this, char *command, json_object *jreq,
- json_object **jresp);
-
- /**
- * Destroy imv_swid_rest_t object
- */
- void (*destroy)(imv_swid_rest_t *this);
-
-};
-
-/**
- * Create an imv_swid_rest_t instance
- *
- * @param uri REST URI (http://username:password@hostname[:port]/api/)
- * @param timeout Timeout of the REST connection
- */
-imv_swid_rest_t* imv_swid_rest_create(char *uri, u_int timeout);
-
-#endif /** IMV_SWID_REST_H_ @}*/
diff --git a/src/libimcv/plugins/imv_swima/Makefile.am b/src/libimcv/plugins/imv_swima/Makefile.am
index 0c548411d..b1726f061 100644
--- a/src/libimcv/plugins/imv_swima/Makefile.am
+++ b/src/libimcv/plugins/imv_swima/Makefile.am
@@ -16,7 +16,6 @@ imv_swima_la_LIBADD = \
imv_swima_la_SOURCES = \
imv_swima.c imv_swima_state.h imv_swima_state.c \
- imv_swima_agent.h imv_swima_agent.c \
- imv_swima_rest.h imv_swima_rest.c
+ imv_swima_agent.h imv_swima_agent.c
imv_swima_la_LDFLAGS = -module -avoid-version -no-undefined
diff --git a/src/libimcv/plugins/imv_swima/imv_swima_agent.c b/src/libimcv/plugins/imv_swima/imv_swima_agent.c
index 5d653fffc..eedc5da81 100644
--- a/src/libimcv/plugins/imv_swima/imv_swima_agent.c
+++ b/src/libimcv/plugins/imv_swima/imv_swima_agent.c
@@ -18,11 +18,11 @@
#include "imv_swima_agent.h"
#include "imv_swima_state.h"
-#include "imv_swima_rest.h"
#include <imcv.h>
#include <imv/imv_agent.h>
#include <imv/imv_msg.h>
+#include "rest/rest.h"
#include "tcg/seg/tcg_seg_attr_max_size.h"
#include "tcg/seg/tcg_seg_attr_seg_env.h"
#include "ietf/swima/ietf_swima_attr_req.h"
@@ -73,7 +73,7 @@ struct private_imv_swima_agent_t {
/**
* REST API to strongTNC manager
*/
- imv_swima_rest_t *rest_api;
+ rest_t *rest_api;
};
@@ -770,7 +770,7 @@ imv_agent_if_t *imv_swima_agent_create(const char *name, TNC_IMVID id,
"%s.plugins.imv-swima.rest_api_timeout", 120, lib->ns);
if (rest_api_uri)
{
- this->rest_api = imv_swima_rest_create(rest_api_uri, rest_api_timeout);
+ this->rest_api = rest_create(rest_api_uri, rest_api_timeout);
}
return &this->public;
diff --git a/src/libimcv/plugins/imv_swima/imv_swima_rest.c b/src/libimcv/rest/rest.c
index b82e38a6a..531da090e 100644
--- a/src/libimcv/plugins/imv_swima/imv_swima_rest.c
+++ b/src/libimcv/rest/rest.c
@@ -13,22 +13,24 @@
* for more details.
*/
+#ifdef USE_JSON
+
#define _GNU_SOURCE
#include <stdio.h>
-#include "imv_swima_rest.h"
+#include "rest.h"
-typedef struct private_imv_swima_rest_t private_imv_swima_rest_t;
+typedef struct private_rest_t private_rest_t;
/**
- * Private data of an imv_swima_rest_t object.
+ * Private data of an rest_t object.
*/
-struct private_imv_swima_rest_t {
+struct private_rest_t {
/**
- * Public members of imv_swima_rest_t
+ * Public members of rest_t
*/
- imv_swima_rest_t public;
+ rest_t public;
/**
* URI of REST API
@@ -42,10 +44,41 @@ struct private_imv_swima_rest_t {
};
+METHOD(rest_t, get, status_t,
+ private_rest_t *this, char *command, json_object **jresponse)
+{
+ struct json_tokener *tokener;
+ chunk_t response = chunk_empty;
+ status_t status;
+ char *uri;
+
+ if (asprintf(&uri, "%s%s",this->uri, command) < 0)
+ {
+ return FAILED;
+ }
+
+ status = lib->fetcher->fetch(lib->fetcher, uri, &response,
+ FETCH_TIMEOUT, this->timeout,
+ FETCH_END);
+ free(uri);
+
+ if (status == SUCCESS && jresponse)
+ {
+ /* Parse HTTP response into a JSON object */
+ tokener = json_tokener_new();
+ *jresponse = json_tokener_parse_ex(tokener, response.ptr, response.len);
+ json_tokener_free(tokener);
+ }
+ free(response.ptr);
+
+ return status;
+}
+
+#define HTTP_STATUS_CODE_NOT_FOUND 404
#define HTTP_STATUS_CODE_PRECONDITION_FAILED 412
-METHOD(imv_swima_rest_t, post, status_t,
- private_imv_swima_rest_t *this, char *command, json_object *jrequest,
+METHOD(rest_t, post, status_t,
+ private_rest_t *this, char *command, json_object *jrequest,
json_object **jresponse)
{
struct json_tokener *tokener;
@@ -72,22 +105,31 @@ METHOD(imv_swima_rest_t, post, status_t,
if (status != SUCCESS)
{
- if (code != HTTP_STATUS_CODE_PRECONDITION_FAILED || !response.ptr)
+ switch (code)
{
- DBG2(DBG_IMV, "REST http request failed with status code: %d", code);
- status = FAILED;
- }
- else
- {
- if (jresponse)
- {
- /* Parse HTTP response into a JSON object */
- tokener = json_tokener_new();
- *jresponse = json_tokener_parse_ex(tokener, response.ptr,
- response.len);
- json_tokener_free(tokener);
- }
- status = NEED_MORE;
+ case HTTP_STATUS_CODE_NOT_FOUND:
+ status = NOT_FOUND;
+ break;
+ case HTTP_STATUS_CODE_PRECONDITION_FAILED:
+ if (!response.ptr)
+ {
+ return FAILED;
+ }
+ if (jresponse)
+ {
+ /* Parse HTTP response into a JSON object */
+ tokener = json_tokener_new();
+ *jresponse = json_tokener_parse_ex(tokener, response.ptr,
+ response.len);
+ json_tokener_free(tokener);
+ }
+ status = NEED_MORE;
+ break;
+ default:
+ DBG2(DBG_IMV, "REST http request failed with status code: %d",
+ code);
+ status = FAILED;
+ break;
}
}
free(response.ptr);
@@ -95,8 +137,8 @@ METHOD(imv_swima_rest_t, post, status_t,
return status;
}
-METHOD(imv_swima_rest_t, destroy, void,
- private_imv_swima_rest_t *this)
+METHOD(rest_t, destroy, void,
+ private_rest_t *this)
{
free(this->uri);
free(this);
@@ -105,12 +147,13 @@ METHOD(imv_swima_rest_t, destroy, void,
/**
* Described in header.
*/
-imv_swima_rest_t *imv_swima_rest_create(char *uri, u_int timeout)
+rest_t *rest_create(char *uri, u_int timeout)
{
- private_imv_swima_rest_t *this;
+ private_rest_t *this;
INIT(this,
.public = {
+ .get = _get,
.post = _post,
.destroy = _destroy,
},
@@ -121,4 +164,4 @@ imv_swima_rest_t *imv_swima_rest_create(char *uri, u_int timeout)
return &this->public;
}
-
+#endif /* USE_JSON */
diff --git a/src/libimcv/plugins/imv_swima/imv_swima_rest.h b/src/libimcv/rest/rest.h
index 55266ddbd..bddb881b8 100644
--- a/src/libimcv/plugins/imv_swima/imv_swima_rest.h
+++ b/src/libimcv/rest/rest.h
@@ -17,47 +17,58 @@
* @defgroup imv_swima imv_swima
* @ingroup libimcv_plugins
*
- * @defgroup imv_swima_rest_t imv_swima_rest
+ * @defgroup rest_t rest
* @{ @ingroup imv_swima
*/
-#ifndef IMV_SWIMA_REST_H_
-#define IMV_SWIMA_REST_H_
+#ifndef REST_H_
+#define REST_H_
-#include <library.h>
+#ifdef USE_JSON
+#include <library.h>
#include <json.h>
-typedef struct imv_swima_rest_t imv_swima_rest_t;
+typedef struct rest_t rest_t;
/**
* Public REST interface
*/
-struct imv_swima_rest_t {
+struct rest_t {
/**
- * Post a HTTP request including a JSON object
+ * Send an HTTP GET request returning a JSON object
+ *
+ * @param jresp JSON object in HTTP
+ * @return Status (SUCCESS or FAILED)
+ */
+ status_t (*get)(rest_t *this, char *command, json_object **jresp);
+
+ /**
+ * Send an HTTP POST request including a JSON object
*
* @param jreq JSON object in HTTP request
* @param jresp JSON object in HTTP response if NEED_MORE
* @return Status (SUCCESS, NEED_MORE or FAILED)
*/
- status_t (*post)(imv_swima_rest_t *this, char *command, json_object *jreq,
+ status_t (*post)(rest_t *this, char *command, json_object *jreq,
json_object **jresp);
/**
- * Destroy imv_swima_rest_t object
+ * Destroy rest_t object
*/
- void (*destroy)(imv_swima_rest_t *this);
+ void (*destroy)(rest_t *this);
};
/**
- * Create an imv_swima_rest_t instance
+ * Create an rest_t instance
*
* @param uri REST URI (http://username:password@hostname[:port]/api/)
* @param timeout Timeout of the REST connection
*/
-imv_swima_rest_t* imv_swima_rest_create(char *uri, u_int timeout);
+rest_t* rest_create(char *uri, u_int timeout);
+
+#endif /* USE_JSON */
-#endif /** IMV_SWIMA_REST_H_ @}*/
+#endif /** REST_H_ @}*/