diff options
author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2021-05-11 01:23:28 +0300 |
---|---|---|
committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2021-05-11 01:27:10 +0300 |
commit | 9dee16185a0b33177c6b7b3c60733682cebee66d (patch) | |
tree | 254403fecdcd0c216a53191da1021544c73e6d13 | |
parent | 48394bdc23015c8289ef97fa1af99ba3e024ef36 (diff) |
SL-15168 Changed format
instead of an url function takes an uri
-rw-r--r-- | indra/newview/llurlfloaterdispatchhandler.cpp | 97 |
1 files changed, 67 insertions, 30 deletions
diff --git a/indra/newview/llurlfloaterdispatchhandler.cpp b/indra/newview/llurlfloaterdispatchhandler.cpp index 40afafa4c0..f03caf43b8 100644 --- a/indra/newview/llurlfloaterdispatchhandler.cpp +++ b/indra/newview/llurlfloaterdispatchhandler.cpp @@ -36,25 +36,30 @@ #include "llviewergenericmessage.h" #include "llweb.h" +#include <boost/regex.hpp> + +// Example: +// llOpenFloater("My Help Title", "secondlife://guidebook", []); + // values specified by server side's dispatcher // for llopenfloater const std::string MESSAGE_URL_FLOATER("URLFloater"); const std::string KEY_ACTION("action"); // "action" will be the string constant "OpenURL" const std::string VALUE_OPEN_URL("OpenURL"); const std::string KEY_DATA("action_data"); -const std::string KEY_FLOATER("floater_title"); -const std::string KEY_URL("floater_url"); +const std::string KEY_FLOATER_TITLE("floater_title"); +const std::string KEY_URI("floater_url"); const std::string KEY_PARAMS("floater_params"); -// Supported floaters -const std::string FLOATER_GUIDEBOOK("guidebook"); // alias for how_to -const std::string FLOATER_HOW_TO("how_to"); -const std::string FLOATER_WEB_CONTENT("web_content"); +// Supported floaters, for now it's exact matching, later it might get extended +const std::string FLOATER_GUIDEBOOK("secondlife://guidebook"); // translates to "how_to" +const std::string FLOATER_WEB_CONTENT("secondlife://browser"); // translates to "web_content" -// Web content universal argument +// Web content universal arguments const std::string KEY_TRUSTED_CONTENT("trusted_content"); +const std::string KEY_URL("url"); -// Guidebook specific arguments +// Guidebook ("how_to") specific arguments const std::string KEY_WIDTH("width"); const std::string KEY_HEGHT("height"); const std::string KEY_CAN_CLOSE("can_close"); @@ -63,6 +68,10 @@ const std::string KEY_CAN_CLOSE("can_close"); const std::string KEY_SHOW_PAGE_TITLE("show_page_title"); const std::string KEY_ALLOW_ADRESS_ENTRY("allow_address_entry"); // It is not recomended to set this to true if trusted content is allowed +// expected format secondlife:///floater_alias +// intended to be extended to: secondlife:///floater_alias/instance_id +const boost::regex expression("secondlife:///[^ \n]{1,256}"); + LLUrlFloaterDispatchHandler LLUrlFloaterDispatchHandler::sUrlDispatchhandler; @@ -101,25 +110,25 @@ bool LLUrlFloaterDispatchHandler::operator()(const LLDispatcher *, const std::st } } - std::string floater; + std::string floater_title; LLSD command_params; - std::string url; + std::string floater_uri; if (message.has(KEY_ACTION) && message[KEY_ACTION].asString() == VALUE_OPEN_URL) { LLSD &action_data = message[KEY_DATA]; if (action_data.isMap()) { - floater = action_data[KEY_FLOATER].asString(); + floater_title = action_data[KEY_FLOATER_TITLE].asString(); command_params = action_data[KEY_PARAMS]; - url = action_data[KEY_URL].asString(); + floater_uri = action_data[KEY_URI].asString(); } } - else if (message.has(KEY_FLOATER)) + else if (message.has(KEY_FLOATER_TITLE)) { - floater = message[KEY_FLOATER].asString(); + floater_title = message[KEY_FLOATER_TITLE].asString(); command_params = message[KEY_PARAMS]; - url = message[KEY_URL].asString(); + floater_uri = message[KEY_URI].asString(); } else { @@ -127,16 +136,33 @@ bool LLUrlFloaterDispatchHandler::operator()(const LLDispatcher *, const std::st return false; } - if (url.find("://") == std::string::npos) + if (floater_uri.find(":///") == std::string::npos) { // try unescaping - url = LLURI::unescape(url); + floater_uri = LLURI::unescape(floater_uri); + } + + boost::cmatch what; + if (!boost::regex_match(floater_uri.c_str(), what, expression)) + { + LL_WARNS("URLFloater") << "Received " << MESSAGE_URL_FLOATER << " with invalid uri: " << floater_uri << LL_ENDL; + return false; } LLFloaterWebContent::Params params; - params.url = url; + if (command_params.isMap()) + { + if (command_params.has(KEY_TRUSTED_CONTENT)) + { + params.trusted_content = command_params[KEY_TRUSTED_CONTENT].asBoolean(); + } + if (command_params.has(KEY_URL)) + { + params.url = command_params[KEY_URL].asString(); + } + } - if (floater == FLOATER_GUIDEBOOK || floater == FLOATER_HOW_TO) + if (floater_uri == FLOATER_GUIDEBOOK) { if (command_params.isMap()) // by default is undefines { @@ -162,34 +188,45 @@ bool LLUrlFloaterDispatchHandler::operator()(const LLDispatcher *, const std::st } LLFloaterReg::toggleInstanceOrBringToFront("how_to", params); - + + instance = LLFloaterReg::findInstance("how_to"); + instance->setTitle(floater_title); if (command_params.isMap() && command_params.has(KEY_CAN_CLOSE)) { - LLFloater* instance = LLFloaterReg::findInstance("how_to"); instance->setCanClose(command_params[KEY_CAN_CLOSE].asBoolean()); } } - else if (floater == FLOATER_WEB_CONTENT) + else if (floater_uri == FLOATER_WEB_CONTENT) { - if (command_params.isMap()) // by default is undefines, might be better idea to init params from command_params + if (command_params.has(KEY_URL)) { - params.trusted_content = command_params.has(KEY_TRUSTED_CONTENT) ? command_params[KEY_TRUSTED_CONTENT].asBoolean() : false; - params.show_page_title = command_params.has(KEY_SHOW_PAGE_TITLE) ? command_params[KEY_SHOW_PAGE_TITLE].asBoolean() : true; - params.allow_address_entry = command_params.has(KEY_ALLOW_ADRESS_ENTRY) ? command_params[KEY_ALLOW_ADRESS_ENTRY].asBoolean() : true; + if (command_params.isMap()) // by default is undefines, might be better idea to init params from command_params + { + params.trusted_content = command_params.has(KEY_TRUSTED_CONTENT) ? command_params[KEY_TRUSTED_CONTENT].asBoolean() : false; + params.show_page_title = command_params.has(KEY_SHOW_PAGE_TITLE) ? command_params[KEY_SHOW_PAGE_TITLE].asBoolean() : true; + params.allow_address_entry = command_params.has(KEY_ALLOW_ADRESS_ENTRY) ? command_params[KEY_ALLOW_ADRESS_ENTRY].asBoolean() : true; + } + LLFloater* instance = LLFloaterReg::showInstance("web_content", params); + instance->setTitle(floater_title); } - LLFloaterReg::showInstance("web_content", params); } else { - if (LLFloaterReg::isRegistered(floater)) + LLSD path_array = LLURI(floater_uri).pathArray(); + S32 path_parts = path_array.size(); + if (path_parts == 0) + { + LL_INFOS("URLFloater") << "received an empty uri: " << floater_uri << LL_ENDL; + } + else if (LLFloaterReg::isRegistered(path_array[0])) { // A valid floater - LL_INFOS("URLFloater") << "Floater " << floater << " is not supported by llopenfloater or URLFloater" << LL_ENDL; + LL_INFOS("URLFloater") << "Floater " << path_array[0] << " is not supported by llopenfloater or URLFloater" << LL_ENDL; } else { // A valid message, but no such flaoter - LL_WARNS("URLFloater") << "Recieved a command to open unknown floater: " << floater << LL_ENDL; + LL_WARNS("URLFloater") << "Recieved a command to open unknown floater: " << floater_uri << LL_ENDL; } } |