81
79
%%% {equalityMatch,{'AttributeValueAssertion',
83
81
%%% "xramtsov@gmail.com"}}]}}
84
%%%--------------------------------------------------------------------------
85
parse(RFC2254_Filter, ListOfSubValues) ->
86
case catch convert_filter(parse_filter(RFC2254_Filter), ListOfSubValues) of
87
[EldapFilter] when is_tuple(EldapFilter) ->
95
%%%==========================
96
%%% Internal functions
97
%%%==========================
99
%%%----------------------
101
%%%----------------------
103
split(Filter, 0, [], []).
105
split([], _, _, Result) ->
108
split([H|T], Num, Rest, Result) ->
120
split(T, 0, [], Result ++ [lists:sublist(X, 2, LenX-2)]);
122
split(T, 0, Rest, Result)
125
split(T, NewNum, Rest++[H], Result)
128
%%%-----------------------
130
%%%-----------------------
131
parse_filter(Filter) ->
134
{'not', parse_filter(T)};
136
{'or', parse_filter(T)};
138
{'and', parse_filter(T)};
140
parse_filter(split(Filter));
141
[List | _] when is_list(List) ->
142
[parse_filter(X) || X <- Filter];
147
%%%--------------------
149
%%%--------------------
150
convert_filter({'not', [Val | _]}, Replace) ->
151
eldap:'not'(convert_filter(Val, Replace));
153
convert_filter({'or', Vals}, Replace) ->
154
eldap:'or'([convert_filter(X, Replace) || X <- Vals]);
156
convert_filter({'and', Vals}, Replace) ->
157
eldap:'and'([convert_filter(X, Replace) || X <- Vals]);
159
convert_filter([H|_] = Filter, Replace) when is_integer(H) ->
160
parse_attr(Filter, Replace);
162
convert_filter(Filter, Replace) when is_list(Filter) ->
163
[convert_filter(X, Replace) || X <- Filter].
168
parse_attr(Attr, ListOfSubValues) ->
169
{Action, [_|_] = Name, [_|_] = Value} = split_attribute(Attr),
170
parse_attr(Action, {Name, Value}, ListOfSubValues).
172
parse_attr(approx, {Name, Value}, ListOfSubValues) ->
173
NewValue = do_sub(Value, ListOfSubValues),
174
eldap:approxMatch(Name, NewValue);
176
parse_attr(greater, {Name, Value}, ListOfSubValues) ->
177
NewValue = do_sub(Value, ListOfSubValues),
178
eldap:greaterOrEqual(Name, NewValue);
180
parse_attr(less, {Name, Value}, ListOfSubValues) ->
181
NewValue = do_sub(Value, ListOfSubValues),
182
eldap:lessOrEqual(Name, NewValue);
184
parse_attr(equal, {Name, Value}, ListOfSubValues) ->
185
{ok, RegSList} = regexp:split(remove_extra_asterisks(Value), "[*]"),
186
Pattern = case [do_sub(X, ListOfSubValues) || X <- RegSList] of
187
[Head | Tail] when Tail /= [] ->
188
{Head, lists:sublist(Tail, length(Tail)-1), lists:last(Tail)};
194
eldap:equalityMatch(Name, V);
198
eldap:substrings(Name, [{any, X} || X<-Any]);
200
eldap:substrings(Name, [{initial, H}]++[{any, X} || X<-Any]);
202
eldap:substrings(Name, [{any, X} || X<-Any]++[{final, T}]);
204
eldap:substrings(Name, [{initial, H}]++[{any, X} || X<-Any]++[{final, T}])
207
parse_attr(_, _, _) ->
210
%%%--------------------
212
%%%--------------------
82
%%%-------------------------------------------------------------------
83
parse(L, SList) when is_list(L), is_list(SList) ->
84
case catch eldap_filter_yecc:parse(scan(L, SList)) of
85
{error, {_, _, Msg}} ->
93
%%====================================================================
95
%%====================================================================
96
-define(do_scan(L), scan(Rest, [], [{L, 1} | check(Buf, S) ++ Result], L, S)).
99
scan(L, "", [], undefined, SList).
101
scan("=*)" ++ Rest, Buf, Result, '(', S) ->
102
scan(Rest, [], [{')', 1}, {'=*', 1} | check(Buf, S) ++ Result], ')', S);
103
scan(":dn" ++ Rest, Buf, Result, '(', S) -> ?do_scan(':dn');
104
scan(":=" ++ Rest, Buf, Result, '(', S) -> ?do_scan(':=');
105
scan(":=" ++ Rest, Buf, Result, ':dn', S) -> ?do_scan(':=');
106
scan(":=" ++ Rest, Buf, Result, ':', S) -> ?do_scan(':=');
107
scan("~=" ++ Rest, Buf, Result, '(', S) -> ?do_scan('~=');
108
scan(">=" ++ Rest, Buf, Result, '(', S) -> ?do_scan('>=');
109
scan("<=" ++ Rest, Buf, Result, '(', S) -> ?do_scan('<=');
110
scan("=" ++ Rest, Buf, Result, '(', S) -> ?do_scan('=');
111
scan(":" ++ Rest, Buf, Result, '(', S) -> ?do_scan(':');
112
scan(":" ++ Rest, Buf, Result, ':dn', S) -> ?do_scan(':');
113
scan("&" ++ Rest, Buf, Result, '(', S) when Buf=="" -> ?do_scan('&');
114
scan("|" ++ Rest, Buf, Result, '(', S) when Buf=="" -> ?do_scan('|');
115
scan("!" ++ Rest, Buf, Result, '(', S) when Buf=="" -> ?do_scan('!');
116
scan("*" ++ Rest, Buf, Result, '*', S) -> ?do_scan('*');
117
scan("*" ++ Rest, Buf, Result, '=', S) -> ?do_scan('*');
118
scan("(" ++ Rest, Buf, Result, _, S) -> ?do_scan('(');
119
scan(")" ++ Rest, Buf, Result, _, S) -> ?do_scan(')');
120
scan([Letter | Rest], Buf, Result, PreviosAtom, S) ->
121
scan(Rest, [Letter|Buf], Result, PreviosAtom, S);
122
scan([], Buf, Result, _, S) ->
123
lists:reverse(check(Buf, S) ++ Result).
128
[{str, 1, do_sub(lists:reverse(Buf), S)}].
214
130
-define(MAX_RECURSION, 100).