Skip to content

Commit

Permalink
domain issues
Browse files Browse the repository at this point in the history
  • Loading branch information
ssrlive committed Jul 20, 2022
1 parent 3721e38 commit 81a9545
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 7 deletions.
30 changes: 23 additions & 7 deletions src/server/server.c
Original file line number Diff line number Diff line change
Expand Up @@ -1096,18 +1096,19 @@ void udp_remote_on_dying(struct udp_remote_ctx_t *remote_ctx, void*p) {
(void)remote_ctx;
}

void do_normal_response(struct tunnel_ctx* tunnel) {
void do_normal_response(struct tunnel_ctx* tunnel, const char *domain) {
struct server_ctx* ctx = (struct server_ctx*)tunnel->data;
struct server_config* config = ctx->env->config;
struct socket_ctx* incoming = tunnel->incoming;
char* http_ok = ws_normal_response(&malloc, config->over_tls_server_domain);
char* http_ok = ws_normal_response(&malloc, domain);

ASSERT(config->over_tls_enable);

tunnel_socket_ctx_write(tunnel, incoming, http_ok, strlen(http_ok));
free(http_ok);

ctx->stage = tunnel_stage_normal_response;
(void)config;
}

static void do_tls_init_package(struct tunnel_ctx *tunnel, struct socket_ctx *socket) {
Expand All @@ -1117,6 +1118,8 @@ static void do_tls_init_package(struct tunnel_ctx *tunnel, struct socket_ctx *so
struct buffer_t *proto_confirm = NULL;
struct buffer_t *result = NULL;
struct http_headers *hdrs = NULL;
char *domain = NULL;
#define SAFE_GET_DOMAIN() (domain ? domain : config->over_tls_server_domain)
do {
uint8_t *indata = (uint8_t *)socket->buf->base;
size_t len = (size_t)socket->result;
Expand All @@ -1136,11 +1139,22 @@ static void do_tls_init_package(struct tunnel_ctx *tunnel, struct socket_ctx *so
ctx->tcp_mss = tcp_mss;

hdrs = http_headers_parse(true, indata, len);
{
const char *h = http_headers_get_field_val(hdrs, HOST_STR);
if (h) {
char *port;
domain = strdup(h);
port = strchr(domain, ':');
if (port) {
*port = '\0';
}
}
}
{
const char *key = http_headers_get_field_val(hdrs, SEC_WEBSOKET_KEY);
const char *url = http_headers_get_url(hdrs);
if (key==NULL || url==NULL || 0 != strcmp(url, config->over_tls_path)) {
do_normal_response(tunnel);
do_normal_response(tunnel, SAFE_GET_DOMAIN());
break;
}
string_safe_assign(&ctx->sec_websocket_key, key);
Expand All @@ -1150,12 +1164,12 @@ static void do_tls_init_package(struct tunnel_ctx *tunnel, struct socket_ctx *so
size_t p_len = 0;
const char* addr_field = http_headers_get_field_val(hdrs, TARGET_ADDRESS_STR);
if (addr_field == NULL) {
do_normal_response(tunnel);
do_normal_response(tunnel, SAFE_GET_DOMAIN());
break;
}
addr_p = std_base64_decode_alloc(addr_field, &malloc, &p_len);
if (addr_p == NULL) {
do_normal_response(tunnel);
do_normal_response(tunnel, SAFE_GET_DOMAIN());
break;
}
result = buffer_create_from(addr_p, p_len);
Expand All @@ -1178,7 +1192,7 @@ static void do_tls_init_package(struct tunnel_ctx *tunnel, struct socket_ctx *so
addr_p = url_safe_base64_decode_alloc(udp_field, &malloc, &p_len);
if (socks5_address_parse(addr_p, p_len, &target_addr, NULL) == false) {
free(addr_p);
do_normal_response(tunnel);
do_normal_response(tunnel, SAFE_GET_DOMAIN());
break;
}
free(addr_p);
Expand All @@ -1196,7 +1210,7 @@ static void do_tls_init_package(struct tunnel_ctx *tunnel, struct socket_ctx *so
}

if (result==NULL || is_legal_header(result) == false) {
do_normal_response(tunnel);
do_normal_response(tunnel, SAFE_GET_DOMAIN());
break;
}
buffer_replace(ctx->target_address_with_data_pkg, result);
Expand All @@ -1206,6 +1220,8 @@ static void do_tls_init_package(struct tunnel_ctx *tunnel, struct socket_ctx *so
} while (0);
http_headers_destroy(hdrs);
buffer_release(result);
free(domain);
#undef SAFE_GET_DOMAIN
}

static size_t _tls_get_read_size(struct tunnel_ctx *tunnel, struct socket_ctx *socket, size_t suggested_size) {
Expand Down
1 change: 1 addition & 0 deletions src/ssr_executive.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ void string_safe_assign(char **target, const char *value);
#define DEFAULT_SSROT_PATH "/abcd1234/"
#define TARGET_ADDRESS_STR "Target-Address"
#define UDP_STR "UDP"
#define HOST_STR "Host"

#if !defined(TCP_BUF_SIZE_MAX)
#define TCP_BUF_SIZE_MAX (16 * 1024 - 1) // 16383 (0x3FFF) Bytes, equals to the max chunk size
Expand Down

0 comments on commit 81a9545

Please sign in to comment.