CONNECTION_OBJS := dtls.o cstp.o mainloop.o tun.o
AUTH_OBJECTS := ssl.o http.o version.o
-all: anyconnect nm-openconnect-auth-dialog
+all: openconnect nm-openconnect-auth-dialog
-version.c: $(patsubst %.o,%.c,$(OBJECTS)) anyconnect.h $(wildcard .git/index .git/refs/tags) version.sh
+version.c: $(patsubst %.o,%.c,$(OBJECTS)) openconnect.h $(wildcard .git/index .git/refs/tags) version.sh
@./version.sh
@echo -en "New version.c: "
@cut -f2 -d\" version.c
libopenconnect.a: $(AUTH_OBJECTS)
$(AR) rcs $@ $^
-anyconnect: $(OPENCONNECT_OBJS) $(CONNECTION_OBJS) libopenconnect.a
+openconnect: $(OPENCONNECT_OBJS) $(CONNECTION_OBJS) libopenconnect.a
$(CC) -o $@ $^ $(LDFLAGS)
nm-openconnect-auth-dialog: nm-auth-dialog.o ssl_ui_gtk.o libopenconnect.a
$(CC) -c -o $@ $(CFLAGS) $(CFLAGS_$@) $< -MD -MF .$@.dep
clean:
- rm -f *.o anyconnect $(wildcard .*.o.dep)
+ rm -f *.o openconnect $(wildcard .*.o.dep)
install:
mkdir -p $(DESTDIR)/usr/bin
- install -m0755 anyconnect $(DESTDIR)/usr/bin
+ install -m0755 openconnect $(DESTDIR)/usr/bin
include /dev/null $(wildcard .*.o.dep)
git tag v$(VERSION)
tarball:
- git archive --format=tar --prefix=anyconnect-$(VERSION)/ v$(VERSION) | gzip -9 > anyconnect-$(VERSION).tar.gz
+ git archive --format=tar --prefix=openconnect-$(VERSION)/ v$(VERSION) | gzip -9 > openconnect-$(VERSION).tar.gz
endif
#include <openssl/ssl.h>
#include <openssl/err.h>
-#include "anyconnect.h"
+#include "openconnect.h"
/*
* Data packets are encapsulated in the SSL stream as follows:
*
* 0000: Magic "STF\x1"
* 0004: Big-endian 16-bit length (not including 8-byte header)
- * 0006: Byte packet type (see anyconnect.h)
+ * 0006: Byte packet type (see openconnect.h)
* 0008: data payload
*/
};
-static int start_cstp_connection(struct anyconnect_info *vpninfo)
+static int start_cstp_connection(struct openconnect_info *vpninfo)
{
char buf[65536];
int i;
}
-int make_cstp_connection(struct anyconnect_info *vpninfo)
+int make_cstp_connection(struct openconnect_info *vpninfo)
{
if (!vpninfo->https_ssl && openconnect_open_https(vpninfo))
exit(1);
}
-static int inflate_and_queue_packet(struct anyconnect_info *vpninfo, int type, void *buf, int len)
+static int inflate_and_queue_packet(struct openconnect_info *vpninfo, int type, void *buf, int len)
{
struct pkt *new = malloc(sizeof(struct pkt) + vpninfo->mtu);
return 0;
}
-int cstp_mainloop(struct anyconnect_info *vpninfo, int *timeout)
+int cstp_mainloop(struct openconnect_info *vpninfo, int *timeout)
{
unsigned char buf[16384];
int len, ret;
return work_done;
}
-int cstp_bye(struct anyconnect_info *vpninfo, char *reason)
+int cstp_bye(struct openconnect_info *vpninfo, char *reason)
{
unsigned char *bye_pkt;
int reason_len = strlen(reason);
#include <openssl/err.h>
#include <fcntl.h>
-#include "anyconnect.h"
+#include "openconnect.h"
/*
* The master-secret is generated randomly by the client. The server
return (nybble(data[0]) << 4) | nybble(data[1]);
}
-int connect_dtls_socket(struct anyconnect_info *vpninfo)
+int connect_dtls_socket(struct openconnect_info *vpninfo)
{
SSL_METHOD *dtls_method;
SSL_CIPHER *https_cipher;
return dtls_try_handshake(vpninfo);
}
-int dtls_try_handshake(struct anyconnect_info *vpninfo)
+int dtls_try_handshake(struct openconnect_info *vpninfo)
{
int ret = SSL_do_handshake(vpninfo->new_dtls_ssl);
return -EINVAL;
}
-static int dtls_restart(struct anyconnect_info *vpninfo)
+static int dtls_restart(struct openconnect_info *vpninfo)
{
if (vpninfo->dtls_ssl) {
SSL_free(vpninfo->dtls_ssl);
}
-int setup_dtls(struct anyconnect_info *vpninfo)
+int setup_dtls(struct openconnect_info *vpninfo)
{
struct vpn_option *dtls_opt = vpninfo->dtls_options;
int sessid_found = 0;
return 0;
}
-int dtls_mainloop(struct anyconnect_info *vpninfo, int *timeout)
+int dtls_mainloop(struct openconnect_info *vpninfo, int *timeout)
{
unsigned char buf[2000];
int len;
#include <libxml/parser.h>
#include <libxml/tree.h>
-#include "anyconnect.h"
+#include "openconnect.h"
/*
* We didn't really want to have to do this for ourselves -- one might have
* provided by their caller.
*/
-static int process_http_response(struct anyconnect_info *vpninfo, int *result,
- int (*header_cb)(struct anyconnect_info *, char *, char *),
+static int process_http_response(struct openconnect_info *vpninfo, int *result,
+ int (*header_cb)(struct openconnect_info *, char *, char *),
char *body, int buf_len)
{
char buf[65536];
return 1;
}
-static int parse_auth_choice(struct anyconnect_info *vpninfo,
+static int parse_auth_choice(struct openconnect_info *vpninfo,
xmlNode *xml_node, char *body, int bodylen)
{
char *form_name = (char *)xmlGetProp(xml_node, (unsigned char *)"name");
return -EINVAL;
}
-static int parse_form(struct anyconnect_info *vpninfo, char *form_message,
+static int parse_form(struct openconnect_info *vpninfo, char *form_message,
char *form_error, xmlNode *xml_node, char *body,
int bodylen)
{
return 0;
}
-static int parse_xml_response(struct anyconnect_info *vpninfo, char *response,
+static int parse_xml_response(struct openconnect_info *vpninfo, char *response,
char *request_body, int req_len)
{
char *form_message, *form_error;
return -EINVAL;
}
-static int fetch_config(struct anyconnect_info *vpninfo, char *fu, char *bu,
+static int fetch_config(struct openconnect_info *vpninfo, char *fu, char *bu,
char *server_sha1)
{
struct vpn_option *opt;
return write_new_config(vpninfo, buf, buflen);
}
-int openconnect_obtain_cookie(struct anyconnect_info *vpninfo)
+int openconnect_obtain_cookie(struct openconnect_info *vpninfo)
{
struct vpn_option *opt, *next;
char buf[65536];
fprintf(stderr, "Server claimed successful login, but no cookie!\n");
return -1;
}
+
+char *openconnect_create_useragent(char *base)
+{
+ char *uagent = malloc(strlen(base) + 1 + strlen(openconnect_version));
+ sprintf(uagent, "%s%s", base, openconnect_version);
+ return uagent;
+}
#define _GNU_SOURCE
#include <getopt.h>
-#include "anyconnect.h"
+#include "openconnect.h"
#include "version.h"
int verbose = 0;
void usage(void)
{
- printf("Usage: anyconnect [options] <server>\n");
- printf("Open client for Cisco AnyConnect VPN, version " ANYCONNECT_VERSION "\n\n");
+ printf("Usage: openconnect [options] <server>\n");
+ printf("Open client for Cisco AnyConnect VPN, version %s\n\n", openconnect_version);
printf(" -c, --certificate=CERT Use SSL client certificate CERT\n");
printf(" -k, --sslkey=KEY Use SSL private key file KEY\n");
printf(" -C, --cookie=COOKIE Use WebVPN cookie COOKIE\n");
int main(int argc, char **argv)
{
- struct anyconnect_info *vpninfo;
+ struct openconnect_info *vpninfo;
struct utsname utsbuf;
int cookieonly = 0;
int opt;
/* Set up some defaults */
vpninfo->tun_fd = vpninfo->ssl_fd = vpninfo->dtls_fd = vpninfo->new_dtls_fd = -1;
- vpninfo->useragent = "Open AnyConnect VPN Agent " ANYCONNECT_VERSION;
+ vpninfo->useragent = openconnect_create_useragent("Open AnyConnect VPN Agent %s");
vpninfo->mtu = 1406;
vpninfo->deflate = 1;
vpninfo->dtls_attempt_period = 60;
verbose = 1;
break;
case 'V':
- printf("Open AnyConnect version " ANYCONNECT_VERSION "\n");
+ printf("OpenConnect version " ANYCONNECT_VERSION "\n");
exit(0);
case 'x':
vpninfo->xmlconfig = optarg;
exit(1);
}
-int write_new_config(struct anyconnect_info *vpninfo, char *buf, int buflen)
+int write_new_config(struct openconnect_info *vpninfo, char *buf, int buflen)
{
int config_fd;
#include <signal.h>
#include <arpa/inet.h>
-#include "anyconnect.h"
+#include "openconnect.h"
void queue_packet(struct pkt **q, struct pkt *new)
{
return 0;
}
-int vpn_add_pollfd(struct anyconnect_info *vpninfo, int fd, short events)
+int vpn_add_pollfd(struct openconnect_info *vpninfo, int fd, short events)
{
vpninfo->nfds++;
vpninfo->pfds = realloc(vpninfo->pfds, sizeof(struct pollfd) * vpninfo->nfds);
killed = sig;
}
-int vpn_mainloop(struct anyconnect_info *vpninfo)
+int vpn_mainloop(struct openconnect_info *vpninfo)
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
#include "auth-dlg-settings.h"
#include "version.h"
-#include "anyconnect.h"
+#include "openconnect.h"
static char *get_config_path(GConfClient *gcl, const char *vpn_uuid)
{
static GConfClient *gcl;
static char *config_path;
-static int get_config(char *vpn_uuid, struct anyconnect_info *vpninfo)
+static int get_config(char *vpn_uuid, struct openconnect_info *vpninfo)
{
char *authtype;
}
-static int get_cookie(const char *vpn_uuid, struct anyconnect_info *vpninfo)
+static int get_cookie(const char *vpn_uuid, struct openconnect_info *vpninfo)
{
openconnect_init_openssl();
openconnect_obtain_cookie(vpninfo);
return 0;
}
-int write_new_config(struct anyconnect_info *vpninfo, char *buf, int buflen)
+int write_new_config(struct openconnect_info *vpninfo, char *buf, int buflen)
{
char *key = g_strdup_printf("%s/vpn/%s", config_path,
NM_OPENCONNECT_KEY_XMLCONFIG);
{
char *vpn_name = NULL, *vpn_uuid = NULL, *vpn_service = NULL;
int reprompt;
- struct anyconnect_info *vpninfo;
+ struct openconnect_info *vpninfo;
int opt;
char read_buf;
vpninfo->urlpath = strdup("/");
vpninfo->mtu = 1406;
- vpninfo->useragent = "Open AnyConnect VPN Agent " ANYCONNECT_VERSION "(NetworkManager)";
+ vpninfo->useragent = openconnect_create_useragent("OpenConnect VPN Agent (NetworkManager)");
vpninfo->ssl_fd = -1;
set_openssl_ui();
#define DTLS_HANDSHAKE 1
#define DTLS_RUNNING 2
-struct anyconnect_info {
+struct openconnect_info {
char *redirect_url;
const char *localname;
/* tun.c */
-int setup_tun(struct anyconnect_info *vpninfo);
-int tun_mainloop(struct anyconnect_info *vpninfo, int *timeout);
+int setup_tun(struct openconnect_info *vpninfo);
+int tun_mainloop(struct openconnect_info *vpninfo, int *timeout);
/* dtls.c */
-int setup_dtls(struct anyconnect_info *vpninfo);
-int dtls_mainloop(struct anyconnect_info *vpninfo, int *timeout);
-int dtls_try_handshake(struct anyconnect_info *vpninfo);
-int connect_dtls_socket(struct anyconnect_info *vpninfo);
+int setup_dtls(struct openconnect_info *vpninfo);
+int dtls_mainloop(struct openconnect_info *vpninfo, int *timeout);
+int dtls_try_handshake(struct openconnect_info *vpninfo);
+int connect_dtls_socket(struct openconnect_info *vpninfo);
/* cstp.c */
-int make_cstp_connection(struct anyconnect_info *vpninfo);
-int cstp_mainloop(struct anyconnect_info *vpninfo, int *timeout);
-int cstp_bye(struct anyconnect_info *vpninfo, char *reason);
+int make_cstp_connection(struct openconnect_info *vpninfo);
+int cstp_mainloop(struct openconnect_info *vpninfo, int *timeout);
+int cstp_bye(struct openconnect_info *vpninfo, char *reason);
/* ssl.c */
void openconnect_init_openssl(void);
int __attribute__ ((format (printf, 2, 3)))
openconnect_SSL_printf(SSL *ssl, const char *fmt, ...);
int openconnect_SSL_gets(SSL *ssl, char *buf, size_t len);
-int openconnect_open_https(struct anyconnect_info *vpninfo);
+int openconnect_open_https(struct openconnect_info *vpninfo);
/* main.c */
extern int verbose;
-int write_new_config(struct anyconnect_info *vpninfo, char *buf, int buflen);
+int write_new_config(struct openconnect_info *vpninfo, char *buf, int buflen);
/* mainloop.c */
-int vpn_add_pollfd(struct anyconnect_info *vpninfo, int fd, short events);
-int vpn_mainloop(struct anyconnect_info *vpninfo);
+int vpn_add_pollfd(struct openconnect_info *vpninfo, int fd, short events);
+int vpn_mainloop(struct openconnect_info *vpninfo);
int queue_new_packet(struct pkt **q, int type, void *buf, int len);
void queue_packet(struct pkt **q, struct pkt *new);
int keepalive_action(struct keepalive_info *ka, int *timeout);
int ka_stalled_dpd_time(struct keepalive_info *ka, int *timeout);
/* xml.c */
-int config_lookup_host(struct anyconnect_info *vpninfo, const char *host);
+int config_lookup_host(struct openconnect_info *vpninfo, const char *host);
/* http.c */
-int openconnect_obtain_cookie(struct anyconnect_info *vpninfo);
+int openconnect_obtain_cookie(struct openconnect_info *vpninfo);
char *openconnect_create_useragent(char *base);
/* ssl_ui.c */
#include <openssl/err.h>
#include <openssl/engine.h>
-#include "anyconnect.h"
+#include "openconnect.h"
/* Helper functions for reading/writing lines over SSL.
We could use cURL for the HTTP stuff, but it's overkill */
}
-static int load_certificate(struct anyconnect_info *vpninfo)
+static int load_certificate(struct openconnect_info *vpninfo)
{
if (verbose)
printf("Using Certificate file %s\n", vpninfo->cert);
return 0;
}
-int openconnect_open_https(struct anyconnect_info *vpninfo)
+int openconnect_open_https(struct openconnect_info *vpninfo)
{
SSL_METHOD *ssl3_method;
SSL *https_ssl;
#include <arpa/inet.h>
#include <errno.h>
-#include "anyconnect.h"
+#include "openconnect.h"
-static int local_config_tun(struct anyconnect_info *vpninfo, int mtu_only)
+static int local_config_tun(struct openconnect_info *vpninfo, int mtu_only)
{
struct ifreq ifr;
int net_fd;
return setenv(opt, buf, 1);
}
-static int script_config_tun(struct anyconnect_info *vpninfo)
+static int script_config_tun(struct openconnect_info *vpninfo)
{
struct sockaddr_in *sin = (void *)vpninfo->peer_addr;
/* Set up a tuntap device. */
-int setup_tun(struct anyconnect_info *vpninfo)
+int setup_tun(struct openconnect_info *vpninfo)
{
struct ifreq ifr;
int tun_fd;
return 0;
}
-int tun_mainloop(struct anyconnect_info *vpninfo, int *timeout)
+int tun_mainloop(struct openconnect_info *vpninfo, int *timeout)
{
char buf[2000];
int len;
#include <libxml/parser.h>
#include <libxml/tree.h>
-#include "anyconnect.h"
+#include "openconnect.h"
-int config_lookup_host(struct anyconnect_info *vpninfo, const char *host)
+int config_lookup_host(struct openconnect_info *vpninfo, const char *host)
{
int fd, i;
struct stat st;