diff --git a/src/extractors/taglibextractor.cpp b/src/extractors/taglibextractor.cpp --- a/src/extractors/taglibextractor.cpp +++ b/src/extractors/taglibextractor.cpp @@ -22,6 +22,7 @@ // Taglib includes #include +#include #include #include #include @@ -38,6 +39,7 @@ #include #include +#include using namespace KFileMetaData; @@ -94,8 +96,16 @@ const QString fileUrl = result->inputUrl(); const QString mimeType = result->inputMimetype(); - TagLib::FileRef file(fileUrl.toUtf8().constData(), true); + // Open the file readonly. Important if we're sandboxed. + TagLib::FileStream stream(fileUrl.toUtf8().constData(), true); + if (!stream.isOpen()) { + qWarning() << "Unable to open file readonly: " << fileUrl; + return; + } + + TagLib::FileRef file(&stream, true); if (file.isNull()) { + qWarning() << "Unable to open file: " << fileUrl; return; } @@ -111,7 +121,7 @@ // Handling multiple tags in mpeg files. if ((mimeType == QLatin1String("audio/mpeg")) || (mimeType == QLatin1String("audio/mpeg3")) || (mimeType == QLatin1String("audio/x-mpeg"))) { - TagLib::MPEG::File mpegFile(fileUrl.toUtf8().constData(), true); + TagLib::MPEG::File mpegFile(&stream, TagLib::ID3v2::FrameFactory::instance(), true); if (mpegFile.ID3v2Tag() && !mpegFile.ID3v2Tag()->isEmpty()) { TagLib::ID3v2::FrameList lstID3v2; @@ -179,7 +189,7 @@ } if (mimeType == QStringLiteral("audio/mp4")) { - TagLib::MP4::File mp4File(fileUrl.toUtf8().constData(), true); + TagLib::MP4::File mp4File(&stream, true); if (mp4File.tag() && !mp4File.tag()->isEmpty()) { TagLib::MP4::ItemListMap allTags = mp4File.tag()->itemListMap(); @@ -208,23 +218,23 @@ // FLAC files. if (mimeType == QLatin1String("audio/flac")) { - TagLib::FLAC::File flacFile(fileUrl.toUtf8().constData(), true); + TagLib::FLAC::File flacFile(&stream, TagLib::ID3v2::FrameFactory::instance(), true); if (flacFile.xiphComment() && !flacFile.xiphComment()->isEmpty()) { lstOgg = flacFile.xiphComment()->fieldListMap(); } } // Vorbis files. if (mimeType == QLatin1String("audio/ogg") || mimeType == QLatin1String("audio/x-vorbis+ogg")) { - TagLib::Ogg::Vorbis::File oggFile(fileUrl.toUtf8().constData(), true); + TagLib::Ogg::Vorbis::File oggFile(&stream, true); if (oggFile.tag() && !oggFile.tag()->isEmpty()) { lstOgg = oggFile.tag()->fieldListMap(); } } // Opus files. if (mimeType == QLatin1String("audio/opus") || mimeType == QLatin1String("audio/x-opus+ogg")) { - TagLib::Ogg::Opus::File opusFile(fileUrl.toUtf8().constData(), true); + TagLib::Ogg::Opus::File opusFile(&stream, true); if (opusFile.tag() && !opusFile.tag()->isEmpty()) { lstOgg = opusFile.tag()->fieldListMap(); } @@ -286,7 +296,7 @@ // Handling multiple tags in Musepack files. if (mimeType == QLatin1String("audio/x-musepack")) { - TagLib::MPC::File mpcFile(fileUrl.toUtf8().constData(), true); + TagLib::MPC::File mpcFile(&stream, true); if (mpcFile.tag() && !mpcFile.tag()->isEmpty()) { TagLib::APE::ItemListMap lstMusepack = mpcFile.APETag()->itemListMap(); TagLib::APE::ItemListMap::ConstIterator itMPC;