diff --git a/src/app/main.cpp b/src/app/main.cpp index 2ab3cd10..70806dd0 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -18,8 +18,6 @@ #include "qt/window/QtMainWindow.h" #include "version.h" -#include "settings/ProjectSettings.h" - void init() { std::shared_ptr consoleLogger = std::make_shared(); @@ -59,7 +57,6 @@ int main(int argc, char *argv[]) std::shared_ptr app = Application::create(version); std::shared_ptr checker = LicenseChecker::getInstance(); - checker->setApp(app.get()); if (commandLineParser.startedWithLicense()) { @@ -93,9 +90,6 @@ int main(int argc, char *argv[]) utility::loadFontsFromDirectory(ResourcePaths::getFontsPath(), ".otf"); std::shared_ptr app = Application::create(version, &viewFactory, &networkFactory); - std::shared_ptr checker = LicenseChecker::getInstance(); - checker->setApp(app.get()); - commandLineParser.projectLoad(); return qtApp.exec(); diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp index cf73ab61..fcc94e6d 100644 --- a/src/lib/Application.cpp +++ b/src/lib/Application.cpp @@ -15,6 +15,7 @@ #include "component/view/MainView.h" #include "component/view/ViewFactory.h" #include "data/StorageCache.h" +#include "LicenseChecker.h" #include "settings/ApplicationSettings.h" #include "settings/ColorScheme.h" @@ -73,6 +74,7 @@ void Application::loadSettings() Application::Application(bool withGUI) : m_hasGUI(withGUI) { + LicenseChecker::createInstance(); } Application::~Application() @@ -135,14 +137,6 @@ void Application::saveProject(const FilePath& projectSettingsFilePath) } } -void Application::forceEnterLicense() -{ - if (m_hasGUI) - { - m_mainView->forceLicenseScreen(); - } -} - void Application::handleMessage(MessageActivateWindow* message) { if (m_hasGUI) diff --git a/src/lib/Application.h b/src/lib/Application.h index 7160f867..af5b4556 100644 --- a/src/lib/Application.h +++ b/src/lib/Application.h @@ -36,7 +36,6 @@ public: void loadProject(const FilePath& projectSettingsFilePath); void refreshProject(); void saveProject(const FilePath& projectSettingsFilePath); - void forceEnterLicense(); bool hasGUI(); private: diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 6c097355..2c2d0afb 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -236,6 +236,7 @@ add_files( utility/messaging/type/MessageFlushUpdates.h utility/messaging/type/MessageFocusIn.h utility/messaging/type/MessageFocusOut.h + utility/messaging/type/MessageForceEnterLicense.h utility/messaging/type/MessageGraphNodeBundleSplit.h utility/messaging/type/MessageGraphNodeExpand.h utility/messaging/type/MessageGraphNodeMove.h diff --git a/src/lib/LicenseChecker.cpp b/src/lib/LicenseChecker.cpp index 86bfba48..d7b03c56 100644 --- a/src/lib/LicenseChecker.cpp +++ b/src/lib/LicenseChecker.cpp @@ -1,14 +1,14 @@ #include "LicenseChecker.h" +#include "utility/AppPath.h" +#include "utility/messaging/type/MessageForceEnterLicense.h" #include "utility/messaging/type/MessageStatus.h" +#include "isTrial.h" #include "License.h" -#include "Application.h" #include "PublicKey.h" #include "settings/ApplicationSettings.h" -#include "utility/AppPath.h" - void LicenseChecker::createInstance() { if (!s_instance) @@ -28,79 +28,119 @@ LicenseChecker::~LicenseChecker() { } -void LicenseChecker::setApp(Application* app) +std::string LicenseChecker::getCurrentLicenseString() const { - m_app = app; + License license; + bool isLoaded = license.loadFromEncodedString( + ApplicationSettings::getInstance()->getLicenseString(), AppPath::getAppPath()); + + if (isLoaded) + { + return license.getLicenseString(); + } + + return ""; +} + +void LicenseChecker::saveCurrentLicenseString(const std::string& licenseString) const +{ + License license; + bool isLoaded = license.loadFromString(licenseString); + if (!isLoaded) + { + return; + } + + ApplicationSettings* appSettings = ApplicationSettings::getInstance().get(); + std::string appPath(AppPath::getAppPath()); + + appSettings->setLicenseString(license.getLicenseEncodedString(appPath)); + appSettings->setLicenseCheck(license.hashLocation(FilePath(appPath).absolute().str())); + appSettings->save(); } bool LicenseChecker::isCurrentLicenseValid() { - MessageStatus("preparing...", false, true).dispatch(); + return checkCurrentLicense() == LICENSE_VALID; +} - bool valid = false; - do +LicenseChecker::LicenseState LicenseChecker::checkCurrentLicense() const +{ + ApplicationSettings* appSettings = ApplicationSettings::getInstance().get(); + + std::string licenseCheck = appSettings->getLicenseCheck(); + std::string appPath(AppPath::getAppPath()); + + std::string licenseString = appSettings->getLicenseString(); + if (licenseString.size() == 0) { - ApplicationSettings* appSettings = ApplicationSettings::getInstance().get(); - - std::string licenseCheck = appSettings->getLicenseCheck(); - std::string appPath = AppPath::getAppPath(); // for easier debugging... - FilePath p(appPath); - - if (!License::checkLocation(p.absolute().str(), licenseCheck)) - { - break; - } - - std::string licenseString = appSettings->getLicenseString(); - if (licenseString.size() == 0) - { - break; - } - - License license; - bool isLoaded = license.loadFromEncodedString(licenseString,AppPath::getAppPath()); - if (!isLoaded) - { - break; - } - - license.loadPublicKeyFromString(PublicKey); - valid = license.isValid(); - if (license.isExpired()) - { - valid = false; - } - + return LICENSE_EMPTY; } - while (false); - MessageStatus("ready").dispatch(); + if (!License::checkLocation(FilePath(appPath).absolute().str(), licenseCheck)) + { + return LICENSE_MOVED; + } - return valid; + License license; + bool isLoaded = license.loadFromEncodedString(licenseString, appPath); + if (!isLoaded) + { + return LICENSE_MOVED; + } + + return checkLicense(license); +} + +LicenseChecker::LicenseState LicenseChecker::checkLicenseString(const std::string licenseString) const +{ + if (licenseString.size() == 0) + { + return LICENSE_EMPTY; + } + + License license; + bool isLoaded = license.loadFromString(licenseString); + if (!isLoaded) + { + return LICENSE_MALFORMED; + } + + license.print(); + + return checkLicense(license); } LicenseChecker::LicenseChecker() - : m_app(nullptr) - , m_forcedLicenseEntering(false) + : m_forcedLicenseEntering(false) { } void LicenseChecker::handleMessage(MessageDispatchWhenLicenseValid* message) { - if (m_app != nullptr && !isCurrentLicenseValid()) + if (!isTrial()) { - m_pendingMessage = message->content; + MessageStatus("preparing...", false, true).dispatch(); - if (!m_forcedLicenseEntering) + LicenseState state = checkCurrentLicense(); + + MessageStatus("ready").dispatch(); + + if (state != LICENSE_VALID) { - m_app->forceEnterLicense(); - m_forcedLicenseEntering = true; + m_pendingMessage = message->content; + + if (!m_forcedLicenseEntering) + { + m_forcedLicenseEntering = true; + MessageForceEnterLicense(state == LICENSE_EXPIRED).dispatch(); + } + + return; } } - else - { - message->content->dispatch(); - } + + message->content->dispatch(); } void LicenseChecker::handleMessage(MessageEnteredLicense* message) @@ -114,4 +154,21 @@ void LicenseChecker::handleMessage(MessageEnteredLicense* message) } } +LicenseChecker::LicenseState LicenseChecker::checkLicense(License& license) const +{ + license.loadPublicKeyFromString(PublicKey); + + if (license.isExpired()) + { + return LICENSE_EXPIRED; + } + + if (license.isValid()) + { + return LICENSE_VALID; + } + + return LICENSE_INVALID; +} + std::shared_ptr LicenseChecker::s_instance; diff --git a/src/lib/LicenseChecker.h b/src/lib/LicenseChecker.h index 9c93fb5d..f3eb320f 100644 --- a/src/lib/LicenseChecker.h +++ b/src/lib/LicenseChecker.h @@ -5,21 +5,34 @@ #include "utility/messaging/type/MessageEnteredLicense.h" #include "utility/messaging/type/MessageDispatchWhenLicenseValid.h" -class Application; +class License; class LicenseChecker : public MessageListener , public MessageListener { public: + enum LicenseState + { + LICENSE_EMPTY, + LICENSE_MOVED, + LICENSE_MALFORMED, + LICENSE_INVALID, + LICENSE_EXPIRED, + LICENSE_VALID + }; + static void createInstance(); static std::shared_ptr getInstance(); ~LicenseChecker(); - void setApp(Application* app); + std::string getCurrentLicenseString() const; + void saveCurrentLicenseString(const std::string& licenseString) const; bool isCurrentLicenseValid(); + LicenseState checkCurrentLicense() const; + LicenseState checkLicenseString(const std::string licenseString) const; private: LicenseChecker(); @@ -29,9 +42,10 @@ private: void handleMessage(MessageDispatchWhenLicenseValid* message); void handleMessage(MessageEnteredLicense* message); + LicenseState checkLicense(License& license) const; + static std::shared_ptr s_instance; - Application* m_app; std::shared_ptr m_pendingMessage; bool m_forcedLicenseEntering; }; diff --git a/src/lib/component/view/MainView.h b/src/lib/component/view/MainView.h index f8c652d4..3c32698c 100644 --- a/src/lib/component/view/MainView.h +++ b/src/lib/component/view/MainView.h @@ -16,7 +16,6 @@ public: virtual void setTitle(const std::string& title) = 0; virtual void activateWindow() = 0; virtual void updateRecentProjectMenu() = 0; - virtual void forceLicenseScreen() = 0; }; #endif // MAIN_VIEW_H diff --git a/src/lib/utility/messaging/type/MessageForceEnterLicense.h b/src/lib/utility/messaging/type/MessageForceEnterLicense.h new file mode 100644 index 00000000..4ff7b0c9 --- /dev/null +++ b/src/lib/utility/messaging/type/MessageForceEnterLicense.h @@ -0,0 +1,24 @@ +#ifndef MESSAGE_FORCE_ENTER_LICENSE_H +#define MESSAGE_FORCE_ENTER_LICENSE_H + +#include "utility/messaging/Message.h" + +class MessageForceEnterLicense + : public Message +{ +public: + MessageForceEnterLicense(bool licenseExpired) + : licenseExpired(licenseExpired) + { + setSendAsTask(false); + } + + static const std::string getStaticType() + { + return "MessageForceEnterLicense"; + } + + bool licenseExpired; +}; + +#endif // MESSAGE_FORCE_ENTER_LICENSE_H diff --git a/src/lib_gui/qt/view/QtMainView.cpp b/src/lib_gui/qt/view/QtMainView.cpp index e2bd962b..a27013ec 100644 --- a/src/lib_gui/qt/view/QtMainView.cpp +++ b/src/lib_gui/qt/view/QtMainView.cpp @@ -11,7 +11,7 @@ QtMainView::QtMainView() , m_setTitleFunctor(std::bind(&QtMainView::doSetTitle, this, std::placeholders::_1)) , m_activateWindowFunctor(std::bind(&QtMainView::doActivateWindow, this)) , m_updateRecentProjectMenuFunctor(std::bind(&QtMainView::doUpdateRecentProjectMenu, this)) - , m_forceLicenseScreenFunctor(std::bind(&QtMainView::doForceLicenseScreen, this)) + , m_forceLicenseScreenFunctor(std::bind(&QtMainView::doForceLicenseScreen, this, std::placeholders::_1)) { m_window = std::make_shared(); m_window->show(); @@ -89,9 +89,9 @@ void QtMainView::updateRecentProjectMenu() m_updateRecentProjectMenuFunctor(); } -void QtMainView::forceLicenseScreen() +void QtMainView::handleMessage(MessageForceEnterLicense* message) { - m_forceLicenseScreenFunctor(); + m_forceLicenseScreenFunctor(message->licenseExpired); } void QtMainView::handleMessage(MessageProjectNew* message) @@ -140,7 +140,7 @@ void QtMainView::doUpdateRecentProjectMenu() m_window->updateRecentProjectMenu(); } -void QtMainView::doForceLicenseScreen() +void QtMainView::doForceLicenseScreen(bool expired) { - m_window->forceEnterLicense(); + m_window->forceEnterLicense(expired); } diff --git a/src/lib_gui/qt/view/QtMainView.h b/src/lib_gui/qt/view/QtMainView.h index c61aaad3..4a49a4be 100644 --- a/src/lib_gui/qt/view/QtMainView.h +++ b/src/lib_gui/qt/view/QtMainView.h @@ -10,6 +10,7 @@ #include "qt/utility/QtThreadedFunctor.h" #include "utility/messaging/MessageListener.h" +#include "utility/messaging/type/MessageForceEnterLicense.h" #include "utility/messaging/type/MessageProjectNew.h" #include "utility/messaging/type/MessageShowStartScreen.h" @@ -18,6 +19,7 @@ class View; class QtMainView : public MainView + , public MessageListener , public MessageListener , public MessageListener { @@ -43,9 +45,9 @@ public: virtual void setTitle(const std::string& title); virtual void activateWindow(); virtual void updateRecentProjectMenu(); - virtual void forceLicenseScreen(); private: + void handleMessage(MessageForceEnterLicense* message); void handleMessage(MessageProjectNew* message); void handleMessage(MessageShowStartScreen* message); @@ -55,7 +57,7 @@ private: void doSetTitle(const std::string& title); void doActivateWindow(); void doUpdateRecentProjectMenu(); - void doForceLicenseScreen(); + void doForceLicenseScreen(bool expired); std::shared_ptr m_window; std::vector m_views; @@ -66,7 +68,7 @@ private: QtThreadedFunctor m_setTitleFunctor; QtThreadedFunctor<> m_activateWindowFunctor; QtThreadedFunctor<> m_updateRecentProjectMenuFunctor; - QtThreadedFunctor<> m_forceLicenseScreenFunctor; + QtThreadedFunctor m_forceLicenseScreenFunctor; }; #endif // QT_MAIN_VIEW_H diff --git a/src/lib_gui/qt/window/QtLicense.cpp b/src/lib_gui/qt/window/QtLicense.cpp index 1206a8f1..dfc101cc 100644 --- a/src/lib_gui/qt/window/QtLicense.cpp +++ b/src/lib_gui/qt/window/QtLicense.cpp @@ -5,11 +5,8 @@ #include #include -#include "License.h" -#include "PublicKey.h" +#include "LicenseChecker.h" #include "qt/utility/utilityQt.h" -#include "settings/ApplicationSettings.h" -#include "utility/AppPath.h" #include "utility/file/FilePath.h" #include "utility/messaging/type/MessageEnteredLicense.h" #include "utility/ResourcePaths.h" @@ -42,17 +39,19 @@ void QtLicense::load() { clear(); - License license; - bool isLoaded = license.loadFromEncodedString( - ApplicationSettings::getInstance()->getLicenseString(), AppPath::getAppPath()); - if (!isLoaded) - { - return; - } + std::string licenseString = LicenseChecker::getInstance()->getCurrentLicenseString(); - if (m_licenseText) + if (licenseString.size() && m_licenseText) { - m_licenseText->setText(license.getLicenseString().c_str()); + m_licenseText->setText(licenseString.c_str()); + } +} + +void QtLicense::setErrorMessage(const QString& errorMessage) +{ + if (m_errorLabel) + { + m_errorLabel->setText(errorMessage); } } @@ -136,47 +135,39 @@ void QtLicense::handleClose() void QtLicense::handleNext() { std::string licenseString = m_licenseText->toPlainText().toStdString(); - if (licenseString.size() == 0) + + LicenseChecker* checker = LicenseChecker::getInstance().get(); + LicenseChecker::LicenseState state = checker->checkLicenseString(licenseString); + + std::string errorString; + + switch (state) { - m_errorLabel->setText("No licence key was entered."); - return; + case LicenseChecker::LICENSE_EMPTY: + errorString = "No licence key was entered."; + break; + case LicenseChecker::LICENSE_MOVED: + case LicenseChecker::LICENSE_MALFORMED: + errorString = "The entered license key is malformed."; + break; + case LicenseChecker::LICENSE_INVALID: + errorString = "The entered license key is invalid."; + break; + case LicenseChecker::LICENSE_EXPIRED: + errorString = "The entered license key is expired."; + break; + case LicenseChecker::LICENSE_VALID: + { + checker->saveCurrentLicenseString(licenseString); + MessageEnteredLicense().dispatch(); + + setCancelAble(true); + m_errorLabel->setText(" "); + + emit finished(); + return; + } } - License license; - bool isLoaded = license.loadFromString(licenseString); - if (!isLoaded) - { - m_errorLabel->setText("The entered license key is malformed."); - return; - } - - license.loadPublicKeyFromString(PublicKey); - license.print(); - - if (license.isExpired()) - { - m_errorLabel->setText("The entered license key is expired"); - return; - } - else if (license.isValid()) - { - ApplicationSettings* appSettings = ApplicationSettings::getInstance().get(); - std::string appLocation = AppPath::getAppPath(); - appSettings->setLicenseString(license.getLicenseEncodedString(appLocation)); - FilePath p(appLocation); - appSettings->setLicenseCheck(license.hashLocation(p.absolute().str())); - appSettings->save(); - - MessageEnteredLicense().dispatch(); - } - else - { - m_errorLabel->setText("The entered license key is invalid."); - return; - } - - m_errorLabel->setText(" "); - setCancelAble(true); - - emit finished(); + m_errorLabel->setText(errorString.c_str()); } diff --git a/src/lib_gui/qt/window/QtLicense.h b/src/lib_gui/qt/window/QtLicense.h index 8d6d88c8..049adc19 100644 --- a/src/lib_gui/qt/window/QtLicense.h +++ b/src/lib_gui/qt/window/QtLicense.h @@ -19,6 +19,8 @@ public: void clear(); void load(); + void setErrorMessage(const QString& errorMessage); + protected: // QtWindow implementation virtual void populateWindow(QWidget* widget) override; diff --git a/src/lib_gui/qt/window/QtMainWindow.cpp b/src/lib_gui/qt/window/QtMainWindow.cpp index d4d2ef37..cd07b54a 100644 --- a/src/lib_gui/qt/window/QtMainWindow.cpp +++ b/src/lib_gui/qt/window/QtMainWindow.cpp @@ -262,7 +262,7 @@ void QtMainWindow::saveLayout() settings.setValue("DOCK_LOCATIONS", this->saveState()); } -void QtMainWindow::forceEnterLicense() +void QtMainWindow::forceEnterLicense(bool expired) { enterLicense(); @@ -272,7 +272,15 @@ void QtMainWindow::forceEnterLicense() LOG_ERROR("No enter license window on top of stack"); return; } - enterLicenseWindow->clear(); + + if (expired) + { + enterLicenseWindow->setErrorMessage("The license key is expired."); + } + else + { + enterLicenseWindow->clear(); + } this->setEnabled(false); enterLicenseWindow->setEnabled(true); diff --git a/src/lib_gui/qt/window/QtMainWindow.h b/src/lib_gui/qt/window/QtMainWindow.h index 1db9925f..c2ef3a1b 100644 --- a/src/lib_gui/qt/window/QtMainWindow.h +++ b/src/lib_gui/qt/window/QtMainWindow.h @@ -85,7 +85,7 @@ public: void loadLayout(); void saveLayout(); - void forceEnterLicense(); + void forceEnterLicense(bool expired); protected: bool event(QEvent* event); diff --git a/src/trial/main.cpp b/src/trial/main.cpp index 62496b89..7ff6f96b 100644 --- a/src/trial/main.cpp +++ b/src/trial/main.cpp @@ -8,7 +8,6 @@ #include "Application.h" #include "includes.h" // defines 'void setup(int argc, char *argv[])' -#include "LicenseChecker.h" #include "qt/network/QtNetworkFactory.h" #include "qt/QtApplication.h" #include "qt/utility/utilityQt.h" @@ -16,7 +15,6 @@ #include "qt/window/QtMainWindow.h" #include "version.h" - void init() { std::shared_ptr consoleLogger = std::make_shared(); @@ -53,7 +51,5 @@ int main(int argc, char *argv[]) std::shared_ptr app = Application::create(version, &viewFactory, &networkFactory); - LicenseChecker::createInstance(); - return qtApp.exec(); }