From 588a88fb63f1a4265d180c3dabf668aeee6cf1d8 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Fri, 13 Jan 2017 16:08:16 +0100 Subject: [PATCH] Updater: Don't create instance for invalid URL Also don't use dynamic_cast For enterprise/#689 --- src/gui/generalsettings.cpp | 3 ++- src/gui/main.cpp | 3 ++- src/gui/updater/ocupdater.cpp | 23 +++++++++++++---------- src/gui/updater/ocupdater.h | 8 ++++---- src/gui/updater/updater.cpp | 4 ++++ src/gui/updater/updater.h | 4 +++- 6 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/gui/generalsettings.cpp b/src/gui/generalsettings.cpp index 6ba593947..d6eae4116 100644 --- a/src/gui/generalsettings.cpp +++ b/src/gui/generalsettings.cpp @@ -110,7 +110,8 @@ void GeneralSettings::loadMiscSettings() void GeneralSettings::slotUpdateInfo() { - OCUpdater *updater = dynamic_cast(Updater::instance()); + // Note: the sparkle-updater is not an OCUpdater + OCUpdater *updater = qobject_cast(Updater::instance()); if (ConfigFile().skipUpdateCheck()) { updater = 0; // don't show update info if updates are disabled } diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 003fcfd51..392ced1b5 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -107,7 +107,8 @@ int main(int argc, char **argv) // if handleStartup returns true, main() // needs to terminate here, e.g. because // the updater is triggered - if (Updater::instance()->handleStartup()) { + Updater *updater = Updater::instance(); + if ( updater && updater->handleStartup()) { return true; } diff --git a/src/gui/updater/ocupdater.cpp b/src/gui/updater/ocupdater.cpp index 1b9543613..b6aa88c45 100644 --- a/src/gui/updater/ocupdater.cpp +++ b/src/gui/updater/ocupdater.cpp @@ -19,6 +19,7 @@ #include "updater/ocupdater.h" +#include #include #include #include @@ -43,9 +44,8 @@ UpdaterScheduler::UpdaterScheduler(QObject *parent) : connect( &_updateCheckTimer, SIGNAL(timeout()), this, SLOT(slotTimerFired()) ); - // Note: the sparkle-updater is not an OCUpdater and thus the dynamic_cast - // returns NULL. Clever detail. - if (OCUpdater *updater = dynamic_cast(Updater::instance())) { + // Note: the sparkle-updater is not an OCUpdater + if (OCUpdater *updater = qobject_cast(Updater::instance())) { connect(updater, SIGNAL(newUpdateAvailable(QString,QString)), this, SIGNAL(updaterAnnouncement(QString,QString)) ); connect(updater, SIGNAL(requestRestart()), SIGNAL(requestRestart())); @@ -76,14 +76,17 @@ void UpdaterScheduler::slotTimerFired() return; } - Updater::instance()->backgroundCheckForUpdate(); + Updater *updater = Updater::instance(); + if (updater) { + updater->backgroundCheckForUpdate(); + } } /* ----------------------------------------------------------------- */ -OCUpdater::OCUpdater(const QUrl &url, QObject *parent) : - QObject(parent) +OCUpdater::OCUpdater(const QUrl &url) : + Updater() , _updateUrl(url) , _state(Unknown) , _accessManager(new AccessManager(this)) @@ -242,8 +245,8 @@ void OCUpdater::slotTimedOut() //////////////////////////////////////////////////////////////////////// -NSISUpdater::NSISUpdater(const QUrl &url, QObject *parent) - : OCUpdater(url, parent) +NSISUpdater::NSISUpdater(const QUrl &url) + : OCUpdater(url) , _showFallbackMessage(false) { } @@ -421,8 +424,8 @@ void NSISUpdater::slotSetSeenVersion() //////////////////////////////////////////////////////////////////////// -PassiveUpdateNotifier::PassiveUpdateNotifier(const QUrl &url, QObject *parent) - : OCUpdater(url, parent) +PassiveUpdateNotifier::PassiveUpdateNotifier(const QUrl &url) + : OCUpdater(url) { // remember the version of the currently running binary. On Linux it might happen that the // package management updates the package while the app is running. This is detected in the diff --git a/src/gui/updater/ocupdater.h b/src/gui/updater/ocupdater.h index 2cbd6cca1..170a03305 100644 --- a/src/gui/updater/ocupdater.h +++ b/src/gui/updater/ocupdater.h @@ -86,7 +86,7 @@ private: * @brief Class that uses an ownCloud proprietary XML format to fetch update information * @ingroup gui */ -class OCUpdater : public QObject, public Updater +class OCUpdater : public Updater { Q_OBJECT public: @@ -94,7 +94,7 @@ public: Downloading, DownloadComplete, DownloadFailed, DownloadTimedOut, UpdateOnlyAvailableThroughSystem }; - explicit OCUpdater(const QUrl &url, QObject *parent = 0); + explicit OCUpdater(const QUrl &url); bool performUpdate(); @@ -141,7 +141,7 @@ class NSISUpdater : public OCUpdater { Q_OBJECT public: enum UpdateState { NoUpdate = 0, UpdateAvailable, UpdateFailed }; - explicit NSISUpdater(const QUrl &url, QObject *parent = 0); + explicit NSISUpdater(const QUrl &url); bool handleStartup() Q_DECL_OVERRIDE; private slots: void slotSetSeenVersion(); @@ -167,7 +167,7 @@ private: class PassiveUpdateNotifier : public OCUpdater { Q_OBJECT public: - explicit PassiveUpdateNotifier(const QUrl &url, QObject *parent = 0); + explicit PassiveUpdateNotifier(const QUrl &url); bool handleStartup() Q_DECL_OVERRIDE { return false; } void backgroundCheckForUpdate() Q_DECL_OVERRIDE; diff --git a/src/gui/updater/updater.cpp b/src/gui/updater/updater.cpp index 48ca7040c..96533db59 100644 --- a/src/gui/updater/updater.cpp +++ b/src/gui/updater/updater.cpp @@ -87,6 +87,10 @@ Updater *Updater::create() if (updateBaseUrl.isEmpty()) { updateBaseUrl = QUrl(QLatin1String(APPLICATION_UPDATE_URL)); } + if (!updateBaseUrl.isValid() || updateBaseUrl.host() == ".") { + qDebug() << "Not a valid updater URL, will not do update check"; + return 0; + } updateBaseUrl = addQueryParams(updateBaseUrl); #if defined(Q_OS_MAC) && defined(HAVE_SPARKLE) updateBaseUrl.addQueryItem( QLatin1String("sparkle"), QLatin1String("true")); diff --git a/src/gui/updater/updater.h b/src/gui/updater/updater.h index fd40045e2..8af3c6c19 100644 --- a/src/gui/updater/updater.h +++ b/src/gui/updater/updater.h @@ -21,7 +21,8 @@ class QUrl; namespace OCC { -class Updater { +class Updater : public QObject { + Q_OBJECT public: struct Helper { static qint64 stringVersionToInt(const QString& version); @@ -37,6 +38,7 @@ public: protected: static QString clientVersion(); + Updater() : QObject(0) {} private: static QString getSystemInfo(); -- 2.30.2