~smoser/ubuntu/oneiric/openvpn/lp-794916

« back to all changes in this revision

Viewing changes to plugin/examples/log.c

  • Committer: Bazaar Package Importer
  • Author(s): Alberto Gonzalez Iniesta
  • Date: 2008-08-16 13:34:24 UTC
  • mfrom: (1.1.10 upstream)
  • Revision ID: james.westby@ubuntu.com-20080816133424-0i83yb6dw4hjglo1
Tags: 2.1~rc9-3
* debian/rules: run ./configure with path to 'route', for
  those build daemons without 'route'. (Closes: #495082)
* Created NEWS.Debian with info on new option script-security.
  (Closes: #494998)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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-2008 Telethra, 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
 
20
 *  along with this program (see the file COPYING included with this
 
21
 *  distribution); if not, write to the Free Software Foundation, Inc.,
 
22
 *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
23
 */
 
24
 
 
25
/*
 
26
 * This plugin is similar to simple.c, except it also logs extra information
 
27
 * to stdout for every plugin method called by OpenVPN.
 
28
 *
 
29
 * See the README file for build instructions.
 
30
 */
 
31
 
 
32
#include <stdio.h>
 
33
#include <string.h>
 
34
#include <stdlib.h>
 
35
 
 
36
#include "openvpn-plugin.h"
 
37
 
 
38
/*
 
39
 * Our context, where we keep our state.
 
40
 */
 
41
struct plugin_context {
 
42
  const char *username;
 
43
  const char *password;
 
44
};
 
45
 
 
46
/*
 
47
 * Given an environmental variable name, search
 
48
 * the envp array for its value, returning it
 
49
 * if found or NULL otherwise.
 
50
 */
 
51
static const char *
 
52
get_env (const char *name, const char *envp[])
 
53
{
 
54
  if (envp)
 
55
    {
 
56
      int i;
 
57
      const int namelen = strlen (name);
 
58
      for (i = 0; envp[i]; ++i)
 
59
        {
 
60
          if (!strncmp (envp[i], name, namelen))
 
61
            {
 
62
              const char *cp = envp[i] + namelen;
 
63
              if (*cp == '=')
 
64
                return cp + 1;
 
65
            }
 
66
        }
 
67
    }
 
68
  return NULL;
 
69
}
 
70
 
 
71
OPENVPN_EXPORT openvpn_plugin_handle_t
 
72
openvpn_plugin_open_v1 (unsigned int *type_mask, const char *argv[], const char *envp[])
 
73
{
 
74
  struct plugin_context *context;
 
75
 
 
76
  /*
 
77
   * Allocate our context
 
78
   */
 
79
  context = (struct plugin_context *) calloc (1, sizeof (struct plugin_context));
 
80
 
 
81
  /*
 
82
   * Set the username/password we will require.
 
83
   */
 
84
  context->username = "foo";
 
85
  context->password = "bar";
 
86
 
 
87
  /*
 
88
   * Which callbacks to intercept.
 
89
   */
 
90
  *type_mask =
 
91
    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_UP) |
 
92
    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_DOWN) |
 
93
    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_ROUTE_UP) |
 
94
    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_IPCHANGE) |
 
95
    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_VERIFY) |
 
96
    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY) |
 
97
    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_CONNECT_V2) |
 
98
    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_CLIENT_DISCONNECT) |
 
99
    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_LEARN_ADDRESS) |
 
100
    OPENVPN_PLUGIN_MASK (OPENVPN_PLUGIN_TLS_FINAL);
 
101
 
 
102
  return (openvpn_plugin_handle_t) context;
 
103
}
 
104
 
 
105
void
 
106
show (const int type, const char *argv[], const char *envp[])
 
107
{
 
108
  size_t i;
 
109
  switch (type)
 
110
    {
 
111
    case OPENVPN_PLUGIN_UP:
 
112
      printf ("OPENVPN_PLUGIN_UP\n");
 
113
      break;
 
114
    case OPENVPN_PLUGIN_DOWN:
 
115
      printf ("OPENVPN_PLUGIN_DOWN\n");
 
116
      break;
 
117
    case OPENVPN_PLUGIN_ROUTE_UP:
 
118
      printf ("OPENVPN_PLUGIN_ROUTE_UP\n");
 
119
      break;
 
120
    case OPENVPN_PLUGIN_IPCHANGE:
 
121
      printf ("OPENVPN_PLUGIN_IPCHANGE\n");
 
122
      break;
 
123
    case OPENVPN_PLUGIN_TLS_VERIFY:
 
124
      printf ("OPENVPN_PLUGIN_TLS_VERIFY\n");
 
125
      break;
 
126
    case OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY:
 
127
      printf ("OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY\n");
 
128
      break;
 
129
    case OPENVPN_PLUGIN_CLIENT_CONNECT_V2:
 
130
      printf ("OPENVPN_PLUGIN_CLIENT_CONNECT_V2\n");
 
131
      break;
 
132
    case OPENVPN_PLUGIN_CLIENT_DISCONNECT:
 
133
      printf ("OPENVPN_PLUGIN_CLIENT_DISCONNECT\n");
 
134
      break;
 
135
    case OPENVPN_PLUGIN_LEARN_ADDRESS:
 
136
      printf ("OPENVPN_PLUGIN_LEARN_ADDRESS\n");
 
137
      break;
 
138
    case OPENVPN_PLUGIN_TLS_FINAL:
 
139
      printf ("OPENVPN_PLUGIN_TLS_FINAL\n");
 
140
      break;
 
141
    default:
 
142
      printf ("OPENVPN_PLUGIN_?\n");
 
143
      break;
 
144
    }
 
145
 
 
146
  printf ("ARGV\n");
 
147
  for (i = 0; argv[i] != NULL; ++i)
 
148
    printf ("%d '%s'\n", (int)i, argv[i]);
 
149
 
 
150
  printf ("ENVP\n");
 
151
  for (i = 0; envp[i] != NULL; ++i)
 
152
    printf ("%d '%s'\n", (int)i, envp[i]);
 
153
}
 
154
 
 
155
OPENVPN_EXPORT int
 
156
openvpn_plugin_func_v1 (openvpn_plugin_handle_t handle, const int type, const char *argv[], const char *envp[])
 
157
{
 
158
  struct plugin_context *context = (struct plugin_context *) handle;
 
159
 
 
160
  show (type, argv, envp);
 
161
 
 
162
  /* check entered username/password against what we require */
 
163
  if (type == OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY)
 
164
    {
 
165
      /* get username/password from envp string array */
 
166
      const char *username = get_env ("username", envp);
 
167
      const char *password = get_env ("password", envp);
 
168
 
 
169
      if (username && !strcmp (username, context->username)
 
170
          && password && !strcmp (password, context->password))
 
171
        return OPENVPN_PLUGIN_FUNC_SUCCESS;
 
172
      else
 
173
        return OPENVPN_PLUGIN_FUNC_ERROR;
 
174
    }
 
175
  else
 
176
    return OPENVPN_PLUGIN_FUNC_SUCCESS;
 
177
}
 
178
 
 
179
OPENVPN_EXPORT void
 
180
openvpn_plugin_close_v1 (openvpn_plugin_handle_t handle)
 
181
{
 
182
  struct plugin_context *context = (struct plugin_context *) handle;
 
183
  free (context);
 
184
}