diff options
author | Tim Jenssen <tim.jenssen@digia.com> | 2012-12-14 13:21:31 +0100 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@digia.com> | 2012-12-14 13:30:17 +0100 |
commit | fbb5912de2151187c4277bdc88dff07b5d4a13ea (patch) | |
tree | 57e83a52b272c077fe8ef81a0b5357eb5c686387 | |
parent | 6803b4ea0a844c645e11531b0612d538dcf67d3d (diff) |
added first version of a product key checker API
Change-Id: Idea3826cdeb1ddda3469a647fee86e83b5881ecf
Reviewed-by: Iikka Eklund <iikka.eklund@digia.com>
-rw-r--r-- | src/libs/installer/applyproductkeyoperation.cpp | 66 | ||||
-rw-r--r-- | src/libs/installer/applyproductkeyoperation.h | 51 | ||||
-rw-r--r-- | src/libs/installer/component.cpp | 6 | ||||
-rw-r--r-- | src/libs/installer/init.cpp | 2 | ||||
-rw-r--r-- | src/libs/installer/installer.pro | 19 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 7 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 12 | ||||
-rw-r--r-- | src/libs/installer/productkeycheck.cpp | 80 | ||||
-rw-r--r-- | src/libs/installer/productkeycheck.h | 62 | ||||
-rw-r--r-- | src/sdk/installerbasecommons.cpp | 6 | ||||
-rw-r--r-- | src/sdk/tabcontroller.cpp | 6 |
11 files changed, 314 insertions, 3 deletions
diff --git a/src/libs/installer/applyproductkeyoperation.cpp b/src/libs/installer/applyproductkeyoperation.cpp new file mode 100644 index 000000000..4556df743 --- /dev/null +++ b/src/libs/installer/applyproductkeyoperation.cpp @@ -0,0 +1,66 @@ +/************************************************************************** +** +** Copyright (c) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Installer Framework +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +**************************************************************************/ + +#include "applyproductkeyoperation.h" +#include "productkeycheck.h" + +using namespace QInstaller; + +ApplyProductKeyOperation::ApplyProductKeyOperation() +{ + setName(QLatin1String("ApplyProductKey")); +} + +void ApplyProductKeyOperation::backup() +{ +} + +bool ApplyProductKeyOperation::performOperation() +{ + if (!ProductKeyCheck::instance()->applyKey(arguments())) { + setError(UserDefinedError); + setErrorString(ProductKeyCheck::instance()->lastErrorString()); + } + return true; +} + +bool ApplyProductKeyOperation::undoOperation() +{ + return true; +} + +bool ApplyProductKeyOperation::testOperation() +{ + return true; +} + +Operation *ApplyProductKeyOperation::clone() const +{ + return new ApplyProductKeyOperation(); +} diff --git a/src/libs/installer/applyproductkeyoperation.h b/src/libs/installer/applyproductkeyoperation.h new file mode 100644 index 000000000..9761492a1 --- /dev/null +++ b/src/libs/installer/applyproductkeyoperation.h @@ -0,0 +1,51 @@ +/************************************************************************** +** +** Copyright (c) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Installer Framework +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +**************************************************************************/ + +#ifndef APPLYPRODUCTKEYOPERATION_H +#define APPLYPRODUCTKEYOPERATION_H + +#include "qinstallerglobal.h" + +namespace QInstaller { + +class INSTALLER_EXPORT ApplyProductKeyOperation : public Operation +{ +public: + ApplyProductKeyOperation(); + + void backup(); + bool performOperation(); + bool undoOperation(); + bool testOperation(); + Operation *clone() const; +}; + +} // namespace + +#endif // APPLYPRODUCTKEYOPERATION_H diff --git a/src/libs/installer/component.cpp b/src/libs/installer/component.cpp index 963dd55c6..6fd75bffe 100644 --- a/src/libs/installer/component.cpp +++ b/src/libs/installer/component.cpp @@ -42,6 +42,8 @@ #include <kdupdaterupdatesourcesinfo.h> #include <kdupdaterupdateoperationfactory.h> +#include <productkeycheck.h> + #include <QtCore/QDirIterator> #include <QtCore/QTranslator> @@ -497,6 +499,10 @@ void Component::loadLicenses(const QString &directory, const QHash<QString, QVar QHash<QString, QVariant>::const_iterator it; for (it = licenseHash.begin(); it != licenseHash.end(); ++it) { const QString &fileName = it.value().toString(); + + if (!ProductKeyCheck::instance()->isValidLicense(fileName)) + continue; + QFileInfo fileInfo(fileName); QFile file(QString::fromLatin1("%1%2_%3.%4").arg(directory, fileInfo.baseName(), QLocale().name().toLower(), fileInfo.completeSuffix())); diff --git a/src/libs/installer/init.cpp b/src/libs/installer/init.cpp index 463628c03..067fbdd6d 100644 --- a/src/libs/installer/init.cpp +++ b/src/libs/installer/init.cpp @@ -66,6 +66,7 @@ #include "registerdefaultdebuggeroperation.h" #include "updatecreatorsettingsfrom21to22operation.h" #include "createlinkoperation.h" +#include "applyproductkeyoperation.h" #include "minimumprogressoperation.h" @@ -230,6 +231,7 @@ void QInstaller::init() factory.registerUpdateOperation<LineReplaceOperation>(QLatin1String( "LineReplace" ) ); factory.registerUpdateOperation<UpdateCreatorSettingsFrom21To22Operation>(QLatin1String("UpdateCreatorSettingsFrom21To22")); factory.registerUpdateOperation<CreateLinkOperation>(QLatin1String("CreateLink")); + factory.registerUpdateOperation<ApplyProductKeyOperation>(QLatin1String( "ApplyProductKey" ) ); factory.registerUpdateOperation<MinimumProgressOperation>(QLatin1String("MinimumProgress")); factory.registerUpdateOperation<LicenseOperation>(QLatin1String("License")); diff --git a/src/libs/installer/installer.pro b/src/libs/installer/installer.pro index f21394ae2..8cf096df0 100644 --- a/src/libs/installer/installer.pro +++ b/src/libs/installer/installer.pro @@ -7,6 +7,19 @@ include(../7zip/7zip.pri) include(../kdtools/kdtools.pri) include(../../../installerfw.pri) +# productkeycheck API +# call qmake "PRODUCTKEYCHECK_PRI_FILE=<your_path_to_pri_file>" +# content of that pri file needs to be: +# SOURCES += $$PWD/productkeycheck.cpp +# ... +# your files if needed +HEADERS += productkeycheck.h +!isEmpty(PRODUCTKEYCHECK_PRI_FILE) { + include($$PRODUCTKEYCHECK_PRI_FILE) +} else { + SOURCES += productkeycheck.cpp +} + DESTDIR = $$IFW_LIB_PATH DLLDESTDIR = $$IFW_APP_PATH @@ -90,7 +103,8 @@ HEADERS += packagemanagercore.h \ createlocalrepositoryoperation.h \ lib7z_facade.h \ link.h \ - createlinkoperation.h + createlinkoperation.h \ + applyproductkeyoperation.h SOURCES += packagemanagercore.cpp \ packagemanagercore_p.cpp \ @@ -162,7 +176,8 @@ SOURCES += packagemanagercore.cpp \ createlocalrepositoryoperation.cpp \ lib7z_facade.cpp \ link.cpp \ - createlinkoperation.cpp + createlinkoperation.cpp \ + applyproductkeyoperation.cpp RESOURCES += resources/patch_file_lists.qrc diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index f4ce4bbcc..ff4453dea 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -49,6 +49,8 @@ #include "settings.h" #include "utils.h" +#include <productkeycheck.h> + #include <QFuture> #include <QFutureWatcher> #include <QtConcurrentRun> @@ -674,6 +676,11 @@ bool PackageManagerCore::fetchRemotePackagesTree() return false; } + if (!ProductKeyCheck::instance()->hasValidKey()) { + d->setStatus(Failure, ProductKeyCheck::instance()->lastErrorString()); + return false; + } + const LocalPackagesHash installedPackages = d->localInstalledPackages(); if (!isInstaller() && status() == Failure) return false; diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 98505bfd5..0fdbd7018 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -51,6 +51,8 @@ #include "kdupdaterupdateoperationfactory.h" #include "kdupdaterupdatefinder.h" +#include <productkeycheck.h> + #include <QtCore/QtConcurrentRun> #include <QtCore/QCoreApplication> #include <QtCore/QDir> @@ -517,6 +519,16 @@ QString PackageManagerCorePrivate::installReason(Component *component) void PackageManagerCorePrivate::initialize() { + if (!ProductKeyCheck::instance()->hasValidKey()) { + if (m_core->isInstaller()) { + setStatus(PackageManagerCore::Failure, ProductKeyCheck::instance()->lastErrorString()); + } else { + MessageBoxHandler::warning(MessageBoxHandler::currentBestSuitParent(), + QLatin1String("ProductKeyCheckError"), ProductKeyCheck::instance()->lastErrorString(), + ProductKeyCheck::instance()->maintainanceToolDetailErrorNotice(), QMessageBox::Ok); + } + } + m_coreCheckedHash.clear(); m_componentsToInstallCalculated = false; m_createLocalRepositoryFromBinary = false; diff --git a/src/libs/installer/productkeycheck.cpp b/src/libs/installer/productkeycheck.cpp new file mode 100644 index 000000000..f975db821 --- /dev/null +++ b/src/libs/installer/productkeycheck.cpp @@ -0,0 +1,80 @@ +/************************************************************************** +** +** Copyright (c) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Installer Framework +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +**************************************************************************/ + +#include <productkeycheck.h> + + +class ProductKeyCheckPrivate +{ +}; + + +ProductKeyCheck::ProductKeyCheck() + : d(new ProductKeyCheckPrivate()) +{ +} + +ProductKeyCheck::~ProductKeyCheck() +{ + delete d; +} + +ProductKeyCheck *ProductKeyCheck::instance() +{ + static ProductKeyCheck *instance = 0; + if (instance == 0) + instance = new ProductKeyCheck(); + return instance; +} + +bool ProductKeyCheck::hasValidKey() +{ + return true; +} + +bool ProductKeyCheck::applyKey(const QStringList &/*arguments*/) +{ + return true; +} + +QString ProductKeyCheck::lastErrorString() +{ + return QString(); +} + +QString ProductKeyCheck::maintainanceToolDetailErrorNotice() +{ + return QString(); +} + +// to filter none valid licenses +bool ProductKeyCheck::isValidLicense(const QString &/*fileName*/) +{ + return true; +} diff --git a/src/libs/installer/productkeycheck.h b/src/libs/installer/productkeycheck.h new file mode 100644 index 000000000..1ecffc3d2 --- /dev/null +++ b/src/libs/installer/productkeycheck.h @@ -0,0 +1,62 @@ +/************************************************************************** +** +** Copyright (c) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Installer Framework +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +**************************************************************************/ + +#ifndef PRODUCTKEYCHECK_H +#define PRODUCTKEYCHECK_H + +#include "qinstallerglobal.h" + +#include <QString> +#include <QHash> + +class ProductKeyCheckPrivate; + +class INSTALLER_EXPORT ProductKeyCheck +{ +public: + ~ProductKeyCheck(); + static ProductKeyCheck *instance(); + + // was validLicense + bool hasValidKey(); + QString lastErrorString(); + QString maintainanceToolDetailErrorNotice(); + + //is used in the generic ApplyProductKeyOperation, for example to patch things + bool applyKey(const QStringList &arguments); + + // to filter none valid licenses + bool isValidLicense(const QString &fileName); + +private: + ProductKeyCheck(); + ProductKeyCheckPrivate *const d; +}; + +#endif // PRODUCTKEYCHECK_H diff --git a/src/sdk/installerbasecommons.cpp b/src/sdk/installerbasecommons.cpp index 5c23e5309..a6298c836 100644 --- a/src/sdk/installerbasecommons.cpp +++ b/src/sdk/installerbasecommons.cpp @@ -36,6 +36,8 @@ #include <packagemanagercore.h> #include <settings.h> +#include <productkeycheck.h> + #include <QtCore/QDir> #include <QtCore/QFileInfo> #include <QtCore/QTimer> @@ -101,6 +103,8 @@ IntroductionPageImpl::IntroductionPageImpl(QInstaller::PackageManagerCore *core) connect(core, SIGNAL(metaJobInfoMessage(QString)), this, SLOT(setMessage(QString))); connect(core, SIGNAL(coreNetworkSettingsChanged()), this, SLOT(onCoreNetworkSettingsChanged())); + + m_updateComponents->setEnabled(ProductKeyCheck::instance()->hasValidKey()); } int IntroductionPageImpl::nextId() const @@ -214,7 +218,7 @@ void IntroductionPageImpl::showMaintenanceTools() void IntroductionPageImpl::setMaintenanceToolsEnabled(bool enable) { //m_packageManager->setEnabled(enable); // ### Todo: Remove for online installers after Beta - //m_updateComponents->setEnabled(enable); // ### Todo: Remove for online installers after Beta + //m_updateComponents->setEnabled(enable && ProductKeyCheck::instance()->hasValidKey()); // ### Todo: Remove for online installers after Beta m_removeAllComponents->setEnabled(enable); } diff --git a/src/sdk/tabcontroller.cpp b/src/sdk/tabcontroller.cpp index 200de2359..57df5bff6 100644 --- a/src/sdk/tabcontroller.cpp +++ b/src/sdk/tabcontroller.cpp @@ -36,6 +36,8 @@ #include <packagemanagercore.h> +#include <productkeycheck.h> + #include <QtCore/QTimer> #include <QtScript/QScriptEngine> @@ -114,6 +116,10 @@ void TabController::setManagerParams(const QHash<QString, QString> ¶ms) int TabController::init() { + if (!ProductKeyCheck::instance()->hasValidKey() && d->m_core->isInstaller()) { + return PackageManagerCore::Failure; + } + if (!d->m_init) { d->m_init = true; // this should called as early as possible, to handle error message boxes for example |