diff --git a/ChangeLog b/ChangeLog index 59eca2dd3..59c54cc87 100644 --- a/ChangeLog +++ b/ChangeLog @@ -83,6 +83,7 @@ Enhancements: - #7438 Compare result of `clickedButton` instead of `exec` - #7440 Fixed light logo filename on about screen - #7441 Share file line logic between logger and message box +- #7442 Improve error handling and use long long for dates # 1.14.6 diff --git a/src/gui/src/ActivationDialog.cpp b/src/gui/src/ActivationDialog.cpp index 3dc55e88b..a9bb37302 100644 --- a/src/gui/src/ActivationDialog.cpp +++ b/src/gui/src/ActivationDialog.cpp @@ -31,7 +31,6 @@ #include #include #include -#include using namespace synergy::gui; using namespace synergy::license; @@ -97,17 +96,9 @@ void ActivationDialog::accept() { return; } - try { - const auto result = m_licenseHandler.changeSerialKey(serialKey); - if (result != Result::kSuccess) { - showResultDialog(result); - return; - } - } catch (const std::exception &e) { // NOSONAR - qCritical("failed to change serial key: %s", e.what()); - return; - } catch (...) { // NOSONAR - qCritical("failed to change serial key"); + const auto result = m_licenseHandler.changeSerialKey(serialKey); + if (result != Result::kSuccess) { + showResultDialog(result); return; } diff --git a/src/gui/src/MainWindow.cpp b/src/gui/src/MainWindow.cpp index c80da4ed4..76beba556 100644 --- a/src/gui/src/MainWindow.cpp +++ b/src/gui/src/MainWindow.cpp @@ -31,8 +31,8 @@ #include "gui/diagnostic.h" #include "gui/dialogs/SettingsDialog.h" #include "gui/license/LicenseHandler.h" -#include "gui/license/license_config.h" #include "gui/license/license_notices.h" +#include "gui/license/license_utils.h" #include "gui/messages.h" #include "gui/string_utils.h" #include "gui/styles.h" diff --git a/src/gui/src/main.cpp b/src/gui/src/main.cpp index 5efc53baa..4bc038f7b 100644 --- a/src/gui/src/main.cpp +++ b/src/gui/src/main.cpp @@ -35,8 +35,8 @@ #include #include #include +#include #include -#include #if defined(Q_OS_MAC) #include diff --git a/src/lib/gui/core/CoreProcess.cpp b/src/lib/gui/core/CoreProcess.cpp index bb5e7f1ee..8c97fa28d 100644 --- a/src/lib/gui/core/CoreProcess.cpp +++ b/src/lib/gui/core/CoreProcess.cpp @@ -19,7 +19,7 @@ #include "gui/config/IAppConfig.h" #include "gui/core/CoreTool.h" -#include "gui/license/license_config.h" +#include "gui/license/license_utils.h" #include "gui/paths.h" #include "tls/TlsUtility.h" diff --git a/src/lib/gui/dialogs/SettingsDialog.cpp b/src/lib/gui/dialogs/SettingsDialog.cpp index 4867dc4dd..59e2c925f 100644 --- a/src/lib/gui/dialogs/SettingsDialog.cpp +++ b/src/lib/gui/dialogs/SettingsDialog.cpp @@ -20,7 +20,7 @@ #include "UpgradeDialog.h" #include "gui/core/CoreProcess.h" -#include "gui/license/license_config.h" +#include "gui/license/license_utils.h" #include "gui/messages.h" #include "gui/tls/TlsCertificate.h" #include "gui/tls/TlsUtility.h" diff --git a/src/lib/gui/license/LicenseHandler.cpp b/src/lib/gui/license/LicenseHandler.cpp index 6210aad5e..f1fe2df9b 100644 --- a/src/lib/gui/license/LicenseHandler.cpp +++ b/src/lib/gui/license/LicenseHandler.cpp @@ -18,17 +18,21 @@ #include "LicenseHandler.h" #include "constants.h" +#include "gui/license/license_utils.h" #include "license/ProductEdition.h" -#include "license/parse_serial_key.h" #include #include #include +#include using namespace std::chrono; -using namespace synergy::license; +using namespace synergy::gui::license; +using License = synergy::license::License; -const License &LicenseHandler::license() const { return m_license; } +const synergy::license::License &LicenseHandler::license() const { + return m_license; +} Edition LicenseHandler::productEdition() const { return m_license.productEdition(); @@ -52,7 +56,7 @@ LicenseHandler::changeSerialKey(const QString &hexString) { } qDebug() << "changing serial key to:" << hexString; - auto serialKey = parseSerialKey(hexString.toStdString()); + auto serialKey = parseSerialKey(hexString); if (serialKey == m_license.serialKey()) { qDebug("serial key did not change, ignoring"); diff --git a/src/lib/gui/license/LicenseHandler.h b/src/lib/gui/license/LicenseHandler.h index d516c325e..f68468069 100644 --- a/src/lib/gui/license/LicenseHandler.h +++ b/src/lib/gui/license/LicenseHandler.h @@ -18,7 +18,7 @@ #pragma once #include "gui/constants.h" -#include "gui/license/license_config.h" +#include "gui/license/license_utils.h" #include "license/License.h" #include "license/ProductEdition.h" diff --git a/src/lib/gui/license/license_config.cpp b/src/lib/gui/license/license_utils.cpp similarity index 78% rename from src/lib/gui/license/license_config.cpp rename to src/lib/gui/license/license_utils.cpp index 5f30317b4..c1747a1cb 100644 --- a/src/lib/gui/license/license_config.cpp +++ b/src/lib/gui/license/license_utils.cpp @@ -15,8 +15,9 @@ * along with this program. If not, see . */ -#include "license_config.h" +#include "license_utils.h" +#include "license/parse_serial_key.h" #include "string_utils.h" #include @@ -55,4 +56,16 @@ bool isActivationEnabled() { } } +synergy::license::SerialKey parseSerialKey(const QString &hexString) { + try { + return synergy::license::parseSerialKey(hexString.toStdString()); + } catch (const std::exception &e) { + qFatal("failed to parse serial key: %s", e.what()); + abort(); + } catch (...) { + qFatal("failed to parse serial key, unknown error"); + abort(); + } +} + } // namespace synergy::gui::license diff --git a/src/lib/gui/license/license_config.h b/src/lib/gui/license/license_utils.h similarity index 87% rename from src/lib/gui/license/license_config.h rename to src/lib/gui/license/license_utils.h index 16fddf629..40a76babe 100644 --- a/src/lib/gui/license/license_config.h +++ b/src/lib/gui/license/license_utils.h @@ -17,9 +17,14 @@ #pragma once +#include + +#include "license/SerialKey.h" + namespace synergy::gui::license { bool isLicensedProduct(); bool isActivationEnabled(); +synergy::license::SerialKey parseSerialKey(const QString &hexString); } // namespace synergy::gui::license diff --git a/src/lib/gui/messages.cpp b/src/lib/gui/messages.cpp index d0066fd7f..be77b2e65 100644 --- a/src/lib/gui/messages.cpp +++ b/src/lib/gui/messages.cpp @@ -20,7 +20,7 @@ #include "Logger.h" #include "common/version.h" #include "constants.h" -#include "gui/license/license_config.h" +#include "gui/license/license_utils.h" #include "styles.h" #include diff --git a/src/lib/gui/tls/TlsUtility.cpp b/src/lib/gui/tls/TlsUtility.cpp index 9cad1fe82..53e020fef 100644 --- a/src/lib/gui/tls/TlsUtility.cpp +++ b/src/lib/gui/tls/TlsUtility.cpp @@ -18,7 +18,7 @@ #include "TlsUtility.h" #include "TlsCertificate.h" -#include "gui/license/license_config.h" +#include "gui/license/license_utils.h" #include #include diff --git a/src/lib/license/parse_serial_key.cpp b/src/lib/license/parse_serial_key.cpp index 79acea024..bd81fdbac 100644 --- a/src/lib/license/parse_serial_key.cpp +++ b/src/lib/license/parse_serial_key.cpp @@ -19,9 +19,8 @@ #include "SerialKey.h" #include "SerialKeyType.h" -#include "utils/trim.h" +#include "utils/string_utils.h" -#include #include #include #include @@ -131,14 +130,20 @@ std::optional parseDate(const std::string &unixTimeString) { } try { - auto seconds = std::stol(clean); + auto seconds = std::stoll(clean); if (seconds <= 0) { return std::nullopt; } else { return time_point{std::chrono::seconds{seconds}}; } - } catch (const std::exception &) { - throw InvalidSerialKeyDate(unixTimeString); + } catch (std::invalid_argument &) { + throw InvalidSerialKeyDate(unixTimeString, "invalid argument"); + } catch (std::out_of_range &) { + throw InvalidSerialKeyDate(unixTimeString, "out of range"); + } catch (std::exception &ex) { + throw InvalidSerialKeyDate(unixTimeString, ex.what()); + } catch (...) { // NOSONAR + throw InvalidSerialKeyDate(unixTimeString, "unknown error"); } } diff --git a/src/lib/license/parse_serial_key.h b/src/lib/license/parse_serial_key.h index 289aa250d..b34e21041 100644 --- a/src/lib/license/parse_serial_key.h +++ b/src/lib/license/parse_serial_key.h @@ -30,8 +30,7 @@ public: class InvalidHexString : public SerialKeyParseError { public: - explicit InvalidHexString() - : SerialKeyParseError("invalid hex string length") {} + explicit InvalidHexString() : SerialKeyParseError("invalid hex string") {} }; class InvalidSerialKeyFormat : public SerialKeyParseError { @@ -42,8 +41,10 @@ public: class InvalidSerialKeyDate : public SerialKeyParseError { public: - explicit InvalidSerialKeyDate(const std::string &date) - : SerialKeyParseError("invalid serial key date: " + date) {} + explicit InvalidSerialKeyDate( + const std::string &date, const std::string &cause) + : SerialKeyParseError("invalid serial key date: " + date + "\n" + cause) { + } }; class InvalidSerialKeyVersion : public SerialKeyParseError { diff --git a/src/lib/utils/trim.h b/src/lib/utils/string_utils.h similarity index 100% rename from src/lib/utils/trim.h rename to src/lib/utils/string_utils.h