gcontini
2020-10-24 7e4e14dde5fbfade46311fbf75386d5371062d7d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
 * LicenseReader.cpp
 *
 *  Created on: Mar 30, 2014
 *
 */
 
#ifdef _WIN32
#pragma warning(disable : 4786)
#else
#include <unistd.h>
#endif
 
#include <cstring>
#include <ctime>
#include <vector>
#include <iostream>
#include <iterator>
#include <fstream>
#include <sstream>
 
#include <stdlib.h>
#include <math.h>
 
#include <licensecc/licensecc.h>
 
#include "base/base.h"
#include "LicenseReader.hpp"
#include "base/string_utils.h"
#include "base/logger.h"
#include "locate/LocatorFactory.hpp"
 
namespace license {
using namespace std;
 
FullLicenseInfo::FullLicenseInfo(const string &source, const string &product, const string &license_signature)
    : source(source),
      m_project(product),  //
      license_signature(license_signature),
      m_magic(0) {}
 
LicenseReader::LicenseReader(const LicenseLocation *licenseLocation) : licenseLocation(licenseLocation) {}
 
EventRegistry LicenseReader::readLicenses(const string &product, vector<FullLicenseInfo> &licenseInfoOut) const {
    vector<unique_ptr<locate::LocatorStrategy>> locator_strategies;
    FUNCTION_RETURN ret = locate::LocatorFactory::get_active_strategies(locator_strategies, licenseLocation);
    EventRegistry eventRegistry;
    if (ret != FUNC_RET_OK) {
        eventRegistry.addEvent(LICENSE_FILE_NOT_FOUND);
        eventRegistry.turnWarningsIntoErrors();
        return eventRegistry;
    }
 
    bool atLeastOneLicenseComplete = false;
    const string product_up = toupper_copy(product);
    const char *productNamePtr = product_up.c_str();
    for (unique_ptr<locate::LocatorStrategy> &locator : locator_strategies) {
        vector<string> licenseLocations = locator->license_locations(eventRegistry);
        if (licenseLocations.size() == 0) {
            continue;
        }
        CSimpleIniA ini;
        for (auto it = licenseLocations.begin(); it != licenseLocations.end(); it++) {
            ini.Reset();
            const string license = locator->retrieve_license_content((*it).c_str());
            const SI_Error rc = ini.LoadData(license.c_str(), license.size());
            if (rc < 0) {
                eventRegistry.addEvent(FILE_FORMAT_NOT_RECOGNIZED, *it);
                continue;
            }
            const int sectionSize = ini.GetSectionSize(productNamePtr);
            if (sectionSize <= 0) {
                eventRegistry.addEvent(PRODUCT_NOT_LICENSED, *it);
                continue;
            } else {
                eventRegistry.addEvent(PRODUCT_FOUND, *it);
            }
            /*
             *  sw_version_from = (optional int)
             *  sw_version_to = (optional int)
             *  from_date = YYYY-MM-DD (optional)
             *  to_date  = YYYY-MM-DD (optional)
             *  client_signature = XXXX-XXXX-XXXX (optional string 16)
             *  sig = XXXXXXXXXX (mandatory, 1024)
             *  application_data = xxxxxxxxx (optional string 16)
             */
            const char *license_signature = ini.GetValue(productNamePtr, LICENSE_SIGNATURE, nullptr);
            long license_version = ini.GetLongValue(productNamePtr, LICENSE_VERSION, -1);
            if (license_signature != nullptr && license_version == 200) {
                CSimpleIniA::TNamesDepend keys;
                ini.GetAllKeys(productNamePtr, keys);
                FullLicenseInfo licInfo(*it, product, license_signature);
                for (auto &it : keys) {
                    licInfo.m_limits[it.pItem] = ini.GetValue(productNamePtr, it.pItem, nullptr);
                }
                licenseInfoOut.push_back(licInfo);
                atLeastOneLicenseComplete = true;
            } else {
                eventRegistry.addEvent(LICENSE_MALFORMED, *it);
            }
        }
    }
    if (!atLeastOneLicenseComplete) {
        eventRegistry.turnWarningsIntoErrors();
    }
    return eventRegistry;
}
 
LicenseReader::~LicenseReader() {}
 
string FullLicenseInfo::printForSign() const {
    ostringstream oss;
    oss << toupper_copy(trim_copy(m_project));
    for (auto &it : m_limits) {
        if (it.first != LICENSE_SIGNATURE) {
            oss << trim_copy(it.first) << trim_copy(it.second);
        }
    }
 
#ifndef NDEBUG
    cout << "license to sign [" << oss.str() << "]" << endl;
#endif
    return oss.str();
}
 
}  // namespace license