Skip to content

Commit

Permalink
Add "Target-Address" field to HTTP header. Caution: The protocol is n…
Browse files Browse the repository at this point in the history
…o longer backward compatible.
  • Loading branch information
ssrlive committed Oct 14, 2020
1 parent 5a28803 commit 13b55d2
Show file tree
Hide file tree
Showing 4 changed files with 4 additions and 26 deletions.
10 changes: 2 additions & 8 deletions src/client/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -1201,9 +1201,7 @@ static void tls_cli_on_connection_established(struct tls_cli_ctx* tls_cli, int s
cstl_deque_pop_front(ctx->udp_data_ctx->send_deque);
}
}
if (ssr_ok != tunnel_cipher_client_encrypt(ctx->cipher, tmp)) {
tunnel->tunnel_shutdown(tunnel);
} else {
{
const char* url_path = config->over_tls_path;
const char* domain = config->over_tls_server_domain;
unsigned short domain_port = config->remote_port;
Expand All @@ -1216,19 +1214,15 @@ static void tls_cli_on_connection_established(struct tls_cli_ctx* tls_cli, int s
free(key);

buf = websocket_connect_request(domain, domain_port, url_path, ctx->sec_websocket_key, &malloc, &len);
if (config->target_address)
{
char* b64addr = url_safe_base64_encode_alloc(typ, (size_t)typ_len, &malloc);
char* b64addr = std_base64_encode_alloc(typ, (size_t)typ_len, &malloc);
static const char* addr_fmt = "Target-Address" ": %s\r\n";
char* addr_field = (char*)calloc(strlen(addr_fmt) + strlen(b64addr) + 1, sizeof(*addr_field));
sprintf(addr_field, addr_fmt, b64addr);
buf = http_header_append_new_field(buf, &len, &realloc, addr_field);
free(addr_field);
free(b64addr);
}
else {
buf = http_header_set_payload_data(buf, &len, &realloc, typ, typ_len);
}
if (ctx->udp_data_ctx) {
size_t addr_len = 0;
uint8_t* addr_p = socks5_address_binary(&ctx->udp_data_ctx->target_addr, &malloc, &addr_len);
Expand Down
4 changes: 0 additions & 4 deletions src/config_json.c
Original file line number Diff line number Diff line change
Expand Up @@ -238,10 +238,6 @@ struct server_config* parse_config_file(bool is_server, const char* file)
string_safe_assign(&config->over_tls_path, obj_str2);
continue;
}
if (json_iter_extract_bool("target_address", &iter2, &obj_bool)) {
config->target_address = obj_bool;
continue;
}
if (json_iter_extract_string("root_cert_file", &iter2, &obj_str2)) {
string_safe_assign(&config->over_tls_root_cert_file, obj_str2);
continue;
Expand Down
15 changes: 2 additions & 13 deletions src/server/server.c
Original file line number Diff line number Diff line change
Expand Up @@ -1156,32 +1156,21 @@ static void do_tls_init_package(struct tunnel_ctx *tunnel, struct socket_ctx *so
}
string_safe_assign(&ctx->sec_websocket_key, key);
}
if (config->target_address)
{
uint8_t* addr_p;
size_t p_len = 0;
struct buffer_t* buf;
const char* addr_field = http_headers_get_field_val(hdrs, "Target-Address");
if (addr_field == NULL) {
do_normal_response(tunnel);
break;
}
addr_p = url_safe_base64_decode_alloc(addr_field, &malloc, &p_len);
addr_p = std_base64_decode_alloc(addr_field, &malloc, &p_len);
if (addr_p == NULL) {
do_normal_response(tunnel);
break;
}
buf = buffer_create_from(addr_p, p_len);
result = buffer_create_from(addr_p, p_len);
free(addr_p);
result = tunnel_cipher_server_decrypt(ctx->cipher, buf, &obfs_receipt, &proto_confirm);
buffer_release(buf);
}
else
{
size_t cb = http_headers_get_content_beginning(hdrs);
struct buffer_t *buf = buffer_create_from(indata + cb, len - cb);
result = tunnel_cipher_server_decrypt(ctx->cipher, buf, &obfs_receipt, &proto_confirm);
buffer_release(buf);
}
ASSERT(obfs_receipt == NULL);
ASSERT(proto_confirm == NULL);
Expand Down
1 change: 0 additions & 1 deletion src/ssr_executive.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ struct server_config {
char *over_tls_server_domain;
char *over_tls_path;
char *over_tls_root_cert_file;
bool target_address;
bool udp;
unsigned int idle_timeout; /* Connection idle timeout in ms. */
uint64_t connect_timeout_ms;
Expand Down

0 comments on commit 13b55d2

Please sign in to comment.