Annotation of embedaddon/strongswan/src/libcharon/plugins/ext_auth/ext_auth_plugin.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (c) 2014 Vyronas Tsingaras (vtsingaras@it.auth.gr)
3: * Copyright (C) 2014 Martin Willi
4: * Copyright (C) 2014 revosec AG
5: *
6: * Permission is hereby granted, free of charge, to any person obtaining a copy
7: * of this software and associated documentation files (the "Software"), to deal
8: * in the Software without restriction, including without limitation the rights
9: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10: * copies of the Software, and to permit persons to whom the Software is
11: * furnished to do so, subject to the following conditions:
12: *
13: * The above copyright notice and this permission notice shall be included in
14: * all copies or substantial portions of the Software.
15: *
16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22: * THE SOFTWARE.
23: */
24:
25: #include "ext_auth_plugin.h"
26: #include "ext_auth_listener.h"
27:
28: #include <daemon.h>
29:
30: typedef struct private_ext_auth_plugin_t private_ext_auth_plugin_t;
31:
32: /**
33: * private data of ext_auth plugin
34: */
35: struct private_ext_auth_plugin_t {
36:
37: /**
38: * implements plugin interface
39: */
40: ext_auth_plugin_t public;
41:
42: /**
43: * Listener verifying peers during authorization
44: */
45: ext_auth_listener_t *listener;
46: };
47:
48: METHOD(plugin_t, get_name, char*,
49: private_ext_auth_plugin_t *this)
50: {
51: return "ext-auth";
52: }
53:
54: /**
55: * Create a listener instance, NULL on error
56: */
57: static ext_auth_listener_t* create_listener()
58: {
59: char *script;
60:
61: script = lib->settings->get_str(lib->settings,
62: "%s.plugins.ext-auth.script", NULL, lib->ns);
63: if (!script)
64: {
65: DBG1(DBG_CFG, "no script for ext-auth script defined, disabled");
66: return NULL;
67: }
68: DBG1(DBG_CFG, "using ext-auth script '%s'", script);
69: return ext_auth_listener_create(script);
70: }
71:
72: /**
73: * Register listener
74: */
75: static bool plugin_cb(private_ext_auth_plugin_t *this,
76: plugin_feature_t *feature, bool reg, void *cb_data)
77: {
78: if (reg)
79: {
80: this->listener = create_listener();
81: if (!this->listener)
82: {
83: return FALSE;
84: }
85: charon->bus->add_listener(charon->bus, &this->listener->listener);
86: }
87: else
88: {
89: if (this->listener)
90: {
91: charon->bus->remove_listener(charon->bus, &this->listener->listener);
92: this->listener->destroy(this->listener);
93: }
94: }
95: return TRUE;
96: }
97:
98: METHOD(plugin_t, get_features, int,
99: private_ext_auth_plugin_t *this, plugin_feature_t *features[])
100: {
101: static plugin_feature_t f[] = {
102: PLUGIN_CALLBACK((plugin_feature_callback_t)plugin_cb, NULL),
103: PLUGIN_PROVIDE(CUSTOM, "ext_auth"),
104: };
105: *features = f;
106: return countof(f);
107: }
108:
109:
110: METHOD(plugin_t, reload, bool,
111: private_ext_auth_plugin_t *this)
112: {
113: ext_auth_listener_t *listener;
114:
115: /* reload new listener overlapped */
116: listener = create_listener();
117: if (listener)
118: {
119: charon->bus->add_listener(charon->bus, &listener->listener);
120: }
121: if (this->listener)
122: {
123: charon->bus->remove_listener(charon->bus, &this->listener->listener);
124: this->listener->destroy(this->listener);
125: }
126: this->listener = listener;
127:
128: return TRUE;
129: }
130:
131: METHOD(plugin_t, destroy, void,
132: private_ext_auth_plugin_t *this)
133: {
134: free(this);
135: }
136:
137: /**
138: * Plugin constructor
139: */
140: plugin_t *ext_auth_plugin_create()
141: {
142: private_ext_auth_plugin_t *this;
143:
144: INIT(this,
145: .public = {
146: .plugin = {
147: .get_name = _get_name,
148: .get_features = _get_features,
149: .reload = _reload,
150: .destroy = _destroy,
151: },
152: },
153: );
154:
155: return &this->public.plugin;
156: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>