diff --git a/ChangeLog b/ChangeLog index ff3363fba..b33cbeb86 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2005-11-22 Alexey Shchepin + * src/web/ejabberd_web_admin.erl: Fixed encoding of user names in + URLs + + * src/web/ejabberd_http.erl: Added url_encode function from yaws + * src/ejabberd_c2s.erl: Send stream error when connection is replaced (thanks to Maxim Ryazanov) diff --git a/src/web/ejabberd_http.erl b/src/web/ejabberd_http.erl index 7b6c65645..550f3e0e4 100644 --- a/src/web/ejabberd_http.erl +++ b/src/web/ejabberd_http.erl @@ -13,7 +13,8 @@ %% External exports -export([start/2, start_link/2, - receive_headers/1]). + receive_headers/1, + url_encode/1]). -include("ejabberd.hrl"). -include("jlib.hrl"). @@ -652,6 +653,46 @@ parse_urlencoded(undefined, _, _, _) -> []. +url_encode([H|T]) -> + if + H >= $a, $z >= H -> + [H|url_encode(T)]; + H >= $A, $Z >= H -> + [H|url_encode(T)]; + H >= $0, $9 >= H -> + [H|url_encode(T)]; + H == $_; H == $.; H == $-; H == $/; H == $: -> % FIXME: more.. + [H|url_encode(T)]; + true -> + case integer_to_hex(H) of + [X, Y] -> + [$%, X, Y | url_encode(T)]; + [X] -> + [$%, $0, X | url_encode(T)] + end + end; + +url_encode([]) -> + []. + +integer_to_hex(I) -> + case catch erlang:integer_to_list(I, 16) of + {'EXIT', _} -> + old_integer_to_hex(I); + Int -> + Int + end. + + +old_integer_to_hex(I) when I<10 -> + integer_to_list(I); +old_integer_to_hex(I) when I<16 -> + [I-10+$A]; +old_integer_to_hex(I) when I>=16 -> + N = trunc(I/16), + old_integer_to_hex(N) ++ old_integer_to_hex(I rem 16). + + % The following code is mostly taken from yaws_ssl.erl parse_request(State, Data) -> diff --git a/src/web/ejabberd_web_admin.erl b/src/web/ejabberd_web_admin.erl index 0ed317a0c..460b0c28d 100644 --- a/src/web/ejabberd_web_admin.erl +++ b/src/web/ejabberd_web_admin.erl @@ -1343,8 +1343,11 @@ list_given_users(Users, Prefix, Lang, URLFunc) -> ?T("Online") end, ?XE("tr", - [?XE("td", [?AC(URLFunc({user, Prefix, User, Server}), - us_to_list(US))]), + [?XE("td", + [?AC(URLFunc({user, Prefix, + ejabberd_http:url_encode(User), + Server}), + us_to_list(US))]), ?XE("td", FQueueLen), ?XC("td", FLast)]) end, Users) @@ -1397,7 +1400,9 @@ list_online_users(Host, _Lang) -> SUsers = lists:usort(Users), lists:flatmap( fun({S, U} = SU) -> - [?AC("../user/" ++ U ++ "/", su_to_list(SU)), ?BR] + [?AC("../user/" ++ ejabberd_http:url_encode(U) ++ "/", + su_to_list(SU)), + ?BR] end, SUsers). user_info(User, Server, Query, Lang) ->