From a2c5a9e5713846a0f3e7ca891c4aab24e24dc8df Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Fri, 14 Oct 2022 23:15:13 +0200 Subject: [PATCH] Use a cryptographic checksum when downloading openH264 from CISCO and update them to 2.2.0 --- CHANGELOG.md | 1 + .../components/codecs/AbstractCodecsModel.cpp | 4 +++- .../components/codecs/AbstractCodecsModel.hpp | 3 ++- .../components/codecs/VideoCodecsModel.cpp | 18 +++++++++++----- .../src/components/file/FileDownloader.cpp | 21 ++++++++++++++++++- .../src/components/file/FileDownloader.hpp | 6 ++++++ linphone-app/src/utils/Constants.cpp | 4 ++++ linphone-app/src/utils/Constants.hpp | 12 +++++++---- linphone-app/src/utils/Utils.cpp | 12 +++++++++++ linphone-app/src/utils/Utils.hpp | 1 + linphone-app/ui/scripts/Utils/utils.js | 3 ++- 11 files changed, 72 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 075a188d0..a0925c545 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Mark as Read synchronized between devices. - Merge messages into one notification to avoid spam. - Design overhaul on calls. +- Use a cryptographic checksum when downloading openH264 from CISCO (Update to 2.2.0) ### Fixed - Crash on exit. diff --git a/linphone-app/src/components/codecs/AbstractCodecsModel.cpp b/linphone-app/src/components/codecs/AbstractCodecsModel.cpp index 1e5235da1..0f1e96e40 100644 --- a/linphone-app/src/components/codecs/AbstractCodecsModel.cpp +++ b/linphone-app/src/components/codecs/AbstractCodecsModel.cpp @@ -157,7 +157,8 @@ void AbstractCodecsModel::addDownloadableCodec ( const QString &mime, const QString &encoderDescription, const QString &downloadUrl, - const QString &installName + const QString &installName, + const QString &chekcksum ) { QVariantMap map; @@ -165,6 +166,7 @@ void AbstractCodecsModel::addDownloadableCodec ( map["encoderDescription"] = encoderDescription; map["installName"] = installName; map["mime"] = mime; + map["checksum"] = chekcksum; mList << map; } diff --git a/linphone-app/src/components/codecs/AbstractCodecsModel.hpp b/linphone-app/src/components/codecs/AbstractCodecsModel.hpp index 1ee83c15d..cf17bd6ad 100644 --- a/linphone-app/src/components/codecs/AbstractCodecsModel.hpp +++ b/linphone-app/src/components/codecs/AbstractCodecsModel.hpp @@ -63,7 +63,8 @@ protected: const QString &mime, const QString &encoderDescription, const QString &downloadUrl, - const QString &installName + const QString &installName, + const QString &chekcksum ); virtual void updateCodecs (std::list> &codecs) = 0; diff --git a/linphone-app/src/components/codecs/VideoCodecsModel.cpp b/linphone-app/src/components/codecs/VideoCodecsModel.cpp index a7fae0fef..4aed12c0f 100644 --- a/linphone-app/src/components/codecs/VideoCodecsModel.cpp +++ b/linphone-app/src/components/codecs/VideoCodecsModel.cpp @@ -47,7 +47,8 @@ static bool downloadUpdatableCodec ( const QString &codecsFolder, const QString &mime, const QString &downloadUrl, - const QString &installName + const QString &installName, + const QString &checksum ) { QString versionFilePath = codecsFolder + mime + ".txt"; QFile versionFile(versionFilePath); @@ -70,9 +71,16 @@ static bool downloadUpdatableCodec ( fileExtractor->setExtractFolder(codecsFolder); fileExtractor->setExtractName(installName + ".in"); - QObject::connect(fileDownloader, &FileDownloader::downloadFinished, [fileExtractor](const QString &filePath) { + QObject::connect(fileDownloader, &FileDownloader::downloadFinished, [fileDownloader, fileExtractor, checksum](const QString &filePath) { fileExtractor->setFile(filePath); - fileExtractor->extract(); + QString fileChecksum = Utils::getFileChecksum(filePath); + if(fileChecksum == checksum) + fileExtractor->extract(); + else{ + qWarning() << "File cannot be downloaded : Bad checksum."; + fileDownloader->remove(); + fileDownloader->deleteLater(); + } }); QObject::connect(fileDownloader, &FileDownloader::downloadFailed, [fileDownloader]() { @@ -128,7 +136,7 @@ void VideoCodecsModel::updateCodecs () { void VideoCodecsModel::downloadUpdatableCodecs (QObject *parent) { #if defined(Q_OS_LINUX) || defined(Q_OS_WIN) - downloadUpdatableCodec(parent, getCodecsFolder(), "H264", Constants::PluginUrlH264, Constants::H264InstallName); + downloadUpdatableCodec(parent, getCodecsFolder(), "H264", Constants::PluginUrlH264, Constants::H264InstallName, Constants::PluginH264Check); #else Q_UNUSED(parent); #endif // if defined(Q_OS_LINUX) || defined(Q_OS_WIN) @@ -169,7 +177,7 @@ void VideoCodecsModel::load () { if (find_if(codecs.begin(), codecs.end(), [](const shared_ptr &codec) { return codec->getMimeType() == "H264"; }) == codecs.end()) - addDownloadableCodec("H264", Constants::H264Description, Constants::PluginUrlH264, Constants::H264InstallName); + addDownloadableCodec("H264", Constants::H264Description, Constants::PluginUrlH264, Constants::H264InstallName, Constants::PluginH264Check); #endif // if defined(Q_OS_LINUX) || defined(Q_OS_WIN) } diff --git a/linphone-app/src/components/file/FileDownloader.cpp b/linphone-app/src/components/file/FileDownloader.cpp index de186b3ba..028136545 100644 --- a/linphone-app/src/components/file/FileDownloader.cpp +++ b/linphone-app/src/components/file/FileDownloader.cpp @@ -19,6 +19,7 @@ */ #include +#include #include "app/paths/Paths.hpp" #include "components/core/CoreManager.hpp" #include "components/settings/SettingsModel.hpp" @@ -149,7 +150,14 @@ void FileDownloader::handleDownloadFinished() { qInfo() << QStringLiteral("Download of %1 finished to %2").arg(mUrl.toString(), mDestinationFile.fileName()); mDestinationFile.close(); cleanDownloadEnd(); - emit downloadFinished(mDestinationFile.fileName()); + QString fileChecksum = Utils::getFileChecksum(mDestinationFile.fileName()); + if( fileChecksum == mChecksum) + emit downloadFinished(mDestinationFile.fileName()); + else{ + qCritical() << "File cannot be downloaded : Bad checksum " << fileChecksum; + mDestinationFile.remove(); + emit downloadFailed(); + } } } @@ -261,6 +269,17 @@ QString FileDownloader::synchronousDownload(const QUrl &url, const QString &dest return filePath; } +QString FileDownloader::getChecksum() const{ + return mChecksum; +} + +void FileDownloader::setChecksum(const QString& code){ + if(mChecksum != code) { + mChecksum = code; + emit checksumChanged(); + } +} + qint64 FileDownloader::getReadBytes () const { return mReadBytes; } diff --git a/linphone-app/src/components/file/FileDownloader.hpp b/linphone-app/src/components/file/FileDownloader.hpp index 6a203783d..686bfd38e 100644 --- a/linphone-app/src/components/file/FileDownloader.hpp +++ b/linphone-app/src/components/file/FileDownloader.hpp @@ -39,6 +39,7 @@ class FileDownloader : public QObject{ Q_PROPERTY(qint64 readBytes READ getReadBytes NOTIFY readBytesChanged); Q_PROPERTY(qint64 totalBytes READ getTotalBytes NOTIFY totalBytesChanged); Q_PROPERTY(bool downloading READ getDownloading NOTIFY downloadingChanged); + Q_PROPERTY(QString checksum READ getChecksum WRITE setChecksum NOTIFY checksumChanged); public: FileDownloader (QObject *parent = Q_NULLPTR) : QObject(parent) { @@ -63,6 +64,9 @@ public: void setOverwriteFile(const bool &overwrite); static QString synchronousDownload(const QUrl &url, const QString &destinationFolder, const bool &overwriteFile);// Return the filpath. Empty if nof file could be downloaded + QString getChecksum() const; + void setChecksum(const QString& code); + signals: void urlChanged (const QUrl &url); void downloadFolderChanged (const QString &downloadFolder); @@ -71,6 +75,7 @@ signals: void downloadingChanged (bool downloading); void downloadFinished (const QString &filePath); void downloadFailed(); + void checksumChanged(); private: qint64 getReadBytes () const; @@ -97,6 +102,7 @@ private: QUrl mUrl; QString mDownloadFolder; QFile mDestinationFile; + QString mChecksum; qint64 mReadBytes = 0; qint64 mTotalBytes = 0; diff --git a/linphone-app/src/utils/Constants.cpp b/linphone-app/src/utils/Constants.cpp index 965f6afc4..4e1324fae 100644 --- a/linphone-app/src/utils/Constants.cpp +++ b/linphone-app/src/utils/Constants.cpp @@ -82,16 +82,20 @@ constexpr char Constants::LibraryExtension[]; constexpr char Constants::H264InstallName[]; #ifdef Q_PROCESSOR_X86_64 constexpr char Constants::PluginUrlH264[]; +constexpr char Constants::PluginH264Check[]; #else constexpr char Constants::PluginUrlH264[]; +constexpr char Constants::PluginH264Check[]; #endif // ifdef Q_PROCESSOR_X86_64 #elif defined(Q_OS_WIN) constexpr char Constants::LibraryExtension[]; constexpr char Constants::H264InstallName[]; #ifdef Q_OS_WIN64 constexpr char Constants::PluginUrlH264[]; +constexpr char Constants::PluginH264Check[]; #else constexpr char Constants::PluginUrlH264[]; +constexpr char Constants::PluginH264Check[]; #endif // ifdef Q_OS_WIN64 #endif // ifdef Q_OS_LINUX constexpr char Constants::VcardScheme[]; diff --git a/linphone-app/src/utils/Constants.hpp b/linphone-app/src/utils/Constants.hpp index 3daaa6b9e..2807f1a64 100644 --- a/linphone-app/src/utils/Constants.hpp +++ b/linphone-app/src/utils/Constants.hpp @@ -156,17 +156,21 @@ public: static constexpr char LibraryExtension[] = "so"; static constexpr char H264InstallName[] = "libopenh264.so"; #ifdef Q_PROCESSOR_X86_64 - static constexpr char PluginUrlH264[] = "http://ciscobinary.openh264.org/libopenh264-2.1.0-linux64.5.so.bz2"; + static constexpr char PluginUrlH264[] = "http://ciscobinary.openh264.org/libopenh264-2.2.0-linux64.6.so.bz2"; + static constexpr char PluginH264Check[] = "45ba1aaeb6213c19cd9622b79788e16b05beabc4d16a3a74e57f046a0826fd77"; #else - static constexpr char PluginUrlH264[] = "http://ciscobinary.openh264.org/libopenh264-2.1.0-linux32.5.so.bz2"; + static constexpr char PluginUrlH264[] = "http://ciscobinary.openh264.org/libopenh264-2.2.0-linux32.6.so.bz2"; + static constexpr char PluginH264Check[] = "bf18e0e79c4a23018b0ea5ad6d7dd14fd1b6a6189d2f88fd56dece019fc415c8"; #endif // ifdef Q_PROCESSOR_X86_64 #elif defined(Q_OS_WIN) static constexpr char LibraryExtension[] = "dll"; static constexpr char H264InstallName[] = "openh264.dll"; #ifdef Q_OS_WIN64 - static constexpr char PluginUrlH264[] = "http://ciscobinary.openh264.org/openh264-2.1.0-win64.dll.bz2"; + static constexpr char PluginUrlH264[] = "http://ciscobinary.openh264.org/openh264-2.2.0-win64.dll.bz2"; + static constexpr char PluginH264Check[] = "799e08c418b6cdeadfbe18d027392158face4a5c901d41f83712a20f0d41ad7d"; #else - static constexpr char PluginUrlH264[] = "http://ciscobinary.openh264.org/openh264-2.1.0-win32.dll.bz2"; + static constexpr char PluginUrlH264[] = "http://ciscobinary.openh264.org/openh264-2.2.0-win32.dll.bz2"; + static constexpr char PluginH264Check[] = "2205097a3a309271e15879b25a905eb290cfdd7fd7a8a0c1037e0458e5dc1f21"; #endif // ifdef Q_OS_WIN64 #endif // ifdef Q_OS_LINUX diff --git a/linphone-app/src/utils/Utils.cpp b/linphone-app/src/utils/Utils.cpp index d227945bf..0c1bdacea 100644 --- a/linphone-app/src/utils/Utils.cpp +++ b/linphone-app/src/utils/Utils.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -569,4 +570,15 @@ QSize Utils::getImageSize(const QString& url){ QPoint Utils::getCursorPosition(){ return QCursor::pos(); +} + +QString Utils::getFileChecksum(const QString& filePath){ + QFile file(filePath); + if (file.open(QFile::ReadOnly)) { + QCryptographicHash hash(QCryptographicHash::Sha256); + if (hash.addData(&file)) { + return hash.result().toHex(); + } + } + return QString(); } \ No newline at end of file diff --git a/linphone-app/src/utils/Utils.hpp b/linphone-app/src/utils/Utils.hpp index b26ffd5d5..c59cfa049 100644 --- a/linphone-app/src/utils/Utils.hpp +++ b/linphone-app/src/utils/Utils.hpp @@ -64,6 +64,7 @@ public: Q_INVOKABLE static bool isPhoneNumber(const QString& txt); Q_INVOKABLE QSize getImageSize(const QString& url); Q_INVOKABLE static QPoint getCursorPosition(); + Q_INVOKABLE static QString getFileChecksum(const QString& filePath); //---------------------------------------------------------------------------------- static inline QString coreStringToAppString (const std::string &str) { diff --git a/linphone-app/ui/scripts/Utils/utils.js b/linphone-app/ui/scripts/Utils/utils.js index 4cc604b09..dc4e2f202 100644 --- a/linphone-app/ui/scripts/Utils/utils.js +++ b/linphone-app/ui/scripts/Utils/utils.js @@ -765,7 +765,8 @@ function openCodecOnlineInstallerDialog (window, codecInfo, cb) { extract: true, installFolder: VideoCodecsModel.codecsFolder, installName: codecInfo.installName, - mime: codecInfo.mime + mime: codecInfo.mime, + checksum: codecInfo.checksum }, function (status) { if (status) { VideoCodecsModel.reload()