48#include "openvpn-plugin.h"
85get_env(
const char *name,
const char *envp[])
90 const int namelen = strlen(name);
91 for (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_in
const *args,
124 struct openvpn_plugin_args_open_return *ret)
127 const char **envp = args->envp;
132 fprintf(stderr,
"sample-client-connect: this plugin is incompatible with the running version of OpenVPN\n");
133 return OPENVPN_PLUGIN_FUNC_ERROR;
149 OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_UP)
150 |OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_DOWN)
151 |OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_ROUTE_UP)
152 |OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_IPCHANGE)
153 |OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_TLS_VERIFY)
154 |OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_CLIENT_CONNECT)
155 |OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_CLIENT_CONNECT_V2)
156 |OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2)
157 |OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_CLIENT_DISCONNECT)
158 |OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_LEARN_ADDRESS)
159 |OPENVPN_PLUGIN_MASK(OPENVPN_PLUGIN_TLS_FINAL);
171 ret->handle = (openvpn_plugin_handle_t *)
context;
173 return OPENVPN_PLUGIN_FUNC_SUCCESS;
177 return OPENVPN_PLUGIN_FUNC_ERROR;
210 return OPENVPN_PLUGIN_FUNC_SUCCESS;
213 FILE *fp = fopen(name,
"w");
217 return OPENVPN_PLUGIN_FUNC_ERROR;
221 const char *p =
get_env(
"plugin_cc_config", envp);
224 fprintf(fp,
"%s\n", p);
228 fprintf(fp,
"push \"echo sample-cc plugin 1 called\"\n");
231 if (
get_env(
"UV_WANT_CC_DISABLE", envp))
234 fprintf(fp,
"disable\n");
238 return OPENVPN_PLUGIN_FUNC_SUCCESS;
244 const char *ccd_file =
get_env(
"client_connect_deferred_file", envp);
248 "'client_connect_deferred_file' not set -> fail", seconds);
249 return OPENVPN_PLUGIN_FUNC_ERROR;
259 int fd = open(ccd_file, O_WRONLY);
263 return OPENVPN_PLUGIN_FUNC_ERROR;
266 if (
write(fd,
"2", 1) != 1)
270 return OPENVPN_PLUGIN_FUNC_ERROR;
284 return OPENVPN_PLUGIN_FUNC_ERROR;
288 waitpid(p1, NULL, 0);
289 return OPENVPN_PLUGIN_FUNC_DEFERRED;
311 plugin_log(PLOG_NOTE,
MODULE,
"in async/deferred handler, sleep(%d)", seconds);
318 const char *p =
get_env(
"UV_WANT_CC_FAIL", envp);
322 ret = OPENVPN_PLUGIN_FUNC_ERROR;
326 fd = open(ccd_file, O_WRONLY);
334 (ret == OPENVPN_PLUGIN_FUNC_SUCCESS) ?
"success" :
"fail" );
336 if (
write(fd, (ret == OPENVPN_PLUGIN_FUNC_SUCCESS) ?
"1" :
"0", 1) != 1)
355 for (
int i = 0;
argv[i]; i++)
359 for (
int i = 0; envp[i]; i++)
366 const char *p =
get_env(
"UV_WANT_CC_ASYNC", envp);
379 p =
get_env(
"UV_WANT_CC_FAIL", envp);
383 return OPENVPN_PLUGIN_FUNC_ERROR;
396 struct openvpn_plugin_string_list **return_list)
399 const char *want_async =
get_env(
"UV_WANT_CC2_ASYNC", envp);
400 const char *want_fail =
get_env(
"UV_WANT_CC2_FAIL", envp);
401 const char *want_disable =
get_env(
"UV_WANT_CC2_DISABLE", envp);
408 const char *client_config =
get_env(
"plugin_cc2_config", envp);
412 client_config =
"push \"setenv CC2 MOOH\"\n";
425 plugin_log(PLOG_NOTE,
MODULE,
"env has UV_WANT_CC2_ASYNC=%s -> set up deferred handler", want_async);
426 return OPENVPN_PLUGIN_FUNC_DEFERRED;
432 plugin_log(PLOG_NOTE,
MODULE,
"env has UV_WANT_CC2_FAIL=%s -> fail", want_fail);
433 return OPENVPN_PLUGIN_FUNC_ERROR;
436 struct openvpn_plugin_string_list *rl =
437 calloc(1,
sizeof(
struct openvpn_plugin_string_list));
441 return OPENVPN_PLUGIN_FUNC_ERROR;
443 rl->name = strdup(
"config");
447 rl->value = strdup(
"disable\n");
451 rl->value = strdup(client_config);
454 if (!rl->name || !rl->value)
460 return OPENVPN_PLUGIN_FUNC_ERROR;
465 return OPENVPN_PLUGIN_FUNC_SUCCESS;
471 struct openvpn_plugin_string_list
481 return OPENVPN_PLUGIN_FUNC_DEFERRED;
488 return OPENVPN_PLUGIN_FUNC_ERROR;
494 struct openvpn_plugin_string_list *rl =
495 calloc(1,
sizeof(
struct openvpn_plugin_string_list));
499 return OPENVPN_PLUGIN_FUNC_ERROR;
501 rl->name = strdup(
"config");
505 rl->value = strdup(
"disable\n");
512 if (!rl->name || !rl->value)
518 return OPENVPN_PLUGIN_FUNC_ERROR;
523 return OPENVPN_PLUGIN_FUNC_SUCCESS;
531 void *per_client_context,
532 struct openvpn_plugin_string_list **return_list)
543 case OPENVPN_PLUGIN_UP:
547 case OPENVPN_PLUGIN_DOWN:
551 case OPENVPN_PLUGIN_ROUTE_UP:
555 case OPENVPN_PLUGIN_IPCHANGE:
559 case OPENVPN_PLUGIN_TLS_VERIFY:
563 case OPENVPN_PLUGIN_CLIENT_CONNECT:
567 case OPENVPN_PLUGIN_CLIENT_CONNECT_V2:
572 case OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2:
577 case OPENVPN_PLUGIN_CLIENT_DISCONNECT:
581 case OPENVPN_PLUGIN_LEARN_ADDRESS:
585 case OPENVPN_PLUGIN_TLS_FINAL:
592 return OPENVPN_PLUGIN_FUNC_SUCCESS;
598 printf(
"FUNC: openvpn_plugin_client_constructor_v1\n");
605 printf(
"FUNC: openvpn_plugin_client_destructor_v1\n");
606 free(per_client_context);
613 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