summaryrefslogtreecommitdiff
path: root/indra/newview/llviewerhelputil.cpp
diff options
context:
space:
mode:
authorandreykproductengine <andreykproductengine@lindenlab.com>2019-04-10 17:20:51 +0300
committerandreykproductengine <andreykproductengine@lindenlab.com>2019-04-10 17:20:51 +0300
commit960d1169f0b73acb001adffc912797cf0f0f1687 (patch)
tree60c640b4e2140cbe787276755968b14f9c109977 /indra/newview/llviewerhelputil.cpp
parentc9cc8f6ddedefc681ac2fe08034c57c87c1d745c (diff)
SL-10924 CEF update broke many visitor trackers
Diffstat (limited to 'indra/newview/llviewerhelputil.cpp')
-rw-r--r--indra/newview/llviewerhelputil.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/indra/newview/llviewerhelputil.cpp b/indra/newview/llviewerhelputil.cpp
index ef4b955a5e..4d18a791fc 100644
--- a/indra/newview/llviewerhelputil.cpp
+++ b/indra/newview/llviewerhelputil.cpp
@@ -39,6 +39,80 @@
// Build a help URL from a topic and formatter
//static
+std::string LLViewerHelpUtil::helpDataEncode(const std::string &component)
+{
+ const std::string data_marker = "data:";
+ if (component.compare(0, data_marker.length(), data_marker) == 0)
+ {
+ // This is not url, but data, data part needs to be properly escaped
+ // data part is separated by ',' from header. Minimal data uri is "data:,"
+ // See "data URI scheme"
+ size_t separator = component.find(",");
+ if (separator != std::string::npos)
+ {
+ size_t header_size = separator + 1;
+ std::string header = component.substr(0, header_size);
+ if (header.find("base64") != std::string::npos)
+ {
+ // assume url-safe data
+ return component;
+ }
+
+ std::string data = component.substr(header_size, component.length() - header_size);
+
+ const std::string allowed_sorted =
+ "%-." //include % since it can be a sign of being pre-escaped and is an allowed symbol
+ "0123456789"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "_"
+ "abcdefghijklmnopqrstuvwxyz";
+
+ bool needs_escaping = false;
+
+ std::string::const_iterator it = data.begin();
+ std::string::const_iterator end = data.end();
+ std::string::const_iterator allowed_begin(allowed_sorted.begin());
+ std::string::const_iterator allowed_end(allowed_sorted.end());
+ std::string::value_type c;
+ for (; it != end; ++it)
+ {
+ c = *it;
+ if (!std::binary_search(allowed_begin, allowed_end, c))
+ {
+ // found unescaped symbol
+ needs_escaping = true;
+ break;
+ }
+ }
+
+ if (!needs_escaping)
+ {
+ // pre-escaped
+ return component;
+ }
+
+ // Notes: Teoretically file can be partially pre-escaped,
+ // but we can't reliably distinguish what user intended to do,
+ // so escape everything and let user control the rest.
+ // Escapes % as well
+ std::string url = header + helpURLEncode(data);
+
+ return url;
+ }
+ else
+ {
+ // corrupted or not a data scheme? Nothing we can do.
+ return component;
+ }
+ }
+ else
+ {
+ // Not a data scheme
+ return component;
+ }
+}
+
+//static
std::string LLViewerHelpUtil::helpURLEncode( const std::string &component )
{
// Every character rfc3986 allows as unreserved in 2.3, minus the tilde