Go to the documentation of this file.
27 #ifdef HAVE_CONFIG_VERSION_H
28 #include "config-version.h"
48 #define PLUGIN_SYMBOL_REQUIRED (1<<0)
57 for (i = 0; array[i]; ++i)
61 msg(msglevel,
"%s[%d] = '%s'", name, i, array[i]);
88 return "PLUGIN_ROUTE_UP";
91 return "PLUGIN_IPCHANGE";
94 return "PLUGIN_TLS_VERIFY";
97 return "PLUGIN_AUTH_USER_PASS_VERIFY";
100 return "PLUGIN_CLIENT_CONNECT";
103 return "PLUGIN_CLIENT_CONNECT_V2";
106 return "PLUGIN_CLIENT_CONNECT_DEFER";
109 return "PLUGIN_CLIENT_CONNECT_DEFER_V2";
112 return "PLUGIN_CLIENT_DISCONNECT";
115 return "PLUGIN_LEARN_ADDRESS";
118 return "PLUGIN_TLS_FINAL";
121 return "PLUGIN_ROUTE_PREDOWN";
123 case OPENVPN_PLUGIN_CLIENT_CRRESPONSE:
124 return "PLUGIN_CRRESPONSE";
153 static inline unsigned int
194 for (i = 0; i <
list->n; ++i)
207 libdl_resolve_symbol(
void *handle,
void **dest,
const char *symbol,
const char *plugin_name,
const unsigned int flags)
209 *dest = dlsym(handle, symbol);
212 msg(
M_FATAL,
"PLUGIN: could not find required symbol '%s' in plugin shared object %s: %s", symbol, plugin_name, dlerror());
219 dll_resolve_symbol(HMODULE module,
void **dest,
const char *symbol,
const char *plugin_name,
const unsigned int flags)
221 *dest = GetProcAddress(module, symbol);
224 msg(
M_FATAL,
"PLUGIN: could not find required symbol '%s' in plugin DLL %s", symbol, plugin_name);
264 p->handle = dlopen(full, RTLD_NOW);
273 msg(
M_ERR,
"PLUGIN_INIT: could not load plugin shared object %s: %s", p->
so_pathname, dlerror());
276 #define PLUGIN_SYM(var, name, flags) libdl_resolve_symbol(p->handle, (void *)&p->var, name, p->so_pathname, flags)
287 #define PLUGIN_SYM(var, name, flags) dll_resolve_symbol(p->module, (void *)&p->var, name, p->so_pathname, flags)
291 PLUGIN_SYM(open1,
"openvpn_plugin_open_v1", 0);
292 PLUGIN_SYM(open2,
"openvpn_plugin_open_v2", 0);
293 PLUGIN_SYM(open3,
"openvpn_plugin_open_v3", 0);
294 PLUGIN_SYM(func1,
"openvpn_plugin_func_v1", 0);
295 PLUGIN_SYM(func2,
"openvpn_plugin_func_v2", 0);
296 PLUGIN_SYM(func3,
"openvpn_plugin_func_v3", 0);
298 PLUGIN_SYM(abort,
"openvpn_plugin_abort_v1", 0);
299 PLUGIN_SYM(client_constructor,
"openvpn_plugin_client_constructor_v1", 0);
300 PLUGIN_SYM(client_destructor,
"openvpn_plugin_client_destructor_v1", 0);
301 PLUGIN_SYM(min_version_required,
"openvpn_plugin_min_version_required_v1", 0);
302 PLUGIN_SYM(initialization_point,
"openvpn_plugin_select_initialization_point_v1", 0);
322 msg(
M_FATAL,
"PLUGIN_INIT: plugin needs interface version %d, but this version of OpenVPN only supports version %d: %s",
323 plugin_needs_version,
340 msg(
M_WARN,
"WARNING: plugin '%s' specified by a relative pathname -- using an absolute pathname would be more secure", p->
so_pathname);
351 unsigned int msg_flags = 0;
358 if (!name || name[0] ==
'\0')
360 msg(
D_PLUGIN_DEBUG,
"PLUGIN: suppressed log message from plugin with unknown name");
401 x_msg_va(msg_flags, msg_fmt, arglist);
411 va_start(arglist, format);
429 #ifndef CONFIGURE_GIT_REVISION
430 #define _OPENVPN_PATCH_LEVEL OPENVPN_VERSION_PATCH
432 #define _OPENVPN_PATCH_LEVEL "git:" CONFIGURE_GIT_REVISION CONFIGURE_GIT_FLAGS
440 const int init_point)
463 (
const char **
const) o->
argv,
464 (
const char **
const)
envp,
498 msg(
D_PLUGIN,
"PLUGIN_INIT: POST %s '%s' intercepted=%s %s",
502 (retlist && *retlist) ?
"[RETLIST]" :
"");
506 msg(
M_FATAL,
"PLUGIN_INIT: plugin %s expressed interest in unsupported plugin types: [want=0x%08x, have=0x%08x]",
514 msg(
M_FATAL,
"PLUGIN_INIT: plugin initialization function failed: %s",
524 void *per_client_context,
526 const struct argv *av,
555 (
const char **
const) a.
argv,
556 (
const char **
const)
envp,
588 msg(
M_WARN,
"PLUGIN_CALL: plugin function %s failed with status %d: %s",
616 if (dlclose(p->handle))
620 #elif defined(_WIN32)
621 if (!FreeLibrary(p->
module))
646 const int init_point)
651 for (i = 0; i < n; ++i)
669 for (i = 0; i < n; ++i)
701 for (i = 0; i < list->
n; ++i)
717 const int init_point)
730 for (i = 0; i < pc->
n; ++i)
734 pr ? &pr->
list[i] : NULL,
755 for (i = 0; i < pc->
n; ++i)
778 const int init_point)
787 const struct argv *av,
806 bool deferred_auth_done =
false;
811 for (i = 0; i < n; ++i)
817 pr ? &pr->
list[i] : NULL,
829 && deferred_auth_done)
847 "Exiting due to multiple authentication plug-ins "
848 "performing deferred authentication. Only one "
849 "authentication plug-in doing deferred auth is "
850 "allowed. Ignoring the result and stopping now, "
851 "the current authentication result is not to be "
855 deferred_auth_done =
true;
875 else if (deferred_auth_done)
912 for (i = 0; i < pc->
n; ++i)
932 for (i = 0; i < pc->
n; ++i)
995 for (i = 0; i < src->
n; ++i)
1006 for (i = 0; i < pr->
n; ++i)
1015 plugin_return_print(
const int msglevel,
const char *prefix,
const struct plugin_return *pr)
1018 msg(msglevel,
"PLUGIN_RETURN_PRINT %s", prefix);
1019 for (i = 0; i < pr->
n; ++i)
1024 msg(msglevel,
"PLUGIN #%d (%s)", i, prefix);
1027 msg(msglevel,
"[%d] '%s' -> '%s'\n",
struct openvpn_plugin_string_list * list[MAX_PLUGINS]
struct gc_entry * list
First element of the linked list of gc_entry structures.
openvpn_plugin_open_v1 open1
struct plugin_list * plugin_list_init(const struct plugin_option_list *list)
int openvpn_base64_decode(const char *str, void *data, int size)
#define OPENVPN_PLUGIN_CLIENT_CONNECT_V2
#define OPENVPN_PLUGIN_LEARN_ADDRESS
#define OPENVPN_PLUGIN_UP
int plugin_call_ssl(const struct plugin_list *pl, const int type, const struct argv *av, struct plugin_return *pr, struct env_set *es, int certdepth, openvpn_x509_cert_t *current_cert)
static bool msg_test(unsigned int flags)
Return true if flags represent an enabled, not muted log level.
unsigned int plugin_type_mask
static void plugin_per_client_init(const struct plugin_common *pc, struct plugin_per_client *cli, const int init_point)
#define OPENVPN_PLUGIN_DOWN
static struct gc_arena gc_new(void)
static struct plugin_common * static_plugin_common
#define OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER
openvpn_plugin_abort_v1 abort
void x_msg_va(const unsigned int flags, const char *format, va_list arglist)
Arguments used to transport variables to the plug-in.
openvpn_plugin_handle_t plugin_handle
struct openvpn_plugin_string_list * next
#define OPENVPN_PLUGINv3_STRUCTVER
Defines version of the v3 plugin argument structs.
static void plugin_show_args_env(int msglevel, const char *argv[], const char *envp[])
static void plugin_return_init(struct plugin_return *pr)
const char ** make_extended_arg_array(char **p, bool is_inline, struct gc_arena *gc)
struct buffer alloc_buf_gc(size_t size, struct gc_arena *gc)
void argv_free(struct argv *a)
Frees all memory allocations allocated by the struct argv related functions.
openvpn_plugin_open_v2 open2
#define OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY
openvpn_plugin_select_initialization_point_v1 initialization_point
void plugin_list_open(struct plugin_list *pl, const struct plugin_option_list *list, struct plugin_return *pr, const struct env_set *es, const int init_point)
static struct plugin_common * plugin_common_init(const struct plugin_option_list *list)
int openvpn_base64_encode(const void *data, int size, char **str)
#define OPENVPN_VERSION_MINOR
static void plugin_log(openvpn_plugin_log_flags_t flags, const char *name, const char *format,...)
static void plugin_vlog(openvpn_plugin_log_flags_t flags, const char *name, const char *format, va_list arglist)
#define PLUGIN_SYM(var, name, flags)
openvpn_plugin_log_flags_t
Definitions needed for the plug-in callback functions.
#define OPENVPN_PLUGIN_MASK(x)
void plugin_option_list_print(const struct plugin_option_list *list, int msglevel)
openvpn_plugin_func_v2 func2
static struct openvpn_plugin_callbacks callbacks
void * per_client_context[MAX_PLUGINS]
static unsigned int plugin_supported_types(void)
static void secure_memzero(void *data, size_t len)
Securely zeroise memory.
static void plugin_abort_item(const struct plugin *p)
void string_clear(char *str)
#define OPENVPN_PLUGIN_FUNC_ERROR
struct plugin plugins[MAX_PLUGINS]
#define OPENVPN_PLUGIN_INIT_PRE_DAEMON
static void plugin_show_string_array(int msglevel, const char *name, const char *array[])
openvpn_plugin_close_v1 close
openvpn_x509_cert_t * current_cert
static struct openvpn_plugin_string_list * openvpn_plugin_string_list_find(struct openvpn_plugin_string_list *l, const char *name)
struct plugin_common * common
openvpn_plugin_client_destructor_v1 client_destructor
#define OPENVPN_PLUGIN_IPCHANGE
static int plugin_call_item(const struct plugin *p, void *per_client_context, const int type, const struct argv *av, struct openvpn_plugin_string_list **retlist, const char **envp, int certdepth, openvpn_x509_cert_t *current_cert)
void plugin_list_close(struct plugin_list *pl)
void plugin_return_free(struct plugin_return *pr)
#define OPENVPN_VERSION_MAJOR
#define OPENVPN_PLUGIN_FUNC_DEFERRED
struct plugin_list * plugin_list_inherit(const struct plugin_list *src)
#define ALLOC_OBJ_CLEAR_GC(dptr, type, gc)
struct openvpn_plugin_string_list ** return_list
WCHAR * wide_string(const char *utf8, struct gc_arena *gc)
#define OPENVPN_PLUGIN_ROUTE_UP
struct plugin_option_list * plugin_option_list_new(struct gc_arena *gc)
static void plugin_init_item(struct plugin *p, const struct plugin_option *o)
static void dll_resolve_symbol(HMODULE module, void **dest, const char *symbol, const char *plugin_name, const unsigned int flags)
void * per_client_context
#define OPENVPN_PLUGIN_TLS_VERIFY
struct argv argv_insert_head(const struct argv *a, const char *head)
Inserts an argument string in front of all other argument slots.
Wrapper structure for dynamically allocated memory.
openvpn_plugin_func_v1 func1
Garbage collection arena used to keep track of dynamically allocated memory.
Arguments used to transport variables to and from the plug-in.
static void plugin_common_close(struct plugin_common *pc)
bool plugin_option_list_add(struct plugin_option_list *list, char **p, struct gc_arena *gc)
#define PLUGIN_SYMBOL_REQUIRED
struct plugin_option plugins[MAX_PLUGINS]
static bool check_debug_level(unsigned int level)
void plugin_return_get_column(const struct plugin_return *src, struct plugin_return *dest, const char *colname)
int requested_initialization_point
static void openvpn_plugin_string_list_free(struct openvpn_plugin_string_list *l)
#define OPENVPN_PLUGIN_CLIENT_DISCONNECT
#define OPENVPN_PLUGIN_VERSION
void * gc_malloc(size_t size, bool clear, struct gc_arena *a)
static void openvpn_plugin_string_list_item_free(struct openvpn_plugin_string_list *l)
Arguments used to transport variables from the plug-in back to the OpenVPN process.
Arguments used to transport variables to and from the plug-in.
static void plugin_close_item(struct plugin *p)
openvpn_plugin_handle_t handle
bool openvpn_snprintf(char *str, size_t size, const char *format,...)
static SERVICE_STATUS status
struct plugin_per_client per_client
static void gc_free(struct gc_arena *a)
openvpn_plugin_open_v3 open3
openvpn_plugin_client_constructor_v1 client_constructor
static int plugin_n(const struct plugin_list *pl)
#define ALLOC_OBJ_CLEAR(dptr, type)
#define _OPENVPN_PATCH_LEVEL
#define OPENVPN_PLUGIN_FUNC_SUCCESS
#define OPENVPN_PLUGIN_TLS_FINAL
static void gc_init(struct gc_arena *a)
openvpn_plugin_func_v3 func3
static void plugin_per_client_destroy(const struct plugin_common *pc, struct plugin_per_client *cli)
#define OPENVPN_PLUGIN_ROUTE_PREDOWN
bool plugin_defined(const struct plugin_list *pl, const int type)
struct openvpn_plugin_string_list ** return_list
char * print_argv(const char **p, struct gc_arena *gc, const unsigned int flags)
Used by the openvpn_plugin_open_v3() function to pass callback function pointers to the plug-in.
void setenv_del(struct env_set *es, const char *name)
static const char * plugin_mask_string(const unsigned int type_mask, struct gc_arena *gc)
#define OPENVPN_PLUGIN_CLIENT_CONNECT
openvpn_plugin_min_version_required_v1 min_version_required
static bool env_safe_to_print(const char *str)
const char ** make_env_array(const struct env_set *es, const bool check_allowed, struct gc_arena *gc)
static void plugin_open_item(struct plugin *p, const struct plugin_option *o, struct openvpn_plugin_string_list **retlist, const char **envp, const int init_point)
bool buf_printf(struct buffer *buf, const char *format,...)
static const char * plugin_type_name(const int type)
static void plugin_common_open(struct plugin_common *pc, const struct plugin_option_list *list, struct plugin_return *pr, const struct env_set *es, const int init_point)
#define OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2