From a7e948b0f4496def1f5ffbf07a9c9b2ae155f75f Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Mon, 4 Jul 2022 23:17:03 +0200 Subject: [PATCH 1/2] fix(ws): websocket header get expects bin-string --- CHANGES-5.0.md | 6 ++++++ apps/emqx/src/emqx_ws_connection.erl | 14 ++++++++------ apps/emqx/test/emqx_channel_SUITE.erl | 3 ++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/CHANGES-5.0.md b/CHANGES-5.0.md index ddb99a079..6370b0c1d 100644 --- a/CHANGES-5.0.md +++ b/CHANGES-5.0.md @@ -1,3 +1,9 @@ +# 5.0.3 + +## Bug fixes + +* Websocket listener failed to read headers `X-Forwared-For` and `X-Forwarded-Port` [8415](https://github.com/emqx/emqx/pull/8415) + # 5.0.2 Announcemnet: EMQX team has decided to stop supporting relup for opensouce edition. diff --git a/apps/emqx/src/emqx_ws_connection.erl b/apps/emqx/src/emqx_ws_connection.erl index 2e4587b46..0134810c1 100644 --- a/apps/emqx/src/emqx_ws_connection.erl +++ b/apps/emqx/src/emqx_ws_connection.erl @@ -981,9 +981,8 @@ trigger(Event) -> erlang:send(self(), Event). get_peer(Req, #{listener := {Type, Listener}}) -> {PeerAddr, PeerPort} = cowboy_req:peer(Req), - AddrHeader = cowboy_req:header( - get_ws_opts(Type, Listener, proxy_address_header), Req, <<>> - ), + AddrHeaderName = get_ws_header_opts(Type, Listener, proxy_address_header), + AddrHeader = cowboy_req:header(AddrHeaderName, Req, <<>>), ClientAddr = case string:tokens(binary_to_list(AddrHeader), ", ") of [] -> @@ -998,9 +997,8 @@ get_peer(Req, #{listener := {Type, Listener}}) -> _ -> PeerAddr end, - PortHeader = cowboy_req:header( - get_ws_opts(Type, Listener, proxy_port_header), Req, <<>> - ), + PortHeaderName = get_ws_header_opts(Type, Listener, proxy_port_header), + PortHeader = cowboy_req:header(PortHeaderName, Req, <<>>), ClientPort = case string:tokens(binary_to_list(PortHeader), ", ") of [] -> @@ -1042,6 +1040,10 @@ set_field(Name, Value, State) -> Pos = emqx_misc:index_of(Name, record_info(fields, state)), setelement(Pos + 1, State, Value). +%% ensure lowercase letters in headers +get_ws_header_opts(Type, Listener, Key) -> + iolist_to_binary(string:lowercase(get_ws_opts(Type, Listener, Key))). + get_ws_opts(Type, Listener, Key) -> emqx_config:get_listener_conf(Type, Listener, [websocket, Key]). diff --git a/apps/emqx/test/emqx_channel_SUITE.erl b/apps/emqx/test/emqx_channel_SUITE.erl index 34bafb1de..40bf6ff45 100644 --- a/apps/emqx/test/emqx_channel_SUITE.erl +++ b/apps/emqx/test/emqx_channel_SUITE.erl @@ -156,7 +156,8 @@ listener_mqtt_ws_conf() -> max_frame_size => infinity, mqtt_path => "/mqtt", mqtt_piggyback => multiple, - proxy_address_header => "x-forwarded-for", + % should allow uppercase in config + proxy_address_header => "X-Forwarded-For", proxy_port_header => "x-forwarded-port", supported_subprotocols => ["mqtt", "mqtt-v3", "mqtt-v3.1.1", "mqtt-v5"] From fa89b633d80668c7729d2c92efe94e95d1975c19 Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Mon, 4 Jul 2022 23:23:20 +0200 Subject: [PATCH 2/2] chore: bump version to 5.0.3 --- apps/emqx/include/emqx_release.hrl | 2 +- apps/emqx/src/emqx.app.src | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/emqx/include/emqx_release.hrl b/apps/emqx/include/emqx_release.hrl index 62aaf71c3..0fc59698e 100644 --- a/apps/emqx/include/emqx_release.hrl +++ b/apps/emqx/include/emqx_release.hrl @@ -32,7 +32,7 @@ %% `apps/emqx/src/bpapi/README.md' %% Community edition --define(EMQX_RELEASE_CE, "5.0.2"). +-define(EMQX_RELEASE_CE, "5.0.3"). %% Enterprise edition -define(EMQX_RELEASE_EE, "5.0.0-alpha.1"). diff --git a/apps/emqx/src/emqx.app.src b/apps/emqx/src/emqx.app.src index f466ce5cc..b7fa2d624 100644 --- a/apps/emqx/src/emqx.app.src +++ b/apps/emqx/src/emqx.app.src @@ -3,7 +3,7 @@ {id, "emqx"}, {description, "EMQX Core"}, % strict semver, bump manually! - {vsn, "5.0.2"}, + {vsn, "5.0.3"}, {modules, []}, {registered, []}, {applications, [