浏览代码

Put cn/dn of client cert into credentials (#2357)

Put cn/dn of client cert into credentials
JianBo He 7 年之前
父节点
当前提交
c223f62c5a
共有 2 个文件被更改,包括 22 次插入10 次删除
  1. 1 1
      src/emqx_alarm_handler.erl
  2. 21 9
      src/emqx_protocol.erl

+ 1 - 1
src/emqx_alarm_handler.erl

@@ -25,7 +25,7 @@
 -boot_mnesia({mnesia, [boot]}).
 -copy_mnesia({mnesia, [copy]}).
 
-%% gen_server callbacks
+%% gen_event callbacks
 -export([ init/1
         , handle_event/2
         , handle_call/2

+ 21 - 9
src/emqx_protocol.erl

@@ -204,14 +204,26 @@ client_id(#pstate{client_id = ClientId}) ->
 
 credentials(#pstate{credentials = Credentials}) when map_size(Credentials) =/= 0 ->
     Credentials;
-credentials(#pstate{zone       = Zone,
-                    client_id  = ClientId,
-                    username   = Username,
-                    peername   = Peername}) ->
-    #{zone      => Zone,
-      client_id => ClientId,
-      username  => Username,
-      peername  => Peername}.
+credentials(#pstate{zone      = Zone,
+                    client_id = ClientId,
+                    username  = Username,
+                    peername  = Peername,
+                    peercert  = Peercert}) ->
+    with_cert(#{zone => Zone,
+                client_id => ClientId,
+                username => Username,
+                peername => Peername}, Peercert).
+
+with_cert(Credentials, undefined) -> Credentials;
+with_cert(Credentials, Peercert) ->
+    Credentials#{dn => esockd_peercert:subject(Peercert),
+                 cn => esockd_peercert:common_name(Peercert)}.
+
+keepsafety(Credentials) ->
+    maps:filter(fun(password, _) -> false;
+                   (dn, _) -> false;
+                   (cn, _) -> false;
+                   (_,  _) -> true end, Credentials).
 
 stats(#pstate{recv_stats = #{pkt := RecvPkt, msg := RecvMsg},
               send_stats = #{pkt := SendPkt, msg := SendMsg}}) ->
@@ -389,7 +401,7 @@ process(?CONNECT_PACKET(
                       case try_open_session(SessAttrs, PState3) of
                           {ok, SPid, SP} ->
                               PState4 = PState3#pstate{session = SPid, connected = true,
-                                                       credentials = maps:remove(password, Credentials0)},
+                                                       credentials = keepsafety(Credentials0)},
                               ok = emqx_cm:register_connection(client_id(PState4)),
                               true = emqx_cm:set_conn_attrs(client_id(PState4), attrs(PState4)),
                               %% Start keepalive