34#include "openvpn-plugin.h"
40#define ovpn_err(fmt, ...) plugin->log(PLOG_ERR, "SSO", fmt, ##__VA_ARGS__)
41#define ovpn_dbg(fmt, ...) plugin->log(PLOG_DEBUG, "SSO", fmt, ##__VA_ARGS__)
42#define ovpn_note(fmt, ...) plugin->log(PLOG_NOTE, "SSO", fmt, ##__VA_ARGS__)
70get_env(
const char *name,
const char *envp[])
74 const size_t namelen = strlen(name);
75 for (
int i = 0; envp[i]; ++i)
77 if (!strncmp(envp[i], name, namelen))
79 const char *cp = envp[i] + namelen;
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;
125 x509_name = X509_get_subject_name(x509);
126 int n = X509_NAME_entry_count(x509_name);
127 for (
int i = 0; i < n; ++i)
129 X509_NAME_ENTRY *ent;
131 if (!(ent = X509_NAME_get_entry(x509_name, i)))
135 if (!(fn = X509_NAME_ENTRY_get_object(ent)))
139 if (!(val = X509_NAME_ENTRY_get_data(ent)))
143 if ((fn_nid = OBJ_obj2nid(fn)) == NID_undef)
147 if (!(objbuf = OBJ_nid2sn(fn_nid)))
151 unsigned char *buf = NULL;
152 if (ASN1_STRING_to_UTF8(&buf, val) < 0)
157 if (!strncasecmp(objbuf,
"CN", 2))
159 strncpy(sess->
user, (
char *)buf,
sizeof(sess->
user) - 1);
170 struct session *sess = (
struct session *)args->per_client_context;
175 return OPENVPN_PLUGIN_FUNC_SUCCESS;
178 if (!args->current_cert)
180 ovpn_err(
"this example plugin requires client certificate");
181 return OPENVPN_PLUGIN_FUNC_ERROR;
186 return OPENVPN_PLUGIN_FUNC_SUCCESS;
193 if (!(f = fopen(file,
"w+")))
198 fprintf(f,
"%s", content);
206 const struct session *sess = args->per_client_context;
209 snprintf(file,
sizeof(file) - 1,
"/tmp/openvpn_sso_%s", sess->
key);
218 const struct session *sess = args->per_client_context;
220 char *file =
"/tmp/openvpn_sso_user";
226tls_final(
struct openvpn_plugin_args_func_in
const *args,
227 struct openvpn_plugin_args_func_return *rv)
230 struct session *sess = (
struct session *)args->per_client_context;
233 if (!(
key =
get_env(
"exported_keying_material", args->envp)))
235 return OPENVPN_PLUGIN_FUNC_ERROR;
238 strncpy(sess->
key,
key,
sizeof(sess->
key) - 1);
249 return OPENVPN_PLUGIN_FUNC_SUCCESS;
253 return OPENVPN_PLUGIN_FUNC_SUCCESS;
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 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 file_store(const char *file, const char *content)
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.