diff options
Diffstat (limited to 'indra')
-rw-r--r-- | indra/newview/llviewerhelputil.cpp | 74 | ||||
-rw-r--r-- | indra/newview/llviewerhelputil.h | 1 | ||||
-rw-r--r-- | indra/newview/llviewermedia.cpp | 5 |
3 files changed, 79 insertions, 1 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 diff --git a/indra/newview/llviewerhelputil.h b/indra/newview/llviewerhelputil.h index d8f08f3f04..8f6d08bec9 100644 --- a/indra/newview/llviewerhelputil.h +++ b/indra/newview/llviewerhelputil.h @@ -34,6 +34,7 @@ class LLOSInfo; class LLViewerHelpUtil { public: + static std::string helpDataEncode( const std::string &component ); static std::string helpURLEncode( const std::string &component ); static std::string buildHelpURL( const std::string &topic ); }; diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index d8745b1eca..ef281f880b 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -70,6 +70,7 @@ #include "llwebprofile.h" #include "llwindow.h" #include "llvieweraudio.h" +#include "llviewerhelputil.h" #include "llcorehttputil.h" #include "llfloaterwebcontent.h" // for handling window close requests and geometry change requests in media browser windows. @@ -2484,8 +2485,10 @@ void LLViewerMediaImpl::unload() } ////////////////////////////////////////////////////////////////////////////////////////// -void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mime_type, bool rediscover_type, bool server_request, bool clean_browser) +void LLViewerMediaImpl::navigateTo(const std::string& input_url, const std::string& mime_type, bool rediscover_type, bool server_request, bool clean_browser) { + std::string url = LLViewerHelpUtil::helpDataEncode(input_url); + cancelMimeTypeProbe(); if(mMediaURL != url) |