From a686f19ca20fb6462480318fc4c37bda0dd9114e Mon Sep 17 00:00:00 2001 From: Nick Bolton Date: Thu, 8 Aug 2024 21:54:32 +0100 Subject: [PATCH] Parse date numbers as long instead of int (#7429) * Fixed menus * Parse string to long for date * Change time limited logic * Restore time limit logic * Remove qglobal.h includes * Remove warning * Fixed tests to work with 0 value * Update ChangeLog --- ChangeLog | 1 + cspell.json | 1 + src/gui/src/ActivationDialog.cpp | 8 ++++-- src/gui/src/MainWindow.cpp | 33 ++++++++++++++++------ src/gui/src/MainWindow.h | 12 ++++++-- src/gui/src/MainWindowBase.ui | 2 +- src/gui/src/SettingsDialog.cpp | 1 - src/lib/gui/core/CoreProcess.cpp | 2 -- src/lib/license/License.cpp | 6 ++-- src/lib/license/License.h | 2 +- src/lib/license/SerialKeyType.cpp | 4 --- src/lib/license/SerialKeyType.h | 1 - src/lib/license/parse_serial_key.cpp | 12 ++++---- src/test/unittests/shared/LicenseTests.cpp | 20 ++++++------- 14 files changed, 65 insertions(+), 40 deletions(-) diff --git a/ChangeLog b/ChangeLog index a1c6edc39..4ead106de 100644 --- a/ChangeLog +++ b/ChangeLog @@ -72,6 +72,7 @@ Enhancements: - #7426 Fixed warnings and enable errors as warnings - #7427 More reliable button click detection for add client dialog - #7428 Refactor settings dialog to simplify enable/disable logic +- #7429 Parse date numbers as long instead of int # 1.14.6 diff --git a/cspell.json b/cspell.json index fe1cac8fd..5385c2b75 100644 --- a/cspell.json +++ b/cspell.json @@ -28,6 +28,7 @@ "macdeployqt", "msvc", "noquote", + "NOSONAR", "notarytool", "Oleksandr", "Olena", diff --git a/src/gui/src/ActivationDialog.cpp b/src/gui/src/ActivationDialog.cpp index 05ef96bfc..6dc36b827 100644 --- a/src/gui/src/ActivationDialog.cpp +++ b/src/gui/src/ActivationDialog.cpp @@ -31,6 +31,7 @@ #include #include #include +#include using namespace synergy::gui; using namespace synergy::license; @@ -102,8 +103,11 @@ void ActivationDialog::accept() { showResultDialog(result); return; } - } catch (const SerialKeyParseError &e) { - showErrorDialog(e.what()); + } catch (const std::exception &e) { // NOSONAR + qCritical("failed to change serial key: %s", e.what()); + return; + } catch (...) { // NOSONAR + qCritical("failed to change serial key"); return; } diff --git a/src/gui/src/MainWindow.cpp b/src/gui/src/MainWindow.cpp index 15eef033c..7ca0627bd 100644 --- a/src/gui/src/MainWindow.cpp +++ b/src/gui/src/MainWindow.cpp @@ -154,6 +154,13 @@ void MainWindow::setupControls() { updateWindowTitle(); } + if (!kLicensedProduct) { + m_pActionHelp->setText("Report a bug"); + m_pActionActivate->setText("Purchase"); + } else if (!kEnableActivation) { + m_pActionActivate->setVisible(false); + } + createMenuBar(); secureSocket(false); @@ -170,10 +177,6 @@ void MainWindow::setupControls() { m_AppConfig.setLastVersion(SYNERGY_VERSION); } - if (kEnableActivation) { - m_pActivate->setVisible(true); - } - #if defined(Q_OS_MAC) m_pRadioGroupServer->setAttribute(Qt::WA_MacShowFocusRect, 0); @@ -412,8 +415,12 @@ void MainWindow::on_m_pActionAbout_triggered() { about.exec(); } -void MainWindow::on_m_pActionHelp_triggered() { - QDesktopServices::openUrl(QUrl(kUrlHelp)); +void MainWindow::on_m_pActionHelp_triggered() const { + if (kLicensedProduct) { + QDesktopServices::openUrl(QUrl(kUrlHelp)); + } else { + QDesktopServices::openUrl(QUrl(kUrlBugReport)); + } } void MainWindow::on_m_pActionSettings_triggered() { @@ -437,7 +444,13 @@ void MainWindow::on_m_pButtonConfigureServer_clicked() { showConfigureServer(); } -void MainWindow::on_m_pActivate_triggered() { showActivationDialog(); } +void MainWindow::on_m_pActionActivate_triggered() { + if (kLicensedProduct) { + showActivationDialog(); + } else { + QDesktopServices::openUrl(QUrl(kUrlPurchase)); + } +} void MainWindow::on_m_pLineEditHostname_returnPressed() { m_pButtonConnect->click(); @@ -572,7 +585,7 @@ void MainWindow::createMenuBar() { m_pMenuFile->addAction(m_pActionStartCore); m_pMenuFile->addAction(m_pActionStopCore); m_pMenuFile->addSeparator(); - m_pMenuFile->addAction(m_pActivate); + m_pMenuFile->addAction(m_pActionActivate); m_pMenuFile->addSeparator(); m_pMenuFile->addAction(m_pActionSave); m_pMenuFile->addSeparator(); @@ -1012,6 +1025,10 @@ void MainWindow::showConfigureServer(const QString &message) { } int MainWindow::showActivationDialog() { + if (!kEnableActivation) { + qFatal("cannot show activation dialog when activation is disabled"); + } + if (m_ActivationDialogRunning) { return QDialog::Rejected; } diff --git a/src/gui/src/MainWindow.h b/src/gui/src/MainWindow.h index 2087f4dd1..d275d0156 100644 --- a/src/gui/src/MainWindow.h +++ b/src/gui/src/MainWindow.h @@ -89,6 +89,10 @@ public slots: void onAppAboutToQuit(); private slots: + // + // Manual slots + // + void onCreated(); void onShown(); void onConfigScopesSaving(); @@ -109,7 +113,9 @@ private slots: void onWindowSaveTimerTimeout(); void onServerConnectionConfigureClient(const QString &clientName); - // autoconnect slots + // + // Auto-connect slots + // void on_m_pButtonApply_clicked(); void on_m_pLabelComputerName_linkActivated(const QString &link); void on_m_pLabelFingerprint_linkActivated(const QString &link); @@ -120,9 +126,9 @@ private slots: void on_m_pButtonConfigureServer_clicked(); bool on_m_pActionSave_triggered(); void on_m_pActionAbout_triggered(); - void on_m_pActionHelp_triggered(); + void on_m_pActionHelp_triggered() const; void on_m_pActionSettings_triggered(); - void on_m_pActivate_triggered(); + void on_m_pActionActivate_triggered(); void on_m_pLineEditHostname_returnPressed(); void on_m_pLineEditClientIp_returnPressed(); void on_m_pLineEditHostname_textChanged(const QString &text); diff --git a/src/gui/src/MainWindowBase.ui b/src/gui/src/MainWindowBase.ui index 25f86e96f..e94472853 100644 --- a/src/gui/src/MainWindowBase.ui +++ b/src/gui/src/MainWindowBase.ui @@ -651,7 +651,7 @@ - + Activate diff --git a/src/gui/src/SettingsDialog.cpp b/src/gui/src/SettingsDialog.cpp index 7b1b2622f..e0d34ba8e 100644 --- a/src/gui/src/SettingsDialog.cpp +++ b/src/gui/src/SettingsDialog.cpp @@ -32,7 +32,6 @@ #include #include #include -#include using namespace synergy::license; using namespace synergy::gui; diff --git a/src/lib/gui/core/CoreProcess.cpp b/src/lib/gui/core/CoreProcess.cpp index 029587055..723c8ba6e 100644 --- a/src/lib/gui/core/CoreProcess.cpp +++ b/src/lib/gui/core/CoreProcess.cpp @@ -20,8 +20,6 @@ #include "constants.h" #include "gui/config/IAppConfig.h" #include "gui/core/CoreTool.h" -#include -#include #if defined(Q_OS_MAC) #include "OSXHelpers.h" diff --git a/src/lib/license/License.cpp b/src/lib/license/License.cpp index cc10c07bc..273e495dd 100644 --- a/src/lib/license/License.cpp +++ b/src/lib/license/License.cpp @@ -43,7 +43,9 @@ bool License::isSubscription() const { return m_serialKey.type.isSubscription(); } -bool License::isTimeLimited() const { return m_serialKey.type.isTimeLimited(); } +bool License::isTimeLimited() const { + return m_serialKey.type.isSubscription() || m_serialKey.type.isTrial(); +} bool License::isTlsAvailable() const { return m_serialKey.product.isTlsAvailable(); @@ -53,7 +55,7 @@ Edition License::productEdition() const { return m_serialKey.product.edition(); } -bool License::isExpiring() const { +bool License::isExpiringSoon() const { if (!isTimeLimited()) { return false; } diff --git a/src/lib/license/License.h b/src/lib/license/License.h index c278a7d96..18576166b 100644 --- a/src/lib/license/License.h +++ b/src/lib/license/License.h @@ -50,7 +50,7 @@ public: } bool isValid() const { return m_serialKey.isValid; } - bool isExpiring() const; + bool isExpiringSoon() const; bool isExpired() const; bool isTrial() const; bool isSubscription() const; diff --git a/src/lib/license/SerialKeyType.cpp b/src/lib/license/SerialKeyType.cpp index 0eff9ea1c..0e0834a37 100644 --- a/src/lib/license/SerialKeyType.cpp +++ b/src/lib/license/SerialKeyType.cpp @@ -28,7 +28,3 @@ void SerialKeyType::setType(const std::string_view &type) { bool SerialKeyType::isTrial() const { return m_isTrial; } bool SerialKeyType::isSubscription() const { return m_isSubscription; } - -bool SerialKeyType::isTimeLimited() const { - return m_isTrial || m_isSubscription; -} diff --git a/src/lib/license/SerialKeyType.h b/src/lib/license/SerialKeyType.h index 9d34403bb..a7057ef36 100644 --- a/src/lib/license/SerialKeyType.h +++ b/src/lib/license/SerialKeyType.h @@ -34,7 +34,6 @@ public: void setType(const std::string_view &type); bool isTrial() const; bool isSubscription() const; - bool isTimeLimited() const; private: bool m_isTrial = false; diff --git a/src/lib/license/parse_serial_key.cpp b/src/lib/license/parse_serial_key.cpp index 64776b8ba..79acea024 100644 --- a/src/lib/license/parse_serial_key.cpp +++ b/src/lib/license/parse_serial_key.cpp @@ -22,6 +22,7 @@ #include "utils/trim.h" #include +#include #include #include #include @@ -130,12 +131,13 @@ std::optional parseDate(const std::string &unixTimeString) { } try { - auto seconds = std::stoi(clean); - if (seconds < 0) { - throw InvalidSerialKeyDate(unixTimeString); + auto seconds = std::stol(clean); + if (seconds <= 0) { + return std::nullopt; + } else { + return time_point{std::chrono::seconds{seconds}}; } - return time_point{std::chrono::seconds{seconds}}; - } catch (const std::invalid_argument &) { + } catch (const std::exception &) { throw InvalidSerialKeyDate(unixTimeString); } } diff --git a/src/test/unittests/shared/LicenseTests.cpp b/src/test/unittests/shared/LicenseTests.cpp index 9cb82a32e..02a90ef88 100644 --- a/src/test/unittests/shared/LicenseTests.cpp +++ b/src/test/unittests/shared/LicenseTests.cpp @@ -70,7 +70,7 @@ TEST_F(LicenseTests, isExpiring_validV2TrialBasicSerial_isExpiring) { "F6D70616E79206E616D653B313B38363430307D"); setNow(license, 0); - EXPECT_FALSE(license.isExpiring()); + EXPECT_FALSE(license.isExpiringSoon()); } TEST_F(LicenseTests, isExpiring_validV2TrialBasicSerial_isBasicEdition) { @@ -83,13 +83,13 @@ TEST_F(LicenseTests, isExpiring_validV2TrialBasicSerial_isBasicEdition) { } TEST_F(LicenseTests, isExpiring_expiringV2TrialBasicSerial_returnTrue) { - // {v2;trial;basic;Bob;1;email;company name;0;86400} + // {v2;trial;basic;Bob;1;email;company name;86400;0} License license("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636" - "F6D70616E79206E616D653B303B38363430307D"); - setNow(license, 1); + "F6D70616E79206E616D653B38363430303B307D"); + setNow(license, 86401); EXPECT_TRUE(license.isTrial()); - EXPECT_TRUE(license.isExpiring()); + EXPECT_TRUE(license.isExpiringSoon()); } TEST_F(LicenseTests, isExpired_validV2TrialBasicSerial_returnFalse) { @@ -157,18 +157,18 @@ TEST_F(LicenseTests, isExpiring_validV2SubscriptionBasicSerial_returnFalse) { setNow(license, 0); EXPECT_TRUE(license.isSubscription()); - EXPECT_FALSE(license.isExpiring()); + EXPECT_FALSE(license.isExpiringSoon()); EXPECT_EQ(kBasic, license.productEdition()); } TEST_F(LicenseTests, isExpiring_expiringV2SubscriptionBasicSerial_returnTrue) { - // {v2;subscription;basic;Bob;1;email;company name;0;86400} + // {v2;subscription;basic;Bob;1;email;company name;86400;0} License license("7B76323B737562736372697074696F6E3B62617369633B426F623B313B6" - "56D61696C3B636F6D70616E79206E616D653B303B38363430307D"); - setNow(license, 1); + "56D61696C3B636F6D70616E79206E616D653B38363430303B307D"); + setNow(license, 86401); EXPECT_TRUE(license.isSubscription()); - EXPECT_TRUE(license.isExpiring()); + EXPECT_TRUE(license.isExpiringSoon()); } TEST_F(LicenseTests, isExpired_expiredV2SubscriptionBasicSerial_returnTrue) {