diff --git a/content/media/VideoUtils.cpp b/content/media/VideoUtils.cpp index 79c83be18761..12f29a500107 100644 --- a/content/media/VideoUtils.cpp +++ b/content/media/VideoUtils.cpp @@ -11,9 +11,7 @@ #include "ImageContainer.h" #include "SharedThreadPool.h" #include "mozilla/Preferences.h" -#include "mozilla/Base64.h" -#include "nsIRandomGenerator.h" -#include "nsIServiceManager.h" + #include namespace mozilla { @@ -232,42 +230,4 @@ ExtractH264CodecDetails(const nsAString& aCodec, return true; } -nsresult -GenerateRandomPathName(nsCString& aOutSalt, uint32_t aLength) -{ - nsresult rv; - nsCOMPtr rg = - do_GetService("@mozilla.org/security/random-generator;1", &rv); - if (NS_FAILED(rv)) return rv; - - // For each three bytes of random data we will get four bytes of - // ASCII. Request a bit more to be safe and truncate to the length - // we want at the end. - const uint32_t requiredBytesLength = - static_cast((aLength + 1) / 4 * 3); - - uint8_t* buffer; - rv = rg->GenerateRandomBytes(requiredBytesLength, &buffer); - if (NS_FAILED(rv)) return rv; - - nsAutoCString temp; - nsDependentCSubstring randomData(reinterpret_cast(buffer), - requiredBytesLength); - rv = Base64Encode(randomData, temp); - NS_Free(buffer); - buffer = nullptr; - if (NS_FAILED (rv)) return rv; - - temp.Truncate(aLength); - - // Base64 characters are alphanumeric (a-zA-Z0-9) and '+' and '/', so we need - // to replace illegal characters -- notably '/' - temp.ReplaceChar(FILE_PATH_SEPARATOR FILE_ILLEGAL_CHARACTERS, '_'); - - aOutSalt = temp; - - return NS_OK; -} - - } // end namespace mozilla diff --git a/content/media/VideoUtils.h b/content/media/VideoUtils.h index ffef9304049d..56f8e7d80352 100644 --- a/content/media/VideoUtils.h +++ b/content/media/VideoUtils.h @@ -257,12 +257,6 @@ ExtractH264CodecDetails(const nsAString& aCodecs, int16_t& aProfile, int16_t& aLevel); -// Use a cryptographic quality PRNG to generate raw random bytes -// and convert that to a base64 string suitable for use as a file or URL -// path. This is based on code from nsExternalAppHandler::SetUpTempFile. -nsresult -GenerateRandomPathName(nsCString& aOutSalt, uint32_t aLength); - } // end namespace mozilla #endif diff --git a/content/media/android/AndroidMediaResourceServer.cpp b/content/media/android/AndroidMediaResourceServer.cpp index ca60dedca410..890c281450fe 100644 --- a/content/media/android/AndroidMediaResourceServer.cpp +++ b/content/media/android/AndroidMediaResourceServer.cpp @@ -438,11 +438,38 @@ AndroidMediaResourceServer::AppendRandomPath(nsCString& aUrl) // and convert that to a base64 string for use as an URL path. This // is based on code from nsExternalAppHandler::SetUpTempFile. nsresult rv; - nsAutoCString salt; - rv = GenerateRandomPathName(salt, 16); + nsCOMPtr rg = + do_GetService("@mozilla.org/security/random-generator;1", &rv); if (NS_FAILED(rv)) return rv; + + // For each three bytes of random data we will get four bytes of + // ASCII. Request a bit more to be safe and truncate to the length + // we want at the end. + const uint32_t wantedFileNameLength = 16; + const uint32_t requiredBytesLength = + static_cast((wantedFileNameLength + 1) / 4 * 3); + + uint8_t* buffer; + rv = rg->GenerateRandomBytes(requiredBytesLength, &buffer); + if (NS_FAILED(rv)) return rv; + + nsAutoCString tempLeafName; + nsDependentCSubstring randomData(reinterpret_cast(buffer), + requiredBytesLength); + rv = Base64Encode(randomData, tempLeafName); + NS_Free(buffer); + buffer = nullptr; + if (NS_FAILED (rv)) return rv; + + tempLeafName.Truncate(wantedFileNameLength); + + // Base64 characters are alphanumeric (a-zA-Z0-9) and '+' and '/', so we need + // to replace illegal characters -- notably '/' + tempLeafName.ReplaceChar(FILE_PATH_SEPARATOR FILE_ILLEGAL_CHARACTERS, '_'); + aUrl += "/"; - aUrl += salt; + aUrl += tempLeafName; + return NS_OK; } @@ -450,7 +477,7 @@ nsresult AndroidMediaResourceServer::AddResource(mozilla::MediaResource* aResource, nsCString& aUrl) { nsCString url = GetURLPrefix(); - nsresult rv = GenerateRandomPathName(url, 16); + nsresult rv = AppendRandomPath(url); if (NS_FAILED (rv)) return rv; {