nsresult nsPermissionManager::Import() { nsresult rv; nsCOMPtr<nsIFile> permissionsFile; rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(permissionsFile)); if (NS_FAILED(rv)) return rv; rv = permissionsFile->AppendNative(NS_LITERAL_CSTRING(kHostpermFileName)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIInputStream> fileInputStream; rv = NS_NewLocalFileInputStream(getter_AddRefs(fileInputStream), permissionsFile); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsILineInputStream> lineInputStream = do_QueryInterface(fileInputStream, &rv); NS_ENSURE_SUCCESS(rv, rv); // start a transaction on the storage db, to optimize insertions. // transaction will automically commit on completion mozStorageTransaction transaction(mDBConn, PR_TRUE); /* format is: * matchtype \t type \t permission \t host * Only "host" is supported for matchtype * type is a string that identifies the type of permission (e.g. "cookie") * permission is an integer between 1 and 15 */ nsCAutoString buffer; PRBool isMore = PR_TRUE; while (isMore && NS_SUCCEEDED(lineInputStream->ReadLine(buffer, &isMore))) { if (buffer.IsEmpty() || buffer.First() == '#') { continue; } nsTArray<nsCString> lineArray; // Split the line at tabs ParseString(buffer, '\t', lineArray); if (lineArray[0].EqualsLiteral(kMatchTypeHost) && lineArray.Length() == 4) { PRInt32 error; PRUint32 permission = lineArray[2].ToInteger(&error); if (error) continue; // hosts might be encoded in UTF8; switch them to ACE to be consistent if (!IsASCII(lineArray[3])) { rv = NormalizeToACE(lineArray[3]); if (NS_FAILED(rv)) continue; } rv = AddInternal(lineArray[3], lineArray[1], permission, 0, nsIPermissionManager::EXPIRE_NEVER, 0, eDontNotify, eWriteToDB); NS_ENSURE_SUCCESS(rv, rv); } } // we're done importing - delete the old file permissionsFile->Remove(PR_FALSE); return NS_OK; }
constexpr static inline bool IsASCII(const char ch) { return IsASCII((unsigned char)ch); }
// returns TRUE if SAN was used to produce names // return FALSE if nothing was produced // names => a single name or a list of names // multipleNames => whether multiple names were delivered static bool GetSubjectAltNames(CERTCertificate *nssCert, nsINSSComponent *component, nsString &allNames, uint32_t &nameCount) { allNames.Truncate(); nameCount = 0; SECItem altNameExtension = {siBuffer, nullptr, 0 }; CERTGeneralName *sanNameList = nullptr; SECStatus rv = CERT_FindCertExtension(nssCert, SEC_OID_X509_SUBJECT_ALT_NAME, &altNameExtension); if (rv != SECSuccess) { return false; } ScopedPLArenaPool arena(PORT_NewArena(DER_DEFAULT_CHUNKSIZE)); if (!arena) { return false; } sanNameList = CERT_DecodeAltNameExtension(arena.get(), &altNameExtension); if (!sanNameList) { return false; } SECITEM_FreeItem(&altNameExtension, false); CERTGeneralName *current = sanNameList; do { nsAutoString name; switch (current->type) { case certDNSName: { nsDependentCSubstring nameFromCert(reinterpret_cast<char*> (current->name.other.data), current->name.other.len); // dNSName fields are defined as type IA5String and thus should // be limited to ASCII characters. if (IsASCII(nameFromCert)) { name.Assign(NS_ConvertASCIItoUTF16(nameFromCert)); if (!allNames.IsEmpty()) { allNames.AppendLiteral(", "); } ++nameCount; allNames.Append(name); } } break; case certIPAddress: { char buf[INET6_ADDRSTRLEN]; PRNetAddr addr; if (current->name.other.len == 4) { addr.inet.family = PR_AF_INET; memcpy(&addr.inet.ip, current->name.other.data, current->name.other.len); PR_NetAddrToString(&addr, buf, sizeof(buf)); name.AssignASCII(buf); } else if (current->name.other.len == 16) { addr.ipv6.family = PR_AF_INET6; memcpy(&addr.ipv6.ip, current->name.other.data, current->name.other.len); PR_NetAddrToString(&addr, buf, sizeof(buf)); name.AssignASCII(buf); } else { /* invalid IP address */ } if (!name.IsEmpty()) { if (!allNames.IsEmpty()) { allNames.AppendLiteral(", "); } ++nameCount; allNames.Append(name); } break; } default: // all other types of names are ignored break; } current = CERT_GetNextGeneralName(current); } while (current != sanNameList); // double linked return true; }
NS_IMETHODIMP nsDNSService::Resolve(const nsACString &hostname, PRUint32 flags, nsIDNSRecord **result) { // grab reference to global host resolver and IDN service. beware // simultaneous shutdown!! nsRefPtr<nsHostResolver> res; nsCOMPtr<nsIIDNService> idn; { nsAutoLock lock(mLock); res = mResolver; idn = mIDN; } NS_ENSURE_TRUE(res, NS_ERROR_OFFLINE); const nsACString *hostPtr = &hostname; nsresult rv; nsCAutoString hostACE; if (idn && !IsASCII(hostname)) { if (NS_SUCCEEDED(idn->ConvertUTF8toACE(hostname, hostACE))) hostPtr = &hostACE; } // // sync resolve: since the host resolver only works asynchronously, we need // to use a mutex and a condvar to wait for the result. however, since the // result may be in the resolvers cache, we might get called back recursively // on the same thread. so, our mutex needs to be re-entrant. inotherwords, // we need to use a monitor! ;-) // PRMonitor *mon = PR_NewMonitor(); if (!mon) return NS_ERROR_OUT_OF_MEMORY; PR_EnterMonitor(mon); nsDNSSyncRequest syncReq(mon); PRUint16 af = GetAFForLookup(*hostPtr); rv = res->ResolveHost(PromiseFlatCString(*hostPtr).get(), flags, af, &syncReq); if (NS_SUCCEEDED(rv)) { // wait for result while (!syncReq.mDone) PR_Wait(mon, PR_INTERVAL_NO_TIMEOUT); if (NS_FAILED(syncReq.mStatus)) rv = syncReq.mStatus; else { NS_ASSERTION(syncReq.mHostRecord, "no host record"); nsDNSRecord *rec = new nsDNSRecord(syncReq.mHostRecord); if (!rec) rv = NS_ERROR_OUT_OF_MEMORY; else NS_ADDREF(*result = rec); } } PR_ExitMonitor(mon); PR_DestroyMonitor(mon); return rv; }
/* nsIURI createFixupURI (in nsAUTF8String aURIText, in unsigned long aFixupFlags); */ NS_IMETHODIMP nsDefaultURIFixup::CreateFixupURI(const nsACString& aStringURI, PRUint32 aFixupFlags, nsIURI **aURI) { NS_ENSURE_ARG(!aStringURI.IsEmpty()); NS_ENSURE_ARG_POINTER(aURI); nsresult rv; *aURI = nsnull; nsCAutoString uriString(aStringURI); uriString.Trim(" "); // Cleanup the empty spaces that might be on each end. // Eliminate embedded newlines, which single-line text fields now allow: uriString.StripChars("\r\n"); NS_ENSURE_TRUE(!uriString.IsEmpty(), NS_ERROR_FAILURE); nsCOMPtr<nsIIOService> ioService = do_GetService(NS_IOSERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCAutoString scheme; ioService->ExtractScheme(aStringURI, scheme); // View-source is a pseudo scheme. We're interested in fixing up the stuff // after it. The easiest way to do that is to call this method again with the // "view-source:" lopped off and then prepend it again afterwards. if (scheme.LowerCaseEqualsLiteral("view-source")) { nsCOMPtr<nsIURI> uri; PRUint32 newFixupFlags = aFixupFlags & ~FIXUP_FLAG_ALLOW_KEYWORD_LOOKUP; rv = CreateFixupURI(Substring(uriString, sizeof("view-source:") - 1, uriString.Length() - (sizeof("view-source:") - 1)), newFixupFlags, getter_AddRefs(uri)); if (NS_FAILED(rv)) return NS_ERROR_FAILURE; nsCAutoString spec; uri->GetSpec(spec); uriString.Assign(NS_LITERAL_CSTRING("view-source:") + spec); } else { // Check for if it is a file URL FileURIFixup(uriString, aURI); if(*aURI) return NS_OK; #if defined(XP_WIN) || defined(XP_OS2) // Not a file URL, so translate '\' to '/' for convenience in the common protocols // e.g. catch // // http:\\broken.com\address // http:\\broken.com/blah // broken.com\blah // // Code will also do partial fix up the following urls // // http:\\broken.com\address/somewhere\image.jpg (stops at first forward slash) // http:\\broken.com\blah?arg=somearg\foo.jpg (stops at question mark) // http:\\broken.com#odd\ref (stops at hash) // if (scheme.IsEmpty() || scheme.LowerCaseEqualsLiteral("http") || scheme.LowerCaseEqualsLiteral("https") || scheme.LowerCaseEqualsLiteral("ftp")) { // Walk the string replacing backslashes with forward slashes until // the end is reached, or a question mark, or a hash, or a forward // slash. The forward slash test is to stop before trampling over // URIs which legitimately contain a mix of both forward and // backward slashes. nsCAutoString::iterator start; nsCAutoString::iterator end; uriString.BeginWriting(start); uriString.EndWriting(end); while (start != end) { if (*start == '?' || *start == '#' || *start == '/') break; if (*start == '\\') *start = '/'; ++start; } } #endif } // For these protocols, use system charset instead of the default UTF-8, // if the URI is non ASCII. PRBool bAsciiURI = IsASCII(uriString); PRBool bUseNonDefaultCharsetForURI = !bAsciiURI && (scheme.IsEmpty() || scheme.LowerCaseEqualsLiteral("http") || scheme.LowerCaseEqualsLiteral("https") || scheme.LowerCaseEqualsLiteral("ftp") || scheme.LowerCaseEqualsLiteral("file")); // Now we need to check whether "scheme" is something we don't // really know about. nsCOMPtr<nsIProtocolHandler> ourHandler, extHandler; ioService->GetProtocolHandler(scheme.get(), getter_AddRefs(ourHandler)); extHandler = do_GetService(NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX"default"); if (ourHandler != extHandler || !PossiblyHostPortUrl(uriString)) { // Just try to create an URL out of it rv = NS_NewURI(aURI, uriString, bUseNonDefaultCharsetForURI ? GetCharsetForUrlBar() : nsnull); if (!*aURI && rv != NS_ERROR_MALFORMED_URI) { return rv; } } if (*aURI) { if (aFixupFlags & FIXUP_FLAGS_MAKE_ALTERNATE_URI) MakeAlternateURI(*aURI); return NS_OK; } // See if it is a keyword // Test whether keywords need to be fixed up PRBool fixupKeywords = PR_FALSE; if (aFixupFlags & FIXUP_FLAG_ALLOW_KEYWORD_LOOKUP) { if (mPrefBranch) { NS_ENSURE_SUCCESS(mPrefBranch->GetBoolPref("keyword.enabled", &fixupKeywords), NS_ERROR_FAILURE); } if (fixupKeywords) { KeywordURIFixup(uriString, aURI); if(*aURI) return NS_OK; } } // Prune duff protocol schemes // // ://totallybroken.url.com // //shorthand.url.com // if (StringBeginsWith(uriString, NS_LITERAL_CSTRING("://"))) { uriString = StringTail(uriString, uriString.Length() - 3); } else if (StringBeginsWith(uriString, NS_LITERAL_CSTRING("//"))) { uriString = StringTail(uriString, uriString.Length() - 2); } // Add ftp:// or http:// to front of url if it has no spec // // Should fix: // // no-scheme.com // ftp.no-scheme.com // ftp4.no-scheme.com // no-scheme.com/query?foo=http://www.foo.com // PRInt32 schemeDelim = uriString.Find("://",0); PRInt32 firstDelim = uriString.FindCharInSet("/:"); if (schemeDelim <= 0 || (firstDelim != -1 && schemeDelim > firstDelim)) { // find host name PRInt32 hostPos = uriString.FindCharInSet("/:?#"); if (hostPos == -1) hostPos = uriString.Length(); // extract host name nsCAutoString hostSpec; uriString.Left(hostSpec, hostPos); // insert url spec corresponding to host name if (IsLikelyFTP(hostSpec)) uriString.Assign(NS_LITERAL_CSTRING("ftp://") + uriString); else uriString.Assign(NS_LITERAL_CSTRING("http://") + uriString); // For ftp & http, we want to use system charset. if (!bAsciiURI) bUseNonDefaultCharsetForURI = PR_TRUE; } // end if checkprotocol rv = NS_NewURI(aURI, uriString, bUseNonDefaultCharsetForURI ? GetCharsetForUrlBar() : nsnull); // Did the caller want us to try an alternative URI? // If so, attempt to fixup http://foo into http://www.foo.com if (*aURI && aFixupFlags & FIXUP_FLAGS_MAKE_ALTERNATE_URI) { MakeAlternateURI(*aURI); } // If we still haven't been able to construct a valid URI, try to force a // keyword match. This catches search strings with '.' or ':' in them. if (!*aURI && fixupKeywords) { KeywordToURI(aStringURI, aURI); if(*aURI) return NS_OK; } return rv; }
nsresult nsXHTMLContentSerializer::EscapeURI(nsIContent* aContent, const nsAString& aURI, nsAString& aEscapedURI) { // URL escape %xx cannot be used in JS. // No escaping if the scheme is 'javascript'. if (IsJavaScript(aContent, nsGkAtoms::href, kNameSpaceID_None, aURI)) { aEscapedURI = aURI; return NS_OK; } // nsITextToSubURI does charset convert plus uri escape // This is needed to convert to a document charset which is needed to support existing browsers. // But we eventually want to use UTF-8 instead of a document charset, then the code would be much simpler. // See HTML 4.01 spec, "Appendix B.2.1 Non-ASCII characters in URI attribute values" nsCOMPtr<nsITextToSubURI> textToSubURI; nsAutoString uri(aURI); // in order to use FindCharInSet() nsresult rv = NS_OK; if (!mCharset.IsEmpty() && !IsASCII(uri)) { textToSubURI = do_GetService(NS_ITEXTTOSUBURI_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); } int32_t start = 0; int32_t end; nsAutoString part; nsXPIDLCString escapedURI; aEscapedURI.Truncate(0); // Loop and escape parts by avoiding escaping reserved characters // (and '%', '#', as well as '[' and ']' for IPv6 address literals). while ((end = uri.FindCharInSet("%#;/?:@&=+$,[]", start)) != -1) { part = Substring(aURI, start, (end-start)); if (textToSubURI && !IsASCII(part)) { rv = textToSubURI->ConvertAndEscape(mCharset.get(), part.get(), getter_Copies(escapedURI)); NS_ENSURE_SUCCESS(rv, rv); } else if (NS_WARN_IF(!NS_Escape(NS_ConvertUTF16toUTF8(part), escapedURI, url_Path))) { return NS_ERROR_OUT_OF_MEMORY; } AppendASCIItoUTF16(escapedURI, aEscapedURI); // Append a reserved character without escaping. part = Substring(aURI, end, 1); aEscapedURI.Append(part); start = end + 1; } if (start < (int32_t) aURI.Length()) { // Escape the remaining part. part = Substring(aURI, start, aURI.Length()-start); if (textToSubURI) { rv = textToSubURI->ConvertAndEscape(mCharset.get(), part.get(), getter_Copies(escapedURI)); NS_ENSURE_SUCCESS(rv, rv); } else if (NS_WARN_IF(!NS_Escape(NS_ConvertUTF16toUTF8(part), escapedURI, url_Path))) { return NS_ERROR_OUT_OF_MEMORY; } AppendASCIItoUTF16(escapedURI, aEscapedURI); } return rv; }
bool IsASCII(const Unit &U) { return IsASCII(U.data(), U.size()); }
constexpr static inline bool IsPrintableASCII(TCHAR ch) { return IsASCII(ch) && ch >= 0x20; }
bool SkeletonState::DecodeFisbone(ogg_packet* aPacket) { if (aPacket->bytes < static_cast<long>(FISBONE_MSG_FIELDS_OFFSET + 4)) { return false; } uint32_t offsetMsgField = LittleEndian::readUint32(aPacket->packet + FISBONE_MSG_FIELDS_OFFSET); if (aPacket->bytes < static_cast<long>(FISBONE_SERIALNO_OFFSET + 4)) { return false; } uint32_t serialno = LittleEndian::readUint32(aPacket->packet + FISBONE_SERIALNO_OFFSET); CheckedUint32 checked_fields_pos = CheckedUint32(FISBONE_MSG_FIELDS_OFFSET) + offsetMsgField; if (!checked_fields_pos.isValid() || aPacket->bytes < static_cast<int64_t>(checked_fields_pos.value())) { return false; } int64_t msgLength = aPacket->bytes - checked_fields_pos.value(); char* msgProbe = (char*)aPacket->packet + checked_fields_pos.value(); char* msgHead = msgProbe; nsAutoPtr<MessageField> field(new MessageField()); const static FieldPatternType kFieldTypeMaps[] = { {"Content-Type:", eContentType}, {"Role:", eRole}, {"Name:", eName}, {"Language:", eLanguage}, {"Title:", eTitle}, {"Display-hint:", eDisplayHint}, {"Altitude:", eAltitude}, {"TrackOrder:", eTrackOrder}, {"Track dependencies:", eTrackDependencies} }; bool isContentTypeParsed = false; while (msgLength > 1) { if (*msgProbe == '\r' && *(msgProbe+1) == '\n') { nsAutoCString strMsg(msgHead, msgProbe-msgHead); for (size_t i = 0; i < ArrayLength(kFieldTypeMaps); i++) { if (strMsg.Find(kFieldTypeMaps[i].mPatternToRecognize) != -1) { // The content of message header fields follows [RFC2822], and the // mandatory message field must be encoded in US-ASCII, others // must be be encoded in UTF-8. "Content-Type" must come first // for all of message header fields. // See http://svn.annodex.net/standards/draft-pfeiffer-oggskeleton-current.txt. if (i != 0 && !isContentTypeParsed) { return false; } if ((i == 0 && IsASCII(strMsg)) || (i != 0 && IsUTF8(strMsg))) { EMsgHeaderType eHeaderType = kFieldTypeMaps[i].mMsgHeaderType; if (!field->mValuesStore.Contains(eHeaderType)) { uint32_t nameLen = strlen(kFieldTypeMaps[i].mPatternToRecognize); field->mValuesStore.Put(eHeaderType, new nsCString(msgHead+nameLen, msgProbe-msgHead-nameLen)); } isContentTypeParsed = i==0 ? true : isContentTypeParsed; } break; } } msgProbe += 2; msgLength -= 2; msgHead = msgProbe; continue; } msgLength--; msgProbe++; }; if (!mMsgFieldStore.Contains(serialno)) { mMsgFieldStore.Put(serialno, field.forget()); } else { return false; } return true; }