Merge branch 'dev/v4.3.14' into dev/v4.3.14
This commit is contained in:
commit
b84ef11935
|
@ -89,11 +89,6 @@ emqx_test(){
|
||||||
"rpm")
|
"rpm")
|
||||||
packagename=$(basename "${PACKAGE_PATH}/${EMQX_NAME}"-*.rpm)
|
packagename=$(basename "${PACKAGE_PATH}/${EMQX_NAME}"-*.rpm)
|
||||||
|
|
||||||
if [[ "${ARCH}" == "amd64" && $(rpm -E '%{rhel}') == 7 ]] ; then
|
|
||||||
# EMQX OTP requires openssl11 to have TLS1.3 support
|
|
||||||
yum install -y openssl11
|
|
||||||
fi
|
|
||||||
|
|
||||||
rpm -ivh "${PACKAGE_PATH}/${packagename}"
|
rpm -ivh "${PACKAGE_PATH}/${packagename}"
|
||||||
if ! rpm -q emqx | grep -q emqx; then
|
if ! rpm -q emqx | grep -q emqx; then
|
||||||
echo "package install error"
|
echo "package install error"
|
||||||
|
|
|
@ -19,12 +19,21 @@ File format:
|
||||||
* add api: PUT /rules/{id}/reset_metrics.
|
* add api: PUT /rules/{id}/reset_metrics.
|
||||||
This api reset the metrics of the rule engine of a rule, and reset the metrics of the action related to this rule. [#7474]
|
This api reset the metrics of the rule engine of a rule, and reset the metrics of the action related to this rule. [#7474]
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
* Prohibit empty topics in strict mode
|
||||||
|
|
||||||
## v4.3.13
|
## v4.3.13
|
||||||
|
|
||||||
### Important changes
|
### Important changes
|
||||||
|
|
||||||
* For docker image, /opt/emqx/etc has been removed from the VOLUME list,
|
* For docker image, /opt/emqx/etc has been removed from the VOLUME list,
|
||||||
this made it easier for the users to rebuild image on top with changed configs.
|
this made it easier for the users to rebuild image on top with changed configs.
|
||||||
|
* CentOS 7 Erlang runtime is rebuilt on OpenSSL-1.1.1n (previously on 1.0),
|
||||||
|
Prior to v4.3.13, EMQX pick certain cipher suites proposed by the clients,
|
||||||
|
but then fail to handshake resulting in a `malformed_handshake_data` exception.
|
||||||
|
* CentOS 8 Erlang runtime is rebuilt on RockyLinux 8.
|
||||||
|
'centos8' will remain in the package name to keep it backward compatible.
|
||||||
|
|
||||||
### Enhancements
|
### Enhancements
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{application, emqx_auth_jwt,
|
{application, emqx_auth_jwt,
|
||||||
[{description, "EMQ X Authentication with JWT"},
|
[{description, "EMQ X Authentication with JWT"},
|
||||||
{vsn, "4.3.1"}, % strict semver, bump manually!
|
{vsn, "4.3.2"}, % strict semver, bump manually!
|
||||||
{modules, []},
|
{modules, []},
|
||||||
{registered, [emqx_auth_jwt_sup]},
|
{registered, [emqx_auth_jwt_sup]},
|
||||||
{applications, [kernel,stdlib,jose]},
|
{applications, [kernel,stdlib,jose]},
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
%% -*-: erlang -*-
|
%% -*-: erlang -*-
|
||||||
{VSN,
|
{VSN,
|
||||||
[
|
[
|
||||||
{"4.3.0", [
|
{"4.3.[0-1]", [
|
||||||
{load_module, emqx_auth_jwt_svr, brutal_purge, soft_purge, []}
|
{load_module, emqx_auth_jwt_svr, brutal_purge, soft_purge, []}
|
||||||
]},
|
]},
|
||||||
{<<".*">>, []}
|
{<<".*">>, []}
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
{"4.3.0", [
|
{"4.3.[0-1]", [
|
||||||
{load_module, emqx_auth_jwt_svr, brutal_purge, soft_purge, []}
|
{load_module, emqx_auth_jwt_svr, brutal_purge, soft_purge, []}
|
||||||
]},
|
]},
|
||||||
{<<".*">>, []}
|
{<<".*">>, []}
|
||||||
|
|
|
@ -91,7 +91,7 @@ do_init_jwks(Options) ->
|
||||||
[K, V, Reason]),
|
[K, V, Reason]),
|
||||||
undefined;
|
undefined;
|
||||||
J -> J
|
J -> J
|
||||||
catch T:R:_ ->
|
catch T:R ->
|
||||||
?LOG(warning, "Build ~p JWK ~p failed: {~p, ~p}~n",
|
?LOG(warning, "Build ~p JWK ~p failed: {~p, ~p}~n",
|
||||||
[K, V, T, R]),
|
[K, V, T, R]),
|
||||||
undefined
|
undefined
|
||||||
|
|
|
@ -175,7 +175,7 @@ resovle_hookspec(HookSpecs) when is_list(HookSpecs) ->
|
||||||
case maps:get(name, HookSpec, undefined) of
|
case maps:get(name, HookSpec, undefined) of
|
||||||
undefined -> Acc;
|
undefined -> Acc;
|
||||||
Name0 ->
|
Name0 ->
|
||||||
Name = try binary_to_existing_atom(Name0, utf8) catch T:R:_ -> {T,R} end,
|
Name = try binary_to_existing_atom(Name0, utf8) catch T:R -> {T,R} end,
|
||||||
case lists:member(Name, AvailableHooks) of
|
case lists:member(Name, AvailableHooks) of
|
||||||
true ->
|
true ->
|
||||||
case lists:member(Name, MessageHooks) of
|
case lists:member(Name, MessageHooks) of
|
||||||
|
|
|
@ -7,9 +7,11 @@
|
||||||
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.7",
|
{"4.3.7",
|
||||||
[{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
||||||
|
@ -92,9 +94,11 @@
|
||||||
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.7",
|
{"4.3.7",
|
||||||
[{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_rule_metrics,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
|
||||||
|
|
|
@ -172,18 +172,18 @@ eventmsg_connected(_ClientInfo = #{
|
||||||
is_bridge := IsBridge,
|
is_bridge := IsBridge,
|
||||||
mountpoint := Mountpoint
|
mountpoint := Mountpoint
|
||||||
},
|
},
|
||||||
_ConnInfo = #{
|
ConnInfo = #{
|
||||||
peername := PeerName,
|
peername := PeerName,
|
||||||
sockname := SockName,
|
sockname := SockName,
|
||||||
clean_start := CleanStart,
|
clean_start := CleanStart,
|
||||||
proto_name := ProtoName,
|
proto_name := ProtoName,
|
||||||
proto_ver := ProtoVer,
|
proto_ver := ProtoVer,
|
||||||
keepalive := Keepalive,
|
|
||||||
connected_at := ConnectedAt,
|
connected_at := ConnectedAt,
|
||||||
conn_props := ConnProps,
|
receive_maximum := RcvMax
|
||||||
receive_maximum := RcvMax,
|
|
||||||
expiry_interval := ExpiryInterval
|
|
||||||
}) ->
|
}) ->
|
||||||
|
Keepalive = maps:get(keepalive, ConnInfo, 0),
|
||||||
|
ConnProps = maps:get(conn_props, ConnInfo, #{}),
|
||||||
|
ExpiryInterval = maps:get(expiry_interval, ConnInfo, 0),
|
||||||
with_basic_columns('client.connected',
|
with_basic_columns('client.connected',
|
||||||
#{clientid => ClientId,
|
#{clientid => ClientId,
|
||||||
username => Username,
|
username => Username,
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
-ifndef(EMQX_ENTERPRISE).
|
-ifndef(EMQX_ENTERPRISE).
|
||||||
|
|
||||||
-define(EMQX_RELEASE, {opensource, "4.3.13-rc.2"}).
|
-define(EMQX_RELEASE, {opensource, "4.3.13-rc.3"}).
|
||||||
|
|
||||||
-else.
|
-else.
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,7 @@ if [ "$NEW_COPY" = 'no' ]; then
|
||||||
REMOTE="$(git remote -v | grep "${GIT_REPO}" | head -1 | awk '{print $1}')"
|
REMOTE="$(git remote -v | grep "${GIT_REPO}" | head -1 | awk '{print $1}')"
|
||||||
git fetch "$REMOTE"
|
git fetch "$REMOTE"
|
||||||
fi
|
fi
|
||||||
|
git reset --hard
|
||||||
git clean -fdx
|
git clean -fdx
|
||||||
git checkout "${PREV_TAG}"
|
git checkout "${PREV_TAG}"
|
||||||
make "$PROFILE"
|
make "$PROFILE"
|
||||||
|
|
|
@ -265,7 +265,7 @@ parse_packet(#mqtt_packet_header{type = ?CONNACK}, <<AckFlags:8, ReasonCode:8, R
|
||||||
|
|
||||||
parse_packet(#mqtt_packet_header{type = ?PUBLISH, qos = QoS}, Bin,
|
parse_packet(#mqtt_packet_header{type = ?PUBLISH, qos = QoS}, Bin,
|
||||||
#{strict_mode := StrictMode, version := Ver}) ->
|
#{strict_mode := StrictMode, version := Ver}) ->
|
||||||
{TopicName, Rest} = parse_utf8_string(Bin, StrictMode),
|
{TopicName, Rest} = parse_topic_name(Bin, StrictMode),
|
||||||
{PacketId, Rest1} = case QoS of
|
{PacketId, Rest1} = case QoS of
|
||||||
?QOS_0 -> {undefined, Rest};
|
?QOS_0 -> {undefined, Rest};
|
||||||
_ -> parse_packet_id(Rest)
|
_ -> parse_packet_id(Rest)
|
||||||
|
@ -357,7 +357,7 @@ parse_will_message(Packet = #mqtt_packet_connect{will_flag = true,
|
||||||
proto_ver = Ver},
|
proto_ver = Ver},
|
||||||
Bin, StrictMode) ->
|
Bin, StrictMode) ->
|
||||||
{Props, Rest} = parse_properties(Bin, Ver, StrictMode),
|
{Props, Rest} = parse_properties(Bin, Ver, StrictMode),
|
||||||
{Topic, Rest1} = parse_utf8_string(Rest, StrictMode),
|
{Topic, Rest1} = parse_topic_name(Rest, StrictMode),
|
||||||
{Payload, Rest2} = parse_binary_data(Rest1),
|
{Payload, Rest2} = parse_binary_data(Rest1),
|
||||||
{Packet#mqtt_packet_connect{will_props = Props,
|
{Packet#mqtt_packet_connect{will_props = Props,
|
||||||
will_topic = Topic,
|
will_topic = Topic,
|
||||||
|
@ -524,6 +524,14 @@ parse_binary_data(Bin)
|
||||||
when 2 > byte_size(Bin) ->
|
when 2 > byte_size(Bin) ->
|
||||||
error(malformed_binary_data_length).
|
error(malformed_binary_data_length).
|
||||||
|
|
||||||
|
parse_topic_name(Bin, false) ->
|
||||||
|
parse_utf8_string(Bin, false);
|
||||||
|
parse_topic_name(Bin, true) ->
|
||||||
|
case parse_utf8_string(Bin, true) of
|
||||||
|
{<<>>, _Rest} -> error(empty_topic_name);
|
||||||
|
Result -> Result
|
||||||
|
end.
|
||||||
|
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% Serialize MQTT Packet
|
%% Serialize MQTT Packet
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
|
|
@ -159,7 +159,7 @@ update_overall_limiter(Zone, Capacity, Interval) ->
|
||||||
try
|
try
|
||||||
esockd_limiter:update({Zone, overall_messages_routing}, Capacity, Interval),
|
esockd_limiter:update({Zone, overall_messages_routing}, Capacity, Interval),
|
||||||
true
|
true
|
||||||
catch _:_:_ ->
|
catch _:_ ->
|
||||||
false
|
false
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -167,6 +167,6 @@ delete_overall_limiter(Zone) ->
|
||||||
try
|
try
|
||||||
esockd_limiter:delete({Zone, overall_messages_routing}),
|
esockd_limiter:delete({Zone, overall_messages_routing}),
|
||||||
true
|
true
|
||||||
catch _:_:_ ->
|
catch _:_ ->
|
||||||
false
|
false
|
||||||
end.
|
end.
|
||||||
|
|
|
@ -162,6 +162,14 @@ t_parse_malformed_utf8_string(_) ->
|
||||||
ParseState = emqx_frame:initial_parse_state(#{strict_mode => true}),
|
ParseState = emqx_frame:initial_parse_state(#{strict_mode => true}),
|
||||||
?catch_error(utf8_string_invalid, emqx_frame:parse(MalformedPacket, ParseState)).
|
?catch_error(utf8_string_invalid, emqx_frame:parse(MalformedPacket, ParseState)).
|
||||||
|
|
||||||
|
t_parse_empty_topic_name(_) ->
|
||||||
|
Packet = <<48, 4, 0, 0, 0, 1>>,
|
||||||
|
NormalState = emqx_frame:initial_parse_state(#{strict_mode => false}),
|
||||||
|
?assertMatch({_, _}, emqx_frame:parse(Packet, NormalState)),
|
||||||
|
|
||||||
|
StrictState = emqx_frame:initial_parse_state(#{strict_mode => true}),
|
||||||
|
?catch_error(empty_topic_name, emqx_frame:parse(Packet, StrictState)).
|
||||||
|
|
||||||
t_parse_frame_proxy_protocol(_) ->
|
t_parse_frame_proxy_protocol(_) ->
|
||||||
BinList = [ <<"PROXY TCP4 ">>, <<"PROXY TCP6 ">>, <<"PROXY UNKNOWN">>
|
BinList = [ <<"PROXY TCP4 ">>, <<"PROXY TCP6 ">>, <<"PROXY UNKNOWN">>
|
||||||
, <<"\r\n\r\n\0\r\nQUIT\n">>],
|
, <<"\r\n\r\n\0\r\nQUIT\n">>],
|
||||||
|
|
Loading…
Reference in New Issue