From dfddf5294677407c3a01b3a13c8348f02fe993ee Mon Sep 17 00:00:00 2001 From: Gabriele Contini <gcontini@users.noreply.github.com> Date: ćšć, 19 9æ 2019 20:20:18 +0800 Subject: [PATCH] Feature/mingw cross compile (#51) --- src/library/CMakeLists.txt | 6 src/library/os/os-linux.c | 8 src/tools/base_lib/CMakeLists.txt | 6 src/tools/license-generator/license-generator.cpp | 2 src/library/os/os.c | 4 CMakeLists.txt | 60 +++++--- test/functional/volid_test.cpp | 22 ++ README.md | 12 + src/library/pc-identifiers.c | 5 src/tools/license-generator/CMakeLists.txt | 6 test/library/CMakeLists.txt | 17 +- src/tools/bootstrap/CMakeLists.txt | 36 +++-- test/functional/CMakeLists.txt | 26 ++- test/license-generator/CMakeLists.txt | 8 .travis.yml | 120 ++++++++++++---- modules/toolchain-ubuntu-mingw64.cmake | 27 +++ src/tools/base_lib/CryptoHelper.cpp | 11 example/CMakeLists.txt | 4 src/tools/base_lib/win/CryptoHelperWindows.cpp | 11 + 19 files changed, 262 insertions(+), 129 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7fd8a73..8c0456d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,10 @@ - libboost-system-dev - libboost-thread-dev - libboost-date-time-dev + script: + - cmake --build . --target install + - ctest + - ctest -T memcheck - os: linux dist: xenial name: "Ubuntu 16.04 - Travis CI VM" @@ -39,64 +43,120 @@ - libboost-system-dev - libboost-thread-dev - libboost-date-time-dev - + - os: linux + dist: bionic + name: "Ubuntu 18.04 - Travis CI VM - Debug build" + addons: + apt: + packages: + - cmake + - valgrind + - libssl-dev + - zlib1g-dev + - libboost-dev + - libboost-test-dev + - libboost-filesystem-dev + - libboost-iostreams-dev + - libboost-program-options-dev + - libboost-system-dev + - libboost-thread-dev + - libboost-date-time-dev + before_script: + - mkdir build + - cd build && cmake -DCMAKE_INSTALL_PREFIX=../../install -DCMAKE_BUILD_TYPE=Debug .. + script: + - cmake --build . --target install + - ctest + - ctest -T memcheck + - os: linux dist: bionic name: "CentOS-7 Docker" before_script: - docker run --name centos7_toconfigure -v `pwd`:/root/open-license-manager centos:centos7 /bin/bash -c - "yum -y update && yum -y install cmake boost boost-devel boost-static openssl openssl-devel gcc-c++ valgrind valgrind-devel glibc-static centos-release-scl-rh && - yum -y install devtoolset-3-gcc devtoolset-3-gcc-c++ && cd /root/open-license-manager && mkdir build && cd build && - CC=/opt/rh/devtoolset-3/root/usr/bin/gcc XX=/opt/rh/devtoolset-3/root/usr/bin/g++ cmake .." + "yum -y update && yum -y install install centos-release-scl && + yum -y install cmake boost boost-devel boost-static openssl openssl-devel glibc-static devtoolset-7-toolchain devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-valgrind-devel && + cd /root/open-license-manager && mkdir build && cd build && + CC=/opt/rh/devtoolset-7/root/usr/bin/gcc CXX=/opt/rh/devtoolset-7/root/usr/bin/g++ cmake .." - docker commit centos7_toconfigure centos7_configured script: - docker run --name centos7_make -v `pwd`:/root/open-license-manager centos7_configured /bin/bash -c "cd /root/open-license-manager/build && make && make install && VIRT_ENV=CONTAINER make test" - + - os: linux + dist: bionic + name: "Ubuntu 18.04 - MinGW cross-compile for Windows x64" + addons: + apt: + packages: + - cmake + - binutils-mingw-w64 + - mingw-w64 + - mingw-w64-tools + - mingw-w64-x86-64-dev + - wine-development + before_script: + - mkdir build + - cd build + - wget -c https://dl.bintray.com/boostorg/release/1.71.0/source/boost_1_71_0.tar.bz2 + - tar xjf boost_1_71_0.tar.bz2 + - sudo ln -s /usr/bin/x86_64-w64-mingw32-g++ /usr/local/bin/g++-mingw + - cd boost_1_71_0 + - ./bootstrap.sh + - travis_wait 30 ./b2 toolset=gcc-mingw target-os=windows address-model=64 --with-date_time --with-test --with-filesystem --with-program_options --with-regex --with-serialization --with-system runtime-link=static --prefix=./dist release install + - cd .. + - cmake -DCMAKE_TOOLCHAIN_FILE=../modules/toolchain-ubuntu-mingw64.cmake -DCMAKE_INSTALL_PREFIX=../../install -DBOOST_ROOT=$PWD/boost_1_71_0/dist .. - os: windows name: "Widnows server 1803 - Visual Studio 15 2017 Win64 - (/MD)" - env: - - CACHE_NAME=boost - cache: - directories: - - "/C/local/boost" before_script: - #- Regsvr32.exe "C:\Widnows\System32\rsaenh.dll" - #Not sure this is necessary let's leave it here for some time, see if there are - #differences with the build (/MT) - - sc stop CryptSvc - - travis_wait 30 ./windows_download_boost.bat - - cd "/C/Users/travis/build/open-license-manager/open-license-manager" + - travis_wait 40 ./windows_download_boost.bat + - cd "${TRAVIS_BUILD_DIR}" - mkdir build - cd build && cmake -G "Visual Studio 15 2017 Win64" -DBOOST_ROOT="C:/local/boost" .. - script: - - cmake --build . --target install --config Release - - ctest -C Release - os: windows name: "Widnows server 1803 - Visual Studio 15 2017 Win64 - (/MT)" + before_script: + - travis_wait 40 ./windows_download_boost.bat + - cd "${TRAVIS_BUILD_DIR}" + - mkdir build + - cd build && cmake -G "Visual Studio 15 2017 Win64" -DBOOST_ROOT="C:/local/boost" -DSTATIC_RUNTIME=1 .. + + - os: windows + name: "Widnows server 1803 - MinGW Win64" env: - - CACHE_NAME=boost + - CACHE_NAME=boost-mingw cache: + name: boost-mingw directories: - "/C/local/boost" before_script: - - travis_wait 30 ./windows_download_boost.bat - - cd "/C/Users/travis/build/open-license-manager/open-license-manager" + - | + if [ -d "/C/local/boost/lib" ]; then + echo "Boost already installed" + else + echo "Boost not cached, compiling it" + wget -q https://dl.bintray.com/boostorg/release/1.68.0/source/boost_1_68_0.7z + echo "Boost downloaded" + travis_wait 20 7z x boost_1_68_0.7z -oC:/local + cd "C:/local/boost_1_68_0" + ./bootstrap.bat gcc + travis_wait 40 ./b2.exe -d0 --with-date_time --with-test --with-filesystem --with-program_options --with-regex --with-serialization --with-system runtime-link=static toolset=gcc --prefix=C:/local/boost install + echo "Boost installed" + cd /C/local/boost/lib + dir + fi + - cd "${TRAVIS_BUILD_DIR}" - mkdir build - - cd build && cmake -G "Visual Studio 15 2017 Win64" -DBOOST_ROOT="C:/local/boost" -DSTATIC_RUNTIME=1 .. - script: - - cmake --build . --target install --config Release - - ctest -C Release - + - cd build && cmake -G "MinGW Makefiles" --trace-expand -DBOOST_ROOT="C:/local/boost" -DBoost_ARCHITECTURE="-x64" -DCMAKE_CXX_COMPILER_ARCHITECTURE_ID="x64" -DCMAKE_SH="CMAKE_SH-NOTFOUND" .. + env: - CTEST_OUTPUT_ON_FAILURE=1 + before_script: - mkdir build - cd build && cmake -DCMAKE_INSTALL_PREFIX=../../install .. script: - - make - - make install - - make test + - cmake --build . --target install --config Release + - ctest -C Release diff --git a/CMakeLists.txt b/CMakeLists.txt index 1f0cbb0..411c2c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ string(TOLOWER ${CMAKE_BUILD_TYPE} _CMAKE_BUILD_TYPE) EVAL_CONDITION(RELEASE_BUILD ${_CMAKE_BUILD_TYPE} STREQUAL "release") else(CMAKE_BUILD_TYPE) - set(RELEASE_BUILD 0) + SET(RELEASE_BUILD 0) endif(CMAKE_BUILD_TYPE) if(MSVC) @@ -43,32 +43,19 @@ #SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib ) #${CMAKE_FIND_LIBRARY_SUFFIXES} add_definitions("/D _CRT_SECURE_NO_WARNINGS") else(MSVC) + #GCC or Mingw SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -fmessage-length=0 -std=c++11 -Wuninitialized -fPIC") #-Wall SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe -fmessage-length=0 -Wall -Wuninitialized -fPIC") - if(RELEASE_BUILD) - SET(CMAKE_FIND_LIBRARY_SUFFIXES .a) #.so for dynamic libraries - else() - SET(CMAKE_FIND_LIBRARY_SUFFIXES .a .so) - endif() - set (CMAKE_EXE_LINKER_FLAGS "-pthread") + SET(CMAKE_EXE_LINKER_FLAGS "-pthread -static-libstdc++") SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "-Wl,--strip-all -static-libstdc++") #-static #you need to "force" the change in cmake_install_prefix after the project keyword IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) SET(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Install path prefix" FORCE) ENDIF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - #find a static version of openssl crypto library - find_package(OpenSSL REQUIRED) - include_directories(${OPENSSL_INCLUDE_DIR}) if(MINGW) - list(APPEND EXTERNAL_LIBS "-lcrypto -liphlpapi") - else(MINGW) - list(APPEND EXTERNAL_LIBS ${OPENSSL_CRYPTO_LIBRARY}) + list(APPEND EXTERNAL_LIBS "-lcrypt32 -lws2_32 -liphlpapi") + SET(CMAKE_EXE_LINKER_FLAGS "-static") endif(MINGW) - MESSAGE(STATUS "Found openssl version ${OPENSSL_VERSION} ") - - #Zlib required when openssl version < 1.0.1f - find_package(ZLIB REQUIRED) - list(APPEND EXTERNAL_LIBS ${ZLIB_LIBRARIES}) if(USE_DBUS_IDENTIFIER) FIND_PACKAGE(Dbus REQUIRED) @@ -77,14 +64,28 @@ include_directories(${DBUS_ARCH_INCLUDE_DIR}) list(APPEND EXTERNAL_LIBS ${DBUS_LIBRARIES}) endif(USE_DBUS_IDENTIFIER) - if(NOT MINGW) - list(APPEND EXTERNAL_LIBS dl) - endif(NOT MINGW) - list(APPEND EXTERNAL_LIBS "-Wl,-Bdynamic") endif(MSVC) -set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:Debug>:_DEBUG>) +if(UNIX) #this is true for all the linux systems but not for cross compiling + #find a static version of openssl crypto library + SET ( OPENSSL_USE_STATIC_LIBS ON ) + find_package(OpenSSL REQUIRED COMPONENTS Crypto) + include_directories(${OPENSSL_INCLUDE_DIR}) + list(APPEND EXTERNAL_LIBS ${OPENSSL_CRYPTO_LIBRARY}) + MESSAGE(STATUS "Found openssl version ${OPENSSL_VERSION} ") + #Zlib required when openssl version < 1.0.1f + SET ( ZLIB_USE_STATIC_LIBS ON ) + find_package(ZLIB REQUIRED) + list(APPEND EXTERNAL_LIBS ${ZLIB_LIBRARIES}) + MESSAGE(STATUS "Found zlib version ${ZLIB_VERSION} ") + if(NOT MINGW) + list(APPEND EXTERNAL_LIBS "-ldl") + endif(NOT MINGW) + find_program( MEMORYCHECK_COMMAND valgrind ) + set( MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full" ) +endif(UNIX) +SET_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:Debug>:_DEBUG>) if(CMAKE_SIZEOF_VOID_P EQUAL 8) SET(HAVE_64BIT_SIZE_T 1) @@ -92,7 +93,18 @@ SET(HAVE_64BIT_SIZE_T 0) endif(CMAKE_SIZEOF_VOID_P EQUAL 8) -set( Boost_USE_STATIC_LIBS ON ) +#bug in cmake win32 - can't find boost compiled with mingw +if(WIN32 AND "x${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}" STREQUAL "x") + message(WARNING "WIN32 compiler does not specify CMAKE_CXX_COMPILER_ARCHITECTURE_ID -- filling in manually") + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID "x64") + else() + set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID "x86") + endif() + message(STATUS "Compiler architecture: ${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}") +endif() + +SET( Boost_USE_STATIC_LIBS ON ) find_package(Boost REQUIRED COMPONENTS date_time unit_test_framework program_options system filesystem) #set below in case of dynamic linking in debug. #set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:Debug>:BOOST_TEST_DYN_LINK>) diff --git a/README.md b/README.md index c8e4031..3b096d7 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ ## License The project is donated to the community. It comes with a very large freedom of use for everyone, and it will always be. -It uses a [BSD 3 clauses](https://opensource.org/licenses/BSD-3-Clause) licensing schema, that allows the inclusion in commercial software. +It uses a [BSD 3 clauses](https://opensource.org/licenses/BSD-3-Clause) licensing schema, that allows free modification and inclusion in commercial software. ## Project Structure @@ -28,13 +28,13 @@ * bootstrap: allows to generate private keys and modify the library on the fly after the downloading. * testing : runs the tests (and publish the results on cdash) -#How to build +# How to build Below an overview of the basic build procedure, you can find detailed instructions for each [supported environment](https://github.com/open-license-manager/open-license-manager/wiki/Build-the-library) in the wiki. ## prerequisites - * compilsers: GCC (Linux), MINGW or MSVC (Windows) - * tools/libs: cmake, boost, openssl (Linux/MINGW). + * compilsers: GCC (Linux) MINGW (Linux cross compile for Windows), MINGW or MSVC (Windows) + * tools/libs: cmake, boost. If target is linux openssl is necessary. ``` git clone https://github.com/open-license-manager/open-license-manager.git @@ -94,3 +94,7 @@ $ ./example licence OK ``` + +# How to contribute +The project is not dead but we take our time to answer. The best interaction you can have with us is through the issue system. Have a look to the [contribution guidelines](blob/develop/CONTRIBUTING.md) +We use [GitFlow](https://datasift.github.io/gitflow/IntroducingGitFlow.html) (or at least a subset of it). Remember to install the gitflow git plugin and use `develop` as default branch for your pull requests. diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 425fb92..cbd53b6 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -10,7 +10,7 @@ SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib ) else(MSVC) set(CMAKE_FIND_LIBRARY_SUFFIXES .a .so) -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s -Wl,--exclude-libs,liblicense++_static.a") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s -Wl,--exclude-libs,liblicensepp_static.a") find_package(OpenSSL REQUIRED) endif(MSVC) @@ -18,7 +18,7 @@ add_executable(example example.cpp) -target_link_libraries(example license++_static os base tools_base) +target_link_libraries(example licensepp_static os base tools_base) if(NOT MSVC) target_link_libraries(example crypto pthread dl z) diff --git a/modules/toolchain-ubuntu-mingw64.cmake b/modules/toolchain-ubuntu-mingw64.cmake new file mode 100644 index 0000000..ebac7f8 --- /dev/null +++ b/modules/toolchain-ubuntu-mingw64.cmake @@ -0,0 +1,27 @@ +# Sample toolchain file for building for Windows from an Ubuntu Linux system. +# +# Typical usage: +# *) install cross compiler: `sudo apt-get install mingw-w64 g++-mingw-w64` +# *) cd build +# *) cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-Ubuntu-mingw64.cmake .. + +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_HOST_SYSTEM_NAME Linux) +set(TOOLCHAIN_PREFIX x86_64-w64-mingw32) + +# cross compilers to use for C and C++ +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++) +set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres) + +# target environment on the build host system +# set 1st to dir with the cross compiler's C/C++ headers/libs +set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX}) + +# modify default behavior of FIND_XXX() commands to +# search for headers/libs in the target environment and +# search for programs in the build host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +#set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +#set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/src/library/CMakeLists.txt b/src/library/CMakeLists.txt index de60a7d..d1f0813 100644 --- a/src/library/CMakeLists.txt +++ b/src/library/CMakeLists.txt @@ -2,19 +2,19 @@ add_subdirectory("base") add_subdirectory("ini") -ADD_LIBRARY(license++_static STATIC +ADD_LIBRARY(licensepp_static STATIC license++.cpp LicenseReader.cpp pc-identifiers.c ) target_link_libraries( - license++_static + licensepp_static ini os ) -install(TARGETS license++_static ARCHIVE DESTINATION lib) +install(TARGETS licensepp_static ARCHIVE DESTINATION lib) install(FILES api/datatypes.h api/license++.h DESTINATION include/api) install(FILES base/base.h DESTINATION include/base) install(FILES pc-identifiers.h DESTINATION include/) diff --git a/src/library/os/os-linux.c b/src/library/os/os-linux.c index 661ea78..1b78283 100644 --- a/src/library/os/os-linux.c +++ b/src/library/os/os-linux.c @@ -2,16 +2,16 @@ #include <sys/stat.h> #include "os.h" #include "../base/logger.h" - -//#include <openssl/evp.h> -//#include <openssl/bio.h> #include <openssl/pem.h> #include <openssl/err.h> #include <mntent.h> #include <dirent.h> - #include <sys/utsname.h> +#ifdef _DEBUG +#include <valgrind/memcheck.h> +#endif + #ifdef USE_DBUS #include <dbus-1.0/dbus/dbus.h> #endif diff --git a/src/library/os/os.c b/src/library/os/os.c index a9947b0..ad4803b 100644 --- a/src/library/os/os.c +++ b/src/library/os/os.c @@ -3,7 +3,7 @@ #include "public-key.h" #include <stdio.h> -#ifndef _MSC_VER +#ifdef __linux__ #include <openssl/pem.h> @@ -84,7 +84,7 @@ #else #include <iphlpapi.h> -#include <Windows.h> +#include <windows.h> #pragma comment(lib, "IPHLPAPI.lib") unsigned char* unbase64(const char* ascii, int len, int *flen); diff --git a/src/library/pc-identifiers.c b/src/library/pc-identifiers.c index 59f3dd1..0f39760 100644 --- a/src/library/pc-identifiers.c +++ b/src/library/pc-identifiers.c @@ -388,9 +388,12 @@ //found = false; for (i = 0; i < 2; i++) { current_strategy_id = strategy_from_pc_id(user_identifiers[i]); - if (current_strategy_id == STRATEGY_UNKNOWN) { + if (current_strategy_id == STRATEGY_UNKNOWN && previous_strategy_id == STRATEGY_UNKNOWN && i==1) { free(calculated_identifiers); + printf("Comparing pc identifiers: %d %d %d %s\n",current_strategy_id,previous_strategy_id,i, str_code); return LICENSE_MALFORMED; + } else if (current_strategy_id == STRATEGY_UNKNOWN ){ + continue; } if (current_strategy_id != previous_strategy_id) { if (calculated_identifiers != NULL) { diff --git a/src/tools/base_lib/CMakeLists.txt b/src/tools/base_lib/CMakeLists.txt index 009056a..99788b9 100644 --- a/src/tools/base_lib/CMakeLists.txt +++ b/src/tools/base_lib/CMakeLists.txt @@ -1,17 +1,17 @@ -if(MSVC) +if(WIN32) ADD_LIBRARY( tools_base STATIC CryptoHelper.cpp win/CryptoHelperWindows.cpp ) -else(MSVC) +else(WIN32) ADD_LIBRARY( tools_base STATIC CryptoHelper.cpp linux/CryptoHelperLinux.cpp ) -ENDIF(MSVC) +ENDIF(WIN32) target_link_libraries( tools_base diff --git a/src/tools/base_lib/CryptoHelper.cpp b/src/tools/base_lib/CryptoHelper.cpp index afa566d..530596e 100644 --- a/src/tools/base_lib/CryptoHelper.cpp +++ b/src/tools/base_lib/CryptoHelper.cpp @@ -1,8 +1,8 @@ #include <memory> #include "CryptoHelper.h" -#ifndef _MSC_VER +#ifdef __linux__ #include"linux/CryptoHelperLinux.h" -#else +#elif _WIN32 #include"win/CryptoHelperWindows.h" #endif @@ -10,11 +10,12 @@ namespace license { unique_ptr<CryptoHelper> CryptoHelper::getInstance() { -#ifndef _MSC_VER +#ifdef __linux__ unique_ptr<CryptoHelper> ptr((CryptoHelper*) new CryptoHelperLinux()); -#else - unique_ptr<CryptoHelper> ptr((CryptoHelper*) new CryptoHelperWindows()); +#elif _WIN32 + unique_ptr<CryptoHelper> ptr((CryptoHelper*) new CryptoHelperWindows()); #endif return ptr; } } + diff --git a/src/tools/base_lib/win/CryptoHelperWindows.cpp b/src/tools/base_lib/win/CryptoHelperWindows.cpp index 98d14b3..99e0b12 100644 --- a/src/tools/base_lib/win/CryptoHelperWindows.cpp +++ b/src/tools/base_lib/win/CryptoHelperWindows.cpp @@ -21,14 +21,14 @@ CryptoHelperWindows::CryptoHelperWindows() { m_hCryptProv = NULL; m_hCryptKey = NULL; - if (!CryptAcquireContext(&m_hCryptProv, "license_sign", NULL, PROV_RSA_FULL, 0)) { + if (!CryptAcquireContext(&m_hCryptProv, "license_sign", NULL , PROV_RSA_FULL, 0)) { // If the key container cannot be opened, try creating a new // container by specifying a container name and setting the // CRYPT_NEWKEYSET flag. DWORD lastError = GetLastError(); printf("Error in CryptAcquireContext (1) 0x%08x \n", lastError); if (NTE_BAD_KEYSET == lastError) { - if (!CryptAcquireContext(&m_hCryptProv, "license_sign", NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { + if (!CryptAcquireContext(&m_hCryptProv, "license_sign", NULL , PROV_RSA_FULL, CRYPT_NEWKEYSET)) { printf("Warn in CryptAcquireContext: acquiring new user keyset failed 0x%08x, trying less secure mackine keyset \n", GetLastError()); //maybe access to protected storage disabled. Try with machine keys (less secure) if (!CryptAcquireContext(&m_hCryptProv, "license_sign", NULL, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET)) { @@ -71,6 +71,13 @@ string("Error generating keys ") + to_string(static_cast<long long>(dwErrCode))); } + //double check the key is really generated + if(m_hCryptKey == NULL) { + dwErrCode = GetLastError(); + throw logic_error( + string("Error generating keys (2)") + + to_string(static_cast<long long>(dwErrCode))); + } } /* This method calls the CryptExportKey function to get the Public key diff --git a/src/tools/bootstrap/CMakeLists.txt b/src/tools/bootstrap/CMakeLists.txt index 856fc5f..6bdf996 100644 --- a/src/tools/bootstrap/CMakeLists.txt +++ b/src/tools/bootstrap/CMakeLists.txt @@ -3,8 +3,7 @@ bootstrap.cpp ) - -SET_TARGET_PROPERTIES(bootstrap PROPERTIES LINK_SEARCH_START_STATIC ON) +#SET_TARGET_PROPERTIES(bootstrap PROPERTIES LINK_SEARCH_START_STATIC ON) SET_TARGET_PROPERTIES(bootstrap PROPERTIES LINK_SEARCH_END_STATIC OFF) target_link_libraries( bootstrap @@ -12,22 +11,29 @@ ${EXTERNAL_LIBS} ) -# add the command to generate the source code - if(MINGW) -add_custom_command ( - OUTPUT "${CMAKE_BINARY_DIR}/private-key.h" "${CMAKE_BINARY_DIR}/public-key.h" - COMMAND ./bootstrap.exe "${CMAKE_BINARY_DIR}/private-key.h" "${CMAKE_BINARY_DIR}/public-key.h" - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS bootstrap) + #Cross compiling from linux host to windows + IF( ( CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux") AND CMAKE_CROSSCOMPILING) + #this is to avoid to install binfmt_misc (for builds in docker, or LXC) + add_custom_command ( + OUTPUT "${CMAKE_BINARY_DIR}/private-key.h" "${CMAKE_BINARY_DIR}/public-key.h" + COMMAND wine ${CMAKE_CURRENT_BINARY_DIR}/bootstrap.exe "${CMAKE_BINARY_DIR}/private-key.h" "${CMAKE_BINARY_DIR}/public-key.h" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS bootstrap) + ELSE() + add_custom_command ( + OUTPUT "${CMAKE_BINARY_DIR}/private-key.h" "${CMAKE_BINARY_DIR}/public-key.h" + COMMAND ./bootstrap.exe "${CMAKE_BINARY_DIR}/private-key.h" "${CMAKE_BINARY_DIR}/public-key.h" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS bootstrap) + ENDIF() else(MINGW) -add_custom_command ( - OUTPUT "${CMAKE_BINARY_DIR}/private-key.h" "${CMAKE_BINARY_DIR}/public-key.h" - COMMAND bootstrap "${CMAKE_BINARY_DIR}/private-key.h" "${CMAKE_BINARY_DIR}/public-key.h" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - DEPENDS bootstrap) + add_custom_command ( + OUTPUT "${CMAKE_BINARY_DIR}/private-key.h" "${CMAKE_BINARY_DIR}/public-key.h" + COMMAND bootstrap "${CMAKE_BINARY_DIR}/private-key.h" "${CMAKE_BINARY_DIR}/public-key.h" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + DEPENDS bootstrap) endif(MINGW) - add_custom_target(private_key DEPENDS "${CMAKE_BINARY_DIR}/private-key.h") add_custom_target(public_key DEPENDS "${CMAKE_BINARY_DIR}/public-key.h") diff --git a/src/tools/license-generator/CMakeLists.txt b/src/tools/license-generator/CMakeLists.txt index 1c65372..e707d5f 100644 --- a/src/tools/license-generator/CMakeLists.txt +++ b/src/tools/license-generator/CMakeLists.txt @@ -1,8 +1,6 @@ - include_directories(${Boost_INCLUDE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) link_directories ( ${Boost_LIBRARY_DIR} ) - ADD_LIBRARY( license_generator_lib STATIC @@ -12,7 +10,7 @@ target_link_libraries( license_generator_lib tools_base - license++_static + licensepp_static $<$<CONFIG:Debug>:${Boost_PROGRAM_OPTIONS_LIBRARY_DEBUG}> $<$<NOT:$<CONFIG:Debug>>:${Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE}> $<$<CONFIG:Debug>:${Boost_SYSTEM_LIBRARY_DEBUG}> @@ -33,5 +31,3 @@ install(TARGETS license_generator RUNTIME DESTINATION bin) -#SET_TARGET_PROPERTIES(license_generator PROPERTIES LINK_SEARCH_START_STATIC ON) -#SET_TARGET_PROPERTIES(license_generator PROPERTIES LINK_SEARCH_END_STATIC ON) diff --git a/src/tools/license-generator/license-generator.cpp b/src/tools/license-generator/license-generator.cpp index a2b70e5..dcffd7e 100644 --- a/src/tools/license-generator/license-generator.cpp +++ b/src/tools/license-generator/license-generator.cpp @@ -146,7 +146,7 @@ ostream& outputFile) { vector<FullLicenseInfo> licenseInfo = parseLicenseInfo(vm); const unique_ptr<CryptoHelper> helper = CryptoHelper::getInstance(); - const char pkey[] = PRIVATE_KEY; + const unsigned char pkey[] = PRIVATE_KEY; const size_t len = sizeof(pkey); for (auto it = licenseInfo.begin(); it != licenseInfo.end(); ++it) { const string license = it->printForSign(); diff --git a/test/functional/CMakeLists.txt b/test/functional/CMakeLists.txt index 0fc9432..d2c718c 100644 --- a/test/functional/CMakeLists.txt +++ b/test/functional/CMakeLists.txt @@ -14,12 +14,10 @@ target_link_libraries( standard_license_test - license++_static + licensepp_static license_generator_snippet ${Boost_LIBRARIES} ) -#SET_TARGET_PROPERTIES(standard_license_test PROPERTIES LINK_SEARCH_START_STATIC ON) -#add_dependencies( standard_license_test boost_test boost_filesystem ) add_executable( date_test @@ -28,12 +26,10 @@ target_link_libraries( date_test - license++_static + licensepp_static license_generator_snippet ${Boost_LIBRARIES} ) -#SET_TARGET_PROPERTIES(date_test PROPERTIES LINK_SEARCH_START_STATIC ON) -#add_dependencies( date_test boost_test boost_filesystem ) add_executable( volid_test @@ -42,15 +38,21 @@ target_link_libraries( volid_test - license++_static + licensepp_static license_generator_snippet ${Boost_LIBRARIES} ) -#SET_TARGET_PROPERTIES(volid_test PROPERTIES LINK_SEARCH_START_STATIC ON) -#add_dependencies( volid_test boost_test boost_filesystem ) -ADD_TEST(NAME standard_license_test COMMAND standard_license_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) -ADD_TEST(NAME date_test COMMAND date_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) -ADD_TEST(NAME volid_test COMMAND volid_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +IF( ( CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux") AND CMAKE_CROSSCOMPILING) +#binfmt_misc doesn't work in my system :( + ADD_TEST(NAME standard_license_test COMMAND wine ${CMAKE_CURRENT_BINARY_DIR}/standard_license_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + ADD_TEST(NAME date_test COMMAND wine ${CMAKE_CURRENT_BINARY_DIR}/date_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + ADD_TEST(NAME volid_test COMMAND wine ${CMAKE_CURRENT_BINARY_DIR}/volid_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +ELSE() + ADD_TEST(NAME standard_license_test COMMAND standard_license_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + ADD_TEST(NAME date_test COMMAND date_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + ADD_TEST(NAME volid_test COMMAND volid_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +ENDIF() + diff --git a/test/functional/volid_test.cpp b/test/functional/volid_test.cpp index f63d2b3..a91d0bc 100644 --- a/test/functional/volid_test.cpp +++ b/test/functional/volid_test.cpp @@ -52,11 +52,11 @@ for (int i = 0; i < num_strategies; i++) { FUNCTION_RETURN generate_ok = generate_user_pc_signature(identifier_out, strategies[i]); - BOOST_ASSERT(generate_ok == FUNC_RET_OK); if (generate_ok != FUNC_RET_OK) { BOOST_ERROR( "Generating identifier for strategy " << strategies[i] << " failed with: " << generate_ok); idfile << "0000-0000-0000-0000" << endl; + BOOST_ASSERT(generate_ok == FUNC_RET_OK); } else idfile << identifier_out << endl; } @@ -66,12 +66,26 @@ BOOST_AUTO_TEST_CASE(generated_identifiers_stability) { const string idfileLocation(PROJECT_TEST_TEMP_DIR "/identifiers_file"); std::vector<IDENTIFICATION_STRATEGY> strategies; - if (getVirtualization() != CONTAINER) { - strategies = { DEFAULT, DISK_LABEL, DISK_NUM, ETHERNET }; + size_t disk_num; + getDiskInfos(NULL, &disk_num); + if (disk_num >0) { + strategies = { DEFAULT, DISK_NUM, DISK_LABEL }; } else { - strategies = { DEFAULT, ETHERNET }; + BOOST_TEST_CHECKPOINT("if no disk default strategy fails see #49"); + //strategies = { DEFAULT }; + strategies = {}; } + size_t adapters; + getAdapterInfos(nullptr, &adapters); + if(adapters > 0){ + strategies.push_back(ETHERNET); + } + int num_strategies = strategies.size(); + if(num_strategies == 0) { + //see issue #49 can't use default + return; + } std::ifstream test_idfile_exist(idfileLocation); if (!test_idfile_exist.good()) { generate_reference_file(idfileLocation, strategies.data(), diff --git a/test/library/CMakeLists.txt b/test/library/CMakeLists.txt index 314aa6f..49edff0 100644 --- a/test/library/CMakeLists.txt +++ b/test/library/CMakeLists.txt @@ -2,17 +2,19 @@ license_reader_test LicenseReader_test.cpp ) -#add_dependencies( license_reader_test boost_filesystem ) target_link_libraries( license_reader_test - license++_static + licensepp_static ${Boost_LIBRARIES} ) -#SET_TARGET_PROPERTIES(license_reader_test PROPERTIES LINK_SEARCH_START_STATIC ON) -#SET_TARGET_PROPERTIES(license_reader_test PROPERTIES LINK_SEARCH_END_STATIC OFF) -ADD_TEST(NAME license_reader_test COMMAND license_reader_test) +IF( ( CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux") AND CMAKE_CROSSCOMPILING) +#binfmt_misc doesn't work in my system :( + ADD_TEST(NAME license_reader_test COMMAND wine ${CMAKE_CURRENT_BINARY_DIR}/license_reader_test) +ELSE() + ADD_TEST(NAME license_reader_test COMMAND license_reader_test) +ENDIF() IF(WIN32) #test windows @@ -27,9 +29,6 @@ os ${Boost_LIBRARIES} ) - - #add_dependencies( os_linux_test ) - #SET_TARGET_PROPERTIES(os_linux_test PROPERTIES LINK_SEARCH_START_STATIC ON) + ADD_TEST(NAME os_linux_test COMMAND os_linux_test) - ENDIF(WIN32) diff --git a/test/license-generator/CMakeLists.txt b/test/license-generator/CMakeLists.txt index 4708cf0..f50b2ea 100644 --- a/test/license-generator/CMakeLists.txt +++ b/test/license-generator/CMakeLists.txt @@ -10,6 +10,8 @@ ${Boost_LIBRARIES} ) -#add_dependencies( license_generator_test boost_test boost_filesystem ) -#SET_TARGET_PROPERTIES(license_generator_test PROPERTIES LINK_SEARCH_START_STATIC ON) -ADD_TEST(NAME license_generator_test COMMAND license_generator_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +IF( ( CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux") AND CMAKE_CROSSCOMPILING) + ADD_TEST(NAME license_generator_test COMMAND wine ${CMAKE_CURRENT_BINARY_DIR}/license_generator_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +ELSE() + ADD_TEST(NAME license_generator_test COMMAND license_generator_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +ENDIF() -- Gitblit v1.9.1