35#include "openvpn-plugin.h"
41#define ovpn_err(fmt, ...) \
42 plugin->log(PLOG_ERR, "SSO", fmt, ## __VA_ARGS__)
43#define ovpn_dbg(fmt, ...) \
44 plugin->log(PLOG_DEBUG, "SSO", fmt, ## __VA_ARGS__)
45#define ovpn_note(fmt, ...) \
46 plugin->log(PLOG_NOTE, "SSO", fmt, ## __VA_ARGS__)
68get_env(
const char *name,
const char *envp[])
73 const int namelen = strlen(name);
74 for (i = 0; envp[i]; ++i)
76 if (!strncmp(envp[i], name, namelen))
78 const char *cp = envp[i] + namelen;
91 struct openvpn_plugin_args_open_in
const *args,
92 struct openvpn_plugin_args_open_return *rv)
98 printf(
"PLUGIN: allocating memory for context failed\n");
99 return OPENVPN_PLUGIN_FUNC_ERROR;
103 plugin->
log = args->callbacks->plugin_log;
105 plugin->
mask = OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_TLS_FINAL);
106 plugin->
mask |= OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_TLS_VERIFY);
111 rv->handle = (
void *)
plugin;
113 return OPENVPN_PLUGIN_FUNC_SUCCESS;
122 X509_NAME *x509_name;
123 X509_NAME_ENTRY *ent;
126 x509_name = X509_get_subject_name(x509);
127 int i, n = X509_NAME_entry_count(x509_name);
128 for (i = 0; i < n; ++i)
130 if (!(ent = X509_NAME_get_entry(x509_name, i)))
134 if (!(fn = X509_NAME_ENTRY_get_object(ent)))
138 if (!(val = X509_NAME_ENTRY_get_data(ent)))
142 if ((fn_nid = OBJ_obj2nid(fn)) == NID_undef)
146 if (!(objbuf = OBJ_nid2sn(fn_nid)))
150 unsigned char *buf = NULL;
151 if (ASN1_STRING_to_UTF8(&buf, val) < 0)
156 if (!strncasecmp(objbuf,
"CN", 2))
158 strncpy(sess->
user, (
char *)buf,
sizeof(sess->
user) - 1);
169 struct session *sess = (
struct session *)args->per_client_context;
174 return OPENVPN_PLUGIN_FUNC_SUCCESS;
177 if (!args->current_cert)
179 ovpn_err(
"this example plugin requires client certificate");
180 return OPENVPN_PLUGIN_FUNC_ERROR;
185 return OPENVPN_PLUGIN_FUNC_SUCCESS;
192 if (!(f = fopen(file,
"w+")))
197 fprintf(f,
"%s", content);
205 struct session *sess = (
struct session *)args->per_client_context;
208 snprintf(file,
sizeof(file) - 1,
"/tmp/openvpn_sso_%s", sess->
key);
217 struct session *sess = (
struct session *)args->per_client_context;
219 char *file =
"/tmp/openvpn_sso_user";
225tls_final(
struct openvpn_plugin_args_func_in
const *args,
226 struct openvpn_plugin_args_func_return *rv)
229 struct session *sess = (
struct session *)args->per_client_context;
232 if (!(
key =
get_env(
"exported_keying_material", args->envp)))
234 return OPENVPN_PLUGIN_FUNC_ERROR;
237 strncpy(sess->
key,
key,
sizeof(sess->
key) - 1);
248 return OPENVPN_PLUGIN_FUNC_SUCCESS;
252 return OPENVPN_PLUGIN_FUNC_SUCCESS;
257 struct openvpn_plugin_args_func_in
const *args,
258 struct openvpn_plugin_args_func_return *rv)
262 case OPENVPN_PLUGIN_TLS_VERIFY:
265 case OPENVPN_PLUGIN_TLS_FINAL:
268 return OPENVPN_PLUGIN_FUNC_SUCCESS;
275 struct session *sess = calloc(1,
sizeof(*sess));
static void server_store(struct openvpn_plugin_args_func_in const *args)
OPENVPN_EXPORT void openvpn_plugin_close_v1(openvpn_plugin_handle_t handle)
static int tls_verify(struct openvpn_plugin_args_func_in const *args)
static void client_store(struct openvpn_plugin_args_func_in const *args)
OPENVPN_EXPORT void openvpn_plugin_client_destructor_v1(openvpn_plugin_handle_t handle, void *ctx)
OPENVPN_EXPORT int openvpn_plugin_open_v3(const int version, struct openvpn_plugin_args_open_in const *args, struct openvpn_plugin_args_open_return *rv)
OPENVPN_EXPORT int openvpn_plugin_func_v3(const int version, struct openvpn_plugin_args_func_in const *args, struct openvpn_plugin_args_func_return *rv)
static void file_store(char *file, char *content)
static const char * get_env(const char *name, const char *envp[])
static int tls_final(struct openvpn_plugin_args_func_in const *args, struct openvpn_plugin_args_func_return *rv)
OPENVPN_EXPORT void * openvpn_plugin_client_constructor_v1(openvpn_plugin_handle_t handle)
static void session_user_set(struct session *sess, X509 *x509)
#define ovpn_err(fmt,...)
#define ovpn_note(fmt,...)
Container for unidirectional cipher and HMAC key material.