logic: Changed seats to users in license generator and license check

This commit is contained in:
Eberhard Graether
2018-02-27 16:55:11 +01:00
parent 2408224379
commit f2e4ad1661
12 changed files with 768 additions and 71 deletions
+2 -1
View File
@@ -252,6 +252,7 @@ create_source_groups(${LIB_LICENSE_FILES})
target_include_directories( ${LIB_LICENSE_PROJECT_NAME} PUBLIC
"${CMAKE_SOURCE_DIR}/src/lib_license"
"${CMAKE_BINARY_DIR}/src/lib_license"
"${CMAKE_SOURCE_DIR}/src/lib_utility"
)
target_include_directories(${LIB_LICENSE_PROJECT_NAME} SYSTEM
@@ -684,7 +685,7 @@ if(UNIX AND NOT APPLE)
set_target_properties(${LICENSE_GENERATOR_PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE "-pthread")
endif()
target_link_libraries(${LICENSE_GENERATOR_PROJECT_NAME} ${LIB_LICENSE_PROJECT_NAME} ${Boost_LIBRARIES} )
target_link_libraries(${LICENSE_GENERATOR_PROJECT_NAME} ${LIB_UTILITY_PROJECT_NAME} ${LIB_LICENSE_PROJECT_NAME} ${Boost_LIBRARIES} )
# CxxTest ----------------------------------------------------------------------
-2
View File
@@ -540,8 +540,6 @@ add_files(
utility/utilityLibrary.h
utility/utilityMath.cpp
utility/utilityMath.h
utility/utilityString.cpp
utility/utilityString.h
utility/utilityUuid.cpp
utility/utilityUuid.h
utility/utilityXml.cpp
+3
View File
@@ -79,11 +79,13 @@ LicenseChecker::LicenseState LicenseChecker::checkCurrentLicense() const
std::string licenseString = appSettings->getLicenseString();
if (licenseString.size() == 0)
{
LOG_ERROR_STREAM(<< "No license key available.");
return LICENSE_EMPTY;
}
if (!License::checkLocation(appPath.getAbsolute().str(), appSettings->getLicenseCheck()))
{
LOG_ERROR_STREAM(<< "Application was moved, reenter license key.");
return LICENSE_MOVED;
}
@@ -91,6 +93,7 @@ LicenseChecker::LicenseState LicenseChecker::checkCurrentLicense() const
bool isLoaded = license.loadFromEncodedString(licenseString, appPath.str());
if (!isLoaded)
{
LOG_ERROR_STREAM(<< "License is invalid or application was moved.");
return LICENSE_MOVED;
}
+47 -41
View File
@@ -21,24 +21,16 @@
#include "botan/auto_rng.h"
#include "botan/pbkdf.h"
#include "utility/utilityString.h"
#include "utility/Version.h"
#include "PublicKey.h"
namespace
{
std::string trimWhiteSpaces(const std::string &str)
{
auto wsfront = std::find_if_not(str.begin(), str.end(), [](int c){ return std::isspace(c); });
auto wsback = std::find_if_not(str.rbegin(), str.rend(), [](int c){ return std::isspace(c); }).base();
return (wsback <= wsfront ? std::string() : std::string(wsfront, wsback));
}
}
License::License()
: m_rng(std::make_shared<Botan::AutoSeeded_RNG>())
, m_user("")
, m_type("Private License")
, m_seats(0)
, m_numberOfUsers(0)
, m_createdWithSeats(false)
, m_expire("")
{
loadPublicKey();
@@ -52,7 +44,7 @@ void License::createHeader(
const std::string& user,
const std::string& type,
const std::string& expiration,
unsigned int seats
size_t numberOfUsers
)
{
if (user.empty() || type.empty() || expiration.empty())
@@ -62,7 +54,7 @@ void License::createHeader(
m_user = user;
m_expire = expiration;
m_type = type;
m_seats = seats;
m_numberOfUsers = numberOfUsers;
}
std::string License::getMessage(bool withNewlines) const
@@ -78,17 +70,17 @@ std::string License::getMessage(bool withNewlines) const
message += LicenseConstants::PRODUCT_STRING + separator;
message += LicenseConstants::LICENSED_TO_STRING + m_user + separator;
message += LicenseConstants::LICENSE_TYPE_STRING + m_type;
if (m_seats > 1)
if (m_numberOfUsers > 1)
{
message += " (" + std::to_string(m_seats) + " Seats)";
message += " (" + std::to_string(m_numberOfUsers) + (m_createdWithSeats ? " Seats)" : " users)");
}
else if (m_seats == 1)
else if (m_numberOfUsers == 1)
{
message += " (1 Seat)";
message += (m_createdWithSeats ? " (1 Seat)" : " (1 user)");
}
else if (m_type == LicenseConstants::TEST_LICENSE_STRING)
{
message += " (unlimited seats)";
message += (m_createdWithSeats ? " (unlimited seats)" : " (unlimited users)");
}
message += separator;
message += getExpireLine() + separator;
@@ -103,7 +95,7 @@ std::string License::getLine(std::istream& stream)
std::string line;
if(getline(stream, line, '\n'))
{
return trimWhiteSpaces(line);
return utility::trim(line);
}
return "";
}
@@ -140,7 +132,7 @@ bool License::extractData(const std::string& data, LICENSE_LINE line)
}
return !m_expire.empty();
case TYPE_LINE:
setTypeAndSeats(removeCaption(data, LicenseConstants::LICENSE_TYPE_STRING));
setTypeAndNumberOfUsers(removeCaption(data, LicenseConstants::LICENSE_TYPE_STRING));
return !m_type.empty();
default:
return false;
@@ -164,9 +156,9 @@ bool License::isNonCommercialLicenseType() const
return false;
}
unsigned int License::getSeats() const
size_t License::getNumberOfUsers() const
{
return m_seats;
return m_numberOfUsers;
}
std::string License::getType() const
@@ -196,15 +188,15 @@ std::string License::getLicenseInfo() const
}
else if (m_type == LicenseConstants::TEST_LICENSE_STRING)
{
info += "unlimited Seats";
info += "unlimited users";
}
else if (m_seats > 1)
else if (m_numberOfUsers > 1)
{
info += std::to_string(m_seats) + " Seats";
info += std::to_string(m_numberOfUsers) + " users";
}
else
{
info += "1 Seat";
info += "1 user";
}
return info;
@@ -282,7 +274,7 @@ bool License::load(std::istream& stream)
// separator line
getline(stream, line, '\n');
if (trimWhiteSpaces(line) != LicenseConstants::SEPARATOR_STRING)
if (utility::trim(line) != LicenseConstants::SEPARATOR_STRING)
{
return false;
}
@@ -294,7 +286,7 @@ bool License::load(std::istream& stream)
m_signature = "";
while (getline(stream, line, '\n'))
{
std::string l = trimWhiteSpaces(line);
std::string l = utility::trim(line);
if (l == LicenseConstants::END_LICENSE_STRING)
{
break;
@@ -312,26 +304,31 @@ bool License::load(std::istream& stream)
return true;
}
void License::setTypeAndSeats(const std::string& line)
void License::setTypeAndNumberOfUsers(const std::string& line)
{
size_t pos = line.find("(");
if ( pos != line.npos)
if (pos != line.npos)
{
m_type = line.substr(0, pos - 1);
try
{
m_seats = std::stoi(line.substr(pos+1));
m_numberOfUsers = std::stoi(line.substr(pos+1));
}
catch (std::invalid_argument e)
{
m_seats = 0;
m_numberOfUsers = 0;
}
if (utility::toLowerCase(line).find("seat") != line.npos)
{
m_createdWithSeats = true;
}
}
else
{
m_type = line;
m_seats = 0;
m_numberOfUsers = 0;
}
}
@@ -348,7 +345,7 @@ void License::print()
bool License::isValid() const
{
if(!m_publicKey)
if (!m_publicKey)
{
std::cout << "No public key loaded" << std::endl;
return false;
@@ -369,6 +366,12 @@ bool License::isValid() const
return false;
}
if (isExpired())
{
std::cout << "License is expired" << std::endl;
return false;
}
Botan::PK_Verifier verifier(*m_publicKey.get(), "EMSA4(SHA-256)");
Botan::DataSource_Memory in(getMessage());
@@ -379,8 +382,9 @@ bool License::isValid() const
}
const bool ok = verifier.check_signature(signature);
if (isExpired())
if (!ok)
{
std::cout << "License check failed" << std::endl;
return false;
}
return ok;
@@ -394,9 +398,9 @@ bool License::isValid() const
bool License::isExpired() const
{
if ( getType() == LicenseConstants::TEST_LICENSE_STRING)
if (getType() == LicenseConstants::TEST_LICENSE_STRING)
{
return (getTimeLeft()==-1);
return (getTimeLeft() == -1);
}
else
{
@@ -407,7 +411,7 @@ bool License::isExpired() const
std::string License::getPublicKeyFilename() const
{
if(m_publicKeyFilename.empty())
if (m_publicKeyFilename.empty())
{
return "public-sourcetrail" + KEY_FILEENDING;
}
@@ -421,9 +425,10 @@ bool License::loadPublicKeyFromFile(const std::string& filename)
m_publicKeyFilename = filename;
}
if(boost::filesystem::exists(getPublicKeyFilename()))
if (boost::filesystem::exists(getPublicKeyFilename()))
{
Botan::RSA_PublicKey* rsaPublicKey = dynamic_cast<Botan::RSA_PublicKey *>(Botan::X509::load_key(getPublicKeyFilename()));
Botan::RSA_PublicKey* rsaPublicKey =
dynamic_cast<Botan::RSA_PublicKey*>(Botan::X509::load_key(getPublicKeyFilename()));
if (!rsaPublicKey)
{
@@ -535,7 +540,8 @@ std::string License::getLicenseEncodedString(const std::string& applicationLocat
return "";
}
std::string result = Botan::CryptoBox::encrypt(&fileContents[0], fileContents.size(), getEncodeKey(applicationLocation), rng);
std::string result =
Botan::CryptoBox::encrypt(&fileContents[0], fileContents.size(), getEncodeKey(applicationLocation), rng);
//remove Botan Cryptobox begin and end
//should not be in the application settings
+5 -4
View File
@@ -55,20 +55,20 @@ public:
void setLine(const LICENSE_LINE line, const std::string& value);
void setHashLine(const std::string& hash);
void setTypeAndSeats(const std::string& line);
void setTypeAndNumberOfUsers(const std::string& line);
std::string getLicenseInfo() const;
std::string getPublicKeyFilename() const;
std::string getVersion() const;
std::string getType() const;
std::string getUser() const;
unsigned int getSeats() const;
size_t getNumberOfUsers() const;
void createHeader(
const std::string& user,
const std::string& type,
const std::string& expiration,
unsigned int seats = 0
size_t numberOfUsers = 0
);
std::string getExpireLine() const;
@@ -115,7 +115,8 @@ private:
// message
std::string m_user;
std::string m_type;
unsigned int m_seats;
size_t m_numberOfUsers;
bool m_createdWithSeats;
std::string m_expire;
std::string m_hashLine;
+3
View File
@@ -4,4 +4,7 @@ add_files(
utility/TextCodec.cpp
utility/TextCodec.h
utility/utilityString.cpp
utility/utilityString.h
)
+477
View File
@@ -0,0 +1,477 @@
#include "utility/utilityString.h"
#include <algorithm>
#include <cctype>
#include <iterator>
#include <string>
#include <boost/locale/encoding_utf.hpp>
namespace
{
template <typename StringType>
StringType doReplace(StringType str, const StringType& from, const StringType& to)
{
size_t pos = 0;
if (from.size() == 0)
{
return str;
}
while ((pos = str.find(from, pos)) != std::string::npos)
{
str.replace(pos, from.length(), to);
pos += to.length();
}
return str;
}
template <typename StringType>
StringType doReplaceBetween(const StringType& str, typename StringType::value_type startDelimiter, typename StringType::value_type endDelimiter, const StringType& to)
{
size_t startPos = str.find(startDelimiter);
if (startPos == StringType::npos)
{
return str;
}
size_t depth = 1;
for (size_t pos = startPos + 1; pos < str.size(); pos++)
{
if (str[pos] == endDelimiter && depth)
{
depth--;
if (depth == 0)
{
StringType end = doReplaceBetween<StringType>(str.substr(pos + 1), startDelimiter, endDelimiter, to);
return str.substr(0, startPos) + startDelimiter + to + endDelimiter + end;
}
}
if (str[pos] == startDelimiter)
{
depth++;
}
}
return str;
}
}
namespace utility
{
std::string encodeToUtf8(const std::wstring& s)
{
return boost::locale::conv::utf_to_utf<char>(s.c_str(), s.c_str() + s.size());
}
std::wstring decodeFromUtf8(const std::string& s)
{
return boost::locale::conv::utf_to_utf<wchar_t>(s.c_str(), s.c_str() + s.size());
}
std::deque<std::string> split(const std::string& str, char delimiter)
{
return split<std::deque<std::string>>(str, std::string(1, delimiter));
}
std::deque<std::string> split(const std::string& str, const std::string& delimiter)
{
return split<std::deque<std::string>>(str, delimiter);
}
std::vector<std::string> splitToVector(const std::string& str, char delimiter)
{
return split<std::vector<std::string>>(str, std::string(1, delimiter));
}
std::vector<std::string> splitToVector(const std::string& str, const std::string& delimiter)
{
return split<std::vector<std::string>>(str, delimiter);
}
std::vector<std::wstring> splitToVector(const std::wstring& str, wchar_t delimiter)
{
return split<std::vector<std::wstring>>(str, std::wstring(1, delimiter));
}
std::vector<std::wstring> splitToVector(const std::wstring& str, const std::wstring& delimiter)
{
return split<std::vector<std::wstring>>(str, delimiter);
}
std::string join(const std::deque<std::string>& list, char delimiter)
{
return join<std::deque<std::string> >(list, std::string(1, delimiter));
}
std::string join(const std::deque<std::string>& list, const std::string& delimiter)
{
return join<std::deque<std::string> >(list, delimiter);
}
std::string join(const std::vector<std::string>& list, char delimiter)
{
return join<std::vector<std::string> >(list, std::string(1, delimiter));
}
std::string join(const std::vector<std::string>& list, const std::string& delimiter)
{
return join<std::vector<std::string> >(list, delimiter);
}
std::deque<std::string> tokenize(const std::string& str, char delimiter)
{
return tokenize(str, std::string(1, delimiter));
}
std::deque<std::string> tokenize(const std::string& str, const std::string& delimiter)
{
size_t pos = 0;
size_t oldPos = 0;
std::deque<std::string> c;
do
{
pos = str.find(delimiter, oldPos);
if (pos != oldPos)
{
c.push_back(str.substr(oldPos, pos - oldPos));
}
if (pos != std::string::npos)
{
c.push_back(str.substr(pos, delimiter.size()));
}
oldPos = pos + delimiter.size();
}
while (pos != std::string::npos && oldPos < str.size());
return c;
}
std::deque<std::string> tokenize(const std::deque<std::string>& list, char delimiter)
{
return tokenize(list, std::string(1, delimiter));
}
std::deque<std::string> tokenize(const std::deque<std::string>& list, const std::string& delimiter)
{
std::deque<std::string> c;
for (const std::string& str : list)
{
if (str.size())
{
std::deque<std::string> c2 = tokenize(str, delimiter);
c.insert(c.end(), c2.begin(), c2.end());
}
}
return c;
}
std::string substrBeforeFirst(const std::string& str, char delimiter)
{
size_t pos = str.find(delimiter);
if (pos != std::string::npos)
{
return str.substr(0, pos);
}
return str;
}
std::string substrBeforeFirst(const std::string& str, const std::string& delimiter)
{
size_t pos = str.find(delimiter);
if (pos != std::string::npos)
{
return str.substr(0, pos);
}
return str;
}
std::string substrBeforeLast(const std::string& str, char delimiter)
{
size_t pos = str.rfind(delimiter);
if (pos != std::string::npos)
{
return str.substr(0, pos);
}
return str;
}
std::wstring substrBeforeLast(const std::wstring& str, wchar_t delimiter)
{
size_t pos = str.rfind(delimiter);
if (pos != std::wstring::npos)
{
return str.substr(0, pos);
}
return str;
}
std::string substrAfter(const std::string& str, char delimiter)
{
size_t pos = str.find(delimiter);
if (pos != std::string::npos)
{
return str.substr(pos + 1, str.size());
}
return str;
}
std::string substrAfter(const std::string& str, const std::string& delimiter)
{
size_t pos = str.find(delimiter);
if (pos != std::string::npos)
{
return str.substr(pos + delimiter.size(), str.size());
}
return str;
}
std::string toUpperCase(const std::string& in)
{
std::string out;
std::transform(in.begin(), in.end(), std::back_inserter(out), toupper);
return out;
}
std::string toLowerCase(const std::string& in)
{
std::string out;
std::transform(in.begin(), in.end(), std::back_inserter(out), tolower);
return out;
}
std::wstring toLowerCase(const std::wstring& in)
{
std::wstring out;
std::transform(in.begin(), in.end(), std::back_inserter(out), tolower);
return out;
}
std::string replace(std::string str, const std::string& from, const std::string& to)
{
return doReplace(str, from, to);
}
std::wstring replace(std::wstring str, const std::wstring& from, const std::wstring& to)
{
return doReplace(str, from, to);
}
std::string replaceBetween(const std::string& str, char startDelimiter, char endDelimiter, const std::string& to)
{
return doReplaceBetween<std::string>(str, startDelimiter, endDelimiter, to);
}
std::wstring replaceBetween(const std::wstring& str, wchar_t startDelimiter, wchar_t endDelimiter, const std::wstring& to)
{
return doReplaceBetween<std::wstring>(str, startDelimiter, endDelimiter, to);
}
std::string insertLineBreaksAtBlankSpaces(const std::string& s, size_t maxLineLength)
{
const std::vector<std::string> atoms = splitToVector(s, " ");
std::string ret = "";
std::string currentLine = "";
for (const std::string& atom: atoms)
{
if (currentLine.size() + 1 + atom.size() <= maxLineLength)
{
currentLine += " " + atom;
}
else
{
if (!ret.empty())
{
ret += "\n";
}
if (currentLine.empty())
{
ret += atom;
}
else
{
ret += currentLine;
currentLine = atom;
}
}
}
if (!currentLine.empty())
{
if (!ret.empty())
{
ret += "\n";
}
ret += currentLine;
}
return ret;
}
std::string breakSignature(
std::string returnPart, std::string namePart, std::string paramPart,
size_t maxLineLength, size_t tabWidth)
{
namePart = ' ' + namePart;
size_t totalSize = returnPart.size() + namePart.size() + paramPart.size();
if (totalSize <= maxLineLength)
{
return returnPart + namePart + paramPart;
}
if (paramPart.size())
{
namePart += paramPart[0];
paramPart.erase(0, 1);
}
size_t parenPos = paramPart.rfind(')');
std::string endPart;
if (parenPos == 0)
{
namePart += paramPart;
paramPart = "";
}
else if (parenPos != std::string::npos)
{
endPart = paramPart.substr(parenPos);
paramPart = paramPart.substr(0, parenPos);
}
if (paramPart.size() && paramPart.size() + tabWidth - endPart.size() > maxLineLength)
{
std::vector<std::string> paramLines;
while (true)
{
size_t parenCount = 0;
bool split = false;
for (size_t i = 0; i < paramPart.size(); i++)
{
char c = paramPart[i];
if (parenCount == 0 && c == ',')
{
paramLines.push_back(paramPart.substr(0, i + 1));
paramPart = paramPart.substr(i + 2);
split = true;
break;
}
else if (c == '<' || c == '(')
{
parenCount++;
}
else if (c == '>' || c == ')')
{
parenCount--;
}
}
if (!split)
{
paramLines.push_back(paramPart);
break;
}
}
paramPart = "";
for (const std::string& str : paramLines)
{
paramPart += "\n\t" + str;
size_t length = tabWidth + str.size();
maxLineLength = std::max(length, maxLineLength);
}
}
else if (paramPart.size())
{
paramPart = "\n\t" + paramPart;
}
if (returnPart.size() + namePart.size() <= maxLineLength)
{
namePart = returnPart + namePart;
returnPart = "";
}
std::string sig;
if (returnPart.size())
{
sig += returnPart + '\n';
}
sig += namePart;
if (paramPart.size())
{
sig += paramPart;
}
if (endPart.size())
{
sig += '\n' + endPart;
}
return sig;
}
std::string trim(const std::string &str)
{
auto wsfront = std::find_if_not(str.begin(), str.end(), [](int c) { return std::isspace(c); });
auto wsback = std::find_if_not(str.rbegin(), str.rend(), [](int c) { return std::isspace(c); }).base();
return (wsback <= wsfront ? std::string() : std::string(wsfront, wsback));
}
std::wstring trim(const std::wstring &str)
{
auto wsfront = std::find_if_not(str.begin(), str.end(), [](int c) { return std::isspace(c); });
auto wsback = std::find_if_not(str.rbegin(), str.rend(), [](int c) { return std::isspace(c); }).base();
return (wsback <= wsfront ? std::wstring() : std::wstring(wsfront, wsback));
}
std::string elide(const std::string& str, ElideMode mode, size_t size)
{
if (str.size() <= size || str.size() <= 3)
{
return str;
}
switch (mode)
{
case ELIDE_LEFT:
return "..." + str.substr(str.size() - size - 3, str.size());
case ELIDE_MIDDLE:
return str.substr(0, size / 2 - 1) + "..." + str.substr(str.size() - (size / 2 - 2), str.size());
case ELIDE_RIGHT:
return str.substr(0, size - 3) + "...";
}
}
std::wstring elide(const std::wstring& str, ElideMode mode, size_t size)
{
if (str.size() <= size || str.size() <= 3)
{
return str;
}
switch (mode)
{
case ELIDE_LEFT:
return L"..." + str.substr(str.size() - size - 3, str.size());
case ELIDE_MIDDLE:
return str.substr(0, size / 2 - 1) + L"..." + str.substr(str.size() - (size / 2 - 2), str.size());
case ELIDE_RIGHT:
return str.substr(0, size - 3) + L"...";
}
}
}
+206
View File
@@ -0,0 +1,206 @@
#ifndef UTILITY_STRING_H
#define UTILITY_STRING_H
#include <deque>
#include <sstream>
#include <string>
#include <vector>
namespace utility
{
std::string encodeToUtf8(const std::wstring& s);
std::wstring decodeFromUtf8(const std::string& s);
template <typename ContainerType>
ContainerType split(const std::string& str, const std::string& delimiter);
template <typename ContainerType>
ContainerType split(const std::wstring& str, const std::wstring& delimiter);
std::deque<std::string> split(const std::string& str, char delimiter);
std::deque<std::string> split(const std::string& str, const std::string& delimiter);
std::vector<std::string> splitToVector(const std::string& str, char delimiter);
std::vector<std::string> splitToVector(const std::string& str, const std::string& delimiter);
std::vector<std::wstring> splitToVector(const std::wstring& str, wchar_t delimiter);
std::vector<std::wstring> splitToVector(const std::wstring& str, const std::wstring& delimiter);
template <typename ContainerType>
std::string join(const ContainerType& list, const std::string& delimiter);
template <typename ContainerType>
std::wstring join(const ContainerType& list, const std::wstring& delimiter);
std::string join(const std::deque<std::string>& list, char delimiter);
std::string join(const std::deque<std::string>& list, const std::string& delimiter);
std::string join(const std::vector<std::string>& list, char delimiter);
std::string join(const std::vector<std::string>& list, const std::string& delimiter);
std::deque<std::string> tokenize(const std::string& str, char delimiter);
std::deque<std::string> tokenize(const std::string& str, const std::string& delimiter);
std::deque<std::string> tokenize(const std::deque<std::string>& list, char delimiter);
std::deque<std::string> tokenize(const std::deque<std::string>& list, const std::string& delimiter);
std::string substrBeforeFirst(const std::string& str, char delimiter);
std::string substrBeforeFirst(const std::string& str, const std::string& delimiter);
std::string substrBeforeLast(const std::string& str, char delimiter);
std::wstring substrBeforeLast(const std::wstring& str, wchar_t delimiter);
std::string substrAfter(const std::string& str, char delimiter);
std::string substrAfter(const std::string& str, const std::string& delimiter);
template <typename StringType>
StringType substrBetween(const StringType& str, const StringType& delimiter1, const StringType& delimiter2);
template <typename StringType>
bool isPrefix(const StringType& prefix, const StringType& text);
template <typename StringType>
bool isPostfix(const StringType& postfix, const StringType& text);
std::string toUpperCase(const std::string& in);
std::string toLowerCase(const std::string& in);
std::wstring toLowerCase(const std::wstring& in);
template <typename StringType>
bool equalsCaseInsensitive(const std::string& a, const std::string& b);
std::string replace(std::string str, const std::string& from, const std::string& to);
std::wstring replace(std::wstring str, const std::wstring& from, const std::wstring& to);
std::string replaceBetween(const std::string& str, char startDelimiter, char endDelimiter, const std::string& to);
std::wstring replaceBetween(const std::wstring& str, wchar_t startDelimiter, wchar_t endDelimiter, const std::wstring& to);
std::string insertLineBreaksAtBlankSpaces(const std::string& s, size_t maxLineLength);
std::string breakSignature(
std::string returnPart, std::string namePart, std::string paramPart,
size_t maxLineLength, size_t tabWidth);
std::string trim(const std::string &str);
std::wstring trim(const std::wstring &str);
enum ElideMode
{
ELIDE_LEFT,
ELIDE_MIDDLE,
ELIDE_RIGHT
};
std::string elide(const std::string& str, ElideMode mode, size_t size);
std::wstring elide(const std::wstring& str, ElideMode mode, size_t size);
template <typename ContainerType>
ContainerType split(const std::string& str, const std::string& delimiter)
{
size_t pos = 0;
size_t oldPos = 0;
ContainerType c;
do
{
pos = str.find(delimiter, oldPos);
c.push_back(str.substr(oldPos, pos - oldPos));
oldPos = pos + delimiter.size();
} while (pos != std::string::npos);
return c;
}
template <typename ContainerType>
ContainerType split(const std::wstring& str, const std::wstring& delimiter)
{
size_t pos = 0;
size_t oldPos = 0;
ContainerType c;
do
{
pos = str.find(delimiter, oldPos);
c.push_back(str.substr(oldPos, pos - oldPos));
oldPos = pos + delimiter.size();
} while (pos != std::wstring::npos);
return c;
}
template <typename ContainerType>
std::string join(const ContainerType& list, const std::string& delimiter)
{
std::stringstream ss;
bool first = true;
for (const std::string& str : list)
{
if (!first)
{
ss << delimiter;
}
first = false;
ss << str;
}
return ss.str();
}
template <typename ContainerType>
std::wstring join(const ContainerType& list, const std::wstring& delimiter)
{
std::wstringstream ss;
bool first = true;
for (const std::wstring& str : list)
{
if (!first)
{
ss << delimiter;
}
first = false;
ss << str;
}
return ss.str();
}
template <typename StringType>
StringType substrBetween(const StringType& str, const StringType& delimiter1, const StringType& delimiter2)
{
size_t found_delimiter1 = str.find(delimiter1);
found_delimiter1 += delimiter1.length();
size_t found_delimiter2 = str.find(delimiter2, found_delimiter1);
if (found_delimiter1 != str.npos && found_delimiter2 != str.npos)
{
return str.substr(found_delimiter1, found_delimiter2 - found_delimiter1);
}
return StringType();
}
template <typename StringType>
bool isPrefix(const StringType& prefix, const StringType& text)
{
if (prefix.size() <= text.size())
{
std::pair<typename StringType::const_iterator, typename StringType::const_iterator> res =
std::mismatch(prefix.begin(), prefix.end(), text.begin());
return res.first == prefix.end();
}
return false;
}
template <typename StringType>
bool isPostfix(const StringType& postfix, const StringType& text)
{
return text.size() >= postfix.size() && text.rfind(postfix) == (text.size() - postfix.size());
}
template <typename StringType>
bool equalsCaseInsensitive(const StringType& a, const StringType& b)
{
if (a.size() == b.size())
{
return toLowerCase(a) == toLowerCase(b);
}
return false;
}
}
#endif // UTILITY_STRING_H
+5 -5
View File
@@ -71,7 +71,7 @@ std::string Generator::encodeLicense(const std::string& user, const int days)
std::string Generator::encodeLicense(
const std::string& user,
const std::string& licenseType,
const int seats,
size_t numberOfUsers,
const std::string& version
)
{
@@ -93,13 +93,13 @@ std::string Generator::encodeLicense(
Version tempVersion = Version::fromString(version);
if (tempVersion.isValid())
{
createLicense(user, licenseType, tempVersion.toShortString(), seats);
createLicense(user, licenseType, tempVersion.toShortString(), numberOfUsers);
}
}
if (!m_license)
{
createLicense(user, licenseType, getExpireVersion(), seats);
createLicense(user, licenseType, getExpireVersion(), numberOfUsers);
}
@@ -240,12 +240,12 @@ void Generator::createLicense(
const std::string& user,
const std::string& type,
const std::string& expiration,
const unsigned int seats
size_t numberOfUsers
)
{
m_license = std::make_unique<License>();
m_license->createHeader(user, type, expiration, seats);
m_license->createHeader(user, type, expiration, numberOfUsers);
Botan::AutoSeeded_RNG rng;
std::string pass9 = Botan::generate_passhash9(m_license->getExpireLine(), m_rng);
+2 -2
View File
@@ -21,7 +21,7 @@ public:
std::string encodeLicense(
const std::string& user,
const std::string& licenseType,
const int seats = 0,
size_t numberOfUsers = 0,
const std::string& version = ""
);
std::string encodeLicense(
@@ -45,7 +45,7 @@ public:
const std::string& user,
const std::string& type,
const std::string& expiration,
const unsigned int seates
size_t numberOfUsers
);
std::string getExpireVersion(int versions = 4);
+15 -13
View File
@@ -22,7 +22,7 @@ bool process_command_line(int argc, char** argv)
std::string licenseFile = "";
std::string type = "";
int days = 0;
int seats = 0;
int numberOfUsers = 0;
po::options_description modes_description("Sourcetrail Generator Modes");
modes_description.add_options()
@@ -33,7 +33,8 @@ bool process_command_line(int argc, char** argv)
po::options_description keygen_description("Options Keygeneration");
keygen_description.add_options()
("version,v", po::value<std::string>(&version), "Versionnumber (in format 20xx.x) until Sourcetrail valid")
("seats,s", po::value<int>(&seats), "Generate a License, USERNAME as value")
("users,u", po::value<int>(&numberOfUsers), "Number of users")
("seats,s", po::value<int>(&numberOfUsers), "Number of users (prev. seats)")
("licenseType,t", po::value<std::string>(&type), "License Type of ")
("testLicense,e", po::value<int>(&days), "Generates a test license for <value> days");
@@ -83,12 +84,12 @@ bool process_command_line(int argc, char** argv)
Generator keygen;
// make sure there are no negative amount of seats
if (vm.count("seats"))
// make sure there are no negative amount of users
if (vm.count("users") || vm.count("seats"))
{
if (seats < 0)
if (numberOfUsers < 0)
{
std::cout << "Invalid amount of seats. (Must be > 0)" << std::endl;
std::cout << "Invalid amount of users. (Must be > 0)" << std::endl;
return false;
}
}
@@ -113,23 +114,23 @@ bool process_command_line(int argc, char** argv)
keygen.loadPrivateKeyFromString(PRIVATE_KEY);
}
if(vm.count("generate"))
if (vm.count("generate"))
{
if(vm.count("testLicense"))
if (vm.count("testLicense"))
{
keygen.encodeLicense(user,days);
keygen.encodeLicense(user, days);
keygen.printLicenseAndWriteItToFile();
}
else
{
keygen.encodeLicense(user,type,seats,version);
keygen.encodeLicense(user, type, numberOfUsers, version);
keygen.printLicenseAndWriteItToFile();
}
}
if(vm.count("check"))
if (vm.count("check"))
{
if(keygen.verifyLicense())
if (keygen.verifyLicense())
{
std::cout << "License valid" << std::endl;
}
@@ -139,11 +140,12 @@ bool process_command_line(int argc, char** argv)
}
}
}
catch(std::exception& e)
catch (std::exception& e)
{
std::cout << "Exception caught: " << e.what() << std::endl;
return false;
}
return true;
}
+3 -3
View File
@@ -48,7 +48,7 @@ public:
License license;
license.loadFromString(generator.encodeLicense("TestUser", "VolumeLicense", 20));
TS_ASSERT_EQUALS(license.getSeats(), 20);
TS_ASSERT_EQUALS(license.getNumberOfUsers(), 20);
}
void test_create_test_license_and_validate()
@@ -80,11 +80,11 @@ public:
License license;
license.loadFromString(generator.encodeLicense("TestUser", "Private License", 1, "2017.4"));
std::string testInfo = "TestUser\nPrivate License\nValid up to version: 2017.4\n1 Seat";
std::string testInfo = "TestUser\nPrivate License\nValid up to version: 2017.4\n1 user";
TS_ASSERT_EQUALS(license.getLicenseInfo(), testInfo);
license.loadFromString(generator.encodeLicense("TestUser", "Volume License", 20, "2017.3"));
testInfo = "TestUser\nVolume License\nValid up to version: 2017.3\n20 Seats";
testInfo = "TestUser\nVolume License\nValid up to version: 2017.3\n20 users";
TS_ASSERT_EQUALS(license.getLicenseInfo(), testInfo);
license.loadFromString(generator.encodeLicense("TestUser", "Private/Academic Single User License", 0, "2018.1"));