47#include "openvpn-plugin.h"
86get_env(
const char *name,
const char *envp[])
90 const size_t namelen = strlen(name);
91 for (
int i = 0; envp[
i]; ++
i)
93 if (!strncmp(envp[
i], name, namelen))
95 const char *cp = envp[
i] + namelen;
123 struct openvpn_plugin_args_open_return *ret)
126 const char **envp = args->envp;
132 "sample-client-connect: this plugin is incompatible with the running version of OpenVPN\n");
133 return OPENVPN_PLUGIN_FUNC_ERROR;
148 ret->type_mask = OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_UP)
149 | OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_DOWN)
150 | OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_ROUTE_UP)
151 | OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_IPCHANGE)
152 | OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_TLS_VERIFY)
153 | OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_CLIENT_CONNECT)
154 | OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_CLIENT_CONNECT_V2)
155 | OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2)
156 | OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_CLIENT_DISCONNECT)
157 | OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_LEARN_ADDRESS)
158 | OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_TLS_FINAL);
170 ret->handle = (openvpn_plugin_handle_t *)
context;
172 return OPENVPN_PLUGIN_FUNC_SUCCESS;
176 return OPENVPN_PLUGIN_FUNC_ERROR;
209 return OPENVPN_PLUGIN_FUNC_SUCCESS;
212 FILE *fp = fopen(name,
"w");
216 return OPENVPN_PLUGIN_FUNC_ERROR;
220 const char *p =
get_env(
"plugin_cc_config", envp);
223 fprintf(fp,
"%s\n", p);
227 fprintf(fp,
"push \"echo sample-cc plugin 1 called\"\n");
230 if (
get_env(
"UV_WANT_CC_DISABLE", envp))
233 fprintf(fp,
"disable\n");
237 return OPENVPN_PLUGIN_FUNC_SUCCESS;
243 const char *ccd_file =
get_env(
"client_connect_deferred_file", envp);
247 "env has UV_WANT_CC_ASYNC=%d, but "
248 "'client_connect_deferred_file' not set -> fail",
250 return OPENVPN_PLUGIN_FUNC_ERROR;
260 int fd = open(ccd_file, O_WRONLY);
264 return OPENVPN_PLUGIN_FUNC_ERROR;
267 if (
write(fd,
"2", 1) != 1)
269 plugin_log(PLOG_ERR | PLOG_ERRNO,
MODULE,
"write to '%s' failed", ccd_file);
271 return OPENVPN_PLUGIN_FUNC_ERROR;
285 return OPENVPN_PLUGIN_FUNC_ERROR;
289 waitpid(p1, NULL, 0);
290 return OPENVPN_PLUGIN_FUNC_DEFERRED;
312 plugin_log(PLOG_NOTE,
MODULE,
"in async/deferred handler, sleep(%d)", seconds);
313 sleep((
unsigned int)seconds);
319 const char *p =
get_env(
"UV_WANT_CC_FAIL", envp);
323 ret = OPENVPN_PLUGIN_FUNC_ERROR;
327 fd = open(ccd_file, O_WRONLY);
335 (ret == OPENVPN_PLUGIN_FUNC_SUCCESS) ?
"success" :
"fail");
337 if (
write(fd, (ret == OPENVPN_PLUGIN_FUNC_SUCCESS) ?
"1" :
"0", 1) != 1)
339 plugin_log(PLOG_ERR | PLOG_ERRNO,
MODULE,
"write to '%s' failed", ccd_file);
358 for (
int i = 0; envp[
i];
i++)
365 const char *p =
get_env(
"UV_WANT_CC_ASYNC", envp);
378 p =
get_env(
"UV_WANT_CC_FAIL", envp);
382 return OPENVPN_PLUGIN_FUNC_ERROR;
394 struct openvpn_plugin_string_list **return_list)
397 const char *want_async =
get_env(
"UV_WANT_CC2_ASYNC", envp);
398 const char *want_fail =
get_env(
"UV_WANT_CC2_FAIL", envp);
399 const char *want_disable =
get_env(
"UV_WANT_CC2_DISABLE", envp);
406 const char *client_config =
get_env(
"plugin_cc2_config", envp);
410 client_config =
"push \"setenv CC2 MOOH\"\n";
423 plugin_log(PLOG_NOTE,
MODULE,
"env has UV_WANT_CC2_ASYNC=%s -> set up deferred handler",
425 return OPENVPN_PLUGIN_FUNC_DEFERRED;
431 plugin_log(PLOG_NOTE,
MODULE,
"env has UV_WANT_CC2_FAIL=%s -> fail", want_fail);
432 return OPENVPN_PLUGIN_FUNC_ERROR;
435 struct openvpn_plugin_string_list *rl = calloc(1,
sizeof(
struct openvpn_plugin_string_list));
439 return OPENVPN_PLUGIN_FUNC_ERROR;
441 rl->name = strdup(
"config");
445 rl->value = strdup(
"disable\n");
449 rl->value = strdup(client_config);
452 if (!rl->name || !rl->value)
458 return OPENVPN_PLUGIN_FUNC_ERROR;
463 return OPENVPN_PLUGIN_FUNC_SUCCESS;
469 struct openvpn_plugin_string_list **return_list)
477 return OPENVPN_PLUGIN_FUNC_DEFERRED;
484 return OPENVPN_PLUGIN_FUNC_ERROR;
490 struct openvpn_plugin_string_list *rl = calloc(1,
sizeof(
struct openvpn_plugin_string_list));
494 return OPENVPN_PLUGIN_FUNC_ERROR;
496 rl->name = strdup(
"config");
500 rl->value = strdup(
"disable\n");
507 if (!rl->name || !rl->value)
513 return OPENVPN_PLUGIN_FUNC_ERROR;
518 return OPENVPN_PLUGIN_FUNC_SUCCESS;
523 const char *envp[],
void *per_client_context,
524 struct openvpn_plugin_string_list **return_list)
535 case OPENVPN_PLUGIN_UP:
539 case OPENVPN_PLUGIN_DOWN:
543 case OPENVPN_PLUGIN_ROUTE_UP:
547 case OPENVPN_PLUGIN_IPCHANGE:
551 case OPENVPN_PLUGIN_TLS_VERIFY:
555 case OPENVPN_PLUGIN_CLIENT_CONNECT:
559 case OPENVPN_PLUGIN_CLIENT_CONNECT_V2:
563 case OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2:
567 case OPENVPN_PLUGIN_CLIENT_DISCONNECT:
571 case OPENVPN_PLUGIN_LEARN_ADDRESS:
575 case OPENVPN_PLUGIN_TLS_FINAL:
582 return OPENVPN_PLUGIN_FUNC_SUCCESS;
588 printf(
"FUNC: openvpn_plugin_client_constructor_v1\n");
595 printf(
"FUNC: openvpn_plugin_client_destructor_v1\n");
596 free(per_client_context);
603 printf(
"FUNC: openvpn_plugin_close_v1\n");
OPENVPN_EXPORT void openvpn_plugin_close_v1(openvpn_plugin_handle_t handle)
static plugin_log_t plugin_log
int openvpn_plugin_client_connect_defer_v2(struct plugin_context *context, struct plugin_per_client_context *pcc, struct openvpn_plugin_string_list **return_list)
int cc_handle_deferred_v1(int seconds, const char *name, const char **envp)
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)
static plugin_secure_memzero_t plugin_secure_memzero
int write_cc_options_file(const char *name, const char **envp)
static const char * get_env(const char *name, const char *envp[])
static plugin_base64_decode_t plugin_base64_decode
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)
int openvpn_plugin_client_connect_v2(struct plugin_context *context, struct plugin_per_client_context *pcc, const char **envp, struct openvpn_plugin_string_list **return_list)
int openvpn_plugin_client_connect(struct plugin_context *context, const char **argv, const char **envp)
static int atoi_null0(const char *str)
Contains all state information for one tunnel.
const char * client_config