summaryrefslogtreecommitdiff
path: root/indra/llui
diff options
context:
space:
mode:
authormaksymsproductengine <maksymsproductengine@lindenlab.com>2014-09-24 23:09:30 +0300
committermaksymsproductengine <maksymsproductengine@lindenlab.com>2014-09-24 23:09:30 +0300
commitdd8d2b59f74ff01bd0b79b841e3974b3b00ddeb1 (patch)
treeeeef384b1ff5cf91ffa8b0f18943fd19658afb58 /indra/llui
parent2f08102780b1508563684b65a64e565caab7b143 (diff)
MAINT-4170 FIXED Eliminate homoglyphs in URL hostnames: converting to lowercase links without scheme
Diffstat (limited to 'indra/llui')
-rwxr-xr-xindra/llui/lltextbase.cpp38
1 files changed, 29 insertions, 9 deletions
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index b9c3417dc8..8395e74715 100755
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -2031,25 +2031,45 @@ S32 LLTextBase::normalizeUri(std::string& uri_string)
if (!res)
{
- res = uriNormalizeSyntaxExA(&uri, URI_NORMALIZE_SCHEME | URI_NORMALIZE_HOST);
-
- if (!res)
+ if (uri.scheme.afterLast - uri.scheme.first > 0)
{
- S32 chars_required;
- res = uriToStringCharsRequiredA(&uri, &chars_required);
+ res = uriNormalizeSyntaxExA(&uri, URI_NORMALIZE_SCHEME | URI_NORMALIZE_HOST);
if (!res)
{
- chars_required++;
- std::vector<char> label_buf(chars_required);
- res = uriToStringA(&label_buf[0], &uri, chars_required, NULL);
+ S32 chars_required;
+ res = uriToStringCharsRequiredA(&uri, &chars_required);
if (!res)
{
- uri_string = &label_buf[0];
+ chars_required++;
+ std::vector<char> label_buf(chars_required);
+ res = uriToStringA(&label_buf[0], &uri, chars_required, NULL);
+
+ if (!res)
+ {
+ uri_string = &label_buf[0];
+ }
}
}
}
+ else if (uri_string.find_first_of('.') != std::string::npos)
+ {
+ static bool recursive_call = false;
+
+ // allow only single level recursive call
+ if (!recursive_call)
+ {
+ recursive_call = true;
+
+ // force uri to be with scheme and try to normalize
+ std::string uri_with_scheme = "http://";
+ uri_with_scheme += uri_string;
+ normalizeUri(uri_with_scheme);
+ uri_string = uri_with_scheme.substr(7);
+ recursive_call = false;
+ }
+ }
}
uriFreeUriMembersA(&uri);