bool URIMatchesPrefPattern(nsIURI *uri, const char *pref) { nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID); if (!prefs) { return false; } nsAutoCString scheme, host; int32_t port; if (NS_FAILED(uri->GetScheme(scheme))) { return false; } if (NS_FAILED(uri->GetAsciiHost(host))) { return false; } port = NS_GetRealPort(uri); if (port == -1) { return false; } char *hostList; if (NS_FAILED(prefs->GetCharPref(pref, &hostList)) || !hostList) { return false; } struct FreePolicy { void operator()(void* p) { free(p); } }; mozilla::UniquePtr<char[], FreePolicy> hostListScope; hostListScope.reset(hostList); // pseudo-BNF // ---------- // // url-list base-url ( base-url "," LWS )* // base-url ( scheme-part | host-part | scheme-part host-part ) // scheme-part scheme "://" // host-part host [":" port] // // for example: // "https://, http://office.foo.com" // mozilla::Tokenizer t(hostList); while (!t.CheckEOF()) { t.SkipWhites(); nsDependentCSubstring url; mozilla::Unused << t.ReadUntil(mozilla::Tokenizer::Token::Char(','), url); if (url.IsEmpty()) { continue; } if (detail::MatchesBaseURI(scheme, host, port, url)) { return true; } } return false; }
nsresult GenerateOriginKey(nsIPrincipal* aPrincipal, nsACString& aOriginAttrSuffix, nsACString& aOriginKey) { if (NS_WARN_IF(!aPrincipal)) { return NS_ERROR_UNEXPECTED; } aPrincipal->OriginAttributesRef().CreateSuffix(aOriginAttrSuffix); nsCOMPtr<nsIURI> uri; nsresult rv = aPrincipal->GetURI(getter_AddRefs(uri)); NS_ENSURE_SUCCESS(rv, rv); if (!uri) { return NS_ERROR_UNEXPECTED; } nsAutoCString domainOrigin; rv = uri->GetAsciiHost(domainOrigin); NS_ENSURE_SUCCESS(rv, rv); if (domainOrigin.IsEmpty()) { // For the file:/// protocol use the exact directory as domain. bool isScheme = false; if (NS_SUCCEEDED(uri->SchemeIs("file", &isScheme)) && isScheme) { nsCOMPtr<nsIURL> url = do_QueryInterface(uri, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = url->GetDirectory(domainOrigin); NS_ENSURE_SUCCESS(rv, rv); } } // Append reversed domain nsAutoCString reverseDomain; rv = CreateReversedDomain(domainOrigin, reverseDomain); if (NS_FAILED(rv)) { return rv; } aOriginKey.Append(reverseDomain); // Append scheme nsAutoCString scheme; rv = uri->GetScheme(scheme); NS_ENSURE_SUCCESS(rv, rv); aOriginKey.Append(':'); aOriginKey.Append(scheme); // Append port if any int32_t port = NS_GetRealPort(uri); if (port != -1) { aOriginKey.Append(nsPrintfCString(":%d", port)); } return NS_OK; }
/* static */ PRBool nsPreflightCache::GetCacheKey(nsIURI* aURI, nsIPrincipal* aPrincipal, PRBool aWithCredentials, nsACString& _retval) { NS_ASSERTION(aURI, "Null uri!"); NS_ASSERTION(aPrincipal, "Null principal!"); NS_NAMED_LITERAL_CSTRING(space, " "); nsCOMPtr<nsIURI> uri; nsresult rv = aPrincipal->GetURI(getter_AddRefs(uri)); NS_ENSURE_SUCCESS(rv, PR_FALSE); nsCAutoString scheme, host, port; if (uri) { uri->GetScheme(scheme); uri->GetHost(host); port.AppendInt(NS_GetRealPort(uri)); } nsCAutoString cred; if (aWithCredentials) { _retval.AssignLiteral("cred"); } else { _retval.AssignLiteral("nocred"); } nsCAutoString spec; rv = aURI->GetSpec(spec); NS_ENSURE_SUCCESS(rv, PR_FALSE); _retval.Assign(cred + space + scheme + space + host + space + port + space + spec); return PR_TRUE; }
nsresult nsDOMStorageDBWrapper::CreateOriginScopeDBKey(nsIURI* aUri, nsACString& aKey) { nsresult rv; rv = CreateDomainScopeDBKey(aUri, aKey); if (NS_FAILED(rv)) return rv; nsCAutoString scheme; rv = aUri->GetScheme(scheme); NS_ENSURE_SUCCESS(rv, rv); aKey.AppendLiteral(":"); aKey.Append(scheme); PRInt32 port = NS_GetRealPort(aUri); if (port != -1) { aKey.AppendLiteral(":"); aKey.Append(nsPrintfCString(32, "%d", port)); } return NS_OK; }
nsresult nsDOMStorageDBWrapper::CreateScopeDBKey(nsIPrincipal* aPrincipal, nsACString& aKey) { nsCOMPtr<nsIURI> uri; nsresult rv = aPrincipal->GetURI(getter_AddRefs(uri)); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_TRUE(uri, NS_ERROR_UNEXPECTED); nsAutoCString domainScope; rv = uri->GetAsciiHost(domainScope); NS_ENSURE_SUCCESS(rv, rv); if (domainScope.IsEmpty()) { // About pages have an empty host but a valid path. Since they are handled // internally by our own redirector, we can trust them and use path as key. // if file:/// protocol, let's make the exact directory the domain bool isScheme = false; if ((NS_SUCCEEDED(uri->SchemeIs("about", &isScheme)) && isScheme) || (NS_SUCCEEDED(uri->SchemeIs("moz-safe-about", &isScheme)) && isScheme)) { rv = uri->GetPath(domainScope); NS_ENSURE_SUCCESS(rv, rv); // While the host is always canonicalized to lowercase, the path is not, // thus need to force the casing. ToLowerCase(domainScope); } else if (NS_SUCCEEDED(uri->SchemeIs("file", &isScheme)) && isScheme) { nsCOMPtr<nsIURL> url = do_QueryInterface(uri, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = url->GetDirectory(domainScope); NS_ENSURE_SUCCESS(rv, rv); } } nsAutoCString key; rv = CreateReversedDomain(domainScope, key); NS_ENSURE_SUCCESS(rv, rv); nsAutoCString scheme; rv = uri->GetScheme(scheme); NS_ENSURE_SUCCESS(rv, rv); key.Append(NS_LITERAL_CSTRING(":") + scheme); int32_t port = NS_GetRealPort(uri); if (port != -1) { key.Append(nsPrintfCString(":%d", port)); } uint32_t appId; rv = aPrincipal->GetAppId(&appId); NS_ENSURE_SUCCESS(rv, rv); bool isInBrowserElement; rv = aPrincipal->GetIsInBrowserElement(&isInBrowserElement); NS_ENSURE_SUCCESS(rv, rv); if (appId == nsIScriptSecurityManager::NO_APP_ID && !isInBrowserElement) { aKey.Assign(key); return NS_OK; } aKey.Truncate(); aKey.AppendInt(appId); aKey.Append(NS_LITERAL_CSTRING(":") + (isInBrowserElement ? NS_LITERAL_CSTRING("t") : NS_LITERAL_CSTRING("f")) + NS_LITERAL_CSTRING(":") + key); return NS_OK; }