New license parsing, according to fancy flowchart
This commit is contained in:
parent
20b3010e75
commit
8fef68f331
2 changed files with 42 additions and 14 deletions
|
@ -16,6 +16,8 @@ namespace Controller{
|
||||||
uint64_t exitDelay = 0;
|
uint64_t exitDelay = 0;
|
||||||
static JSON::Value currentLicense;
|
static JSON::Value currentLicense;
|
||||||
static uint64_t lastCheck = 0;
|
static uint64_t lastCheck = 0;
|
||||||
|
static int32_t timeOffset = 0;
|
||||||
|
static bool everContactedServer = false;
|
||||||
|
|
||||||
const JSON::Value & getLicense(){
|
const JSON::Value & getLicense(){
|
||||||
return currentLicense;
|
return currentLicense;
|
||||||
|
@ -41,17 +43,19 @@ namespace Controller{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isLicensed(){
|
bool isLicensed(){
|
||||||
uint64_t now = Util::epoch();
|
uint64_t now = Util::epoch() + timeOffset;
|
||||||
#if DEBUG >= DLVL_DEVEL
|
#if DEBUG >= DLVL_DEVEL
|
||||||
INFO_MSG("Verifying license against %llu: %s", now, currentLicense.toString().c_str());
|
INFO_MSG("Verifying license against %llu: %s", now, currentLicense.toString().c_str());
|
||||||
#endif
|
#endif
|
||||||
|
//Print messages for user, if any
|
||||||
if (currentLicense.isMember("user_msg") && currentLicense["user_msg"].asStringRef().size()){
|
if (currentLicense.isMember("user_msg") && currentLicense["user_msg"].asStringRef().size()){
|
||||||
WARN_MSG("%s", currentLicense["user_msg"].asStringRef().c_str());
|
WARN_MSG("%s", currentLicense["user_msg"].asStringRef().c_str());
|
||||||
}
|
}
|
||||||
//The loop below is timechecker loop
|
//Check time
|
||||||
if (!currentLicense.isMember("valid_from") || !currentLicense.isMember("valid_till") || now < currentLicense["valid_from"].asInt() || now > currentLicense["valid_till"].asInt()){
|
if (!currentLicense.isMember("valid_from") || !currentLicense.isMember("valid_till") || now < currentLicense["valid_from"].asInt() || now > currentLicense["valid_till"].asInt()){
|
||||||
return false;//license is expired
|
return false;//license is expired
|
||||||
}
|
}
|
||||||
|
//Check release/version
|
||||||
if (RELEASE != currentLicense["release"].asStringRef() || PACKAGE_VERSION != currentLicense["version"].asStringRef()){
|
if (RELEASE != currentLicense["release"].asStringRef() || PACKAGE_VERSION != currentLicense["version"].asStringRef()){
|
||||||
FAIL_MSG("Could not verify license");
|
FAIL_MSG("Could not verify license");
|
||||||
return false;
|
return false;
|
||||||
|
@ -62,10 +66,10 @@ namespace Controller{
|
||||||
|
|
||||||
bool checkLicense(){
|
bool checkLicense(){
|
||||||
if (!conf.is_active){return true;}
|
if (!conf.is_active){return true;}
|
||||||
if (!currentLicense.isMember("interval")){
|
INFO_MSG("Checking license validity");
|
||||||
currentLicense["interval"] = 3600ll;
|
if(!everContactedServer && !isLicensed()){
|
||||||
|
updateLicense("&expired=1");
|
||||||
}
|
}
|
||||||
INFO_MSG("Checking license time");
|
|
||||||
if(!isLicensed()){
|
if(!isLicensed()){
|
||||||
FAIL_MSG("Not licensed, shutting down");
|
FAIL_MSG("Not licensed, shutting down");
|
||||||
if (currentLicense.isMember("delay") && currentLicense["delay"].asInt()){
|
if (currentLicense.isMember("delay") && currentLicense["delay"].asInt()){
|
||||||
|
@ -137,6 +141,7 @@ namespace Controller{
|
||||||
}
|
}
|
||||||
if (http.Read(updrConn.Received().get())){
|
if (http.Read(updrConn.Received().get())){
|
||||||
response = JSON::fromString(http.body);
|
response = JSON::fromString(http.body);
|
||||||
|
everContactedServer = true;
|
||||||
break; //break out of while loop
|
break; //break out of while loop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -144,11 +149,11 @@ namespace Controller{
|
||||||
updrConn.close();
|
updrConn.close();
|
||||||
|
|
||||||
//read license
|
//read license
|
||||||
readLicense(response["lic_id"].asInt(), response["license"].asStringRef());
|
readLicense(response["lic_id"].asInt(), response["license"].asStringRef(), true);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void readLicense(uint64_t licID, const std::string & input){
|
void readLicense(uint64_t licID, const std::string & input, bool fromServer){
|
||||||
char aesKey[16];
|
char aesKey[16];
|
||||||
if (strlen(SUPER_SECRET) >= 32){
|
if (strlen(SUPER_SECRET) >= 32){
|
||||||
parseKey(SUPER_SECRET SUPER_SECRET + 7,aesKey,16);
|
parseKey(SUPER_SECRET SUPER_SECRET + 7,aesKey,16);
|
||||||
|
@ -169,15 +174,33 @@ namespace Controller{
|
||||||
//verify checksum
|
//verify checksum
|
||||||
if (deCrypted.size() < 33 || Secure::md5(deCrypted.substr(32)) != deCrypted.substr(0,32)){
|
if (deCrypted.size() < 33 || Secure::md5(deCrypted.substr(32)) != deCrypted.substr(0,32)){
|
||||||
WARN_MSG("Could not decode license");
|
WARN_MSG("Could not decode license");
|
||||||
Storage.removeMember("license");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
currentLicense = JSON::fromString(deCrypted.substr(32));
|
JSON::Value newLicense = JSON::fromString(deCrypted.substr(32));
|
||||||
if (RELEASE != currentLicense["release"].asStringRef() || PACKAGE_VERSION != currentLicense["version"].asStringRef()){
|
if (RELEASE != newLicense["release"].asStringRef() || PACKAGE_VERSION != newLicense["version"].asStringRef()){
|
||||||
FAIL_MSG("Could not verify license");
|
FAIL_MSG("Could not verify license");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fromServer){
|
||||||
|
uint64_t localTime = Util::epoch();
|
||||||
|
uint64_t remoteTime = newLicense["time"].asInt();
|
||||||
|
if (localTime > remoteTime + 60){
|
||||||
|
WARN_MSG("Your computer clock is %u seconds ahead! Please ensure your computer clock is set correctly.", localTime - remoteTime);
|
||||||
|
}
|
||||||
|
if (localTime < remoteTime - 60){
|
||||||
|
WARN_MSG("Your computer clock is %u seconds late! Please ensure your computer clock is set correctly.", remoteTime - localTime);
|
||||||
|
}
|
||||||
|
timeOffset = remoteTime - localTime;
|
||||||
|
|
||||||
|
if (newLicense.isMember("plid") && newLicense["plid"] != currentLicense["lic_id"]){
|
||||||
|
FAIL_MSG("Could not verify license ID");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
currentLicense = newLicense;
|
||||||
|
|
||||||
//Store license here.
|
//Store license here.
|
||||||
if (currentLicense["store"].asBool()){
|
if (currentLicense["store"].asBool()){
|
||||||
if (Storage["license"].asStringRef() != input){
|
if (Storage["license"].asStringRef() != input){
|
||||||
|
@ -190,13 +213,18 @@ namespace Controller{
|
||||||
|
|
||||||
void licenseLoop(void * np){
|
void licenseLoop(void * np){
|
||||||
while (conf.is_active){
|
while (conf.is_active){
|
||||||
if (Util::epoch() - lastCheck > currentLicense["interval"].asInt()){
|
uint64_t interval = currentLicense["interval"].asInt();
|
||||||
updateLicense();
|
if (Util::epoch() - lastCheck > (interval?interval:3600)){
|
||||||
|
if (interval){
|
||||||
|
updateLicense();
|
||||||
|
}
|
||||||
checkLicense();
|
checkLicense();
|
||||||
}
|
}
|
||||||
Util::sleep(1000);//sleep a bit
|
Util::sleep(1000);//sleep a bit
|
||||||
}
|
}
|
||||||
updateLicense("&shutdown=1");
|
if (everContactedServer){
|
||||||
|
updateLicense("&shutdown=1");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ namespace Controller{
|
||||||
bool checkLicense(); //Call from Mainloop.
|
bool checkLicense(); //Call from Mainloop.
|
||||||
void updateLicense(const std::string & extra = ""); //retrieves update from license server
|
void updateLicense(const std::string & extra = ""); //retrieves update from license server
|
||||||
void licenseLoop(void * np);
|
void licenseLoop(void * np);
|
||||||
void readLicense(uint64_t licId, const std::string & input); //checks/interprets license
|
void readLicense(uint64_t licId, const std::string & input, bool fromServer = false); //checks/interprets license
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue