]> granicus.if.org Git - ejabberd/commitdiff
Support also SASL PLAIN auth messages described in RFC4616 (EJAB-1132)
authorBadlop <badlop@process-one.net>
Tue, 29 Dec 2009 18:44:17 +0000 (18:44 +0000)
committerBadlop <badlop@process-one.net>
Tue, 29 Dec 2009 18:44:17 +0000 (18:44 +0000)
SVN Revision: 2839

src/cyrsasl_plain.erl

index 4e69b06ba647b23ebed67abf47fad7b399acdda7..696e303e57a0dbb7008a6adcf6e71925fc7b3c05 100644 (file)
@@ -44,7 +44,7 @@ mech_new(_Host, _GetPassword, CheckPassword, _CheckPasswordDigest) ->
     {ok, #state{check_password = CheckPassword}}.
 
 mech_step(State, ClientIn) ->
-    case parse(ClientIn) of
+    case prepare(ClientIn) of
        [AuthzId, User, Password] ->
            case (State#state.check_password)(User, Password) of
                {true, AuthModule} ->
@@ -57,6 +57,24 @@ mech_step(State, ClientIn) ->
            {error, "bad-protocol"}
     end.
 
+prepare(ClientIn) ->
+    case parse(ClientIn) of
+       [[], UserMaybeDomain, Password] ->
+           case parse_domain(UserMaybeDomain) of
+               %% <NUL>login@domain<NUL>pwd
+               [User, Domain] ->
+                   [UserMaybeDomain, User, Password];
+               %% <NUL>login<NUL>pwd
+               [User] ->
+                   ["", User, Password]
+           end;
+       %% login@domain<NUL>login<NUL>pwd
+       [AuthzId, User, Password] ->
+           [AuthzId, User, Password];
+       _ ->
+           error
+    end.
+
 
 parse(S) ->
     parse1(S, "", []).
@@ -71,5 +89,12 @@ parse1([], S, T) ->
     lists:reverse([lists:reverse(S) | T]).
 
 
+parse_domain(S) ->
+    parse_domain1(S, "", []).
 
-
+parse_domain1([$@ | Cs], S, T) ->
+    parse_domain1(Cs, "", [lists:reverse(S) | T]);
+parse_domain1([C | Cs], S, T) ->
+    parse_domain1(Cs, [C | S], T);
+parse_domain1([], S, T) ->
+    lists:reverse([lists:reverse(S) | T]).