Rename the type 'client()' to 'client_info()'
- Rename tye type 'client()' to 'client_info()' - Rename the 'client' field of channel to 'client_info' - Fix the function specs
This commit is contained in:
parent
18b401d5fc
commit
98b7e3d948
|
@ -28,7 +28,7 @@
|
|||
%% APIs
|
||||
%%--------------------------------------------------------------------
|
||||
|
||||
-spec(authenticate(emqx_types:client())
|
||||
-spec(authenticate(emqx_types:client_info())
|
||||
-> {ok, #{auth_result := emqx_types:auth_result(),
|
||||
anonymous := boolean}} | {error, term()}).
|
||||
authenticate(Client) ->
|
||||
|
|
|
@ -86,23 +86,23 @@ bin(B) when is_binary(B) ->
|
|||
B.
|
||||
|
||||
%% @doc Match access rule
|
||||
-spec(match(emqx_types:client(), emqx_types:topic(), rule())
|
||||
-spec(match(emqx_types:client_info(), emqx_types:topic(), rule())
|
||||
-> {matched, allow} | {matched, deny} | nomatch).
|
||||
match(_Client, _Topic, {AllowDeny, all}) when ?ALLOW_DENY(AllowDeny) ->
|
||||
match(_ClientInfo, _Topic, {AllowDeny, all}) when ?ALLOW_DENY(AllowDeny) ->
|
||||
{matched, AllowDeny};
|
||||
match(Client, Topic, {AllowDeny, Who, _PubSub, TopicFilters})
|
||||
match(ClientInfo, Topic, {AllowDeny, Who, _PubSub, TopicFilters})
|
||||
when ?ALLOW_DENY(AllowDeny) ->
|
||||
case match_who(Client, Who)
|
||||
andalso match_topics(Client, Topic, TopicFilters) of
|
||||
case match_who(ClientInfo, Who)
|
||||
andalso match_topics(ClientInfo, Topic, TopicFilters) of
|
||||
true -> {matched, AllowDeny};
|
||||
false -> nomatch
|
||||
end.
|
||||
|
||||
match_who(_Client, all) ->
|
||||
match_who(_ClientInfo, all) ->
|
||||
true;
|
||||
match_who(_Client, {user, all}) ->
|
||||
match_who(_ClientInfo, {user, all}) ->
|
||||
true;
|
||||
match_who(_Client, {client, all}) ->
|
||||
match_who(_ClientInfo, {client, all}) ->
|
||||
true;
|
||||
match_who(#{client_id := ClientId}, {client, ClientId}) ->
|
||||
true;
|
||||
|
@ -112,44 +112,44 @@ match_who(#{peerhost := undefined}, {ipaddr, _Tup}) ->
|
|||
false;
|
||||
match_who(#{peerhost := IP}, {ipaddr, CIDR}) ->
|
||||
esockd_cidr:match(IP, CIDR);
|
||||
match_who(Client, {'and', Conds}) when is_list(Conds) ->
|
||||
match_who(ClientInfo, {'and', Conds}) when is_list(Conds) ->
|
||||
lists:foldl(fun(Who, Allow) ->
|
||||
match_who(Client, Who) andalso Allow
|
||||
match_who(ClientInfo, Who) andalso Allow
|
||||
end, true, Conds);
|
||||
match_who(Client, {'or', Conds}) when is_list(Conds) ->
|
||||
match_who(ClientInfo, {'or', Conds}) when is_list(Conds) ->
|
||||
lists:foldl(fun(Who, Allow) ->
|
||||
match_who(Client, Who) orelse Allow
|
||||
match_who(ClientInfo, Who) orelse Allow
|
||||
end, false, Conds);
|
||||
match_who(_Client, _Who) ->
|
||||
match_who(_ClientInfo, _Who) ->
|
||||
false.
|
||||
|
||||
match_topics(_Client, _Topic, []) ->
|
||||
match_topics(_ClientInfo, _Topic, []) ->
|
||||
false;
|
||||
match_topics(Client, Topic, [{pattern, PatternFilter}|Filters]) ->
|
||||
TopicFilter = feed_var(Client, PatternFilter),
|
||||
match_topics(ClientInfo, Topic, [{pattern, PatternFilter}|Filters]) ->
|
||||
TopicFilter = feed_var(ClientInfo, PatternFilter),
|
||||
match_topic(emqx_topic:words(Topic), TopicFilter)
|
||||
orelse match_topics(Client, Topic, Filters);
|
||||
match_topics(Client, Topic, [TopicFilter|Filters]) ->
|
||||
orelse match_topics(ClientInfo, Topic, Filters);
|
||||
match_topics(ClientInfo, Topic, [TopicFilter|Filters]) ->
|
||||
match_topic(emqx_topic:words(Topic), TopicFilter)
|
||||
orelse match_topics(Client, Topic, Filters).
|
||||
orelse match_topics(ClientInfo, Topic, Filters).
|
||||
|
||||
match_topic(Topic, {eq, TopicFilter}) ->
|
||||
Topic == TopicFilter;
|
||||
match_topic(Topic, TopicFilter) ->
|
||||
emqx_topic:match(Topic, TopicFilter).
|
||||
|
||||
feed_var(Client, Pattern) ->
|
||||
feed_var(Client, Pattern, []).
|
||||
feed_var(_Client, [], Acc) ->
|
||||
feed_var(ClientInfo, Pattern) ->
|
||||
feed_var(ClientInfo, Pattern, []).
|
||||
feed_var(_ClientInfo, [], Acc) ->
|
||||
lists:reverse(Acc);
|
||||
feed_var(Client = #{client_id := undefined}, [<<"%c">>|Words], Acc) ->
|
||||
feed_var(Client, Words, [<<"%c">>|Acc]);
|
||||
feed_var(Client = #{client_id := ClientId}, [<<"%c">>|Words], Acc) ->
|
||||
feed_var(Client, Words, [ClientId |Acc]);
|
||||
feed_var(Client = #{username := undefined}, [<<"%u">>|Words], Acc) ->
|
||||
feed_var(Client, Words, [<<"%u">>|Acc]);
|
||||
feed_var(Client = #{username := Username}, [<<"%u">>|Words], Acc) ->
|
||||
feed_var(Client, Words, [Username|Acc]);
|
||||
feed_var(Client, [W|Words], Acc) ->
|
||||
feed_var(Client, Words, [W|Acc]).
|
||||
feed_var(ClientInfo = #{client_id := undefined}, [<<"%c">>|Words], Acc) ->
|
||||
feed_var(ClientInfo, Words, [<<"%c">>|Acc]);
|
||||
feed_var(ClientInfo = #{client_id := ClientId}, [<<"%c">>|Words], Acc) ->
|
||||
feed_var(ClientInfo, Words, [ClientId |Acc]);
|
||||
feed_var(ClientInfo = #{username := undefined}, [<<"%u">>|Words], Acc) ->
|
||||
feed_var(ClientInfo, Words, [<<"%u">>|Acc]);
|
||||
feed_var(ClientInfo = #{username := Username}, [<<"%u">>|Words], Acc) ->
|
||||
feed_var(ClientInfo, Words, [Username|Acc]);
|
||||
feed_var(ClientInfo, [W|Words], Acc) ->
|
||||
feed_var(ClientInfo, Words, [W|Acc]).
|
||||
|
||||
|
|
|
@ -73,7 +73,7 @@ start_link() ->
|
|||
-spec(stop() -> ok).
|
||||
stop() -> gen_server:stop(?MODULE).
|
||||
|
||||
-spec(check(emqx_types:client()) -> boolean()).
|
||||
-spec(check(emqx_types:client_info()) -> boolean()).
|
||||
check(#{client_id := ClientId,
|
||||
username := Username,
|
||||
peerhost := IPAddr}) ->
|
||||
|
|
|
@ -60,7 +60,7 @@
|
|||
%% MQTT ConnInfo
|
||||
conninfo :: emqx_types:conninfo(),
|
||||
%% MQTT ClientInfo
|
||||
client :: emqx_types:client(),
|
||||
client_info :: emqx_types:client_info(),
|
||||
%% MQTT Session
|
||||
session :: emqx_session:session(),
|
||||
%% Keepalive
|
||||
|
@ -102,7 +102,7 @@
|
|||
will_timer => will_message
|
||||
}).
|
||||
|
||||
-define(ATTR_KEYS, [conninfo, client, session, connected, connected_at, disconnected_at]).
|
||||
-define(ATTR_KEYS, [conninfo, client_info, session, connected, connected_at, disconnected_at]).
|
||||
-define(INFO_KEYS, ?ATTR_KEYS ++ [keepalive, topic_aliases, alias_maximum, gc_state, disconnected_at]).
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
|
@ -119,7 +119,7 @@ info(Keys, Channel) when is_list(Keys) ->
|
|||
[{Key, info(Key, Channel)} || Key <- Keys];
|
||||
info(conninfo, #channel{conninfo = ConnInfo}) ->
|
||||
ConnInfo;
|
||||
info(client, #channel{client = ClientInfo}) ->
|
||||
info(client_info, #channel{client_info = ClientInfo}) ->
|
||||
ClientInfo;
|
||||
info(session, #channel{session = Session}) ->
|
||||
maybe_apply(fun emqx_session:info/1, Session);
|
||||
|
@ -158,7 +158,7 @@ stats(#channel{session = Session}) ->
|
|||
emqx_session:stats(Session).
|
||||
|
||||
-spec(caps(channel()) -> emqx_types:caps()).
|
||||
caps(#channel{client = #{zone := Zone}}) ->
|
||||
caps(#channel{client_info = #{zone := Zone}}) ->
|
||||
emqx_mqtt_caps:get_caps(Zone).
|
||||
|
||||
%% For tests
|
||||
|
@ -197,7 +197,7 @@ init(ConnInfo = #{peername := {PeerHost, _Port}, protocol := Protocol}, Options)
|
|||
false -> disabled
|
||||
end,
|
||||
#channel{conninfo = ConnInfo,
|
||||
client = ClientInfo,
|
||||
client_info = ClientInfo,
|
||||
gc_state = init_gc_state(Zone),
|
||||
oom_policy = init_oom_policy(Zone),
|
||||
timers = #{stats_timer => StatsTimer},
|
||||
|
@ -252,7 +252,7 @@ handle_in(Packet = ?PUBLISH_PACKET(_QoS), Channel) ->
|
|||
end;
|
||||
|
||||
handle_in(?PUBACK_PACKET(PacketId, _ReasonCode),
|
||||
Channel = #channel{client = ClientInfo, session = Session}) ->
|
||||
Channel = #channel{client_info = ClientInfo, session = Session}) ->
|
||||
case emqx_session:puback(PacketId, Session) of
|
||||
{ok, Msg, Publishes, NSession} ->
|
||||
ok = emqx_hooks:run('message.acked', [ClientInfo, Msg]),
|
||||
|
@ -271,7 +271,7 @@ handle_in(?PUBACK_PACKET(PacketId, _ReasonCode),
|
|||
end;
|
||||
|
||||
handle_in(?PUBREC_PACKET(PacketId, _ReasonCode),
|
||||
Channel = #channel{client = ClientInfo, session = Session}) ->
|
||||
Channel = #channel{client_info = ClientInfo, session = Session}) ->
|
||||
case emqx_session:pubrec(PacketId, Session) of
|
||||
{ok, Msg, NSession} ->
|
||||
ok = emqx_hooks:run('message.acked', [ClientInfo, Msg]),
|
||||
|
@ -310,7 +310,7 @@ handle_in(?PUBCOMP_PACKET(PacketId, _ReasonCode), Channel = #channel{session = S
|
|||
end;
|
||||
|
||||
handle_in(Packet = ?SUBSCRIBE_PACKET(PacketId, Properties, TopicFilters),
|
||||
Channel = #channel{client = ClientInfo}) ->
|
||||
Channel = #channel{client_info = ClientInfo}) ->
|
||||
case emqx_packet:check(Packet) of
|
||||
ok -> TopicFilters1 = emqx_hooks:run_fold('client.subscribe',
|
||||
[ClientInfo, Properties],
|
||||
|
@ -323,7 +323,7 @@ handle_in(Packet = ?SUBSCRIBE_PACKET(PacketId, Properties, TopicFilters),
|
|||
end;
|
||||
|
||||
handle_in(Packet = ?UNSUBSCRIBE_PACKET(PacketId, Properties, TopicFilters),
|
||||
Channel = #channel{client = ClientInfo}) ->
|
||||
Channel = #channel{client_info = ClientInfo}) ->
|
||||
case emqx_packet:check(Packet) of
|
||||
ok -> TopicFilters1 = emqx_hooks:run_fold('client.unsubscribe',
|
||||
[ClientInfo, Properties],
|
||||
|
@ -369,7 +369,7 @@ handle_in(Packet, Channel) ->
|
|||
%%--------------------------------------------------------------------
|
||||
|
||||
process_connect(ConnPkt = #mqtt_packet_connect{clean_start = CleanStart},
|
||||
Channel = #channel{conninfo = ConnInfo, client = ClientInfo}) ->
|
||||
Channel = #channel{conninfo = ConnInfo, client_info = ClientInfo}) ->
|
||||
case emqx_cm:open_session(CleanStart, ClientInfo, ConnInfo) of
|
||||
{ok, #{session := Session, present := false}} ->
|
||||
NChannel = Channel#channel{session = Session},
|
||||
|
@ -440,7 +440,7 @@ process_publish(PacketId, Msg = #message{qos = ?QOS_2},
|
|||
end.
|
||||
|
||||
publish_to_msg(Packet, #channel{conninfo = #{proto_ver := ProtoVer},
|
||||
client = ClientInfo = #{mountpoint := MountPoint}}) ->
|
||||
client_info = ClientInfo = #{mountpoint := MountPoint}}) ->
|
||||
Msg = emqx_packet:to_message(ClientInfo, Packet),
|
||||
Msg1 = emqx_message:set_flag(dup, false, Msg),
|
||||
Msg2 = emqx_message:set_header(proto_ver, ProtoVer, Msg1),
|
||||
|
@ -461,7 +461,7 @@ process_subscribe([{TopicFilter, SubOpts}|More], Acc, Channel) ->
|
|||
process_subscribe(More, [RC|Acc], NChannel).
|
||||
|
||||
do_subscribe(TopicFilter, SubOpts = #{qos := QoS}, Channel =
|
||||
#channel{client = ClientInfo = #{mountpoint := MountPoint},
|
||||
#channel{client_info = ClientInfo = #{mountpoint := MountPoint},
|
||||
session = Session}) ->
|
||||
case check_subscribe(TopicFilter, SubOpts, Channel) of
|
||||
ok ->
|
||||
|
@ -491,7 +491,7 @@ process_unsubscribe([{TopicFilter, SubOpts}|More], Acc, Channel) ->
|
|||
process_unsubscribe(More, [RC|Acc], NChannel).
|
||||
|
||||
do_unsubscribe(TopicFilter, _SubOpts, Channel =
|
||||
#channel{client = ClientInfo = #{mountpoint := MountPoint},
|
||||
#channel{client_info = ClientInfo = #{mountpoint := MountPoint},
|
||||
session = Session}) ->
|
||||
TopicFilter1 = emqx_mountpoint:mount(MountPoint, TopicFilter),
|
||||
case emqx_session:unsubscribe(ClientInfo, TopicFilter1, Session) of
|
||||
|
@ -506,7 +506,7 @@ do_unsubscribe(TopicFilter, _SubOpts, Channel =
|
|||
|
||||
%%TODO: RunFold or Pipeline
|
||||
handle_out({connack, ?RC_SUCCESS, SP, ConnPkt},
|
||||
Channel = #channel{conninfo = ConnInfo, client = ClientInfo}) ->
|
||||
Channel = #channel{conninfo = ConnInfo, client_info = ClientInfo}) ->
|
||||
AckProps = run_fold([fun enrich_caps/2,
|
||||
fun enrich_server_keepalive/2,
|
||||
fun enrich_assigned_clientid/2
|
||||
|
@ -531,7 +531,7 @@ handle_out({connack, ?RC_SUCCESS, SP, ConnPkt},
|
|||
end;
|
||||
|
||||
handle_out({connack, ReasonCode, _ConnPkt}, Channel = #channel{conninfo = ConnInfo,
|
||||
client = ClientInfo}) ->
|
||||
client_info = ClientInfo}) ->
|
||||
ok = emqx_hooks:run('client.connected', [ClientInfo, ReasonCode, ConnInfo]),
|
||||
ReasonCode1 = case ProtoVer = maps:get(proto_ver, ConnInfo) of
|
||||
?MQTT_PROTO_V5 -> ReasonCode;
|
||||
|
@ -572,11 +572,11 @@ handle_out({publish, Publishes}, Channel) when is_list(Publishes) ->
|
|||
%% Ignore loop deliver
|
||||
handle_out({publish, _PacketId, #message{from = ClientId,
|
||||
flags = #{nl := true}}},
|
||||
Channel = #channel{client = #{client_id := ClientId}}) ->
|
||||
Channel = #channel{client_info = #{client_id := ClientId}}) ->
|
||||
{ok, Channel};
|
||||
|
||||
handle_out({publish, PacketId, Msg}, Channel =
|
||||
#channel{client = ClientInfo = #{mountpoint := MountPoint}}) ->
|
||||
#channel{client_info = ClientInfo = #{mountpoint := MountPoint}}) ->
|
||||
Msg1 = emqx_message:update_expiry(Msg),
|
||||
Msg2 = emqx_hooks:run_fold('message.delivered', [ClientInfo], Msg1),
|
||||
Msg3 = emqx_mountpoint:unmount(MountPoint, Msg2),
|
||||
|
@ -657,7 +657,7 @@ handle_call(Req, Channel) ->
|
|||
|
||||
-spec(handle_cast(Msg :: term(), channel())
|
||||
-> ok | {ok, channel()} | {stop, Reason :: term(), channel()}).
|
||||
handle_cast({register, Attrs, Stats}, #channel{client = #{client_id := ClientId}}) ->
|
||||
handle_cast({register, Attrs, Stats}, #channel{client_info = #{client_id := ClientId}}) ->
|
||||
ok = emqx_cm:register_channel(ClientId),
|
||||
emqx_cm:set_chan_attrs(ClientId, Attrs),
|
||||
emqx_cm:set_chan_stats(ClientId, Stats);
|
||||
|
@ -672,14 +672,14 @@ handle_cast(Msg, Channel) ->
|
|||
|
||||
-spec(handle_info(Info :: term(), channel())
|
||||
-> {ok, channel()} | {stop, Reason :: term(), channel()}).
|
||||
handle_info({subscribe, TopicFilters}, Channel = #channel{client = ClientInfo}) ->
|
||||
handle_info({subscribe, TopicFilters}, Channel = #channel{client_info = ClientInfo}) ->
|
||||
TopicFilters1 = emqx_hooks:run_fold('client.subscribe',
|
||||
[ClientInfo, #{'Internal' => true}],
|
||||
parse_topic_filters(TopicFilters)),
|
||||
{_ReasonCodes, NChannel} = process_subscribe(TopicFilters1, Channel),
|
||||
{ok, NChannel};
|
||||
|
||||
handle_info({unsubscribe, TopicFilters}, Channel = #channel{client = ClientInfo}) ->
|
||||
handle_info({unsubscribe, TopicFilters}, Channel = #channel{client_info = ClientInfo}) ->
|
||||
TopicFilters1 = emqx_hooks:run_fold('client.unsubscribe',
|
||||
[ClientInfo, #{'Internal' => true}],
|
||||
parse_topic_filters(TopicFilters)),
|
||||
|
@ -693,7 +693,7 @@ handle_info(disconnected, Channel = #channel{connected = false}) ->
|
|||
{ok, Channel};
|
||||
|
||||
handle_info(disconnected, Channel = #channel{conninfo = #{expiry_interval := ExpiryInterval},
|
||||
client = ClientInfo = #{zone := Zone},
|
||||
client_info = ClientInfo = #{zone := Zone},
|
||||
will_msg = WillMsg}) ->
|
||||
emqx_zone:enable_flapping_detect(Zone) andalso emqx_flapping:detect(ClientInfo),
|
||||
Channel1 = ensure_disconnected(Channel),
|
||||
|
@ -726,7 +726,7 @@ handle_info(Info, Channel) ->
|
|||
| {ok, Result :: term(), channel()}
|
||||
| {stop, Reason :: term(), channel()}).
|
||||
handle_timeout(TRef, {emit_stats, Stats},
|
||||
Channel = #channel{client = #{client_id := ClientId},
|
||||
Channel = #channel{client_info = #{client_id := ClientId},
|
||||
timers = #{stats_timer := TRef}}) ->
|
||||
ok = emqx_cm:set_chan_stats(ClientId, Stats),
|
||||
{ok, clean_timer(stats_timer, Channel)};
|
||||
|
@ -810,7 +810,7 @@ reset_timer(Name, Time, Channel) ->
|
|||
clean_timer(Name, Channel = #channel{timers = Timers}) ->
|
||||
Channel#channel{timers = maps:remove(Name, Timers)}.
|
||||
|
||||
interval(stats_timer, #channel{client = #{zone := Zone}}) ->
|
||||
interval(stats_timer, #channel{client_info = #{zone := Zone}}) ->
|
||||
emqx_zone:get_env(Zone, idle_timeout, 30000);
|
||||
interval(alive_timer, #channel{keepalive = KeepAlive}) ->
|
||||
emqx_keepalive:info(interval, KeepAlive);
|
||||
|
@ -834,12 +834,12 @@ will_delay_interval(WillMsg) ->
|
|||
|
||||
terminate(_, #channel{connected = undefined}) ->
|
||||
ok;
|
||||
terminate(normal, #channel{conninfo = ConnInfo, client = ClientInfo}) ->
|
||||
terminate(normal, #channel{conninfo = ConnInfo, client_info = ClientInfo}) ->
|
||||
ok = emqx_hooks:run('client.disconnected', [ClientInfo, normal, ConnInfo]);
|
||||
terminate({shutdown, Reason}, #channel{conninfo = ConnInfo, client = ClientInfo})
|
||||
terminate({shutdown, Reason}, #channel{conninfo = ConnInfo, client_info = ClientInfo})
|
||||
when Reason =:= kicked orelse Reason =:= discarded orelse Reason =:= takeovered ->
|
||||
ok = emqx_hooks:run('client.disconnected', [ClientInfo, Reason, ConnInfo]);
|
||||
terminate(Reason, #channel{conninfo = ConnInfo, client = ClientInfo, will_msg = WillMsg}) ->
|
||||
terminate(Reason, #channel{conninfo = ConnInfo, client_info = ClientInfo, will_msg = WillMsg}) ->
|
||||
publish_will_msg(WillMsg),
|
||||
ok = emqx_hooks:run('client.disconnected', [ClientInfo, Reason, ConnInfo]).
|
||||
|
||||
|
@ -866,7 +866,7 @@ enrich_conninfo(#mqtt_packet_connect{
|
|||
properties = ConnProps,
|
||||
client_id = ClientId,
|
||||
username = Username}, Channel) ->
|
||||
#channel{conninfo = ConnInfo, client = #{zone := Zone}} = Channel,
|
||||
#channel{conninfo = ConnInfo, client_info = #{zone := Zone}} = Channel,
|
||||
MaxInflight = emqx_mqtt_props:get('Receive-Maximum',
|
||||
ConnProps, emqx_zone:max_inflight(Zone)),
|
||||
Interval = if ProtoVer == ?MQTT_PROTO_V5 ->
|
||||
|
@ -889,18 +889,18 @@ enrich_conninfo(#mqtt_packet_connect{
|
|||
{ok, Channel#channel{conninfo = NConnInfo}}.
|
||||
|
||||
%% @doc Check connect packet.
|
||||
check_connect(ConnPkt, #channel{client = #{zone := Zone}}) ->
|
||||
check_connect(ConnPkt, #channel{client_info = #{zone := Zone}}) ->
|
||||
emqx_packet:check(ConnPkt, emqx_mqtt_caps:get_caps(Zone)).
|
||||
|
||||
%% @doc Enrich client
|
||||
enrich_client(ConnPkt, Channel = #channel{client = ClientInfo}) ->
|
||||
enrich_client(ConnPkt, Channel = #channel{client_info = ClientInfo}) ->
|
||||
{ok, NConnPkt, NClientInfo} =
|
||||
pipeline([fun set_username/2,
|
||||
fun set_bridge_mode/2,
|
||||
fun maybe_username_as_clientid/2,
|
||||
fun maybe_assign_clientid/2,
|
||||
fun fix_mountpoint/2], ConnPkt, ClientInfo),
|
||||
{ok, NConnPkt, Channel#channel{client = NClientInfo}}.
|
||||
{ok, NConnPkt, Channel#channel{client_info = NClientInfo}}.
|
||||
|
||||
set_username(#mqtt_packet_connect{username = Username},
|
||||
ClientInfo = #{username := undefined}) ->
|
||||
|
@ -931,20 +931,20 @@ fix_mountpoint(_ConnPkt, ClientInfo = #{mountpoint := Mountpoint}) ->
|
|||
{ok, ClientInfo#{mountpoint := emqx_mountpoint:replvar(Mountpoint, ClientInfo)}}.
|
||||
|
||||
%% @doc Set logger metadata.
|
||||
set_logger_meta(_ConnPkt, #channel{client = #{client_id := ClientId}}) ->
|
||||
set_logger_meta(_ConnPkt, #channel{client_info = #{client_id := ClientId}}) ->
|
||||
emqx_logger:set_metadata_client_id(ClientId).
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
%% Check banned/flapping
|
||||
%%--------------------------------------------------------------------
|
||||
|
||||
check_banned(_ConnPkt, #channel{client = ClientInfo = #{zone := Zone}}) ->
|
||||
check_banned(_ConnPkt, #channel{client_info = ClientInfo = #{zone := Zone}}) ->
|
||||
case emqx_zone:enable_ban(Zone) andalso emqx_banned:check(ClientInfo) of
|
||||
true -> {error, ?RC_BANNED};
|
||||
false -> ok
|
||||
end.
|
||||
|
||||
check_flapping(_ConnPkt, #channel{client = ClientInfo = #{zone := Zone}}) ->
|
||||
check_flapping(_ConnPkt, #channel{client_info = ClientInfo = #{zone := Zone}}) ->
|
||||
case emqx_zone:enable_flapping_detect(Zone)
|
||||
andalso emqx_flapping:check(ClientInfo) of
|
||||
true -> {error, ?RC_CONNECTION_RATE_EXCEEDED};
|
||||
|
@ -958,10 +958,10 @@ check_flapping(_ConnPkt, #channel{client = ClientInfo = #{zone := Zone}}) ->
|
|||
auth_connect(#mqtt_packet_connect{client_id = ClientId,
|
||||
username = Username,
|
||||
password = Password},
|
||||
Channel = #channel{client = ClientInfo}) ->
|
||||
Channel = #channel{client_info = ClientInfo}) ->
|
||||
case emqx_access_control:authenticate(ClientInfo#{password => Password}) of
|
||||
{ok, AuthResult} ->
|
||||
{ok, Channel#channel{client = maps:merge(ClientInfo, AuthResult)}};
|
||||
{ok, Channel#channel{client_info = maps:merge(ClientInfo, AuthResult)}};
|
||||
{error, Reason} ->
|
||||
?LOG(warning, "Client ~s (Username: '~s') login failed for ~0p",
|
||||
[ClientId, Username, Reason]),
|
||||
|
@ -1004,7 +1004,7 @@ save_alias(AliasId, Topic, Aliases) -> maps:put(AliasId, Topic, Aliases).
|
|||
|
||||
%% Check Pub ACL
|
||||
check_pub_acl(#mqtt_packet{variable = #mqtt_packet_publish{topic_name = Topic}},
|
||||
#channel{client = ClientInfo}) ->
|
||||
#channel{client_info = ClientInfo}) ->
|
||||
case is_acl_enabled(ClientInfo) andalso
|
||||
emqx_access_control:check_acl(ClientInfo, publish, Topic) of
|
||||
false -> ok;
|
||||
|
@ -1033,7 +1033,7 @@ check_pub_caps(#mqtt_packet{header = #mqtt_packet_header{qos = QoS,
|
|||
retain = Retain
|
||||
}
|
||||
},
|
||||
#channel{client = #{zone := Zone}}) ->
|
||||
#channel{client_info = #{zone := Zone}}) ->
|
||||
emqx_mqtt_caps:check_pub(Zone, #{qos => QoS, retain => Retain}).
|
||||
|
||||
%% Check Sub
|
||||
|
@ -1044,7 +1044,7 @@ check_subscribe(TopicFilter, SubOpts, Channel) ->
|
|||
end.
|
||||
|
||||
%% Check Sub ACL
|
||||
check_sub_acl(TopicFilter, #channel{client = ClientInfo}) ->
|
||||
check_sub_acl(TopicFilter, #channel{client_info = ClientInfo}) ->
|
||||
case is_acl_enabled(ClientInfo) andalso
|
||||
emqx_access_control:check_acl(ClientInfo, subscribe, TopicFilter) of
|
||||
false -> allow;
|
||||
|
@ -1052,7 +1052,7 @@ check_sub_acl(TopicFilter, #channel{client = ClientInfo}) ->
|
|||
end.
|
||||
|
||||
%% Check Sub Caps
|
||||
check_sub_caps(TopicFilter, SubOpts, #channel{client = #{zone := Zone}}) ->
|
||||
check_sub_caps(TopicFilter, SubOpts, #channel{client_info = #{zone := Zone}}) ->
|
||||
emqx_mqtt_caps:check_sub(Zone, TopicFilter, SubOpts).
|
||||
|
||||
enrich_subid(#{'Subscription-Identifier' := SubId}, TopicFilters) ->
|
||||
|
@ -1063,12 +1063,12 @@ enrich_subid(_Properties, TopicFilters) ->
|
|||
enrich_subopts(SubOpts, #channel{conninfo = #{proto_ver := ?MQTT_PROTO_V5}}) ->
|
||||
SubOpts;
|
||||
|
||||
enrich_subopts(SubOpts, #channel{client = #{zone := Zone, is_bridge := IsBridge}}) ->
|
||||
enrich_subopts(SubOpts, #channel{client_info = #{zone := Zone, is_bridge := IsBridge}}) ->
|
||||
NL = flag(emqx_zone:ignore_loop_deliver(Zone)),
|
||||
SubOpts#{rap => flag(IsBridge), nl => NL}.
|
||||
|
||||
enrich_caps(AckProps, #channel{conninfo = #{proto_ver := ?MQTT_PROTO_V5},
|
||||
client = #{zone := Zone}}) ->
|
||||
client_info = #{zone := Zone}}) ->
|
||||
#{max_packet_size := MaxPktSize,
|
||||
max_qos_allowed := MaxQoS,
|
||||
retain_available := Retain,
|
||||
|
@ -1087,14 +1087,14 @@ enrich_caps(AckProps, #channel{conninfo = #{proto_ver := ?MQTT_PROTO_V5},
|
|||
enrich_caps(AckProps, _Channel) ->
|
||||
AckProps.
|
||||
|
||||
enrich_server_keepalive(AckProps, #channel{client = #{zone := Zone}}) ->
|
||||
enrich_server_keepalive(AckProps, #channel{client_info = #{zone := Zone}}) ->
|
||||
case emqx_zone:server_keepalive(Zone) of
|
||||
undefined -> AckProps;
|
||||
Keepalive -> AckProps#{'Server-Keep-Alive' => Keepalive}
|
||||
end.
|
||||
|
||||
enrich_assigned_clientid(AckProps, #channel{conninfo = ConnInfo,
|
||||
client = #{client_id := ClientId}
|
||||
client_info = #{client_id := ClientId}
|
||||
}) ->
|
||||
case maps:get(client_id, ConnInfo) of
|
||||
<<>> -> %% Original ClientId is null.
|
||||
|
@ -1117,7 +1117,7 @@ ensure_keepalive(_AckProps, Channel = #channel{conninfo = ConnInfo}) ->
|
|||
ensure_keepalive_timer(maps:get(keepalive, ConnInfo), Channel).
|
||||
|
||||
ensure_keepalive_timer(0, Channel) -> Channel;
|
||||
ensure_keepalive_timer(Interval, Channel = #channel{client = #{zone := Zone}}) ->
|
||||
ensure_keepalive_timer(Interval, Channel = #channel{client_info = #{zone := Zone}}) ->
|
||||
Backoff = emqx_zone:get_env(Zone, keepalive_backoff, 0.75),
|
||||
Keepalive = emqx_keepalive:init(round(timer:seconds(Interval) * Backoff)),
|
||||
ensure_timer(alive_timer, Channel#channel{keepalive = Keepalive}).
|
||||
|
|
|
@ -162,7 +162,7 @@ set_chan_stats(ClientId, ChanPid, Stats) ->
|
|||
ok.
|
||||
|
||||
%% @doc Open a session.
|
||||
-spec(open_session(boolean(), emqx_types:client(), map())
|
||||
-spec(open_session(boolean(), emqx_types:client_info(), emqx_types:conninfo())
|
||||
-> {ok, #{session := emqx_session:session(),
|
||||
present := boolean(),
|
||||
pendings => list()}}
|
||||
|
|
|
@ -69,7 +69,7 @@ start_link() ->
|
|||
stop() -> gen_server:stop(?MODULE).
|
||||
|
||||
%% @doc Check flapping when a MQTT client connected.
|
||||
-spec(check(emqx_types:client()) -> boolean()).
|
||||
-spec(check(emqx_types:client_info()) -> boolean()).
|
||||
check(#{client_id := ClientId}) ->
|
||||
check(ClientId, get_policy()).
|
||||
|
||||
|
@ -81,7 +81,7 @@ check(ClientId, #{banned_interval := Interval}) ->
|
|||
end.
|
||||
|
||||
%% @doc Detect flapping when a MQTT client disconnected.
|
||||
-spec(detect(emqx_types:client()) -> boolean()).
|
||||
-spec(detect(emqx_types:client_info()) -> boolean()).
|
||||
detect(Client) -> detect(Client, get_policy()).
|
||||
|
||||
detect(#{client_id := ClientId, peerhost := PeerHost},
|
||||
|
|
|
@ -61,7 +61,7 @@ all_rules() ->
|
|||
%%--------------------------------------------------------------------
|
||||
|
||||
%% @doc Check ACL
|
||||
-spec(check_acl(emqx_types:client(), emqx_types:pubsub(), emqx_topic:topic(),
|
||||
-spec(check_acl(emqx_types:client_info(), emqx_types:pubsub(), emqx_topic:topic(),
|
||||
emqx_access_rule:acl_result(), acl_rules())
|
||||
-> {ok, allow} | {ok, deny} | ok).
|
||||
check_acl(Client, PubSub, Topic, _AclResult, Rules) ->
|
||||
|
|
|
@ -240,7 +240,7 @@ validate_topic_filters(TopicFilters) ->
|
|||
end, TopicFilters).
|
||||
|
||||
%% @doc Publish Packet to Message.
|
||||
-spec(to_message(emqx_types:client(), emqx_ypes:packet()) -> emqx_types:message()).
|
||||
-spec(to_message(emqx_types:client_info(), emqx_ypes:packet()) -> emqx_types:message()).
|
||||
to_message(#{client_id := ClientId, username := Username, peerhost := PeerHost},
|
||||
#mqtt_packet{header = #mqtt_packet_header{type = ?PUBLISH,
|
||||
retain = Retain,
|
||||
|
|
|
@ -140,7 +140,7 @@
|
|||
%%--------------------------------------------------------------------
|
||||
|
||||
%% @doc Init a session.
|
||||
-spec(init(emqx_types:client(), Options :: map()) -> session()).
|
||||
-spec(init(emqx_types:client_info(), emqx_types:conninfo()) -> session()).
|
||||
init(#{zone := Zone}, #{receive_maximum := MaxInflight}) ->
|
||||
#session{max_subscriptions = get_env(Zone, max_subscriptions, 0),
|
||||
subscriptions = #{},
|
||||
|
@ -252,14 +252,14 @@ redeliver(Session = #session{inflight = Inflight}) ->
|
|||
%% Client -> Broker: SUBSCRIBE
|
||||
%%--------------------------------------------------------------------
|
||||
|
||||
-spec(subscribe(emqx_types:client(), emqx_types:topic(), emqx_types:subopts(), session())
|
||||
-spec(subscribe(emqx_types:client_info(), emqx_types:topic(), emqx_types:subopts(), session())
|
||||
-> {ok, session()} | {error, emqx_types:reason_code()}).
|
||||
subscribe(Client, TopicFilter, SubOpts, Session = #session{subscriptions = Subs}) ->
|
||||
subscribe(ClientInfo, TopicFilter, SubOpts, Session = #session{subscriptions = Subs}) ->
|
||||
case is_subscriptions_full(Session)
|
||||
andalso (not maps:is_key(TopicFilter, Subs)) of
|
||||
true -> {error, ?RC_QUOTA_EXCEEDED};
|
||||
false ->
|
||||
do_subscribe(Client, TopicFilter, SubOpts, Session)
|
||||
do_subscribe(ClientInfo, TopicFilter, SubOpts, Session)
|
||||
end.
|
||||
|
||||
is_subscriptions_full(#session{max_subscriptions = 0}) ->
|
||||
|
@ -285,13 +285,13 @@ do_subscribe(Client = #{client_id := ClientId}, TopicFilter, SubOpts,
|
|||
%% Client -> Broker: UNSUBSCRIBE
|
||||
%%--------------------------------------------------------------------
|
||||
|
||||
-spec(unsubscribe(emqx_types:client(), emqx_types:topic(), session())
|
||||
-spec(unsubscribe(emqx_types:client_info(), emqx_types:topic(), session())
|
||||
-> {ok, session()} | {error, emqx_types:reason_code()}).
|
||||
unsubscribe(Client, TopicFilter, Session = #session{subscriptions = Subs}) ->
|
||||
unsubscribe(ClientInfo, TopicFilter, Session = #session{subscriptions = Subs}) ->
|
||||
case maps:find(TopicFilter, Subs) of
|
||||
{ok, SubOpts} ->
|
||||
ok = emqx_broker:unsubscribe(TopicFilter),
|
||||
ok = emqx_hooks:run('session.unsubscribed', [Client, TopicFilter, SubOpts]),
|
||||
ok = emqx_hooks:run('session.unsubscribed', [ClientInfo, TopicFilter, SubOpts]),
|
||||
{ok, Session#session{subscriptions = maps:remove(TopicFilter, Subs)}};
|
||||
error ->
|
||||
{error, ?RC_NO_SUBSCRIPTION_EXISTED}
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
]).
|
||||
|
||||
-export_type([ conninfo/0
|
||||
, client/0
|
||||
, client_info/0
|
||||
, client_id/0
|
||||
, username/0
|
||||
, password/0
|
||||
|
@ -79,7 +79,6 @@
|
|||
|
||||
-export_type([ caps/0
|
||||
, infos/0
|
||||
, attrs/0
|
||||
, stats/0
|
||||
]).
|
||||
|
||||
|
@ -96,13 +95,15 @@
|
|||
-type(topic() :: emqx_topic:topic()).
|
||||
-type(subid() :: binary() | atom()).
|
||||
|
||||
-type(conninfo() :: #{peername := peername(),
|
||||
-type(socktype() :: tcp | udp | ssl | proxy | atom()).
|
||||
-type(conninfo() :: #{socktype := socktype(),
|
||||
peername := peername(),
|
||||
sockname := peername(),
|
||||
peercert := esockd_peercert:peercert(),
|
||||
conn_mod := module(),
|
||||
atom() => term()
|
||||
}).
|
||||
-type(client() :: #{zone := zone(),
|
||||
-type(client_info() :: #{zone := zone(),
|
||||
protocol := protocol(),
|
||||
peerhost := peerhost(),
|
||||
client_id := client_id(),
|
||||
|
@ -167,6 +168,5 @@
|
|||
|
||||
-type(caps() :: emqx_mqtt_caps:caps()).
|
||||
-type(infos() :: #{atom() => term()}).
|
||||
-type(attrs() :: #{atom() => term()}).
|
||||
-type(stats() :: list({atom(), non_neg_integer()})).
|
||||
-type(stats() :: #{atom() => non_neg_integer()|stats()}).
|
||||
|
||||
|
|
Loading…
Reference in New Issue