]> granicus.if.org Git - ejabberd/commitdiff
Improve reporting of unavailable SASL mechanisms
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Wed, 1 Mar 2017 12:23:22 +0000 (15:23 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Wed, 1 Mar 2017 12:23:22 +0000 (15:23 +0300)
src/xmpp_stream_out.erl

index d84dadf879dbb336fd84ce1d7cbf97e449966dc0..ecfe141479814df2a0dc923a47ad92a58025254d 100644 (file)
@@ -534,8 +534,7 @@ process_features(#stream_features{sub_els = Els} = StreamFeatures,
                                    process_sasl_mechanisms(Mechs, State2);
                                false ->
                                    process_sasl_failure(
-                                     #sasl_failure{reason = 'invalid-mechanism'},
-                                     State2)
+                                     <<"Peer provided no SASL mechanisms">>, State2)
                            end
                    end
            end
@@ -564,7 +563,7 @@ process_sasl_mechanisms(Mechs, #{user := User, server := Server} = State) ->
            send_pkt(State1, #sasl_auth{mechanism = Mech, text = Authzid});
        false ->
            process_sasl_failure(
-             #sasl_failure{reason = 'invalid-mechanism'}, State)
+             <<"Peer doesn't support EXTERNAL authentication">>, State)
     end.
 
 -spec process_starttls(state()) -> state().
@@ -638,10 +637,12 @@ process_sasl_success(#{mod := Mod,
            end
     end.
 
--spec process_sasl_failure(sasl_failure(), state()) -> state().
-process_sasl_failure(#sasl_failure{} = Failure, #{mod := Mod} = State) ->
+-spec process_sasl_failure(sasl_failure() | binary(), state()) -> state().
+process_sasl_failure(#sasl_failure{} = Failure, State) ->
     Reason = format("Peer responded with error: ~s",
                    [format_sasl_failure(Failure)]),
+    process_sasl_failure(Reason, State);
+process_sasl_failure(Reason, #{mod := Mod} = State) ->
     try Mod:handle_auth_failure(<<"EXTERNAL">>, {auth, Reason}, State)
     catch _:undef -> process_stream_end({auth, Reason}, State)
     end.