Механизм cyrsasl_scram не разрешает GUID base64
У меня есть приложение для общения в чате. Если уникальный идентификатор пользователя указан в формате GUID Base 64, возникает ошибка bad_username.
В этом файле: https://pow.gs/mirror/ejabberd/-/blob/fd8e07af4789be362a61755ea47f216baeb64989/src/cyrsasl_scram.erl, есть способ удалить "==" в имени пользователя
unescape_username(<<"">>) -> <<"">>;
unescape_username(EscapedUsername) ->
Pos = str:str(EscapedUsername, <<"=">>),
if Pos == 0 -> EscapedUsername;
true ->
Start = str:substr(EscapedUsername, 1, Pos - 1),
End = str:substr(EscapedUsername, Pos),
EndLen = byte_size(End),
if EndLen < 3 -> error;
true ->
case str:substr(End, 1, 3) of
<<"=2C">> ->
<<Start/binary, ",",
(unescape_username(str:substr(End, 4)))/binary>>;
<<"=3D">> ->
<<Start/binary, "=",
(unescape_username(str:substr(End, 4)))/binary>>;
_Else -> error
end
end
end.
Не знаю, зачем это написано. Если я удалю этот конкретный код, соединение будет работать нормально. Пожалуйста, дайте мне знать, почему это запрещено.
1 ответ
Если уникальный идентификатор пользователя указан в формате GUID Base 64, возникает ошибка bad_username.
Правильно:
call xmpp_sasl_scram:unescape_username(<<"user1">>)
returned from xmpp_sasl_scram:unescape_username/1 -> <<"user1">>
call xmpp_sasl_scram:unescape_username(<<"user3==ABC">>)
returned from xmpp_sasl_scram:unescape_username/1 -> error
call xmpp_sasl_scram:unescape_username(<<"user4=DEF">>)
returned from xmpp_sasl_scram:unescape_username/1 -> error
call xmpp_sasl_scram:unescape_username(<<"user5=">>)
returned from xmpp_sasl_scram:unescape_username/1 -> error
Не знаю, зачем это написано. Если я удалю этот конкретный код, соединение будет работать нормально. Пожалуйста, дайте мне знать, почему это запрещено.
Я тоже не знаю. Но этот код существует девять лет назад:https://github.com/processone/ejabberd/commit/e80b92b48148505b44c6a378db36badfe60fce79#diff-5c51943c1268ffe26fe3b041b20675c6R136
Какой бы ни была причина для этого, очевидно, что это веская причина.