SYNERGY1-1555 maintenance licences (#7190)

* SYNERGY1-1555 Remove unused files

* SYNERGY1-1555 Remove unused function isPermanent

* SYNERGY1-1555 Update SerialKeyType with maintenance type

* SYENRGY1-1555 Add method isMaintenance into SerialKey

* SYNERGY1-1555 Check maintenance licenses

* SYNERGY1-1555 Replace obsolete functions

* SYNERGY1-1555 Fix Linux builds

* Update ChangeLog

* SYNERGY1-1555 Requested changes
This commit is contained in:
Serhii Hadzhilov 2022-06-15 13:55:41 +03:00 committed by GitHub
parent de48bb20b7
commit 8a509f4ba9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 83 additions and 68 deletions

View file

@ -7,6 +7,7 @@ Bug fixes:
Enhancements: Enhancements:
- #7183 Refactoring for Synergy 3 licenses - #7183 Refactoring for Synergy 3 licenses
- #7190 Maintenance license serial key support
1.14.4 1.14.4
====== ======

View file

@ -22,6 +22,47 @@
#include <utility> #include <utility>
#include <QThread> #include <QThread>
#include <QTimer> #include <QTimer>
#include <QDateTime>
#include <QLocale>
namespace {
std::string
getMaintenanceMessage(const SerialKey& serialKey)
{
auto expiration = QDateTime::fromTime_t(serialKey.getExpiration()).date();
QString message = "The license key you used will only work with versions of Synergy released before %1."
"<p>To use this version, you’ll need to renew your Synergy maintenance license. "
"<a href=\"https://symless.com/synergy/account?source=gui\""
"style=\"text-decoration: none; color: #4285F4;\">Renew today</a>.</p>";
auto formatedDate = QLocale("en_US").toString(expiration, "MMM dd yyyy");
return message.arg(formatedDate).toStdString();
}
void
checkSerialKey(const SerialKey& serialKey, bool acceptExpired)
{
if (serialKey.isMaintenance()) {
auto buildDate = QDateTime::fromString(__TIMESTAMP__).toTime_t();
if (buildDate > serialKey.getExpiration()) {
throw std::runtime_error(getMaintenanceMessage(serialKey));
}
}
if (!acceptExpired && serialKey.isExpired(::time(nullptr))) {
throw std::runtime_error("Serial key expired");
}
#ifdef SYNERGY_BUSINESS
if (!serialKey.isValid()) {
throw std::runtime_error("The serial key is not compatible with the business version of Synergy.");
}
#endif
}
}
LicenseManager::LicenseManager(AppConfig* appConfig) : LicenseManager::LicenseManager(AppConfig* appConfig) :
m_AppConfig(appConfig), m_AppConfig(appConfig),
@ -31,17 +72,7 @@ LicenseManager::LicenseManager(AppConfig* appConfig) :
void void
LicenseManager::setSerialKey(SerialKey serialKey, bool acceptExpired) LicenseManager::setSerialKey(SerialKey serialKey, bool acceptExpired)
{ {
time_t currentTime = ::time(0); checkSerialKey(serialKey, acceptExpired);
if (!acceptExpired && serialKey.isExpired(currentTime)) {
throw std::runtime_error("Serial key expired");
}
#ifdef SYNERGY_BUSINESS
if (!serialKey.isValid()) {
throw std::runtime_error("The serial key is not compatible with the business version of Synergy.");
}
#endif
if (serialKey != m_serialKey) { if (serialKey != m_serialKey) {
using std::swap; using std::swap;
@ -108,6 +139,7 @@ LicenseManager::refresh()
SerialKey serialKey (m_AppConfig->serialKey().toStdString()); SerialKey serialKey (m_AppConfig->serialKey().toStdString());
setSerialKey(serialKey, true); setSerialKey(serialKey, true);
} catch (...) { } catch (...) {
m_serialKey = SerialKey();
m_AppConfig->clearSerialKey(); m_AppConfig->clearSerialKey();
} }
} }

View file

@ -83,6 +83,12 @@ SerialKey::isTemporary() const
return m_data.keyType.isTemporary(); return m_data.keyType.isTemporary();
} }
bool
SerialKey::isMaintenance() const
{
return m_data.keyType.isMaintenance();
}
bool bool
SerialKey::isValid() const SerialKey::isValid() const
{ {
@ -125,6 +131,12 @@ SerialKey::daysLeft(time_t currentTime) const
return timeLeft / day + daysLeft; return timeLeft / day + daysLeft;
} }
time_t
SerialKey::getExpiration() const
{
return m_data.expireTime;
}
int int
SerialKey::getSpanLeft(time_t time) const SerialKey::getSpanLeft(time_t time) const
{ {

View file

@ -32,8 +32,10 @@ public:
bool isExpired(time_t currentTime) const; bool isExpired(time_t currentTime) const;
bool isTrial() const; bool isTrial() const;
bool isTemporary() const; bool isTemporary() const;
bool isMaintenance() const;
bool isValid() const; bool isValid() const;
time_t daysLeft(time_t currentTime) const; time_t daysLeft(time_t currentTime) const;
time_t getExpiration() const;
int getSpanLeft(time_t time = ::time(0)) const; int getSpanLeft(time_t time = ::time(0)) const;
Edition edition() const; Edition edition() const;
const std::string& toString() const; const std::string& toString() const;

View file

@ -1,8 +0,0 @@
#include "SerialKeyParserV3.h"
bool
SerialKeyParserV3::parse(const std::string& plainSerial)
{
setKey(plainSerial);
return true;
}

View file

@ -1,30 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2022 Symless Ltd.
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file LICENSE that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "SerialKeyParser.h"
class SerialKeyParserV3 : public SerialKeyParser
{
public:
/**
* @brief parse serial key
* @param plainSerial encoded serial key
* @return true if parsed
*/
bool parse(const std::string& plainSerial) override;
};

View file

@ -19,6 +19,7 @@
const std::string SerialKeyType::TRIAL = "trial"; const std::string SerialKeyType::TRIAL = "trial";
const std::string SerialKeyType::SUBSCRIPTION = "subscription"; const std::string SerialKeyType::SUBSCRIPTION = "subscription";
const std::string SerialKeyType::MAINTENANCE = "maintenance";
SerialKeyType::SerialKeyType() SerialKeyType::SerialKeyType()
{ {
@ -28,16 +29,9 @@ SerialKeyType::SerialKeyType()
void void
SerialKeyType::setKeyType(const std::string& Type) SerialKeyType::setKeyType(const std::string& Type)
{ {
m_isTrial = false; m_isTrial = (Type == SerialKeyType::TRIAL);
m_isTemporary = false; m_isTemporary = (m_isTrial || (Type == SerialKeyType::SUBSCRIPTION));
m_isMaintenance = (Type == SerialKeyType::MAINTENANCE);
if (Type == SerialKeyType::TRIAL){
m_isTrial = true;
m_isTemporary = true;
}
else if (Type == SerialKeyType::SUBSCRIPTION){
m_isTemporary = true;
}
} }
bool bool
@ -53,8 +47,8 @@ SerialKeyType::isTemporary() const
} }
bool bool
SerialKeyType::isPermanent() const SerialKeyType::isMaintenance() const
{ {
return (!m_isTemporary); return m_isMaintenance;
} }

View file

@ -25,17 +25,19 @@ private:
public: public:
static const std::string TRIAL; static const std::string TRIAL;
static const std::string SUBSCRIPTION; static const std::string SUBSCRIPTION;
static const std::string MAINTENANCE;
SerialKeyType(); SerialKeyType();
void setKeyType(const std::string& Type); void setKeyType(const std::string& Type);
bool isTrial() const; bool isTrial() const;
bool isTemporary() const; bool isTemporary() const;
bool isPermanent() const; bool isMaintenance() const;
private: private:
bool m_isTrial = false; bool m_isTrial = false;
bool m_isTemporary = false; bool m_isTemporary = false;
bool m_isMaintenance = false;
}; };
inline bool inline bool

View file

@ -116,6 +116,16 @@ TEST(SerialKeyTests, isExpiring_expiringV2SubscriptionBasicSerial_returnTrue)
EXPECT_EQ(false, serial.isTrial()); EXPECT_EQ(false, serial.isTrial());
EXPECT_EQ(true, serial.isTemporary()); EXPECT_EQ(true, serial.isTemporary());
EXPECT_EQ(true, serial.isExpiring(1)); EXPECT_EQ(true, serial.isExpiring(1));
EXPECT_FALSE(serial.isMaintenance());
}
TEST(SerialKeyTests, isExpiring_expiringV2MentenanceSerial_returnTrue)
{
// {v2;maintenance;basic;Bob;1;email;company name;0;86400}
SerialKey serial("7B76323B6D61696E74656E616E63653B70726F3B736572686969206861647A68696C6F763B313B7365726869694073796D6C6573732E636F6D3B203B303B313635353132343139307D");
EXPECT_FALSE(serial.isTrial());
EXPECT_FALSE(serial.isTemporary());
EXPECT_TRUE(serial.isMaintenance());
} }
TEST(SerialKeyTests, isExpired_expiredV2SubscriptionBasicSerial_returnTrue) TEST(SerialKeyTests, isExpired_expiredV2SubscriptionBasicSerial_returnTrue)

View file

@ -26,7 +26,7 @@ TEST(SerialKeyTypeTests, TrialTemporaryKeyType_false)
SerialKeyType KeyType; SerialKeyType KeyType;
EXPECT_EQ(false, KeyType.isTrial()); EXPECT_EQ(false, KeyType.isTrial());
EXPECT_EQ(false, KeyType.isTemporary()); EXPECT_EQ(false, KeyType.isTemporary());
EXPECT_EQ(true, KeyType.isPermanent()); EXPECT_FALSE(KeyType.isMaintenance());
} }
TEST(SerialKeyTypeTests, TrialTemporaryKeyType_true) TEST(SerialKeyTypeTests, TrialTemporaryKeyType_true)
@ -35,7 +35,7 @@ TEST(SerialKeyTypeTests, TrialTemporaryKeyType_true)
KeyType.setKeyType("trial"); KeyType.setKeyType("trial");
EXPECT_EQ(true, KeyType.isTrial()); EXPECT_EQ(true, KeyType.isTrial());
EXPECT_EQ(true, KeyType.isTemporary()); EXPECT_EQ(true, KeyType.isTemporary());
EXPECT_EQ(false, KeyType.isPermanent()); EXPECT_FALSE(KeyType.isMaintenance());
} }
TEST(SerialKeyTypeTests, TemporaryKeyType_true) TEST(SerialKeyTypeTests, TemporaryKeyType_true)
@ -44,14 +44,14 @@ TEST(SerialKeyTypeTests, TemporaryKeyType_true)
KeyType.setKeyType("subscription"); KeyType.setKeyType("subscription");
EXPECT_EQ(false, KeyType.isTrial()); EXPECT_EQ(false, KeyType.isTrial());
EXPECT_EQ(true, KeyType.isTemporary()); EXPECT_EQ(true, KeyType.isTemporary());
EXPECT_EQ(false, KeyType.isPermanent()); EXPECT_FALSE(KeyType.isMaintenance());
} }
TEST(SerialKeyTypeTests, PermanentKeyType_true) TEST(SerialKeyTypeTests, MaintanenceKeyType_true)
{ {
SerialKeyType KeyType; SerialKeyType KeyType;
KeyType.setKeyType(""); KeyType.setKeyType("maintenance");
EXPECT_EQ(false, KeyType.isTrial()); EXPECT_EQ(false, KeyType.isTrial());
EXPECT_EQ(false, KeyType.isTemporary()); EXPECT_EQ(false, KeyType.isTemporary());
EXPECT_EQ(true, KeyType.isPermanent()); EXPECT_TRUE(KeyType.isMaintenance());
} }