Merge pull request #1789 from Gilbert-Wong/emqx30

Check topic alias
This commit is contained in:
turtleDeng 2018-09-07 21:44:20 +08:00 committed by GitHub
commit 66e9f9b02a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 69 additions and 47 deletions

View File

@ -43,7 +43,9 @@
{mqtt_wildcard_subscription, true}]). {mqtt_wildcard_subscription, true}]).
-define(PUBCAP_KEYS, [max_qos_allowed, -define(PUBCAP_KEYS, [max_qos_allowed,
mqtt_retain_available]). mqtt_retain_available,
mqtt_topic_alias
]).
-define(SUBCAP_KEYS, [max_qos_allowed, -define(SUBCAP_KEYS, [max_qos_allowed,
max_topic_levels, max_topic_levels,
mqtt_shared_subscription, mqtt_shared_subscription,
@ -60,8 +62,15 @@ do_check_pub(Props = #{qos := QoS}, [{max_qos_allowed, MaxQoS}|Caps]) ->
true -> {error, ?RC_QOS_NOT_SUPPORTED}; true -> {error, ?RC_QOS_NOT_SUPPORTED};
false -> do_check_pub(Props, Caps) false -> do_check_pub(Props, Caps)
end; end;
do_check_pub(Props = #{ topic_alias := TopicAlias}, [{max_topic_alias, MaxTopicAlias}| Caps]) ->
case TopicAlias =< MaxTopicAlias andalso TopicAlias > 0 of
false -> {error, ?RC_TOPIC_ALIAS_INVALID};
true -> do_check_pub(Props, Caps)
end;
do_check_pub(#{retain := true}, [{mqtt_retain_available, false}|_Caps]) -> do_check_pub(#{retain := true}, [{mqtt_retain_available, false}|_Caps]) ->
{error, ?RC_RETAIN_NOT_SUPPORTED}; {error, ?RC_RETAIN_NOT_SUPPORTED};
do_check_pub(Props, [{max_topic_alias, _} | Caps]) ->
do_check_pub(Props, Caps);
do_check_pub(Props, [{mqtt_retain_available, _}|Caps]) -> do_check_pub(Props, [{mqtt_retain_available, _}|Caps]) ->
do_check_pub(Props, Caps). do_check_pub(Props, Caps).
@ -136,4 +145,3 @@ with_env(Zone, Key, InitFun) ->
Caps; Caps;
ZoneCaps -> ZoneCaps ZoneCaps -> ZoneCaps
end. end.

View File

@ -72,9 +72,11 @@ validate_packet_id(_) ->
validate_properties(?SUBSCRIBE, #{'Subscription-Identifier' := I}) validate_properties(?SUBSCRIBE, #{'Subscription-Identifier' := I})
when I =< 0; I >= 16#FFFFFFF -> when I =< 0; I >= 16#FFFFFFF ->
error(subscription_identifier_invalid); error(subscription_identifier_invalid);
validate_properties(?PUBLISH, # {'Topic-Alias':= I}) validate_properties(?PUBLISH, #{'Topic-Alias':= I})
when I =:= 0 -> when I =:= 0 ->
error(topic_alias_invalid); error(topic_alias_invalid);
validate_properties(?PUBLISH, #{'Subscription-Identifier' := _I}) ->
error(protocol_error);
validate_properties(_, _) -> validate_properties(_, _) ->
true. true.
@ -236,4 +238,3 @@ format_password(_Password) -> '******'.
i(true) -> 1; i(true) -> 1;
i(false) -> 0; i(false) -> 0;
i(I) when is_integer(I) -> I. i(I) when is_integer(I) -> I.

View File

@ -315,9 +315,12 @@ process_packet(Packet = ?PUBLISH_PACKET(?QOS_0, Topic, _PacketId, _Payload), PSt
case check_publish(Packet, PState) of case check_publish(Packet, PState) of
{ok, PState1} -> {ok, PState1} ->
do_publish(Packet, PState1); do_publish(Packet, PState1);
{error, ?RC_TOPIC_ALIAS_INVALID} ->
?LOG(error, "Protocol error - ~p", [?RC_TOPIC_ALIAS_INVALID], PState),
{error, ?RC_TOPIC_ALIAS_INVALID, PState};
{error, ReasonCode} -> {error, ReasonCode} ->
?LOG(warning, "Cannot publish qos0 message to ~s for ~s", [Topic, ReasonCode], PState), ?LOG(warning, "Cannot publish qos0 message to ~s for ~s", [Topic, ReasonCode], PState),
{ok, PState} {error, ReasonCode, PState}
end; end;
process_packet(Packet = ?PUBLISH_PACKET(?QOS_1, PacketId), PState) -> process_packet(Packet = ?PUBLISH_PACKET(?QOS_1, PacketId), PState) ->
@ -644,9 +647,11 @@ check_publish(Packet, PState) ->
run_check_steps([fun check_pub_caps/2, run_check_steps([fun check_pub_caps/2,
fun check_pub_acl/2], Packet, PState). fun check_pub_acl/2], Packet, PState).
check_pub_caps(#mqtt_packet{header = #mqtt_packet_header{qos = QoS, retain = R}}, check_pub_caps(#mqtt_packet{header = #mqtt_packet_header{qos = QoS, retain = Retain},
variable = #mqtt_packet_publish{ properties = Properties}},
#pstate{zone = Zone}) -> #pstate{zone = Zone}) ->
emqx_mqtt_caps:check_pub(Zone, #{qos => QoS, retain => R}). #{'Topic-Alias' := TopicAlias} = Properties,
emqx_mqtt_caps:check_pub(Zone, #{qos => QoS, retain => Retain, topic_alias => TopicAlias}).
check_pub_acl(_Packet, #pstate{is_super = IsSuper, enable_acl = EnableAcl}) check_pub_acl(_Packet, #pstate{is_super = IsSuper, enable_acl = EnableAcl})
when IsSuper orelse (not EnableAcl) -> when IsSuper orelse (not EnableAcl) ->

View File

@ -64,10 +64,12 @@ t_check_pub(_) ->
{ok, _} = emqx_zone:start_link(), {ok, _} = emqx_zone:start_link(),
PubCaps = #{ PubCaps = #{
max_qos_allowed => ?QOS_1, max_qos_allowed => ?QOS_1,
mqtt_retain_available => false mqtt_retain_available => false,
max_topic_alias => 4
}, },
emqx_zone:set_env(zone, '$mqtt_pub_caps', PubCaps), emqx_zone:set_env(zone, '$mqtt_pub_caps', PubCaps),
timer:sleep(100), timer:sleep(100),
ct:log("~p", [emqx_mqtt_caps:get_caps(zone, publish)]),
BadPubProps1 = #{ BadPubProps1 = #{
qos => ?QOS_2, qos => ?QOS_2,
retain => false retain => false
@ -78,6 +80,12 @@ t_check_pub(_) ->
retain => true retain => true
}, },
{error, ?RC_RETAIN_NOT_SUPPORTED} = emqx_mqtt_caps:check_pub(zone, BadPubProps2), {error, ?RC_RETAIN_NOT_SUPPORTED} = emqx_mqtt_caps:check_pub(zone, BadPubProps2),
BadPubProps3 = #{
qos => ?QOS_1,
retain => false,
topic_alias => 5
},
{error, ?RC_TOPIC_ALIAS_INVALID} = emqx_mqtt_caps:check_pub(zone, BadPubProps3),
PubProps = #{ PubProps = #{
qos => ?QOS_1, qos => ?QOS_1,
retain => false retain => false
@ -104,6 +112,7 @@ t_check_sub(_) ->
ok = do_check_sub(Caps#{mqtt_shared_subscription => false}, ok = do_check_sub(Caps#{mqtt_shared_subscription => false},
[{<<"client/stat">>, Opts}], [{<<"client/stat">>, Opts}],
[{<<"client/stat">>, Opts#{rc => ?RC_SHARED_SUBSCRIPTIONS_NOT_SUPPORTED}}]), [{<<"client/stat">>, Opts#{rc => ?RC_SHARED_SUBSCRIPTIONS_NOT_SUPPORTED}}]),
ok = do_check_sub(Caps#{mqtt_wildcard_subscription => false}, ok = do_check_sub(Caps#{mqtt_wildcard_subscription => false},
[{<<"vlient/+/dsofi">>, Opts}], [{<<"vlient/+/dsofi">>, Opts}],
[{<<"vlient/+/dsofi">>, Opts#{rc => ?RC_WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED}}]), [{<<"vlient/+/dsofi">>, Opts#{rc => ?RC_WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED}}]),
@ -111,7 +120,6 @@ t_check_sub(_) ->
do_check_sub(TopicFilters, Topics) -> do_check_sub(TopicFilters, Topics) ->
{ok, Topics} = emqx_mqtt_caps:check_sub(zone, TopicFilters), {ok, Topics} = emqx_mqtt_caps:check_sub(zone, TopicFilters),
ok. ok.