diff options
| author | andreykproductengine <andreykproductengine@lindenlab.com> | 2019-04-10 17:20:51 +0300 | 
|---|---|---|
| committer | andreykproductengine <andreykproductengine@lindenlab.com> | 2019-04-10 17:20:51 +0300 | 
| commit | 960d1169f0b73acb001adffc912797cf0f0f1687 (patch) | |
| tree | 60c640b4e2140cbe787276755968b14f9c109977 | |
| parent | c9cc8f6ddedefc681ac2fe08034c57c87c1d745c (diff) | |
SL-10924 CEF update broke many visitor trackers
| -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) | 
