open-license-manager
2014-08-04 cd53d13fd12f8dd86514b2894e62ee6612566975
linux tests ok
6个文件已修改
331 ■■■■■ 已修改文件
.cproject 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.project 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/library/api/datatypes.h 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/library/pc-identifiers.c 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test/functional/CMakeLists.txt 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test/functional/volid_test.cpp 155 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.cproject
@@ -18,7 +18,11 @@
                    <folderInfo id="cdt.managedbuild.toolchain.gnu.base.1941555127.38772218" name="/" resourcePath="">
                        <toolChain errorParsers="" id="cdt.managedbuild.toolchain.gnu.base.1610910832" name="cdt.managedbuild.toolchain.gnu.base" nonInternalBuilderId="cdt.managedbuild.target.gnu.builder.base" superClass="cdt.managedbuild.toolchain.gnu.base">
                            <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="cdt.managedbuild.target.gnu.platform.base.333980180" name="Debug Platform" osList="linux,hpux,aix,qnx" superClass="cdt.managedbuild.target.gnu.platform.base"/>
                            <builder buildPath="${workspace_loc:/license-manager-cpp/build/linux}" enableAutoBuild="true" enabledIncrementalBuild="true" id="cdt.managedbuild.target.gnu.builder.base.834186429" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.target.gnu.builder.base"/>
                            <builder buildPath="${workspace_loc:/license-manager-cpp/build/linux}" enableAutoBuild="true" enabledIncrementalBuild="true" id="cdt.managedbuild.target.gnu.builder.base.834186429" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.target.gnu.builder.base">
                                <outputEntries>
                                    <entry excluding="src/**" flags="VALUE_WORKSPACE_PATH" kind="outputPath" name=""/>
                                </outputEntries>
                            </builder>
                            <tool id="cdt.managedbuild.tool.gnu.archiver.base.1063978701" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
                            <tool errorParsers="org.eclipse.cdt.core.GCCErrorParser" id="cdt.managedbuild.tool.gnu.cpp.compiler.base.1465609732" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.base">
                                <option id="gnu.cpp.compiler.option.preprocessor.def.1664583179" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
@@ -69,6 +73,7 @@
    <storageModule moduleId="refreshScope" versionNumber="2">
        <configuration configurationName="Default">
            <resource resourceType="FOLDER" workspacePath="/license-manager-cpp/build/linux"/>
            <resource resourceType="FOLDER" workspacePath="/license-manager-cpp/build"/>
        </configuration>
    </storageModule>
    <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings">
.project
@@ -6,13 +6,13 @@
    </projects>
    <buildSpec>
        <buildCommand>
            <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
            <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
            <triggers>full,incremental,</triggers>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
            <triggers>full,incremental,</triggers>
            <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
src/library/api/datatypes.h
@@ -42,11 +42,11 @@
    LICENSE_FILE_FOUND = 100,
    LICENSE_VERIFIED = 101
}  EVENT_TYPE;
} EVENT_TYPE;
typedef enum {
    LOCAL, REMOTE //remote licenses are not supported now.
}  LICENSE_TYPE;
} LICENSE_TYPE;
typedef enum {
    INFO, SEVERITY_WARN, SEVERITY_ERROR
@@ -61,8 +61,7 @@
typedef struct {
    const char *licenseFileLocation;
    const char *environmentVariableName;
    bool openFileNearModule;
    const char *environmentVariableName;bool openFileNearModule;
} LicenseLocation;
typedef struct {
@@ -77,9 +76,7 @@
     * can be '\0' if the software don't expire
     * */
    char expiry_date[11];
    unsigned int days_left;
    bool has_expiry;
    bool linked_to_pc;
    unsigned int days_left;bool has_expiry;bool linked_to_pc;
    LICENSE_TYPE license_type; // Local or Remote
    /* A string of character inserted into the license understood
     * by the calling application.
@@ -93,7 +90,13 @@
 * in most cases.
 */
typedef enum {
    DEFAULT, ETHERNET, IP_ADDRESS, DISK_NUM, PLATFORM_SPECIFIC, STRATEGY_UNKNOWN
    DEFAULT,
    ETHERNET,
    IP_ADDRESS,
    DISK_NUM,
    DISK_LABEL,
    PLATFORM_SPECIFIC,
    STRATEGY_UNKNOWN
} IDENTIFICATION_STRATEGY;
#ifdef __cplusplus
src/library/pc-identifiers.c
@@ -13,103 +13,55 @@
#include "base/base64.h"
#include <valgrind/memcheck.h>
FUNCTION_RETURN generate_ethernet_pc_id(PcIdentifier * identifiers,
        unsigned int * num_identifiers, bool use_mac);
static void encodeStrategy(PcIdentifier * identifier,
        IDENTIFICATION_STRATEGY strategy);
static FUNCTION_RETURN generate_platform_specific_pc_id(
        PcIdentifier * identifiers, unsigned int * num_identifiers);
static FUNCTION_RETURN generate_default_pc_id(PcIdentifier * identifiers,
        unsigned int * num_identifiers) {
    size_t adapter_num, disk_num, plat_spec_id;
    FUNCTION_RETURN result_adapterInfos, result_diskinfos, result_plat_spec;
    unsigned int required_id_size, current_identifier, i, j, k;
    size_t adapter_num, disk_num;
    FUNCTION_RETURN result_adapterInfos, result_diskinfos;
    unsigned int required_id_size, i, j, k;
    DiskInfo * diskInfos;
    AdapterInfo *adapterInfos;
    required_id_size = 0;
    //just calculate the number of required identifiers
    result_plat_spec = generate_platform_specific_pc_id(NULL, &plat_spec_id);
    if (result_plat_spec == OK) {
        required_id_size += 1;
    }
    result_adapterInfos = getAdapterInfos(NULL, &adapter_num);
    if (result_adapterInfos != OK) {
        //call generate_disk_pc_id;
        return result_adapterInfos;
    }
    result_diskinfos = getDiskInfos(NULL, &disk_num);
    if (result_diskinfos == OK && result_adapterInfos == OK) {
        required_id_size += disk_num * adapter_num;
    } else if (result_adapterInfos == OK) {
        required_id_size += adapter_num;
    } else if (result_diskinfos == OK) {
        required_id_size += disk_num;
    if (result_diskinfos == OK) {
        required_id_size = disk_num * adapter_num;
    } else {
        required_id_size = disk_num;
    }
    int defined_identifiers = *num_identifiers;
    *num_identifiers = required_id_size;
    if (identifiers == NULL) {
        *num_identifiers = required_id_size;
        return OK;
    } else if (required_id_size > defined_identifiers) {
        return BUFFER_TOO_SMALL;
    }
    //calculate the identifiers
    current_identifier = 0;
    if (result_plat_spec == OK) {
        generate_platform_specific_pc_id(identifiers, 1);
        current_identifier += 1;
    }
    if (result_diskinfos == OK && result_adapterInfos == OK) {
        diskInfos = (DiskInfo*) malloc(disk_num * sizeof(DiskInfo));
        result_diskinfos = getDiskInfos(diskInfos, &disk_num);
        adapterInfos = (AdapterInfo*) malloc(adapter_num * sizeof(AdapterInfo));
        result_adapterInfos = getAdapterInfos(adapterInfos, &adapter_num);
        for (i = 0; i < disk_num; i++) {
            for (j = 0; j < adapter_num; j++) {
                if (current_identifier > defined_identifiers) {
                    break;
                }
                for (k = 0; k < 6; k++) {
                    identifiers[current_identifier][k] = diskInfos[i].disk_sn[k
                            + 2] ^ adapterInfos[j].mac_address[k + 2];
                }
                encodeStrategy(&identifiers[current_identifier], DEFAULT);
                current_identifier++;
            }
    diskInfos = (DiskInfo*) malloc(disk_num * sizeof(DiskInfo));
    result_diskinfos = getDiskInfos(diskInfos, &disk_num);
    adapterInfos = (AdapterInfo*) malloc(adapter_num * sizeof(AdapterInfo));
    result_adapterInfos = getAdapterInfos(adapterInfos, &adapter_num);
    for (i = 0; i < disk_num; i++) {
        for (j = 0; j < adapter_num; j++) {
            for (k = 0; k < 6; k++)
                identifiers[i * adapter_num + j][k] =
                        diskInfos[i].disk_sn[k + 2]
                                ^ adapterInfos[j].mac_address[k + 2];
        }
        free(diskInfos);
        free(adapterInfos);
    } else if (result_adapterInfos == OK) {
        i=defined_identifiers-current_identifier;
        return generate_ethernet_pc_id(&identifiers[current_identifier],
                &i, true);
    } else if (result_diskinfos == OK) {
        i=defined_identifiers-current_identifier;
        return generate_disk_pc_id(&identifiers[current_identifier],
                &i, false);
    }
    free(diskInfos);
    free(adapterInfos);
    return OK;
}
static void encodeStrategy(PcIdentifier * identifier,
        IDENTIFICATION_STRATEGY strategy) {
    unsigned char strategy_num = strategy << 5;
    identifier[0][0] = (identifier[0][0] & 15)
                    ++     | strategy_num;
}
static FUNCTION_RETURN generate_platform_specific_pc_id(
           * identifiers, unsigned int * num_identifiers) {
}
static FUNCTION_RETURN generate_ethernet_pc_id(PcIdentifier * identifiers,
        unsigned int * num_identifiers, bool use_mac) {
    size_t adapters;
    FUNCTION_RETURN result_adapterInfos;
    unsigned int j, k;
    unsigned int i, j, k;
    AdapterInfo *adapterInfos;
    result_adapterInfos = getAdapterInfos(NULL, &adapters);
@@ -147,9 +99,9 @@
static FUNCTION_RETURN generate_disk_pc_id(PcIdentifier * identifiers,
        unsigned int * num_identifiers, bool use_label) {
    size_t disk_num, available_disk_info = 0;
    size_t disk_num, available_disk_info=0;
    FUNCTION_RETURN result_diskinfos;
    unsigned int i, j;
    unsigned int i, k, j;
    char firstChar;
    DiskInfo * diskInfos;
@@ -158,7 +110,7 @@
        return result_diskinfos;
    }
    diskInfos = (DiskInfo*) malloc(disk_num * sizeof(DiskInfo));
//memset(diskInfos,0,disk_num * sizeof(DiskInfo));
    //memset(diskInfos,0,disk_num * sizeof(DiskInfo));
    result_diskinfos = getDiskInfos(diskInfos, &disk_num);
    if (result_diskinfos != OK) {
        free(diskInfos);
@@ -179,19 +131,17 @@
        return BUFFER_TOO_SMALL;
    }
    j = 0;
    j=0;
    for (i = 0; i < disk_num; i++) {
        if (use_label) {
            if (diskInfos[i].label[0] != 0) {
                memset(identifiers[j], 0, sizeof(PcIdentifier)); //!!!!!!!
                strncpy(identifiers[j], diskInfos[i].label,
                        sizeof(PcIdentifier));
        if(use_label){
            if(diskInfos[i].label[0]!=0){
                memset(identifiers[j],0,sizeof(PcIdentifier)); //!!!!!!!
                strncpy(identifiers[j],diskInfos[i].label,sizeof(PcIdentifier));
                j++;
            }
        } else {
            if (diskInfos[i].disk_sn[0] != 0) {
                memcpy(identifiers[j], &diskInfos[i].disk_sn[2],
                        sizeof(PcIdentifier));
        }else{
            if(diskInfos[i].disk_sn[0]!=0){
                memcpy(identifiers[j],&diskInfos[i].disk_sn[2],sizeof(PcIdentifier));
                j++;
            }
        }
@@ -234,14 +184,19 @@
    case DISK_NUM:
        result = generate_disk_pc_id(identifiers, array_size, false);
        break;
    case PLATFORM_SPECIFIC:
        result = generate_platform_specific_pc_id(identifiers, array_size);
    case DISK_LABEL:
        result = generate_disk_pc_id(identifiers, array_size, true);
        break;
    default:
        return ERROR;
    }
    if (result == OK && identifiers != NULL) {
        strategy_num = strategy << 5;
        for (i = 0; i < *array_size; i++) {
            //encode strategy in the first three bits of the pc_identifier
            identifiers[i][0] = (identifiers[i][0] & 15) | strategy_num;
        }
        //fill array if larger
        for (i = *array_size; i < original_array_size; i++) {
            identifiers[i][0] = STRATEGY_UNKNOWN << 5;
test/functional/CMakeLists.txt
@@ -45,16 +45,3 @@
ADD_TEST(date_test ${EXECUTABLE_OUTPUT_PATH}/date_test)
ADD_TEST(volid_test ${EXECUTABLE_OUTPUT_PATH}/volid_test)
add_executable(
 stackoverflow
 stackoverflow.cpp
)
target_link_libraries(
    stackoverflow
    license_generator_lib
)
SET_TARGET_PROPERTIES(stackoverflow PROPERTIES LINK_SEARCH_START_STATIC ON)
test/functional/volid_test.cpp
@@ -17,87 +17,86 @@
using namespace license;
using namespace std;
 BOOST_AUTO_TEST_CASE( default_volid_lic_file ) {
 const string licLocation(PROJECT_TEST_TEMP_DIR "/volid_license.lic");
 PcSignature identifier_out;
BOOST_AUTO_TEST_CASE( default_volid_lic_file ) {
    const string licLocation(PROJECT_TEST_TEMP_DIR "/volid_license.lic");
    PcSignature identifier_out;
 IDENTIFICATION_STRATEGY strategy = IDENTIFICATION_STRATEGY::ETHERNET;
 FUNCTION_RETURN generate_ok = generate_user_pc_signature(identifier_out,
 strategy);
 BOOST_ASSERT(generate_ok == FUNCTION_RETURN::OK);
 cout << "Identifier:" << identifier_out << endl;
 vector<string> extraArgs = { "-s", identifier_out };
 generate_license(licLocation, extraArgs);
    IDENTIFICATION_STRATEGY strategy = IDENTIFICATION_STRATEGY::ETHERNET;
    FUNCTION_RETURN generate_ok = generate_user_pc_signature(identifier_out,
            strategy);
    BOOST_ASSERT(generate_ok == FUNCTION_RETURN::OK);
    cout << "Identifier:" << identifier_out << endl;
    vector<string> extraArgs = { "-s", identifier_out };
    generate_license(licLocation, extraArgs);
 LicenseInfo license;
 LicenseLocation licenseLocation;
 licenseLocation.openFileNearModule = false;
 licenseLocation.licenseFileLocation = licLocation.c_str();
 licenseLocation.environmentVariableName = "";
 EVENT_TYPE result = acquire_license("TEST", licenseLocation, &license);
 BOOST_CHECK_EQUAL(result, LICENSE_OK);
 BOOST_CHECK_EQUAL(license.has_expiry, false);
 BOOST_CHECK_EQUAL(license.linked_to_pc, true);
 }
    LicenseInfo license;
    LicenseLocation licenseLocation;
    licenseLocation.openFileNearModule = false;
    licenseLocation.licenseFileLocation = licLocation.c_str();
    licenseLocation.environmentVariableName = "";
    EVENT_TYPE result = acquire_license("TEST", licenseLocation, &license);
    BOOST_CHECK_EQUAL(result, LICENSE_OK);
    BOOST_CHECK_EQUAL(license.has_expiry, false);
    BOOST_CHECK_EQUAL(license.linked_to_pc, true);
}
 static void generate_reference_file(const string& idfileLocation,
 IDENTIFICATION_STRATEGY strategies[], int num_strategies) {
 ofstream idfile(idfileLocation);
 PcSignature identifier_out;
 for (int i = 0; i < num_strategies; i++) {
 FUNCTION_RETURN generate_ok = generate_user_pc_signature(identifier_out,
 strategies[i]);
 BOOST_ASSERT(generate_ok == FUNCTION_RETURN::OK);
 idfile << identifier_out << endl;
 }
 idfile.close();
 }
static void generate_reference_file(const string& idfileLocation,
        IDENTIFICATION_STRATEGY strategies[], int num_strategies) {
    ofstream idfile(idfileLocation);
    PcSignature identifier_out;
    for (int i = 0; i < num_strategies; i++) {
        FUNCTION_RETURN generate_ok = generate_user_pc_signature(identifier_out,
                strategies[i]);
        BOOST_ASSERT(generate_ok == FUNCTION_RETURN::OK);
        idfile << identifier_out << endl;
    }
    idfile.close();
}
 BOOST_AUTO_TEST_CASE(generated_identifiers_stability) {
 const string idfileLocation(PROJECT_TEST_TEMP_DIR "/identifiers_file");
 IDENTIFICATION_STRATEGY strategies[] =
 { IDENTIFICATION_STRATEGY::DEFAULT,
 IDENTIFICATION_STRATEGY::DISK_LABEL,
 IDENTIFICATION_STRATEGY::DISK_NUM,
 IDENTIFICATION_STRATEGY::ETHERNET
 };
 const int num_strategies = sizeof(strategies) / sizeof(strategies[0]);
 std::ifstream test_idfile_exist(idfileLocation);
 if (!test_idfile_exist.good()) {
 generate_reference_file(idfileLocation, strategies, num_strategies);
 }
 std::ifstream is(idfileLocation);
 std::istream_iterator<string> start(is), end;
 std::vector<string> reference_signatures(start, end);
 BOOST_ASSERT(reference_signatures.size() == num_strategies);
 PcSignature generated_identifier;
 BOOST_CHECKPOINT("Generating current signatures and comparing with past");
 for (int i = 0; i < num_strategies; i++) {
 FUNCTION_RETURN generate_ok = generate_user_pc_signature(
 generated_identifier, strategies[i]);
 BOOST_ASSERT(generate_ok == FUNCTION_RETURN::OK);
 if (reference_signatures[i] != generated_identifier) {
 string message = string("pc signature compare fail: strategy:")
 + to_string(strategies[i]) + " generated: ["
 + generated_identifier + "] reference: ["
 + reference_signatures[i] + "]";
 BOOST_FAIL(message);
 }
 }
BOOST_AUTO_TEST_CASE(generated_identifiers_stability) {
    const string idfileLocation(PROJECT_TEST_TEMP_DIR "/identifiers_file");
    IDENTIFICATION_STRATEGY strategies[] =
            { IDENTIFICATION_STRATEGY::DEFAULT,
                    IDENTIFICATION_STRATEGY::DISK_LABEL,
                    IDENTIFICATION_STRATEGY::DISK_NUM,
                    IDENTIFICATION_STRATEGY::ETHERNET };
    const int num_strategies = sizeof(strategies) / sizeof(strategies[0]);
    std::ifstream test_idfile_exist(idfileLocation);
    if (!test_idfile_exist.good()) {
        generate_reference_file(idfileLocation, strategies, num_strategies);
    }
    std::ifstream is(idfileLocation);
    std::istream_iterator<string> start(is), end;
    std::vector<string> reference_signatures(start, end);
    BOOST_ASSERT(reference_signatures.size() == num_strategies);
    PcSignature generated_identifier;
    BOOST_CHECKPOINT("Generating current signatures and comparing with past");
    for (int i = 0; i < num_strategies; i++) {
        FUNCTION_RETURN generate_ok = generate_user_pc_signature(
                generated_identifier, strategies[i]);
        BOOST_ASSERT(generate_ok == FUNCTION_RETURN::OK);
        if (reference_signatures[i] != generated_identifier) {
            string message = string("pc signature compare fail: strategy:")
                    + to_string(strategies[i]) + " generated: ["
                    + generated_identifier + "] reference: ["
                    + reference_signatures[i] + "]";
            BOOST_FAIL(message);
        }
    }
 BOOST_CHECKPOINT("Verifying signatures");
 for (int j = 0; j < 100; j++) {
 for (unsigned int i = 0; i < reference_signatures.size(); i++) {
 PcSignature pcsig;
 strncpy(pcsig, reference_signatures[i].c_str(), sizeof(PcSignature));
 EVENT_TYPE val_result = validate_pc_signature(pcsig);
 string message = string("pc signature verification strategy:")
 + to_string(i) + " generated: [" + generated_identifier
 + "] reference: [" + reference_signatures[i] + "]";
 BOOST_CHECKPOINT("Verifying signature: ");
 BOOST_CHECK_EQUAL(val_result, LICENSE_OK);
 }
 }
 }
    BOOST_CHECKPOINT("Verifying signatures");
    for (int j = 0; j < 100; j++) {
        for (unsigned int i = 0; i < reference_signatures.size(); i++) {
            PcSignature pcsig;
            strncpy(pcsig, reference_signatures[i].c_str(),
                    sizeof(PcSignature));
            EVENT_TYPE val_result = validate_pc_signature(pcsig);
            string message = string("pc signature verification strategy:")
                    + to_string(i) + " generated: [" + generated_identifier
                    + "] reference: [" + reference_signatures[i] + "]";
            BOOST_CHECKPOINT("Verifying signature: ");
            BOOST_CHECK_EQUAL(val_result, LICENSE_OK);
        }
    }
}