Przeglądaj źródła

feat(ldap): supported the `memberOf` syntax in query filters

firest 1 rok temu
rodzic
commit
fc2cf76ed1

+ 3 - 2
apps/emqx_ldap/src/emqx_ldap_filter_lexer.xrl

@@ -1,8 +1,8 @@
 Definitions.
 
-Control = [()&|!=~><:*]
+Control = [()&|!=~><:*,]
 White = [\s\t\n\r]+
-StringChars = [^()&|!=~><:*\t\n\r\\]
+StringChars = [^()&|!=~><:*,\t\n\r\\]
 Escape = \\\\|\\{Control}|\\{White}
 String = ({Escape}|{StringChars})+
 
@@ -20,6 +20,7 @@ Rules.
 \* : {token, {asterisk, TokenLine}}.
 \:dn : {token, {dn, TokenLine}}.
 \: : {token, {colon, TokenLine}}.
+, : {token, {comma, TokenLine}}.
 {White} : skip_token.
 {String} : {token, {string, TokenLine, to_string(TokenChars)}}.
 %% Leex will hang if a composite operation is missing a character

+ 18 - 2
apps/emqx_ldap/src/emqx_ldap_filter_parser.yrl

@@ -15,10 +15,10 @@ Header "%%--------------------------------------------------------------------
 %%--------------------------------------------------------------------".
 
 Nonterminals
-filter filtercomp filterlist item simple present substring initial any final extensible attr value type dnattrs matchingrule.
+filter filtercomp filterlist item simple present substring initial any final extensible attr value type dnattrs matchingrule pairedvalue.
 
 Terminals
-lparen rparen 'and' 'or' 'not' equal approx greaterOrEqual lessOrEqual asterisk colon dn string.
+lparen rparen 'and' 'or' 'not' equal approx greaterOrEqual lessOrEqual asterisk colon dn string comma.
 
 Rootsymbol filter.
 Left 100 present.
@@ -52,6 +52,8 @@ item->
 
 simple ->
     attr equal value: equal('$1', '$3').
+simple ->
+    attr equal pairedvalue: equal('$1', '$3').
 simple ->
     attr approx value: approx('$1', '$3').
 simple ->
@@ -100,6 +102,11 @@ attr ->
 value ->
     string: get_value('$1').
 
+pairedvalue ->
+    string equal string comma pairedvalue: make_paired_value('$1', '$3', '$5').
+pairedvalue ->
+    string equal string: make_paired_value('$1', '$3').
+
 type ->
     value: {type, '$1'}.
 
@@ -150,6 +157,15 @@ flatten(List) -> lists:flatten(List).
 get_value({_Token, _Line, Value}) ->
     Value.
 
+make_paired_value(Attr, Value) ->
+    Attr1 = get_value(Attr),
+    Value1 = get_value(Value),
+    Attr1 ++ "=" ++ Value1.
+
+make_paired_value(Attr, Value, Next) ->
+    Prefix = make_paired_value(Attr, Value),
+    Prefix ++ "," ++ Next.
+
 scan_and_parse(Bin) when is_binary(Bin) ->
     scan_and_parse(erlang:binary_to_list(Bin));
 scan_and_parse(String) ->

+ 8 - 0
apps/emqx_ldap/test/emqx_ldap_filter_SUITE.erl

@@ -256,6 +256,14 @@ t_escape(_Config) ->
 t_value_eql_dn(_Config) ->
     ?assertEqual('and'([equalityMatch("a", "dn")]), parse("(&(a=dn))")).
 
+t_member_of(_Config) ->
+    ?assertEqual(
+        'and'([
+            equalityMatch("a", "b"), equalityMatch("memberOf", "CN=GroupName,OU=emqx,DC=WL,DC=com")
+        ]),
+        parse("(&(a=b)(memberOf=CN=GroupName,OU=emqx,DC=WL,DC=com))")
+    ).
+
 % %%------------------------------------------------------------------------------
 % %% Helpers
 % %%------------------------------------------------------------------------------