From 13b55d2f3ce695bd1de390906cfe859b7ea7b59b Mon Sep 17 00:00:00 2001 From: ssrlive <30760636+ssrlive@users.noreply.github.com> Date: Wed, 14 Oct 2020 15:34:26 +0800 Subject: [PATCH] Add "Target-Address" field to HTTP header. Caution: The protocol is no longer backward compatible. --- src/client/client.c | 10 ++-------- src/config_json.c | 4 ---- src/server/server.c | 15 ++------------- src/ssr_executive.h | 1 - 4 files changed, 4 insertions(+), 26 deletions(-) diff --git a/src/client/client.c b/src/client/client.c index e374c7c4d..69923313d 100644 --- a/src/client/client.c +++ b/src/client/client.c @@ -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; @@ -1216,9 +1214,8 @@ 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); @@ -1226,9 +1223,6 @@ static void tls_cli_on_connection_established(struct tls_cli_ctx* tls_cli, int s 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); diff --git a/src/config_json.c b/src/config_json.c index dab38e42e..13dd1cf25 100644 --- a/src/config_json.c +++ b/src/config_json.c @@ -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; diff --git a/src/server/server.c b/src/server/server.c index 5065dce25..d42fb2060 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -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); diff --git a/src/ssr_executive.h b/src/ssr_executive.h index 17cc7030e..8c73bcbf0 100644 --- a/src/ssr_executive.h +++ b/src/ssr_executive.h @@ -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;