From 225d8fab15a08dcde221396b673bb304f8200c3a Mon Sep 17 00:00:00 2001
From: Maximilien Siavelis <m@siav.pw>
Date: 周日, 21 4月 2019 22:43:06 +0800
Subject: [PATCH] Merge pull request #19 from willamowius/master

---
 src/tools/license-generator/license-generator.cpp |    2 +-
 example/example.cpp                               |   30 +++++++++++++++++++++---------
 src/tools/bootstrap/bootstrap.cpp                 |   12 ++++++++++++
 README.md                                         |    4 ++--
 4 files changed, 36 insertions(+), 12 deletions(-)

diff --git a/README.md b/README.md
index 88c64b4..85649a0 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 # Open License Manager
 ![Build Status](https://travis-ci.org/open-license-manager/open-license-manager.png "Build Status")
 
-A lincense manager written in C/C++ for Windows and Linux environments.
+A license manager written in C/C++ for Windows and Linux environments.
 
 It allows to protect the software you develop from unauthorized copies,
 limit the usage in time, to a specific set of machines, or prevent the usage in 
@@ -15,7 +15,7 @@
 these modules are planned....
  * a license [backoffice](../../issues/7) in php (in order to handle multiple licenses).
  * a license debugger to be sent to the final customer when there are licensing problems. 
- * a [log decriptor](../../issues/8) in order to decrypt logs generated by the license system.
+ * a [log descriptor](../../issues/8) in order to decrypt logs generated by the license system.
 
 You can notice 2 more sub-projects:
  * bootstrap: allows to generate private keys and modify the library on the fly after the downloading.
diff --git a/example/example.cpp b/example/example.cpp
index d8af95f..173d733 100644
--- a/example/example.cpp
+++ b/example/example.cpp
@@ -2,6 +2,7 @@
 #include <map>
 #include "api/license++.h"
 #include "pc-identifiers.h"
+#include "../../src/library/ini/SimpleIni.h"
 
 using namespace std;
 
@@ -15,11 +16,11 @@
     stringByEventType[FILE_FORMAT_NOT_RECOGNIZED      ] = "license file has invalid format (not .ini file) ";
     stringByEventType[LICENSE_MALFORMED               ] = "some mandatory field are missing, or data can't be fully read. ";
     stringByEventType[PRODUCT_NOT_LICENSED            ] = "this product was not licensed ";
-    stringByEventType[PRODUCT_EXPIRED                 ] = "licence expired ";
+    stringByEventType[PRODUCT_EXPIRED                 ] = "license expired ";
     stringByEventType[LICENSE_CORRUPTED               ] = "license signature didn't match with current license ";
     stringByEventType[IDENTIFIERS_MISMATCH            ] = "Calculated identifier and the one provided in license didn't match";
-    stringByEventType[LICENSE_FILE_FOUND              ] = "licence file not found ";
-    stringByEventType[LICENSE_VERIFIED                ] = "licence verified ";
+    stringByEventType[LICENSE_FILE_FOUND              ] = "license file not found ";
+    stringByEventType[LICENSE_VERIFIED                ] = "license verified ";
     
     const string licLocation("example.lic");
     
@@ -29,16 +30,27 @@
     licenseLocation.licenseFileLocation = licLocation.c_str();
     licenseLocation.environmentVariableName = "";
     EVENT_TYPE result = acquire_license("example", licenseLocation, &licenseInfo);
-    
-    if (result != LICENSE_OK){
-        PcSignature signature;
-        FUNCTION_RETURN generate_ok = generate_user_pc_signature(signature, ETHERNET);
-        
+    PcSignature signature;
+    FUNCTION_RETURN generate_ok = generate_user_pc_signature(signature, ETHERNET);
+
+	if (result == LICENSE_OK && licenseInfo.linked_to_pc) {
+        CSimpleIniA ini;
+    	SI_Error rc = ini.LoadFile(licLocation.c_str());
+        string IDinLicense = ini.GetValue("example", "client_signature", "");
+		if (IDinLicense == "") {
+            cout << "No client signature in license file, generate license with -s <id>";
+			result = IDENTIFIERS_MISMATCH;
+		} else if (IDinLicense != signature) {
+			result = IDENTIFIERS_MISMATCH;
+		}
+	}
+
+    if (result != LICENSE_OK) {
         cout << "license ERROR :" << endl;
         cout << "    " << stringByEventType[result].c_str() << endl;
         cout << "the pc signature is :" << endl;
         cout << "    " << signature << endl;
     }
     else
-        cout << "licence OK" << endl;
+        cout << "license OK" << endl;
 }
diff --git a/src/tools/bootstrap/bootstrap.cpp b/src/tools/bootstrap/bootstrap.cpp
index 6b22d59..4af84e9 100644
--- a/src/tools/bootstrap/bootstrap.cpp
+++ b/src/tools/bootstrap/bootstrap.cpp
@@ -3,6 +3,7 @@
 #include <string>
 #include <stdlib.h>
 #include <iostream> 
+#include <sys/stat.h>
 
 using namespace std;
 namespace license {
@@ -73,6 +74,12 @@
 }
 }
 
+bool file_exists (const std::string & name)
+{
+  struct stat buffer;
+  return (stat (name.c_str(), &buffer) == 0);
+}
+
 int main(int argc, char** argv) {
 
 	if (argc != 3) {
@@ -87,6 +94,11 @@
 	string private_fname = string(argv[1]);
 	string public_fname(argv[2]);
 
+	if (file_exists(private_fname) || file_exists(public_fname)) {
+		printf("Key files exist, skipping key generation. Do 'make clean' to generate new keys.\n");
+		exit(0);
+	}
+
 	license::generatePk(private_fname, public_fname);
 	return 0;
 }
diff --git a/src/tools/license-generator/license-generator.cpp b/src/tools/license-generator/license-generator.cpp
index e929748..3b331ef 100644
--- a/src/tools/license-generator/license-generator.cpp
+++ b/src/tools/license-generator/license-generator.cpp
@@ -153,7 +153,7 @@
 int LicenseGenerator::generateLicense(int argc, const char **argv) {
 
 	po::options_description visibleOptions = configureProgramOptions();
-	//positional options must be addedd to standard options
+	//positional options must be added to standard options
 	po::options_description allOptions;
 	allOptions.add(visibleOptions).add_options()("product",
 			po::value<vector<string>>(), "product names");

--
Gitblit v1.9.1