diff --git a/CMakeLists.txt b/CMakeLists.txt index d9aff70d73c8ee56b12475c4d131dbe69a655c9d..70cae6f2b55e414a4dc0ae867d715a4eaef740fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,11 @@ IF (WIN32) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) ENDIF() +IF (BUILD_ACM) + message(STATUS "BUILD_ACM") + add_compile_definitions("BUILD_ACM") +ENDIF() + ########################################### ### DEPENDENCY MANAGEMENT with CONAN ########################################### @@ -81,9 +86,14 @@ add_subdirectory(doc) set(PROTO_FILES ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/info/v1/main.proto ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/entity/v1/main.proto - ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/acm/v1alpha1/main.proto ) +IF (BUILD_ACM) + list(APPEND PROTO_FILES + ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/acm/v1alpha1/main.proto + ) +ENDIF() + set(PROTO_PATH ${PROJECT_SOURCE_DIR}/proto/proto) # compiler binaries @@ -233,12 +243,6 @@ target_link_libraries(cxxcaosdbcli ### LINTING with CLANG-TIDY and INCLUDE-WHAT-YOU-USE ####################################################### -########################################### -### PARANOID COMPILER SETTINGS -########################################### -option(PARANOID_COMPILER_SETTINGS "Enable extra-paranoid compiler settings -(which may even flag errors for code in the dependencies. These only apply in -Debug BUILD_TYPE with SKIP_LINTING=Off or when LINTING=On." OFF) include(CheckCXXCompilerFlag) include(CheckCCompilerFlag) diff --git a/conanfile.py b/conanfile.py index c91038d2d9ab6e2f23c21696bd62d19c0421ca78..cda65824eb827c331d33ae1e57e8430b6ff972ee 100644 --- a/conanfile.py +++ b/conanfile.py @@ -10,8 +10,16 @@ class CaosdbConan(ConanFile): description = "C++ library for the CaosDB project" topics = ("data management", "caosdb") settings = "os", "compiler", "build_type", "arch" - options = {"shared": [True, False], "fPIC": [True, False]} - default_options = {"shared": False, "fPIC": True} + options = { + "shared": [True, False], + "fPIC": [True, False], + "build_acm": [True, False], + } + default_options = { + "shared": False, + "fPIC": True, + "build_acm": False, + } generators = "cmake" requires = [ ("grpc/1.45.2"), @@ -41,14 +49,12 @@ class CaosdbConan(ConanFile): def build(self): cmake = CMake(self) + if self.options.build_acm: + cmake.definitions["BUILD_ACM"] = "On" + cmake.configure(source_folder="") cmake.build() - # Explicit way: - # self.run('cmake %s/hello %s' - # % (self.source_folder, cmake.command_line)) - # self.run("cmake --build . %s" % cmake.build_config) - def package(self): self.copy("*.h", dst="include", src="include") self.copy("*.dll", dst="bin", keep_path=False) diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index d060c096a5398f396cc3026f0c7e93874e5f7a4f..a913c6906d61b4a171fe9955c9c2f81e17f60433 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -20,8 +20,6 @@ # add all header files to this list set(libcaosdb_INCL - ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/role.h - ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/user.h ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/authentication.h ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/certificate_provider.h ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/configuration.h @@ -52,6 +50,14 @@ set(libcaosdb_INCL ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/file_transmission/file_error.h ) +IF(BUILD_ACM) + list(APPEND libcaosdb_INCL + ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/role.h + ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/user.h + ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/permission_rule.h + ) +ENDIF() + # pass variable to parent scope set(libcaosdb_INCL ${libcaosdb_INCL} PARENT_SCOPE) diff --git a/include/caosdb/acm/permission_rule.h b/include/caosdb/acm/permission_rule.h index 00d8e2a6c0073d4e4dff18ce0db6a9c812348fbf..017a33039b1dee350855f399187c871e01b074e7 100644 --- a/include/caosdb/acm/permission_rule.h +++ b/include/caosdb/acm/permission_rule.h @@ -26,6 +26,7 @@ * @author Timm Fitchen * @date 2022-02-11 */ +#ifdef BUILD_ACM #ifndef CAOSDB_ACM_PERMISSION_RULE_H #define CAOSDB_ACM_PERMISSION_RULE_H @@ -65,3 +66,4 @@ using PermissionRules = std::unordered_set<PermissionRule, HashPermissionRule>; } // namespace caosdb::acm #endif +#endif diff --git a/include/caosdb/acm/role.h b/include/caosdb/acm/role.h index cf1a90bafe32f4eedd791fe5ae0832c7bf2c9a51..560449b12762206680d9445cbc7bbe6942d5b896 100644 --- a/include/caosdb/acm/role.h +++ b/include/caosdb/acm/role.h @@ -27,6 +27,7 @@ * @author Timm Fitchen * @date 2022-02-11 */ +#ifdef BUILD_ACM #ifndef CAOSDB_ACM_ROLES_H #define CAOSDB_ACM_ROLES_H @@ -73,3 +74,4 @@ private: } // namespace caosdb::acm #endif +#endif diff --git a/include/caosdb/acm/user.h b/include/caosdb/acm/user.h index 57794bc331c1290dfd73943bec1cc5bea56c5d90..2310bd2195186cf1237d59593b26369d01f2baa7 100644 --- a/include/caosdb/acm/user.h +++ b/include/caosdb/acm/user.h @@ -27,6 +27,7 @@ * @author Timm Fitchen * @date 2022-06-29 */ +#ifdef BUILD_ACM #ifndef CAOSDB_ACM_USER_H #define CAOSDB_ACM_USER_H @@ -68,3 +69,4 @@ private: } // namespace caosdb::acm #endif +#endif diff --git a/include/caosdb/connection.h b/include/caosdb/connection.h index d065c01cad56c2f8e8a6b22063b1619ae4cdc5e0..fd0627bc3295b1fd01b8999466b273b91dd281d4 100644 --- a/include/caosdb/connection.h +++ b/include/caosdb/connection.h @@ -27,27 +27,31 @@ * @date 2021-05-18 * @brief Configuration and setup of the connection. */ +#ifdef BUILD_ACM #include "caosdb/acm/role.h" // for Role #include "caosdb/acm/user.h" // for User #include "caosdb/acm/v1alpha1/main.grpc.pb.h" // for AccessControlMan... -#include "caosdb/authentication.h" // for Authenticator -#include "caosdb/configuration.h" // for ConnectionConfigura... -#include "caosdb/entity/v1/main.grpc.pb.h" // for EntityTransactionSe... -#include "caosdb/info.h" // for VersionInfo -#include "caosdb/info/v1/main.grpc.pb.h" // for GeneralInfoService:... -#include "caosdb/transaction.h" // for Transaction -#include "caosdb/transaction_status.h" // for TransactionStatus -#include <filesystem> // for path -#include <grpcpp/channel.h> // for Channel -#include <map> // for map -#include <memory> // for shared_ptr, unique_ptr -#include <string> // for string, basic_string -#include <vector> // for vector +#endif +#include "caosdb/authentication.h" // for Authenticator +#include "caosdb/configuration.h" // for ConnectionConfigura... +#include "caosdb/entity/v1/main.grpc.pb.h" // for EntityTransactionSe... +#include "caosdb/info.h" // for VersionInfo +#include "caosdb/info/v1/main.grpc.pb.h" // for GeneralInfoService:... +#include "caosdb/transaction.h" // for Transaction +#include "caosdb/transaction_status.h" // for TransactionStatus +#include <filesystem> // for path +#include <grpcpp/channel.h> // for Channel +#include <map> // for map +#include <memory> // for shared_ptr, unique_ptr +#include <string> // for string, basic_string +#include <vector> // for vector namespace caosdb::connection { +#ifdef BUILD_ACM using caosdb::acm::Role; using caosdb::acm::User; using caosdb::acm::v1alpha1::AccessControlManagementService; +#endif using caosdb::authentication::Authenticator; using caosdb::configuration::ConnectionConfiguration; using caosdb::entity::v1::EntityTransactionService; @@ -101,6 +105,7 @@ public: */ [[nodiscard]] auto CreateTransaction() const -> std::unique_ptr<Transaction>; +#ifdef BUILD_ACM /** * List all known roles. */ @@ -130,6 +135,7 @@ public: // TODO(tf) find a way to deal with this: // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) auto DeleteSingleUser(std::string realm, std::string name) const -> void; +#endif private: /// GRPC-Channel (HTTP/2 Connection plus Authentication). We use a shared @@ -147,10 +153,12 @@ private: /// Service for file transmission (download and upload). We use a shared /// pointer because Transaction instances also own this service stub. std::shared_ptr<FileTransmissionService::Stub> file_transmission_service; +#ifdef BUILD_ACM /// Service for Access Controll Management (Role, Useraccounts, Permissions). /// We use a unique pointer because only this connection owns and uses this /// service. std::unique_ptr<AccessControlManagementService::Stub> access_controll_management_service; +#endif }; /** diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1de41ebb757b2444f94fe013f617d6461e4e4398..f2917635ea619755e50bd2291b436d66820e226f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,11 +21,6 @@ # add all source files to this list set(libcaosdb_SRC - ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/permission_rule.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/role.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/role_impl.h - ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/user.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/user_impl.h ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/authentication.cpp ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/entity.cpp ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/logging.cpp @@ -44,5 +39,15 @@ set(libcaosdb_SRC ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/status_code_description.cpp ) +IF(BUILD_ACM) + list(APPEND libcaosdb_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/permission_rule.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/role.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/role_impl.h + ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/user.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/acm/user_impl.h + ) +ENDIF() + # pass variable to parent scope set(libcaosdb_SRC ${libcaosdb_SRC} PARENT_SCOPE) diff --git a/src/caosdb/connection.cpp b/src/caosdb/connection.cpp index 04ee57499d8d173d1c9b6bc4d33313111e37099e..25524b88f67f899a757419a7a74b1185898e78b6 100644 --- a/src/caosdb/connection.cpp +++ b/src/caosdb/connection.cpp @@ -20,25 +20,28 @@ * */ #include "caosdb/connection.h" +#ifdef BUILD_ACM #include "caosdb/acm/role_impl.h" // for RoleImpl #include "caosdb/acm/user_impl.h" // for UserImpl #include "caosdb/acm/v1alpha1/main.grpc.pb.h" // for AccessControlMan... #include "caosdb/acm/v1alpha1/main.pb.h" // for ListRolesRequest -#include "caosdb/configuration.h" // for ConnectionConfigur... -#include "caosdb/exceptions.h" // for ConfigurationError -#include "caosdb/info.h" // for VersionInfo -#include "caosdb/info/v1/main.grpc.pb.h" // for GeneralInfoService -#include "caosdb/info/v1/main.pb.h" // for GetVersionInfoRequest -#include "caosdb/transaction.h" // for Transaction -#include "caosdb/transaction_status.h" // for TransactionStatus -#include <grpcpp/client_context.h> // for ClientContext -#include <grpcpp/create_channel.h> // for CreateChannel -#include <grpcpp/support/status.h> // for Status -#include <grpcpp/support/status_code_enum.h> // for StatusCode, UNAUTHENTIC... -#include <string> // for string, operator+ +#endif +#include "caosdb/configuration.h" // for ConnectionConfigur... +#include "caosdb/exceptions.h" // for ConfigurationError +#include "caosdb/info.h" // for VersionInfo +#include "caosdb/info/v1/main.grpc.pb.h" // for GeneralInfoService +#include "caosdb/info/v1/main.pb.h" // for GetVersionInfoRequest +#include "caosdb/transaction.h" // for Transaction +#include "caosdb/transaction_status.h" // for TransactionStatus +#include <grpcpp/client_context.h> // for ClientContext +#include <grpcpp/create_channel.h> // for CreateChannel +#include <grpcpp/support/status.h> // for Status +#include <grpcpp/support/status_code_enum.h> // for StatusCode, UNAUTHENTIC... +#include <string> // for string, operator+ // IWYU pragma: no_include "net/proto2/public/repeated_field.h" namespace caosdb::connection { +#ifdef BUILD_ACM using caosdb::acm::RoleImpl; using caosdb::acm::UserImpl; using caosdb::acm::v1alpha1::AccessControlManagementService; @@ -56,6 +59,7 @@ using caosdb::acm::v1alpha1::RetrieveSingleRoleRequest; using caosdb::acm::v1alpha1::RetrieveSingleRoleResponse; using caosdb::acm::v1alpha1::RetrieveSingleUserRequest; using caosdb::acm::v1alpha1::RetrieveSingleUserResponse; +#endif using caosdb::configuration::ConfigurationManager; using caosdb::configuration::ConnectionConfiguration; using caosdb::entity::v1::EntityTransactionService; @@ -75,8 +79,10 @@ Connection::Connection(const ConnectionConfiguration &configuration) { this->entity_transaction_service = std::make_shared<EntityTransactionService::Stub>(this->channel); this->file_transmission_service = std::make_shared<FileTransmissionService::Stub>(this->channel); +#ifdef BUILD_ACM this->access_controll_management_service = std::make_unique<AccessControlManagementService::Stub>(this->channel); +#endif } auto Connection::RetrieveVersionInfoNoExceptions() const noexcept -> TransactionStatus { @@ -121,6 +127,7 @@ auto Connection::RetrieveVersionInfo() const -> const VersionInfo & { return std::make_unique<Transaction>(entity_service, file_service); } +#ifdef BUILD_ACM [[nodiscard]] auto Connection::RetrieveSingleRole(std::string name) const -> Role { RetrieveSingleRoleRequest request; request.set_name(name); @@ -323,6 +330,8 @@ auto Connection::CreateSingleUser(const User &user) const -> void { return result; } +#endif + auto ConnectionManager::mHasConnection(const std::string &name) const -> bool { auto it = connections.find(name); return it != connections.end(); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index beb5499ea2ba0e32a88c3da077bf822859b80e47..ab517063ccc31828d251e93c55ceafa0a2ed5e78 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -29,14 +29,19 @@ set(test_cases test_issues test_list_properties test_protobuf - test_role test_transaction test_utility - test_user test_value test_ccaosdb ) +IF(BUILD_ACM) + list(APPEND test_cases + test_role + test_user + ) +ENDIF() + ################################################### ### Set up tests using GoogleTest (GTest) ################################################### diff --git a/test/test_connection.cpp b/test/test_connection.cpp index 57c4c294e6344bc240bf52514c840bc3aa7062e4..0426c35d675bc7ddfe20e7d0edeb069e6277f40e 100644 --- a/test/test_connection.cpp +++ b/test/test_connection.cpp @@ -19,7 +19,9 @@ * along with this program. If not, see <https://www.gnu.org/licenses/>. * */ -#include "caosdb/acm/user.h" // for User +#ifdef BUILD_ACM +#include "caosdb/acm/user.h" // for User +#endif #include "caosdb/certificate_provider.h" // for PemCertificateProvider #include "caosdb/configuration.h" // for InsecureConnectionConfigura... #include "caosdb/connection.h" // for ConnectionManager @@ -32,7 +34,9 @@ #include <string> // for operator+, string namespace caosdb::connection { +#ifdef BUILD_ACM using caosdb::acm::User; +#endif using caosdb::configuration::ConfigurationManager; using caosdb::configuration::InsecureConnectionConfiguration; using caosdb::configuration::PemCertificateProvider; @@ -89,6 +93,7 @@ TEST_F(test_connection, connection_manager_get_connection) { EXPECT_TRUE(ConnectionManager::GetConnection("local-caosdb-admin")); } +#ifdef BUILD_ACM TEST_F(test_connection, test_create_single_user) { auto connection = ConnectionManager::GetDefaultConnection(); User user; @@ -119,5 +124,6 @@ TEST_F(test_connection, test_list_roles) { "The attempt to execute this transaction was not successful because the " "connection to the server could not be established."); } +#endif } // namespace caosdb::connection diff --git a/test_package/CMakeLists.txt b/test_package/CMakeLists.txt deleted file mode 100644 index 6e0db0446b0d4a2e1767f1ecdf2156ffb5dbb295..0000000000000000000000000000000000000000 --- a/test_package/CMakeLists.txt +++ /dev/null @@ -1,47 +0,0 @@ -cmake_minimum_required(VERSION 3.1) -project(PackageTest CXX) - -####################################################################### -### append test cases here (file name without the ".cpp" suffix) -####################################################################### -set(test_cases - test_info - ) - -################################################### -### Set up tests using GoogleTest (GTest) -################################################### - -# dependencies -include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) -conan_basic_setup(KEEP_RPATHS) - -# supress warnings during build of gtest -cmake_policy(SET CMP0054 NEW) -enable_testing() - -# add special cmake functions for gtest -include(GoogleTest REQUIRED) - -# loop over all test cases and add them to the test runner -list(LENGTH test_cases len_test_cases) -math(EXPR len_test_cases "${len_test_cases} - 1") -foreach (i RANGE "${len_test_cases}") - list(GET test_cases ${i} test_case_name) - add_executable(${test_case_name} ${test_case_name}.cpp) - target_link_libraries(${test_case_name} PRIVATE ${CONAN_LIBS_CAOSDB} - ${CONAN_LIBS_GTEST} ${CONAN_LIBS_GRPC} ${CONAN_LIBS_ABSEIL} - ${CONAN_LIBS_OPENSSL} ${CONAN_LIBS_C-ARES} ${CONAN_LIBS_BZIP2} - ${CONAN_LIBS_PROTOBUF} ${CONAN_LIBS_ZLIB}) - if("${CMAKE_BUILD_TYPE}" MATCHES "Debug") - target_link_libraries(${test_case_name} PRIVATE caosdb_grpc) - endif() - target_include_directories(${test_case_name} PUBLIC ${CONAN_INCLUDE_DIRS}) - set_target_properties(${test_case_name} - PROPERTIES - CXX_CLANG_TIDY "${_CMAKE_CXX_CLANG_TIDY}" - CXX_INCLUDE_WHAT_YOU_USE "${_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}") - gtest_discover_tests(${test_case_name} - PROPERTIES - LABELS "caosdb-cpplib-int-tests") -endforeach () diff --git a/test_package/conanfile.py b/test_package/conanfile.py deleted file mode 100644 index 541113405bfca3b1222de81124a13586fe4bbda5..0000000000000000000000000000000000000000 --- a/test_package/conanfile.py +++ /dev/null @@ -1,28 +0,0 @@ -import os - -from conans import ConanFile, CMake, tools - - -class LibcaosdbTestConan(ConanFile): - settings = "os", "compiler", "build_type", "arch" - generators = "cmake" - build_requires = [ - ("gtest/1.11.0"), - ] - - def build(self): - cmake = CMake(self) - # Current dir is "test_package/build/<build_id>" and CMakeLists.txt is - # in "test_package" - cmake.configure() - cmake.build() - - def imports(self): - self.copy("*.dll", dst="bin", src="bin") - self.copy("*.dylib*", dst="bin", src="lib") - self.copy('*.so*', dst='bin', src='lib') - - def test(self): - if not tools.cross_building(self): - cmake = CMake(self) - cmake.test() diff --git a/test_package/test_info.cpp b/test_package/test_info.cpp deleted file mode 120000 index e0e5ee2ff361ddf40cdf3f8d2cf2d03f89d49cbb..0000000000000000000000000000000000000000 --- a/test_package/test_info.cpp +++ /dev/null @@ -1 +0,0 @@ -../test/test_info.cpp \ No newline at end of file