Jan Willamowius
2019-04-22 4093b38f678b4d253b610f3439adb9e950e37c92
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>
@@ -70,13 +71,13 @@
}
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);
         strftime(curdate, 20, "%Y-%m-%d", localtime(&curtime));
@@ -90,7 +91,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 +102,21 @@
   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}");
      regex e("[A-Za-z0-9\\+/]{4}-[A-Za-z0-9\\+/]{4}-[A-Za-z0-9\\+/]{4}-[A-Za-z0-9\\+/]{4}");
      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 +138,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>());
   unique_ptr<CryptoHelper> helper = CryptoHelper::getInstance();
   const char pkey[] = PRIVATE_KEY;
   size_t len = sizeof(pkey);
   for (auto it = licenseInfo.begin(); it != licenseInfo.end(); ++it) {
      licSigner.signLicense(*it);
      const string license = it->printForSign();
      string signature = helper->signString((const void *)pkey,len,license);
      it->license_signature = signature;
      it->printAsIni(outputFile);
   }
}
@@ -153,7 +152,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");
@@ -188,26 +187,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();
}
}