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 b47e67b37..758f1d340 100644 --- a/code/nel/include/nel/gui/url_parser.h +++ b/code/nel/include/nel/gui/url_parser.h @@ -51,7 +51,8 @@ namespace NLGUI public: std::string scheme; - std::string domain; + 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 7369289f2..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; @@ -63,15 +62,33 @@ namespace NLGUI } } - // scan for domain + // scan for authority if (uri.substr(0, 2) == "//") { - pos = uri.find("/", 3); - domain = uri.substr(0, pos); + pos = uri.find_first_of("/?", 2); + authority = uri.substr(0, pos); if (pos != npos) 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 @@ -99,11 +116,11 @@ namespace NLGUI scheme = base.scheme; - // if we already have domain, then ignore base path - if (!domain.empty()) + // if we already have authority, then ignore base path + if (!authority.empty()) return; - domain = base.domain; + authority = base.authority; if (path.empty()) { path = base.path; @@ -190,7 +207,7 @@ namespace NLGUI bool CUrlParser::isAbsolute() const { - return !scheme.empty() && !domain.empty(); + return !scheme.empty() && !authority.empty(); } // serialize URL back to string @@ -200,9 +217,9 @@ namespace NLGUI if (!scheme.empty()) result += scheme + ":"; - if (!domain.empty()) + if (!authority.empty()) { - result += domain; + result += authority; } // path already has leading slash