diff --git a/src/worker-auth.c b/src/worker-auth.c
index 97e2b4f5..d8cfa2f7 100644
--- a/src/worker-auth.c
+++ b/src/worker-auth.c
@@ -422,88 +422,12 @@ char msg[MAX_BANNER_SIZE+32];
return 0;
}
-int post_old_auth_handler(worker_st *ws, unsigned http_ver)
-{
-int ret;
-struct http_req_st *req = &ws->req;
-const char* reason = "Authentication failed";
-char * username = NULL;
-char * password = NULL;
-char *p;
-struct cmd_auth_req_st areq;
-
- memset(&areq, 0, sizeof(areq));
-
- if (ws->config->auth_types & AUTH_TYPE_USERNAME_PASS) {
- /* body should be "username=test&password=test" */
- username = memmem(req->body, req->body_length, "username=", sizeof("username=")-1);
- if (username == NULL) {
- reason = "No username";
- goto auth_fail;
- }
- username += sizeof("username=")-1;
-
- password = memmem(req->body, req->body_length, "password=", sizeof("password=")-1);
- if (password == NULL) {
- reason = "No password";
- goto auth_fail;
- }
- password += sizeof("password=")-1;
-
- /* modify body */
- p = username;
- while(*p != 0) {
- if (*p == '&') {
- *p = 0;
- break;
- }
- p++;
- }
-
- p = password;
- while(*p != 0) {
- if (*p == '&') {
- *p = 0;
- break;
- }
- p++;
- }
-
- areq.user_pass_present = 1;
- snprintf(areq.user, sizeof(areq.user), "%s", username);
- snprintf(areq.pass, sizeof(areq.pass), "%s", password);
- }
-
- if (req->hostname[0] != 0) {
- memcpy(areq.hostname, req->hostname, sizeof(areq.hostname));
- }
-
- ret = auth_user(ws, &areq);
- if (ret < 0) {
- if (username)
- oclog(ws, LOG_INFO, "Failed authentication attempt for '%s'", username);
- else
- oclog(ws, LOG_INFO, "Failed authentication attempt");
- goto auth_fail;
- }
-
- oclog(ws, LOG_INFO, "User '%s' logged in", ws->username);
-
- return post_common_handler(ws, http_ver);;
-
-auth_fail:
- tls_printf(ws->session,
- "HTTP/1.1 503 Service Unavailable\r\nX-Reason: %s\r\n\r\n", reason);
- tls_fatal_close(ws->session, GNUTLS_A_ACCESS_DENIED);
- exit(1);
-}
-
#define XMLUSER ""
#define XMLPASS ""
#define XMLUSER_END ""
#define XMLPASS_END ""
-int post_new_auth_handler(worker_st *ws, unsigned http_ver)
+int post_auth_handler(worker_st *ws, unsigned http_ver)
{
int ret;
struct http_req_st *req = &ws->req;
@@ -516,43 +440,89 @@ struct cmd_auth_req_st areq;
memset(&areq, 0, sizeof(areq));
if (ws->config->auth_types & AUTH_TYPE_USERNAME_PASS) {
- /* body should contain testtest */
- username = memmem(req->body, req->body_length, XMLUSER, sizeof(XMLUSER)-1);
- if (username == NULL) {
- reason = "No username";
- goto ask_auth;
- }
- username += sizeof(XMLUSER)-1;
+ if (memmem(req->body, req->body_length, "body_length, req->body);
- password = memmem(req->body, req->body_length, XMLPASS, sizeof(XMLPASS)-1);
- if (password == NULL) {
- reason = "No password";
- goto auth_fail;
- }
- password += sizeof(XMLPASS)-1;
-
- /* modify body */
- p = username;
- while(*p != 0) {
- if (*p == '<' && (strncmp(p, XMLUSER_END, sizeof(XMLUSER_END)-1) == 0)) {
- *p = 0;
- break;
+ /* body should contain testtest */
+ username = memmem(req->body, req->body_length, XMLUSER, sizeof(XMLUSER)-1);
+ if (username == NULL) {
+ reason = "No username";
+ goto ask_auth;
}
- p++;
- }
+ username += sizeof(XMLUSER)-1;
- p = password;
- while(*p != 0) {
- if (*p == '<' && (strncmp(p, XMLPASS_END, sizeof(XMLPASS_END)-1) == 0)) {
- *p = 0;
- break;
+ password = memmem(req->body, req->body_length, XMLPASS, sizeof(XMLPASS)-1);
+ if (password == NULL) {
+ reason = "No password";
+ goto auth_fail;
}
- p++;
- }
+ password += sizeof(XMLPASS)-1;
- areq.user_pass_present = 1;
- snprintf(areq.user, sizeof(areq.user), "%s", username);
- snprintf(areq.pass, sizeof(areq.pass), "%s", password);
+ /* modify body */
+ p = username;
+ while(*p != 0) {
+ if (*p == '<' && (strncmp(p, XMLUSER_END, sizeof(XMLUSER_END)-1) == 0)) {
+ *p = 0;
+ break;
+ }
+ p++;
+ }
+
+ p = password;
+ while(*p != 0) {
+ if (*p == '<' && (strncmp(p, XMLPASS_END, sizeof(XMLPASS_END)-1) == 0)) {
+ *p = 0;
+ break;
+ }
+ p++;
+ }
+
+ areq.user_pass_present = 1;
+ snprintf(areq.user, sizeof(areq.user), "%s", username);
+ snprintf(areq.pass, sizeof(areq.pass), "%s", password);
+ } else { /* non-xml version */
+ /* body should be "username=test&password=test" */
+ username = memmem(req->body, req->body_length, "username=", sizeof("username=")-1);
+ if (username == NULL) {
+ reason = "No username";
+ goto auth_fail;
+ }
+ username += sizeof("username=")-1;
+
+ password = memmem(req->body, req->body_length, "password=", sizeof("password=")-1);
+ if (password == NULL) {
+ reason = "No password";
+ goto auth_fail;
+ }
+ password += sizeof("password=")-1;
+
+ /* modify body */
+ p = username;
+ while(*p != 0) {
+ if (*p == '&') {
+ *p = 0;
+ break;
+ }
+ p++;
+ }
+
+ p = password;
+ while(*p != 0) {
+ if (*p == '&') {
+ *p = 0;
+ break;
+ }
+ p++;
+ }
+
+ areq.user_pass_present = 1;
+ snprintf(areq.user, sizeof(areq.user), "%s", username);
+ snprintf(areq.pass, sizeof(areq.pass), "%s", password);
+ }
+ }
+
+ if (req->hostname[0] != 0) {
+ memcpy(areq.hostname, req->hostname, sizeof(areq.hostname));
}
ret = auth_user(ws, &areq);
diff --git a/src/worker-vpn.c b/src/worker-vpn.c
index f0f2517e..4e1df228 100644
--- a/src/worker-vpn.c
+++ b/src/worker-vpn.c
@@ -188,8 +188,8 @@ int ret;
#define LL(x,y,z) {x, sizeof(x)-1, y, z}
struct known_urls_st known_urls[] = {
- LL("/", get_auth_handler, post_new_auth_handler),
- LL("/auth", get_auth_handler, post_old_auth_handler),
+ LL("/", get_auth_handler, post_auth_handler),
+ LL("/auth", get_auth_handler, post_auth_handler),
#ifdef ANYCONNECT_CLIENT_COMPAT
LL("/profiles", get_config_handler, NULL),
LL("/+CSCOT+/translation-table", get_cscot_handler, NULL),
@@ -591,7 +591,7 @@ restart:
fn = post_url_handler(ws->req.url);
if (fn == NULL) {
oclog(ws, LOG_INFO, "unexpected POST URL %s", ws->req.url);
- tls_puts(session, "HTTP/1.1 404 Nah, go away\r\n\r\n");
+ tls_printf(session, "HTTP/1.%u 404 Nah, go away\r\n\r\n", parser.http_minor);
goto finish;
}
@@ -607,7 +607,7 @@ restart:
} else {
oclog(ws, LOG_INFO, "unexpected HTTP method %s", http_method_str(parser.method));
- tls_puts(session, "HTTP/1.1 404 Nah, go away\r\n\r\n");
+ tls_printf(session, "HTTP/1.%u 404 Nah, go away\r\n\r\n", parser.http_minor);
}
finish:
diff --git a/src/worker.h b/src/worker.h
index f849b72a..99907d24 100644
--- a/src/worker.h
+++ b/src/worker.h
@@ -98,8 +98,7 @@ void vpn_server(struct worker_st* ws);
int auth_cookie(worker_st *ws, void* cookie, size_t cookie_size);
int get_auth_handler(worker_st *server, unsigned http_ver);
-int post_old_auth_handler(worker_st *server, unsigned http_ver);
-int post_new_auth_handler(worker_st *server, unsigned http_ver);
+int post_auth_handler(worker_st *server, unsigned http_ver);
void set_resume_db_funcs(gnutls_session_t);