diff --git a/code/nel/include/nel/gui/group_html.h b/code/nel/include/nel/gui/group_html.h index 635136220..aecf5f855 100644 --- a/code/nel/include/nel/gui/group_html.h +++ b/code/nel/include/nel/gui/group_html.h @@ -39,7 +39,6 @@ namespace NLGUI class CGroupParagraph; extern std::string CurrentCookie; - extern std::string HTTPCurrentDomain; // HTML group /** @@ -376,6 +375,7 @@ namespace NLGUI std::string _URL; // Current URL std::string _DocumentUrl; + std::string _DocumentDomain; // Valid base href was found bool _IgnoreBaseUrlTag; // Fragment from loading url diff --git a/code/nel/include/nel/gui/url_parser.h b/code/nel/include/nel/gui/url_parser.h index 915d7d85a..758f1d340 100644 --- a/code/nel/include/nel/gui/url_parser.h +++ b/code/nel/include/nel/gui/url_parser.h @@ -52,6 +52,7 @@ namespace NLGUI public: std::string scheme; std::string authority; + std::string host; std::string path; std::string query; std::string hash; diff --git a/code/nel/src/gui/group_html.cpp b/code/nel/src/gui/group_html.cpp index 30dd3ec3f..18aa3e1eb 100644 --- a/code/nel/src/gui/group_html.cpp +++ b/code/nel/src/gui/group_html.cpp @@ -506,7 +506,7 @@ namespace NLGUI } else { - receiveCookies(_CurlWWW->Request, HTTPCurrentDomain, _TrustedDomain); + receiveCookies(_CurlWWW->Request, _DocumentDomain, _TrustedDomain); // redirect, get the location and try browse again // we cant use curl redirection because 'addHTTPGetParams()' must be called on new destination @@ -533,7 +533,7 @@ namespace NLGUI } else { - receiveCookies(_CurlWWW->Request, HTTPCurrentDomain, _TrustedDomain); + receiveCookies(_CurlWWW->Request, _DocumentDomain, _TrustedDomain); _RedirectsRemaining = DEFAULT_RYZOM_REDIRECT_LIMIT; @@ -2548,6 +2548,7 @@ namespace NLGUI _SelectOption = false; _GroupListAdaptor = NULL; _DocumentUrl = ""; + _DocumentDomain = ""; _UrlFragment.clear(); _RefreshUrl.clear(); _NextRefreshTime = 0.0; @@ -4657,9 +4658,12 @@ namespace NLGUI string finalUrl; bool isLocal = lookupLocalFile (finalUrl, _URL.c_str(), true); - // Save new url _URL = finalUrl; + CUrlParser uri (_URL); + _TrustedDomain = isTrustedDomain(uri.host); + _DocumentDomain = uri.host; + // file is probably from bnp (ingame help) if (isLocal) { @@ -4667,8 +4671,6 @@ namespace NLGUI } else { - _TrustedDomain = isTrustedDomain(setCurrentDomain(finalUrl)); - SFormFields formfields; if (_PostNextTime) { @@ -4704,9 +4706,11 @@ namespace NLGUI // Ref the form CForm &form = _Forms[_PostFormId]; - // Save new url _URL = form.Action; - _TrustedDomain = isTrustedDomain(setCurrentDomain(_URL)); + + CUrlParser uri(_URL); + _TrustedDomain = isTrustedDomain(uri.host); + _DocumentDomain = uri.host; for (i=0; i markup for image downloads if (type.find("image/") == 0 && content.size() > 0) { diff --git a/code/nel/src/gui/libwww.cpp b/code/nel/src/gui/libwww.cpp index 800c4d1e3..53cc9e403 100644 --- a/code/nel/src/gui/libwww.cpp +++ b/code/nel/src/gui/libwww.cpp @@ -31,7 +31,6 @@ namespace NLGUI /// store all cookies we receive and resent them depending of the domain static std::map > HTTPCookies; - std::string HTTPCurrentDomain; // The current domain that will be used to get which cookies to send // *************************************************************************** @@ -332,24 +331,6 @@ namespace NLGUI return dst; } - // set current HTTPCurrentDomain for cookie selection, return new domain - const std::string &setCurrentDomain(const std::string &uri) - { - if (uri.find("http://") == 0) - HTTPCurrentDomain = uri.substr(7, uri.find("/", 7) - 7); - else - if (uri.find("https://") == 0) - HTTPCurrentDomain = uri.substr(8, uri.find("/", 8) - 8); - else - if (uri.find("//") == 0) - HTTPCurrentDomain = uri.substr(2, uri.find("/", 2) - 2); - else - if (uri.find("/") != std::string::npos) - HTTPCurrentDomain = uri.substr(0, uri.find("/") - 1); - - return HTTPCurrentDomain; - } - // update HTTPCookies list static void receiveCookie(const char *nsformat, const std::string &domain, bool trusted) { @@ -371,6 +352,9 @@ namespace NLGUI chunks[0] = chunks[0].substr(10); } + // make sure domain is lowercase + chunks[0] = toLower(chunks[0]); + if (chunks[0] != domain && chunks[0] != std::string("." + domain)) { // cookie is for different domain diff --git a/code/nel/src/gui/url_parser.cpp b/code/nel/src/gui/url_parser.cpp index 043defd78..5db7f6d72 100644 --- a/code/nel/src/gui/url_parser.cpp +++ b/code/nel/src/gui/url_parser.cpp @@ -14,8 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -#include -#include "nel/misc/types_nl.h" +#include "nel/misc/common.h" #include "nel/gui/url_parser.h" using namespace std; @@ -72,6 +71,24 @@ namespace NLGUI uri = uri.substr(pos); else uri.clear(); + + // strip empty port from authority + if (authority.find_last_of(":") == authority.length() - 1) + authority = authority.substr(0, authority.length() - 1); + + // extract host from user:pass@host:port + pos = authority.find("@"); + if (pos != npos) + host = authority.substr(pos + 1); + else + host = authority.substr(2); + + // case-insensitive + host = NLMISC::toLower(host); + + pos = host.find(":"); + if (pos != npos) + host = host.substr(0, pos); } // scan for query