commit
66e9f9b02a
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -75,6 +75,8 @@ validate_properties(?SUBSCRIBE, #{'Subscription-Identifier' := I})
|
||||||
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.
|
||||||
|
|
||||||
|
|
|
@ -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) ->
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue