OpenVPN
plugin.h
Go to the documentation of this file.
1/*
2 * OpenVPN -- An application to securely tunnel IP networks
3 * over a single TCP/UDP port, with support for SSL/TLS-based
4 * session authentication and key exchange,
5 * packet encryption, packet authentication, and
6 * packet compression.
7 *
8 * Copyright (C) 2002-2025 OpenVPN Inc <sales@openvpn.net>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2
12 * as published by the Free Software Foundation.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, see <https://www.gnu.org/licenses/>.
21 */
22
23/*
24 * plug-in support, using dynamically loaded libraries
25 */
26
27#ifndef OPENVPN_PLUGIN_H
28#define OPENVPN_PLUGIN_H
29
30#ifdef ENABLE_CRYPTO_OPENSSL
31#include "ssl_verify_openssl.h"
32#endif
33#ifdef ENABLE_CRYPTO_MBEDTLS
34#include "ssl_verify_mbedtls.h"
35#endif
36#include "openvpn-plugin.h"
37
38#ifdef ENABLE_PLUGIN
39
40#include "misc.h"
41
42#define MAX_PLUGINS 16
43
45{
46 const char *so_pathname;
47 const char **argv;
48};
49
55
56struct plugin
57{
59 const char *so_pathname;
60 unsigned int plugin_type_mask;
62
63#ifndef _WIN32
64 void *handle;
65#else
66 HMODULE module;
67#endif
68
70 openvpn_plugin_open_v2 open2;
80 openvpn_plugin_select_initialization_point_v1 initialization_point;
81
82 openvpn_plugin_handle_t plugin_handle;
83};
84
89
91{
92 int n;
94};
95
102
104{
105 int n;
106 struct openvpn_plugin_string_list *list[MAX_PLUGINS];
107};
108
110
111bool plugin_option_list_add(struct plugin_option_list *list, char **p, struct gc_arena *gc);
112
113#ifndef ENABLE_SMALL
114void plugin_option_list_print(const struct plugin_option_list *list, int msglevel);
115
116#endif
117
118struct plugin_list *plugin_list_init(const struct plugin_option_list *list);
119
120void plugin_list_open(struct plugin_list *pl, const struct plugin_option_list *list,
121 struct plugin_return *pr, const struct env_set *es, const int init_point);
122
123struct plugin_list *plugin_list_inherit(const struct plugin_list *src);
124
125int plugin_call_ssl(const struct plugin_list *pl, const int type, const struct argv *av,
126 struct plugin_return *pr, struct env_set *es, int current_cert_depth,
127 openvpn_x509_cert_t *current_cert);
128
129void plugin_list_close(struct plugin_list *pl);
130
131bool plugin_defined(const struct plugin_list *pl, const int type);
132
133void plugin_return_get_column(const struct plugin_return *src, struct plugin_return *dest,
134 const char *colname);
135
136void plugin_return_free(struct plugin_return *pr);
137
138#ifdef ENABLE_DEBUG
139void plugin_return_print(const int msglevel, const char *prefix, const struct plugin_return *pr);
140
141#endif
142
143static inline int
144plugin_n(const struct plugin_list *pl)
145{
146 if (pl && pl->common)
147 {
148 return pl->common->n;
149 }
150 else
151 {
152 return 0;
153 }
154}
155
156static inline bool
158{
159 return pr->n >= 0;
160}
161
162static inline void
164{
165 pr->n = 0;
166}
167
168#else /* ifdef ENABLE_PLUGIN */
169struct plugin_list
170{
171 int dummy;
172};
173struct plugin_return
174{
175 int dummy;
176};
177
178static inline bool
179plugin_defined(const struct plugin_list *pl, const int type)
180{
181 return false;
182}
183
184static inline int
185plugin_call_ssl(const struct plugin_list *pl, const int type, const struct argv *av,
186 struct plugin_return *pr, struct env_set *es, int current_cert_depth,
187 openvpn_x509_cert_t *current_cert)
188{
189 return 0;
190}
191
192#endif /* ENABLE_PLUGIN */
193
194static inline int
195plugin_call(const struct plugin_list *pl, const int type, const struct argv *av,
196 struct plugin_return *pr, struct env_set *es)
197{
198 return plugin_call_ssl(pl, type, av, pr, es, -1, NULL);
199}
200
201void plugin_abort(void);
202
203#endif /* OPENVPN_PLUGIN_H */
OPENVPN_EXPORT void openvpn_plugin_abort_v1(openvpn_plugin_handle_t handle)
Definition auth-pam.c:636
OPENVPN_EXPORT int openvpn_plugin_func_v1(openvpn_plugin_handle_t handle, const int type, const char *argv[], const char *envp[])
Definition log.c:173
OPENVPN_EXPORT openvpn_plugin_handle_t openvpn_plugin_open_v1(unsigned int *type_mask, const char *argv[], const char *envp[])
Definition log.c:72
OPENVPN_EXPORT int openvpn_plugin_func_v3(const int v3structver, struct openvpn_plugin_args_func_in const *args, struct openvpn_plugin_args_func_return *ret)
Definition multi-auth.c:373
OPENVPN_EXPORT int openvpn_plugin_min_version_required_v1(void)
Definition multi-auth.c:173
void plugin_list_close(struct plugin_list *pl)
Definition plugin.c:869
void plugin_abort(void)
Definition plugin.c:888
struct plugin_option_list * plugin_option_list_new(struct gc_arena *gc)
Definition plugin.c:159
bool plugin_option_list_add(struct plugin_option_list *list, char **p, struct gc_arena *gc)
Definition plugin.c:167
#define MAX_PLUGINS
Definition plugin.h:42
static int plugin_n(const struct plugin_list *pl)
Definition plugin.h:144
static void plugin_return_init(struct plugin_return *pr)
Definition plugin.h:163
void plugin_return_free(struct plugin_return *pr)
Definition plugin.c:986
struct plugin_list * plugin_list_inherit(const struct plugin_list *src)
Definition plugin.c:690
static int plugin_call(const struct plugin_list *pl, const int type, const struct argv *av, struct plugin_return *pr, struct env_set *es)
Definition plugin.h:195
static bool plugin_return_defined(const struct plugin_return *pr)
Definition plugin.h:157
struct plugin_list * plugin_list_init(const struct plugin_option_list *list)
Definition plugin.c:764
void plugin_return_get_column(const struct plugin_return *src, struct plugin_return *dest, const char *colname)
Definition plugin.c:972
void plugin_option_list_print(const struct plugin_option_list *list, int msglevel)
Definition plugin.c:187
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 current_cert_depth, openvpn_x509_cert_t *current_cert)
Definition plugin.c:782
bool plugin_defined(const struct plugin_list *pl, const int type)
Definition plugin.c:904
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)
Definition plugin.c:774
OPENVPN_EXPORT void openvpn_plugin_close_v1(openvpn_plugin_handle_t handle)
OPENVPN_EXPORT void openvpn_plugin_client_destructor_v1(openvpn_plugin_handle_t handle, void *per_client_context)
OPENVPN_EXPORT int openvpn_plugin_func_v2(openvpn_plugin_handle_t handle, const int type, const char *argv[], const char *envp[], void *per_client_context, struct openvpn_plugin_string_list **return_list)
OPENVPN_EXPORT void * openvpn_plugin_client_constructor_v1(openvpn_plugin_handle_t handle)
OPENVPN_EXPORT int openvpn_plugin_open_v3(const int v3structver, struct openvpn_plugin_args_open_in const *args, struct openvpn_plugin_args_open_return *ret)
Control Channel Verification Module mbed TLS backend.
mbedtls_x509_crt openvpn_x509_cert_t
Control Channel Verification Module OpenSSL backend.
Definition argv.h:35
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:116
struct plugin plugins[MAX_PLUGINS]
Definition plugin.h:93
struct plugin_common * common
Definition plugin.h:99
bool common_owned
Definition plugin.h:100
struct plugin_per_client per_client
Definition plugin.h:98
struct plugin_option plugins[MAX_PLUGINS]
Definition plugin.h:53
const char ** argv
Definition plugin.h:47
const char * so_pathname
Definition plugin.h:46
void * per_client_context[MAX_PLUGINS]
Definition plugin.h:87
struct openvpn_plugin_string_list * list[MAX_PLUGINS]
Definition plugin.h:106
openvpn_plugin_abort_v1 abort
Definition plugin.h:76
HMODULE openvpn_plugin_open_v1 open1
Definition plugin.h:69
openvpn_plugin_select_initialization_point_v1 initialization_point
Definition plugin.h:80
openvpn_plugin_close_v1 close
Definition plugin.h:75
openvpn_plugin_handle_t plugin_handle
Definition plugin.h:82
int requested_initialization_point
Definition plugin.h:61
bool initialized
Definition plugin.h:58
openvpn_plugin_open_v3 open3
Definition plugin.h:71
openvpn_plugin_open_v2 open2
Definition plugin.h:70
openvpn_plugin_client_destructor_v1 client_destructor
Definition plugin.h:78
unsigned int plugin_type_mask
Definition plugin.h:60
openvpn_plugin_min_version_required_v1 min_version_required
Definition plugin.h:79
const char * so_pathname
Definition plugin.h:59
openvpn_plugin_client_constructor_v1 client_constructor
Definition plugin.h:77
openvpn_plugin_func_v1 func1
Definition plugin.h:72
openvpn_plugin_func_v2 func2
Definition plugin.h:73
openvpn_plugin_func_v3 func3
Definition plugin.h:74
struct env_set * es
struct gc_arena gc
Definition test_ssl.c:154