]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
Add container plugin features
authorMartin Willi <martin@revosec.ch>
Mon, 26 Nov 2012 11:55:25 +0000 (12:55 +0100)
committerMartin Willi <martin@revosec.ch>
Wed, 19 Dec 2012 09:32:07 +0000 (10:32 +0100)
src/libstrongswan/plugins/plugin_feature.c
src/libstrongswan/plugins/plugin_feature.h

index d39fa6eee3db0ea85751bd68fe02c5b6e2061301..6c954f76d7d81ce2ee6f796c118684209c2abea9 100644 (file)
@@ -42,6 +42,8 @@ ENUM(plugin_feature_names, FEATURE_NONE, FEATURE_CUSTOM,
        "PUBKEY_ENCRYPT",
        "CERT_DECODE",
        "CERT_ENCODE",
+       "CONTAINER_DECODE",
+       "CONTAINER_ENCODE",
        "EAP_SERVER",
        "EAP_CLIENT",
        "XAUTH_SERVER",
@@ -83,6 +85,8 @@ u_int32_t plugin_feature_hash(plugin_feature_t *feature)
                case FEATURE_PUBKEY_ENCRYPT:
                case FEATURE_CERT_DECODE:
                case FEATURE_CERT_ENCODE:
+               case FEATURE_CONTAINER_DECODE:
+               case FEATURE_CONTAINER_ENCODE:
                case FEATURE_EAP_SERVER:
                case FEATURE_EAP_PEER:
                        data = chunk_from_thing(feature->arg);
@@ -143,6 +147,9 @@ bool plugin_feature_matches(plugin_feature_t *a, plugin_feature_t *b)
                        case FEATURE_CERT_DECODE:
                        case FEATURE_CERT_ENCODE:
                                return a->arg.cert == b->arg.cert;
+                       case FEATURE_CONTAINER_DECODE:
+                       case FEATURE_CONTAINER_ENCODE:
+                               return a->arg.container == b->arg.container;
                        case FEATURE_EAP_SERVER:
                        case FEATURE_EAP_PEER:
                                return a->arg.eap == b->arg.eap;
@@ -267,6 +274,14 @@ char* plugin_feature_get_string(plugin_feature_t *feature)
                                return str;
                        }
                        break;
+               case FEATURE_CONTAINER_DECODE:
+               case FEATURE_CONTAINER_ENCODE:
+                       if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type,
+                                       container_type_names, feature->arg.container) > 0)
+                       {
+                               return str;
+                       }
+                       break;
                case FEATURE_EAP_SERVER:
                case FEATURE_EAP_PEER:
                        if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type,
@@ -385,6 +400,12 @@ bool plugin_feature_load(plugin_t *plugin, plugin_feature_t *feature,
                                                                feature->arg.cert, reg->arg.reg.final,
                                                                reg->arg.reg.f);
                        break;
+               case FEATURE_CONTAINER_DECODE:
+               case FEATURE_CONTAINER_ENCODE:
+                       lib->creds->add_builder(lib->creds, CRED_CONTAINER,
+                                                               feature->arg.container, reg->arg.reg.final,
+                                                               reg->arg.reg.f);
+                       break;
                case FEATURE_DATABASE:
                        lib->db->add_database(lib->db, reg->arg.reg.f);
                        break;
@@ -454,6 +475,10 @@ bool plugin_feature_unload(plugin_t *plugin, plugin_feature_t *feature,
                case FEATURE_CERT_ENCODE:
                        lib->creds->remove_builder(lib->creds, reg->arg.reg.f);
                        break;
+               case FEATURE_CONTAINER_DECODE:
+               case FEATURE_CONTAINER_ENCODE:
+                       lib->creds->remove_builder(lib->creds, reg->arg.reg.f);
+                       break;
                case FEATURE_DATABASE:
                        lib->db->remove_database(lib->db, reg->arg.reg.f);
                        break;
index 90f8a948a7a7037c7a626efaedbe64be64571eaf..7667fff3ec7e797b787da90e73ef1e9f29c15a90 100644 (file)
@@ -29,6 +29,7 @@ typedef struct plugin_feature_t plugin_feature_t;
 #include <library.h>
 #include <eap/eap.h>
 #include <plugins/plugin.h>
+#include <credentials/containers/container.h>
 
 /**
  * Callback function of a plugin to (un-)register a specified feature.
@@ -133,6 +134,10 @@ struct plugin_feature_t {
                FEATURE_CERT_DECODE,
                /** generating certificates */
                FEATURE_CERT_ENCODE,
+               /** parsing containers */
+               FEATURE_CONTAINER_DECODE,
+               /** generating containers */
+               FEATURE_CONTAINER_ENCODE,
                /** EAP server implementation */
                FEATURE_EAP_SERVER,
                /** EAP peer implementation */
@@ -186,6 +191,8 @@ struct plugin_feature_t {
                encryption_scheme_t pubkey_encrypt;
                /** FEATURE_CERT_DECODE/ENCODE */
                certificate_type_t cert;
+               /** FEATURE_CONTAINER_DECODE/ENCODE */
+               container_type_t container;
                /** FEATURE_EAP_SERVER/CLIENT */
                eap_type_t eap;
                /** FEATURE_DATABASE */
@@ -281,6 +288,8 @@ struct plugin_feature_t {
 #define _PLUGIN_FEATURE_PUBKEY_ENCRYPT(kind, scheme)           __PLUGIN_FEATURE(kind, PUBKEY_ENCRYPT, .pubkey_encrypt = scheme)
 #define _PLUGIN_FEATURE_CERT_DECODE(kind, type)                                __PLUGIN_FEATURE(kind, CERT_DECODE, .cert = type)
 #define _PLUGIN_FEATURE_CERT_ENCODE(kind, type)                                __PLUGIN_FEATURE(kind, CERT_ENCODE, .cert = type)
+#define _PLUGIN_FEATURE_CONTAINER_DECODE(kind, type)           __PLUGIN_FEATURE(kind, CONTAINER_DECODE, .container = type)
+#define _PLUGIN_FEATURE_CONTAINER_ENCODE(kind, type)           __PLUGIN_FEATURE(kind, CONTAINER_ENCODE, .container = type)
 #define _PLUGIN_FEATURE_EAP_SERVER(kind, type)                         __PLUGIN_FEATURE(kind, EAP_SERVER, .eap = type)
 #define _PLUGIN_FEATURE_EAP_PEER(kind, type)                           __PLUGIN_FEATURE(kind, EAP_PEER, .eap = type)
 #define _PLUGIN_FEATURE_DATABASE(kind, type)                           __PLUGIN_FEATURE(kind, DATABASE, .database = type)
@@ -304,6 +313,8 @@ struct plugin_feature_t {
 #define _PLUGIN_FEATURE_REGISTER_PUBKEY(type, f, final)                __PLUGIN_FEATURE_REGISTER_BUILDER(type, f, final)
 #define _PLUGIN_FEATURE_REGISTER_CERT_DECODE(type, f, final)__PLUGIN_FEATURE_REGISTER_BUILDER(type, f, final)
 #define _PLUGIN_FEATURE_REGISTER_CERT_ENCODE(type, f, final)__PLUGIN_FEATURE_REGISTER_BUILDER(type, f, final)
+#define _PLUGIN_FEATURE_REGISTER_CONTAINER_DECODE(type, f, final)__PLUGIN_FEATURE_REGISTER_BUILDER(type, f, final)
+#define _PLUGIN_FEATURE_REGISTER_CONTAINER_ENCODE(type, f, final)__PLUGIN_FEATURE_REGISTER_BUILDER(type, f, final)
 #define _PLUGIN_FEATURE_REGISTER_DATABASE(type, f)                     __PLUGIN_FEATURE_REGISTER(type, f)
 #define _PLUGIN_FEATURE_REGISTER_FETCHER(type, f)                      __PLUGIN_FEATURE_REGISTER(type, f)