Skip to content

Latest commit

 

History

History
267 lines (232 loc) · 6.4 KB

library.c

File metadata and controls

267 lines (232 loc) · 6.4 KB
 
1
2
3
/*
* OpenConnect (SSL + DTLS) VPN client
*
May 13, 2012
May 13, 2012
4
* Copyright © 2008-2012 Intel Corporation.
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
*
* Authors: David Woodhouse <dwmw2@infradead.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* version 2.1, 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to:
*
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
Apr 11, 2012
Apr 11, 2012
25
#include <string.h>
May 13, 2012
May 13, 2012
26
#include <errno.h>
May 29, 2012
May 29, 2012
27
#include <stdlib.h>
Apr 11, 2012
Apr 11, 2012
28
29
30
#include "openconnect-internal.h"
Jun 8, 2012
Jun 8, 2012
31
struct openconnect_info *openconnect_vpninfo_new (char *useragent,
Jun 27, 2011
Jun 27, 2011
32
33
34
35
36
openconnect_validate_peer_cert_vfn validate_peer_cert,
openconnect_write_new_config_vfn write_new_config,
openconnect_process_auth_form_vfn process_auth_form,
openconnect_progress_vfn progress,
void *privdata)
37
38
39
40
{
struct openconnect_info *vpninfo = calloc (sizeof(*vpninfo), 1);
vpninfo->ssl_fd = -1;
Sep 29, 2011
Sep 29, 2011
41
vpninfo->cert_expire_warning = 60 * 86400;
42
43
44
45
46
vpninfo->useragent = openconnect_create_useragent (useragent);
vpninfo->validate_peer_cert = validate_peer_cert;
vpninfo->write_new_config = write_new_config;
vpninfo->process_auth_form = process_auth_form;
vpninfo->progress = progress;
Jun 27, 2011
Jun 27, 2011
47
vpninfo->cbdata = privdata?:vpninfo;
May 12, 2012
May 12, 2012
48
vpninfo->cancel_fd = -1;
Jul 12, 2012
Jul 12, 2012
49
50
51
52
53
#ifdef __APPLE__
vpninfo->csd_xmltag = "csdMac";
#else
vpninfo->csd_xmltag = "csdLinux";
#endif
Nov 24, 2011
Nov 24, 2011
55
56
57
58
#ifdef ENABLE_NLS
bindtextdomain("openconnect", LOCALEDIR);
#endif
Mar 17, 2011
Mar 17, 2011
62
63
64
65
66
67
68
69
70
71
72
73
74
75
static void free_optlist (struct vpn_option *opt)
{
struct vpn_option *next;
for (; opt; opt = next) {
next = opt->next;
free(opt->option);
free(opt->value);
free(opt);
}
}
void openconnect_vpninfo_free (struct openconnect_info *vpninfo)
{
Jul 10, 2012
Jul 10, 2012
76
77
openconnect_close_https(vpninfo, 1);
free(vpninfo->peer_addr);
Mar 17, 2011
Mar 17, 2011
78
79
80
81
82
83
84
85
free_optlist(vpninfo->cookies);
free_optlist(vpninfo->cstp_options);
free_optlist(vpninfo->dtls_options);
free(vpninfo->hostname);
free(vpninfo->urlpath);
free(vpninfo->redirect_url);
free(vpninfo->proxy_type);
free(vpninfo->proxy);
Jul 12, 2012
Jul 12, 2012
86
87
88
89
if (vpninfo->csd_scriptname) {
unlink(vpninfo->csd_scriptname);
free(vpninfo->csd_scriptname);
}
Mar 17, 2011
Mar 17, 2011
90
91
92
93
94
95
96
free(vpninfo->csd_stuburl);
/* These are const in openconnect itself, but for consistency of
the library API we do take ownership of the strings we're given,
and thus we have to free them too. */
free((void *)vpninfo->cafile);
if (vpninfo->cert != vpninfo->sslkey)
free((void *)vpninfo->sslkey);
Mar 17, 2011
Mar 17, 2011
97
free((void *)vpninfo->cert);
May 29, 2012
May 29, 2012
98
99
if (vpninfo->peer_cert) {
#if defined (OPENCONNECT_OPENSSL)
May 17, 2012
May 17, 2012
100
X509_free(vpninfo->peer_cert);
May 29, 2012
May 29, 2012
101
102
103
104
105
#elif defined (OPENCONNECT_GNUTLS)
gnutls_x509_crt_deinit(vpninfo->peer_cert);
#endif
vpninfo->peer_cert = NULL;
}
Jun 12, 2012
Jun 12, 2012
106
free(vpninfo->useragent);
Mar 17, 2011
Mar 17, 2011
107
108
109
110
/* No need to free deflate streams; they weren't initialised */
free(vpninfo);
}
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
char *openconnect_get_hostname (struct openconnect_info *vpninfo)
{
return vpninfo->hostname;
}
void openconnect_set_hostname (struct openconnect_info *vpninfo, char *hostname)
{
vpninfo->hostname = hostname;
}
char *openconnect_get_urlpath (struct openconnect_info *vpninfo)
{
return vpninfo->urlpath;
}
void openconnect_set_urlpath (struct openconnect_info *vpninfo, char *urlpath)
{
vpninfo->urlpath = urlpath;
}
Jun 1, 2012
Jun 1, 2012
131
void openconnect_set_xmlsha1 (struct openconnect_info *vpninfo, const char *xmlsha1, int size)
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
{
if (size != sizeof (vpninfo->xmlsha1))
return;
memcpy (&vpninfo->xmlsha1, xmlsha1, size);
}
void openconnect_set_cafile (struct openconnect_info *vpninfo, char *cafile)
{
vpninfo->cafile = cafile;
}
void openconnect_setup_csd (struct openconnect_info *vpninfo, uid_t uid, int silent, char *wrapper)
{
vpninfo->uid_csd = uid;
vpninfo->uid_csd_given = silent?2:1;
vpninfo->csd_wrapper = wrapper;
}
void openconnect_set_client_cert (struct openconnect_info *vpninfo, char *cert, char *sslkey)
{
vpninfo->cert = cert;
if (sslkey)
vpninfo->sslkey = sslkey;
else
vpninfo->sslkey = cert;
}
May 29, 2012
May 29, 2012
160
OPENCONNECT_X509 *openconnect_get_peer_cert (struct openconnect_info *vpninfo)
May 17, 2012
May 17, 2012
162
return vpninfo->peer_cert;
163
164
165
166
167
168
169
170
171
172
173
174
175
176
}
int openconnect_get_port (struct openconnect_info *vpninfo)
{
return vpninfo->port;
}
char *openconnect_get_cookie (struct openconnect_info *vpninfo)
{
return vpninfo->cookie;
}
void openconnect_clear_cookie (struct openconnect_info *vpninfo)
{
Mar 17, 2011
Mar 17, 2011
177
178
if (vpninfo->cookie)
memset(vpninfo->cookie, 0, strlen(vpninfo->cookie));
179
180
181
182
}
void openconnect_reset_ssl (struct openconnect_info *vpninfo)
{
Jul 10, 2012
Jul 10, 2012
183
openconnect_close_https(vpninfo, 0);
Apr 19, 2011
Apr 19, 2011
184
if (vpninfo->peer_addr) {
185
186
187
188
189
190
191
free(vpninfo->peer_addr);
vpninfo->peer_addr = NULL;
}
}
int openconnect_parse_url (struct openconnect_info *vpninfo, char *url)
{
May 13, 2012
May 13, 2012
192
193
194
char *scheme = NULL;
int ret;
Apr 19, 2011
Apr 19, 2011
195
196
197
198
199
if (vpninfo->peer_addr) {
free(vpninfo->peer_addr);
vpninfo->peer_addr = NULL;
}
May 13, 2012
May 13, 2012
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
free(vpninfo->hostname);
vpninfo->hostname = NULL;
free(vpninfo->urlpath);
vpninfo->urlpath = NULL;
ret = internal_parse_url (url, &scheme, &vpninfo->hostname,
&vpninfo->port, &vpninfo->urlpath, 443);
if (ret) {
vpn_progress(vpninfo, PRG_ERR,
_("Failed to parse server URL '%s'\n"),
url);
return ret;
}
if (scheme && strcmp(scheme, "https")) {
vpn_progress(vpninfo, PRG_ERR,
_("Only https:// permitted for server URL\n"));
ret = -EINVAL;
}
free(scheme);
return ret;
Mar 9, 2011
Mar 9, 2011
222
Sep 30, 2011
Sep 30, 2011
223
224
225
226
227
228
void openconnect_set_cert_expiry_warning (struct openconnect_info *vpninfo,
int seconds)
{
vpninfo->cert_expire_warning = seconds;
}
May 12, 2012
May 12, 2012
229
230
231
232
233
void openconnect_set_cancel_fd (struct openconnect_info *vpninfo, int fd)
{
vpninfo->cancel_fd = fd;
}
Mar 9, 2011
Mar 9, 2011
234
235
const char *openconnect_get_version (void)
{
May 12, 2012
May 12, 2012
236
return openconnect_version_str;
Mar 9, 2011
Mar 9, 2011
237
}
Jun 11, 2012
Jun 11, 2012
238
239
240
241
242
243
244
245
246
int openconnect_has_pkcs11_support(void)
{
#if defined (OPENCONNECT_GNUTLS) && defined (HAVE_P11KIT)
return 1;
#else
return 0;
#endif
}
Jun 11, 2012
Jun 11, 2012
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
#if defined (OPENCONNECT_OPENSSL) && defined (HAVE_ENGINE)
#include <openssl/engine.h>
#endif
int openconnect_has_tss_blob_support(void)
{
#if defined (OPENCONNECT_OPENSSL) && defined (HAVE_ENGINE)
ENGINE *e;
ENGINE_load_builtin_engines();
e = ENGINE_by_id("tpm");
if (e) {
ENGINE_free(e);
return 1;
}
Jun 13, 2012
Jun 13, 2012
263
264
#elif defined (OPENCONNECT_GNUTLS) && defined (HAVE_TROUSERS)
return 1;
Jun 11, 2012
Jun 11, 2012
265
266
267
#endif
return 0;
}