From e24c5e05d6ab923f1d9ee22d0fdafb893d9732b1 Mon Sep 17 00:00:00 2001
From: lurumdare <8020186+lurumdare@users.noreply.github.com>
Date: 周六, 07 9月 2019 22:00:55 +0800
Subject: [PATCH] NULL to nullptr (#34)

---
 src/tools/license-generator/license-generator.cpp |  111 +++++++++++++++++++++++++++++--------------------------
 1 files changed, 58 insertions(+), 53 deletions(-)

diff --git a/src/tools/license-generator/license-generator.cpp b/src/tools/license-generator/license-generator.cpp
index 846d5d9..a2b70e5 100644
--- a/src/tools/license-generator/license-generator.cpp
+++ b/src/tools/license-generator/license-generator.cpp
@@ -1,12 +1,13 @@
 #include <build_properties.h>
-#include "LicenseSigner.h"
+#include <private-key.h>
 #include "license-generator.h"
-#include "../library/base/StringUtils.h"
+#include "../base_lib/CryptoHelper.h"
 #include <stdlib.h>
 #include <stdio.h>
 #include <iostream>
 #include <string.h>
 #include <iostream>
+#include <string.h>
 #include <boost/date_time.hpp>
 #include <boost/program_options.hpp>
 #include <boost/algorithm/string.hpp>
@@ -39,46 +40,51 @@
 
 po::options_description LicenseGenerator::configureProgramOptions() {
 	po::options_description common("General options");
-	common.add_options()("help,h", "print help message and exit.") //
-	("verbose,v", "print more information.") //
-	("output,o", po::value<string>(), "Output file name. If not specified the "
-			"license will be printed in standard output"); //
+	common.add_options()
+		("help,h", "print help message and exit.")
+		("verbose,v", "print more information.")
+		("output,o", po::value<string>(), "Output file name. If not specified the "
+			"license will be printed in standard output")
+		;
 	po::options_description licenseGeneration("License Generation");
-	licenseGeneration.add_options()("private_key,p", po::value<string>(),
+	licenseGeneration.add_options()
+		("private_key,p", po::value<string>(),
 			"Specify an alternate file for the primary key to be used. "
-					"If not specified the internal primary key will be used.") //
-	("begin_date,b", po::value<string>(),
+					"If not specified the internal primary key will be used.")
+		("begin_date,b", po::value<string>(),
 			"Specify the start of the validity for this license. "
-					" Format YYYYMMDD. If not specified defaults to today") //
-	("expire_date,e", po::value<string>(),
+					" Format YYYYMMDD. If not specified defaults to today")
+		("expire_date,e", po::value<string>(),
 			"Specify the expire date for this license. "
-					" Format YYYYMMDD. If not specified the license won't expire") //
-	("client_signature,s", po::value<string>(),
+					" Format YYYYMMDD. If not specified the license won't expire")
+		("client_signature,s", po::value<string>(),
 			"The signature of the pc that requires the license. "
 					"It should be in the format XXXX-XXXX-XXXX-XXXX."
 					" If not specified the license "
-					"won't be linked to a specific pc.") //
-	("start_version,t", po::value<unsigned int>()->default_value(0
-	/*FullLicenseInfo.UNUSED_SOFTWARE_VERSION*/, "All Versions"),
-			"Specify the first version of the software this license apply to.") //
-	("end_version,n", po::value<unsigned int>()->default_value(0
-	/*FullLicenseInfo.UNUSED_SOFTWARE_VERSION*/, "All Versions"),
-			"Specify the last version of the software this license apply to."); //
+					"won't be linked to a specific pc.")
+		("start_version,t", po::value<unsigned int>()->default_value(0
+			/*FullLicenseInfo.UNUSED_SOFTWARE_VERSION*/, "All Versions"),
+			"Specify the first version of the software this license apply to.")
+		("end_version,n", po::value<unsigned int>()->default_value(0
+			/*FullLicenseInfo.UNUSED_SOFTWARE_VERSION*/, "All Versions"),
+			"Specify the last version of the software this license apply to.")
+		("extra_data,x", po::value<string>(), "Specify extra data to be included into the license")
+		;
 	po::options_description visibleOptions;
 	visibleOptions.add(common).add(licenseGeneration);
 	return visibleOptions;
 }
 
 vector<FullLicenseInfo> LicenseGenerator::parseLicenseInfo(
-		po::variables_map vm) {
+		const po::variables_map& vm) {
 	string begin_date = FullLicenseInfo::UNUSED_TIME;
 	string end_date = FullLicenseInfo::UNUSED_TIME;
 	if (vm.count("expire_date")) {
 		const std::string dt_end = vm["expire_date"].as<string>();
 		try {
-			end_date = normalize_date(dt_end.c_str());
+			end_date = normalize_date(dt_end);
 			char curdate[20];
-			time_t curtime = time(NULL);
+			time_t curtime = time(nullptr);
 			strftime(curdate, 20, "%Y-%m-%d", localtime(&curtime));
 			begin_date.assign(curdate);
 		} catch (const invalid_argument &e) {
@@ -90,7 +96,7 @@
 	if (vm.count("begin_date")) {
 		const std::string begin_date_str = vm["begin_date"].as<string>();
 		try {
-			begin_date = normalize_date(begin_date_str.c_str());
+			begin_date = normalize_date(begin_date_str);
 		} catch (invalid_argument &e) {
 			cerr << endl << "Begin date not recognized: " << begin_date_str
 					<< " Please enter a valid date in format YYYYMMDD" << endl;
@@ -101,24 +107,23 @@
 	string client_signature = "";
 	if (vm.count("client_signature")) {
 		client_signature = vm["client_signature"].as<string>();
-		//fixme match + and /
-		/*regex e("(A-Za-z0-9){4}-(A-Za-z0-9){4}-(A-Za-z0-9){4}-(A-Za-z0-9){4}");
+		cout << "cli sig:" << client_signature;
+		regex e("[A-Za-z0-9\\+/]{4}-[A-Za-z0-9\\+/]{4}-[A-Za-z0-9\\+/]{4}-[A-Za-z0-9\\+/]{4}");
+		cout << "\nregex:";
 		if (!regex_match(client_signature, e)) {
 			cerr << endl << "Client signature not recognized: "
-					<< client_signature
-					<< " Please enter a valid signature in format XXXX-XXXX-XXXX-XXXX"
-					<< endl;
+				<< client_signature
+				<< " Please enter a valid signature in format XXXX-XXXX-XXXX-XXXX"
+				<< endl;
 			exit(2);
-		}*/
+		}
 	}
 	string extra_data = "";
 	if (vm.count("extra_data")) {
 		extra_data = vm["extra_data"].as<string>();
 	}
-	unsigned int from_sw_version = vm["start_version"].as<
-			unsigned int>();
-	unsigned int to_sw_version =
-			vm["end_version"].as<unsigned int>();
+	unsigned int from_sw_version = vm["start_version"].as<unsigned int>();
+	unsigned int to_sw_version = vm["end_version"].as<unsigned int>();
 	if (vm.count("product") == 0) {
 		cerr << endl << "Parameter [product] not found. " << endl;
 		exit(2);
@@ -140,12 +145,13 @@
 void LicenseGenerator::generateAndOutputLicenses(const po::variables_map& vm,
 		ostream& outputFile) {
 	vector<FullLicenseInfo> licenseInfo = parseLicenseInfo(vm);
-	license::LicenseSigner licSigner =
-			vm.count("private_key") == 0 ?
-					license::LicenseSigner() :
-					license::LicenseSigner(vm["private_key"].as<string>());
+	const unique_ptr<CryptoHelper> helper = CryptoHelper::getInstance();
+	const char pkey[] = PRIVATE_KEY;
+	const size_t len = sizeof(pkey);
 	for (auto it = licenseInfo.begin(); it != licenseInfo.end(); ++it) {
-		licSigner.signLicense(*it);
+		const string license = it->printForSign();
+		const string signature = helper->signString((const void *)pkey,len,license);
+		it->license_signature = signature;
 		it->printAsIni(outputFile);
 	}
 }
@@ -153,7 +159,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");
@@ -174,7 +180,7 @@
 	if (vm.count("output")) {
 		const std::string fname = vm["output"].as<string>();
 
-		fstream ofstream(fname, std::ios::out | std::ios::trunc);
+		fstream ofstream(fname, std::ios::out | std::ios::app);
 		if (!ofstream.is_open()) {
 			cerr << "can't open file [" << fname << "] for output." << endl
 					<< " error: " << strerror( errno);
@@ -188,26 +194,25 @@
 	return 0;
 }
 
-
-const std::string formats[] = { "%4u-%2u-%2u","%4u/%2u/%2u","%4u%2u%2u" };
+const std::string formats[] = { "%4u-%2u-%2u", "%4u/%2u/%2u", "%4u%2u%2u" };
 const size_t formats_n = 3;
 
-string LicenseGenerator::normalize_date(const char * s) {
+string LicenseGenerator::normalize_date(const std::string& sDate) {
+	if(sDate.size()<8)
+		throw invalid_argument("Date string too small for known formats");
 	unsigned int year, month, day;
-	int chread;
 	bool found = false;
-	for (size_t i = 0; i < formats_n &&!found; ++i) {
-		chread = sscanf(s, formats[i].c_str(),&year, &month, &day);
-		if (chread == 3){
+	for (size_t i = 0; i < formats_n && !found; ++i) {
+		const int chread = sscanf(sDate.c_str(),formats[i].c_str(),&year,&month,&day);
+		if(chread==3) {
 			found = true;
+			break;
 		}
 	}
-	if (!found){
-		throw invalid_argument("Date not recognized.");
-	}
+	if(!found)
+		throw invalid_argument("Date string did not match a known format");
 	ostringstream oss;
-	oss << year << "-"<<setfill('0') << std::setw(2)<< month<<"-"<<day;
-	//delete (facet);
+	oss << year << "-" << setfill('0') << std::setw(2) << month << "-" << setfill('0') << std::setw(2) << day;
 	return oss.str();
 }
 }

--
Gitblit v1.9.1