mirror of
https://github.com/tsl0922/ttyd.git
synced 2026-01-28 13:44:21 +01:00
Implemented authentication for websocket connection
This commit is contained in:
57
src/http.c
57
src/http.c
@@ -18,11 +18,11 @@ check_auth(struct lws *wsi) {
|
||||
if (strlen(token) == 0)
|
||||
continue;
|
||||
if (i++ == 2) {
|
||||
b64_text = strdup(token);
|
||||
b64_text = token;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (b64_text != NULL && strcmp(b64_text, server->credential) == 0)
|
||||
if (b64_text != NULL && !strcmp(b64_text, server->credential))
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -51,18 +51,13 @@ int
|
||||
callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) {
|
||||
unsigned char buffer[4096 + LWS_PRE], *p, *end;
|
||||
char buf[256];
|
||||
int n;
|
||||
|
||||
switch (reason) {
|
||||
case LWS_CALLBACK_HTTP:
|
||||
lwsl_notice("lws_http_serve: %s\n", in);
|
||||
|
||||
{
|
||||
char name[100], rip[50];
|
||||
lws_get_peer_addresses(wsi, lws_get_socket_fd(wsi), name,
|
||||
sizeof(name), rip, sizeof(rip));
|
||||
sprintf(buf, "%s (%s)", name, rip);
|
||||
lwsl_notice("HTTP connect from %s\n", buf);
|
||||
lws_get_peer_addresses(wsi, lws_get_socket_fd(wsi), name, sizeof(name), rip, sizeof(rip));
|
||||
lwsl_notice("HTTP connect from %s (%s), path: %s\n", name, rip, in);
|
||||
}
|
||||
|
||||
if (len < 1) {
|
||||
@@ -70,7 +65,6 @@ callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user, voi
|
||||
goto try_to_reuse;
|
||||
}
|
||||
|
||||
// TODO: this doesn't work for websocket
|
||||
switch (check_auth(wsi)) {
|
||||
case 0:
|
||||
break;
|
||||
@@ -85,37 +79,54 @@ callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user, voi
|
||||
if (lws_hdr_total_length(wsi, WSI_TOKEN_POST_URI))
|
||||
return 0;
|
||||
|
||||
if (strcmp((const char *) in, "/")) {
|
||||
p = buffer + LWS_PRE;
|
||||
end = p + sizeof(buffer) - LWS_PRE;
|
||||
|
||||
if (!strncmp((const char *)in, "/auth_token.js", 14)) {
|
||||
size_t n = server->credential != NULL ? sprintf(buf, "var tty_auth_token = '%s';", server->credential) : 0;
|
||||
|
||||
if (lws_add_http_header_status(wsi, HTTP_STATUS_OK, &p, end))
|
||||
return 1;
|
||||
if (lws_add_http_header_by_token(wsi,
|
||||
WSI_TOKEN_HTTP_CONTENT_TYPE,
|
||||
(unsigned char *) "application/javascript",
|
||||
22, &p, end))
|
||||
return 1;
|
||||
if (lws_add_http_header_content_length(wsi, (unsigned long) n, &p, end))
|
||||
return 1;
|
||||
if (lws_finalize_http_header(wsi, &p, end))
|
||||
return 1;
|
||||
if (lws_write(wsi, buffer + LWS_PRE, p - (buffer + LWS_PRE), LWS_WRITE_HTTP_HEADERS) < 0)
|
||||
return 1;
|
||||
if (n > 0 && lws_write_http(wsi, buf, n) < 0) {
|
||||
return 1;
|
||||
}
|
||||
goto try_to_reuse;
|
||||
}
|
||||
|
||||
if (strncmp((const char *) in, "/", 1)) {
|
||||
lws_return_http_status(wsi, HTTP_STATUS_NOT_FOUND, NULL);
|
||||
goto try_to_reuse;
|
||||
}
|
||||
|
||||
p = buffer + LWS_PRE;
|
||||
end = p + sizeof(buffer) - LWS_PRE;
|
||||
|
||||
if (lws_add_http_header_status(wsi, 200, &p, end))
|
||||
if (lws_add_http_header_status(wsi, HTTP_STATUS_OK, &p, end))
|
||||
return 1;
|
||||
if (lws_add_http_header_by_token(wsi,
|
||||
WSI_TOKEN_HTTP_CONTENT_TYPE,
|
||||
(unsigned char *) "text/html",
|
||||
9, &p, end))
|
||||
return 1;
|
||||
if (lws_add_http_header_content_length(wsi, index_html_len, &p, end))
|
||||
if (lws_add_http_header_content_length(wsi, (unsigned long) index_html_len, &p, end))
|
||||
return 1;
|
||||
if (lws_finalize_http_header(wsi, &p, end))
|
||||
return 1;
|
||||
n = lws_write(wsi, buffer + LWS_PRE, p - (buffer + LWS_PRE), LWS_WRITE_HTTP_HEADERS);
|
||||
if (n < 0) {
|
||||
if (lws_write(wsi, buffer + LWS_PRE, p - (buffer + LWS_PRE), LWS_WRITE_HTTP_HEADERS) < 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
n = lws_write_http(wsi, index_html, index_html_len);
|
||||
if (n < 0)
|
||||
if (lws_write_http(wsi, index_html, index_html_len) < 0)
|
||||
return 1;
|
||||
goto try_to_reuse;
|
||||
case LWS_CALLBACK_HTTP_WRITEABLE:
|
||||
lwsl_info("LWS_CALLBACK_HTTP_WRITEABLE\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user