/*
 *  OpenVPN -- An application to securely tunnel IP networks
 *             over a single TCP/UDP port, with support for SSL/TLS-based
 *             session authentication and key exchange,
 *             packet encryption, packet authentication, and
 *             packet compression.
 *
 *  Copyright (C) 2002-2018 OpenVPN Inc <sales@openvpn.net>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2
 *  as published by the Free Software Foundation.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

/*
 * plug-in support, using dynamically loaded libraries
 */

#ifndef OPENVPN_PLUGIN_H
#define OPENVPN_PLUGIN_H

#ifdef ENABLE_CRYPTO_OPENSSL
#include "ssl_verify_openssl.h"
#endif
#ifdef ENABLE_CRYPTO_MBEDTLS
#include "ssl_verify_mbedtls.h"
#endif
#include "openvpn-plugin.h"

#ifdef ENABLE_PLUGIN

#include "misc.h"

#define MAX_PLUGINS 16

struct plugin_option {
    const char *so_pathname;
    const char **argv;
};

struct plugin_option_list {
    int n;
    struct plugin_option plugins[MAX_PLUGINS];
};

struct plugin {
    bool initialized;
    const char *so_pathname;
    unsigned int plugin_type_mask;
    int requested_initialization_point;

#ifndef _WIN32
    void *handle;
#else
    HMODULE module;
#endif

    openvpn_plugin_open_v1 open1;
    openvpn_plugin_open_v2 open2;
    openvpn_plugin_open_v3 open3;
    openvpn_plugin_func_v1 func1;
    openvpn_plugin_func_v2 func2;
    openvpn_plugin_func_v3 func3;
    openvpn_plugin_close_v1 close;
    openvpn_plugin_abort_v1 abort;
    openvpn_plugin_client_constructor_v1 client_constructor;
    openvpn_plugin_client_destructor_v1 client_destructor;
    openvpn_plugin_min_version_required_v1 min_version_required;
    openvpn_plugin_select_initialization_point_v1 initialization_point;

    openvpn_plugin_handle_t plugin_handle;
};

struct plugin_per_client
{
    void *per_client_context[MAX_PLUGINS];
};

struct plugin_common
{
    int n;
    struct plugin plugins[MAX_PLUGINS];
};

struct plugin_list
{
    struct plugin_per_client per_client;
    struct plugin_common *common;
    bool common_owned;
};

struct plugin_return
{
    int n;
    struct openvpn_plugin_string_list *list[MAX_PLUGINS];
};

struct plugin_option_list *plugin_option_list_new(struct gc_arena *gc);

bool plugin_option_list_add(struct plugin_option_list *list, char **p, struct gc_arena *gc);

#ifndef ENABLE_SMALL
void plugin_option_list_print(const struct plugin_option_list *list, int msglevel);

#endif

struct plugin_list *plugin_list_init(const struct plugin_option_list *list);

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);

struct plugin_list *plugin_list_inherit(const struct plugin_list *src);

int plugin_call_ssl(const struct plugin_list *pl,
                    const int type,
                    const struct argv *av,
                    struct plugin_return *pr,
                    struct env_set *es
#ifdef ENABLE_CRYPTO
                    , int current_cert_depth,
                    openvpn_x509_cert_t *current_cert
#endif
                    );

void plugin_list_close(struct plugin_list *pl);

bool plugin_defined(const struct plugin_list *pl, const int type);

void plugin_return_get_column(const struct plugin_return *src,
                              struct plugin_return *dest,
                              const char *colname);

void plugin_return_free(struct plugin_return *pr);

#ifdef ENABLE_DEBUG
void plugin_return_print(const int msglevel, const char *prefix, const struct plugin_return *pr);

#endif

static inline int
plugin_n(const struct plugin_list *pl)
{
    if (pl && pl->common)
    {
        return pl->common->n;
    }
    else
    {
        return 0;
    }
}

static inline bool
plugin_return_defined(const struct plugin_return *pr)
{
    return pr->n >= 0;
}

static inline void
plugin_return_init(struct plugin_return *pr)
{
    pr->n = 0;
}

#else  /* ifdef ENABLE_PLUGIN */
struct plugin_list { int dummy; };
struct plugin_return { int dummy; };

static inline bool
plugin_defined(const struct plugin_list *pl, const int type)
{
    return false;
}

static inline int
plugin_call_ssl(const struct plugin_list *pl,
                const int type,
                const struct argv *av,
                struct plugin_return *pr,
                struct env_set *es
#ifdef ENABLE_CRYPTO
                , int current_cert_depth,
                openvpn_x509_cert_t *current_cert
#endif
                )
{
    return 0;
}

#endif /* ENABLE_PLUGIN */

static inline int
plugin_call(const struct plugin_list *pl,
            const int type,
            const struct argv *av,
            struct plugin_return *pr,
            struct env_set *es)
{
    return plugin_call_ssl(pl, type, av, pr, es
#ifdef ENABLE_CRYPTO
                           , -1, NULL
#endif
                           );
}

#endif /* OPENVPN_PLUGIN_H */
