From 1718f5b1380a3602bd872e5242489e366c8d30cd Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Thu, 22 Jul 2021 18:44:55 +0200
Subject: [PATCH] WIP: fix circular includes

---
 CMakeLists.txt                        |   4 +-
 include/CMakeLists.txt                |   1 +
 include/caosdb/authentication.h       |   9 +-
 include/caosdb/certificate_provider.h |  53 +++++++++++
 include/caosdb/configuration.h        |  71 +++++++++++---
 include/caosdb/connection.h           |  89 ++----------------
 include/caosdb/entity.h               |   2 +-
 include/caosdb/info.h                 |   2 +-
 include/caosdb/transaction.h          |   4 +-
 include/caosdb/utility.h              |  16 ++--
 src/caosdb/authentication.cpp         |   2 +-
 src/caosdb/configuration.cpp          | 117 ++++++++++++++++++++++--
 src/caosdb/connection.cpp             | 127 ++------------------------
 src/caosdb/transaction.cpp            |  18 ++--
 src/ccaosdb.cpp                       |  37 ++++----
 src/ccaosdbcli.c                      |   2 +-
 src/cxxcaosdbcli.cpp                  |   6 +-
 test/test_ccaosdb.cpp                 |   6 +-
 test/test_configuration.cpp           |   6 +-
 test/test_connection.cpp              |  23 +++--
 test/test_info.cpp                    |   6 +-
 test/test_transaction.cpp             |   8 +-
 test/test_utility.cpp                 |  10 +-
 23 files changed, 320 insertions(+), 299 deletions(-)
 create mode 100644 include/caosdb/certificate_provider.h

diff --git a/CMakeLists.txt b/CMakeLists.txt
index b41ee6f..0131970 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -248,7 +248,7 @@ if(_LINTING)
     add_compiler_flag("-pedantic")
     add_compiler_flag("-Werror")
 
-    set(TARGET_CAOSDB_COMPILE_FLAGS "${TARGET_CAOSDB_COMPILE_FLAGS} ${PEDANTIC_CMAKE_CXX_FLAGS} -isystem /home/tf/.conan/data/grpc/1.38.0/_/_/package/aa66ddfaf24f11a0a60b742fd5533cfa79965e20/include/grpcpp/impl/codegen/server_interface.h")
+    set(TARGET_CAOSDB_COMPILE_FLAGS "${TARGET_CAOSDB_COMPILE_FLAGS} ${PEDANTIC_CMAKE_CXX_FLAGS}")
     set(TARGET_CCAOSDB_COMPILE_FLAGS "${TARGET_CCAOSDB_COMPILE_FLAGS} ${PEDANTIC_CMAKE_C_FLAGS}")
     set(TARGET_CXXCAOSDBCLI_COMPILE_FLAGS "${TARGET_CXXCAOSDBCLI_COMPILE_FLAGS} ${PEDANTIC_CMAKE_CXX_FLAGS}")
     set(TARGET_CCAOSDBCLI_COMPILE_FLAGS "${TARGET_CCAOSDBCLI_COMPILE_FLAGS} ${PEDANTIC_CMAKE_C_FLAGS}")
@@ -289,7 +289,7 @@ if(_LINTING)
     else()
         message(STATUS "clang-tidy: ${clang_tidy}")
         set(_CMAKE_CXX_CLANG_TIDY_CHECKS
-            "--checks=*,-fuchsia-*,-llvm-include-order,-llvmlibc-*,-readability-convert-member-functions-to-static,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,-hicpp-no-array-decay,-llvm-else-after-return,-readability-else-after-return")
+            "--checks=*,-fuchsia-*,-llvmlibc-*,-readability-convert-member-functions-to-static,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,-hicpp-no-array-decay,-llvm-else-after-return,-readability-else-after-return")
         set(_CMAKE_C_CLANG_TIDY_CHECKS "${_CMAKE_CXX_CLANG_TIDY_CHECKS}")
         set(_CMAKE_CXX_CLANG_TIDY "${clang_tidy}"
             "--header-filter=caosdb/.*[^\(\.pb\.h\)]$"
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
index 48f470b..51afe43 100644
--- a/include/CMakeLists.txt
+++ b/include/CMakeLists.txt
@@ -21,6 +21,7 @@
 # add all header files to this list
 set(libcaosdb_INCL
     ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/authentication.h
+    ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/certificate_provider.h
     ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/configuration.h
     ${CMAKE_CURRENT_SOURCE_DIR}/caosdb/connection.h
     ${CMAKE_CURRENT_BINARY_DIR}/caosdb/constants.h
diff --git a/include/caosdb/authentication.h b/include/caosdb/authentication.h
index 8071414..fc2420c 100644
--- a/include/caosdb/authentication.h
+++ b/include/caosdb/authentication.h
@@ -27,16 +27,15 @@
  * @date 2021-06-28
  * @brief Configuration and setup of the client authentication.
  */
-
-#include <grpcpp/security/credentials.h>               // for CallCredentials
-#include <map>                                         // for multimap
-#include <memory>                                      // for shared_ptr
-#include <string>                                      // for string
 #include "caosdb/utility.h"                            // for base64_encode
 #include "grpcpp/impl/codegen/interceptor.h"           // for Status
 #include "grpcpp/impl/codegen/security/auth_context.h" // for AuthContext
 #include "grpcpp/impl/codegen/status.h"                // for Status
 #include "grpcpp/impl/codegen/string_ref.h"            // for string_ref
+#include <grpcpp/security/credentials.h>               // for CallCredentials
+#include <map>                                         // for multimap
+#include <memory>                                      // for shared_ptr
+#include <string>                                      // for string
 
 namespace caosdb {
 namespace authentication {
diff --git a/include/caosdb/certificate_provider.h b/include/caosdb/certificate_provider.h
new file mode 100644
index 0000000..e7d7a15
--- /dev/null
+++ b/include/caosdb/certificate_provider.h
@@ -0,0 +1,53 @@
+/*
+ * This file is a part of the CaosDB Project.
+ *
+ * Copyright (C) 2021 Timm Fitschen <t.fitschen@indiscale.com>
+ * Copyright (C) 2021 IndiScale GmbH <info@indiscale.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef CAOSDB_CERTIFICATE_PROVIDER_H
+#define CAOSDB_CERTIFICATE_PROVIDER_H
+
+#include "boost/filesystem/path.hpp" // for path
+namespace caosdb::configuration {
+using boost::filesystem::path;
+
+class CertificateProvider {
+public:
+  [[nodiscard]] auto virtual GetCertificatePem() const -> std::string = 0;
+  virtual ~CertificateProvider() = default;
+};
+
+class PemFileCertificateProvider : public CertificateProvider {
+private:
+  std::string certificate_provider;
+
+public:
+  explicit PemFileCertificateProvider(const path &path);
+  [[nodiscard]] auto GetCertificatePem() const -> std::string override;
+};
+
+class PemCertificateProvider : public CertificateProvider {
+private:
+  std::string certificate_provider;
+
+public:
+  explicit PemCertificateProvider(const std::string &certificate_provider);
+  [[nodiscard]] auto GetCertificatePem() const -> std::string override;
+};
+} // namespace caosdb::configuration
+#endif
diff --git a/include/caosdb/configuration.h b/include/caosdb/configuration.h
index 8ac50ef..f6f2075 100644
--- a/include/caosdb/configuration.h
+++ b/include/caosdb/configuration.h
@@ -21,17 +21,19 @@
 
 #ifndef CAOSDB_CONFIGURATION_H
 #define CAOSDB_CONFIGURATION_H
-#include <memory>                          // for unique_ptr
-#include <string>                          // for string
 #include "boost/filesystem/operations.hpp" // for exists
 #include "boost/filesystem/path.hpp"       // for path
 #include "boost/json/object.hpp"           // for object
 #include "boost/json/value.hpp"            // for value
 #include "boost/json/value_ref.hpp"        // IWYU pragma: keep
 #include "caosdb/authentication.h"         // for Authenticator, PlainPassw...
-#include "caosdb/connection.h" // for ConnectionConfiguration, Certifi...
-#include "caosdb/exceptions.h" // for ConfigurationError
-#include "caosdb/utility.h"    // for load_json_file
+#include "caosdb/certificate_provider.h"   // for CertificateProvider, path
+#include "caosdb/exceptions.h"             // for ConfigurationError
+#include "caosdb/utility.h"                // for load_json_file
+#include "grpcpp/security/credentials.h"   // for ChannelCredentials
+#include <iosfwd>                          // for ostream
+#include <memory>                          // for unique_ptr, shared_ptr
+#include <string>                          // for string
 
 namespace caosdb::configuration {
 using boost::filesystem::exists;
@@ -41,14 +43,61 @@ using boost::json::object;
 using boost::json::value;
 using caosdb::authentication::Authenticator;
 using caosdb::authentication::PlainPasswordAuthenticator;
-using caosdb::connection::CertificateProvider;
-using caosdb::connection::ConnectionConfiguration;
-using caosdb::connection::ConnectionManager;
-using caosdb::connection::InsecureConnectionConfiguration;
-using caosdb::connection::PemFileCertificateProvider;
-using caosdb::connection::TlsConnectionConfiguration;
 using caosdb::exceptions::ConfigurationError;
 using caosdb::utility::load_json_file;
+using grpc::ChannelCredentials;
+
+/**
+ * @brief Configuration of the CaosDB connection.
+ */
+class ConnectionConfiguration {
+private:
+  std::string host;
+  int port;
+
+public:
+  ConnectionConfiguration(const std::string &host, int port);
+  virtual ~ConnectionConfiguration() = default;
+  friend auto operator<<(std::ostream &out,
+                         const ConnectionConfiguration &configuration)
+    -> std::ostream &;
+
+  [[nodiscard]] auto virtual ToString() const -> std::string = 0;
+  [[nodiscard]] auto GetHost() const -> std::string;
+  [[nodiscard]] auto GetPort() const -> int;
+  [[nodiscard]] auto virtual GetChannelCredentials() const
+    -> std::shared_ptr<ChannelCredentials> = 0;
+};
+
+class InsecureConnectionConfiguration : public ConnectionConfiguration {
+private:
+  std::shared_ptr<ChannelCredentials> credentials;
+
+public:
+  InsecureConnectionConfiguration(const std::string &host, int port);
+  [[nodiscard]] auto GetChannelCredentials() const
+    -> std::shared_ptr<ChannelCredentials> override;
+  [[nodiscard]] auto ToString() const -> std::string override;
+};
+
+class TlsConnectionConfiguration : public ConnectionConfiguration {
+private:
+  std::shared_ptr<ChannelCredentials> credentials;
+  std::string certificate_provider;
+
+public:
+  TlsConnectionConfiguration(const std::string &host, int port);
+  TlsConnectionConfiguration(const std::string &host, int port,
+                             const Authenticator &authenticator);
+  TlsConnectionConfiguration(const std::string &host, int port,
+                             const CertificateProvider &certificate_provider);
+  TlsConnectionConfiguration(const std::string &host, int port,
+                             const CertificateProvider &certificate_provider,
+                             const Authenticator &authenticator);
+  [[nodiscard]] auto GetChannelCredentials() const
+    -> std::shared_ptr<ChannelCredentials> override;
+  [[nodiscard]] auto ToString() const -> std::string override;
+};
 
 /**
  * Helper class (no state, just member functions) which should only be used by
diff --git a/include/caosdb/connection.h b/include/caosdb/connection.h
index c81bb72..33fb760 100644
--- a/include/caosdb/connection.h
+++ b/include/caosdb/connection.h
@@ -27,102 +27,27 @@
  * @date 2021-05-18
  * @brief Configuration and setup of the connection.
  */
-#include <iosfwd>                                // for ostream
-#include <map>                                   // for map
-#include <memory>                                // for shared_ptr, unique_ptr
-#include <string>                                // for string, basic_string
+#include "boost/filesystem/path.hpp"             // for path
 #include "caosdb/authentication.h"               // for Authenticator
+#include "caosdb/configuration.h"                // for ConnectionConfigura...
 #include "caosdb/entity/v1alpha1/main.grpc.pb.h" // for EntityTransactionSe...
 #include "caosdb/info.h"                         // for VersionInfo
 #include "caosdb/info/v1alpha1/main.grpc.pb.h"   // for GeneralInfoService:...
 #include "caosdb/transaction.h"                  // for Transaction
 #include "grpcpp/channel.h"                      // for Channel
-#include "grpcpp/security/credentials.h"         // for ChannelCredentials
+#include <iosfwd>                                // for ostream
+#include <map>                                   // for map
+#include <memory>                                // for shared_ptr, unique_ptr
+#include <string>                                // for string, basic_string
 
 namespace caosdb::connection {
 using boost::filesystem::path;
 using caosdb::authentication::Authenticator;
+using caosdb::configuration::ConnectionConfiguration;
 using caosdb::entity::v1alpha1::EntityTransactionService;
 using caosdb::info::VersionInfo;
 using caosdb::info::v1alpha1::GeneralInfoService;
 using caosdb::transaction::Transaction;
-using grpc::ChannelCredentials;
-
-class CertificateProvider {
-public:
-  [[nodiscard]] auto virtual GetCertificatePem() const -> std::string = 0;
-  virtual ~CertificateProvider() = default;
-};
-
-class PemFileCertificateProvider : public CertificateProvider {
-private:
-  std::string certificate_provider;
-
-public:
-  explicit PemFileCertificateProvider(const path &path);
-  [[nodiscard]] auto GetCertificatePem() const -> std::string override;
-};
-
-class PemCertificateProvider : public CertificateProvider {
-private:
-  std::string certificate_provider;
-
-public:
-  explicit PemCertificateProvider(const std::string &certificate_provider);
-  [[nodiscard]] auto GetCertificatePem() const -> std::string override;
-};
-
-/**
- * @brief Configuration of the CaosDB connection.
- */
-class ConnectionConfiguration {
-private:
-  std::string host;
-  int port;
-
-public:
-  ConnectionConfiguration(const std::string &host, int port);
-  virtual ~ConnectionConfiguration() = default;
-  friend auto operator<<(std::ostream &out,
-                         const ConnectionConfiguration &configuration)
-    -> std::ostream &;
-
-  [[nodiscard]] auto virtual ToString() const -> std::string = 0;
-  [[nodiscard]] auto GetHost() const -> std::string;
-  [[nodiscard]] auto GetPort() const -> int;
-  [[nodiscard]] auto virtual GetChannelCredentials() const
-    -> std::shared_ptr<ChannelCredentials> = 0;
-};
-
-class InsecureConnectionConfiguration : public ConnectionConfiguration {
-private:
-  std::shared_ptr<ChannelCredentials> credentials;
-
-public:
-  InsecureConnectionConfiguration(const std::string &host, int port);
-  [[nodiscard]] auto GetChannelCredentials() const
-    -> std::shared_ptr<ChannelCredentials> override;
-  [[nodiscard]] auto ToString() const -> std::string override;
-};
-
-class TlsConnectionConfiguration : public ConnectionConfiguration {
-private:
-  std::shared_ptr<ChannelCredentials> credentials;
-  std::string certificate_provider;
-
-public:
-  TlsConnectionConfiguration(const std::string &host, int port);
-  TlsConnectionConfiguration(const std::string &host, int port,
-                             const Authenticator &authenticator);
-  TlsConnectionConfiguration(const std::string &host, int port,
-                             const CertificateProvider &certificate_provider);
-  TlsConnectionConfiguration(const std::string &host, int port,
-                             const CertificateProvider &certificate_provider,
-                             const Authenticator &authenticator);
-  [[nodiscard]] auto GetChannelCredentials() const
-    -> std::shared_ptr<ChannelCredentials> override;
-  [[nodiscard]] auto ToString() const -> std::string override;
-};
 
 /**
  * @brief A reusable connection to a CaosDBServer.
diff --git a/include/caosdb/entity.h b/include/caosdb/entity.h
index e98b852..f25b6dc 100644
--- a/include/caosdb/entity.h
+++ b/include/caosdb/entity.h
@@ -28,9 +28,9 @@
 #ifndef CAOSDB_ENTITY_H
 #define CAOSDB_ENTITY_H
 
+#include "caosdb/entity/v1alpha1/main.pb.h" // for Entity, RepeatedField
 #include <memory>                           // for unique_ptr
 #include <string>                           // for string
-#include "caosdb/entity/v1alpha1/main.pb.h" // for Entity, RepeatedField
 
 namespace caosdb::entity {
 
diff --git a/include/caosdb/info.h b/include/caosdb/info.h
index f4f290b..751539e 100644
--- a/include/caosdb/info.h
+++ b/include/caosdb/info.h
@@ -27,9 +27,9 @@
  * @date 2021-07-02
  * @brief General information about the CaosDBServer.
  */
+#include "caosdb/info/v1alpha1/main.pb.h" // for VersionInfo
 #include <cstdint>                        // for uint32_t
 #include <string>                         // for string
-#include "caosdb/info/v1alpha1/main.pb.h" // for VersionInfo
 
 namespace caosdb::info {
 
diff --git a/include/caosdb/transaction.h b/include/caosdb/transaction.h
index 8989951..b7d419b 100644
--- a/include/caosdb/transaction.h
+++ b/include/caosdb/transaction.h
@@ -26,11 +26,11 @@
 #ifndef CAOSDB_TRANSACTION_H
 #define CAOSDB_TRANSACTION_H
 
-#include <memory>                                // for shared_ptr, unique_ptr
-#include <string>                                // for string
 #include "caosdb/entity.h"                       // for Entity
 #include "caosdb/entity/v1alpha1/main.grpc.pb.h" // for EntityTransactionSe...
 #include "caosdb/entity/v1alpha1/main.pb.h"      // for Entity, RetrieveReq...
+#include <memory>                                // for shared_ptr, unique_ptr
+#include <string>                                // for string
 
 namespace caosdb::transaction {
 using caosdb::entity::Entity;
diff --git a/include/caosdb/utility.h b/include/caosdb/utility.h
index 843c1af..e1e306e 100644
--- a/include/caosdb/utility.h
+++ b/include/caosdb/utility.h
@@ -21,18 +21,18 @@
 
 #ifndef CAOSDB_UTILS_H
 #define CAOSDB_UTILS_H
-#include <cassert>
-#include <iostream>
-#include <string_view>
-#include <fstream>
-#include <string>
-#include <cstdlib>
-#include <memory>
-#include <boost/json.hpp>
 #include <boost/beast/core/detail/base64.hpp>
 #include <boost/filesystem.hpp>
 #include <boost/filesystem/fstream.hpp>
 #include <boost/filesystem/string_file.hpp>
+#include <boost/json.hpp>
+#include <cassert>
+#include <cstdlib>
+#include <fstream>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <string_view>
 
 namespace caosdb::utility {
 using boost::filesystem::exists;
diff --git a/src/caosdb/authentication.cpp b/src/caosdb/authentication.cpp
index db92762..a1c84e5 100644
--- a/src/caosdb/authentication.cpp
+++ b/src/caosdb/authentication.cpp
@@ -19,13 +19,13 @@
  *
  */
 #include "caosdb/authentication.h"
+#include "grpcpp/security/credentials.h"    // for MetadataCredentialsPlugin
 #include <grpcpp/impl/codegen/status.h>     // for Status, Status::OK
 #include <grpcpp/impl/codegen/string_ref.h> // for string_ref
 #include <map>                              // for multimap
 #include <memory>                           // for allocator, shared_ptr
 #include <string>                           // for basic_string, operator+
 #include <utility>                          // for pair, move, make_pair
-#include "grpcpp/security/credentials.h"    // for MetadataCredentialsFromP...
 
 namespace caosdb::authentication {
 using caosdb::utility::base64_encode;
diff --git a/src/caosdb/configuration.cpp b/src/caosdb/configuration.cpp
index 3e43b1d..2fed3e4 100644
--- a/src/caosdb/configuration.cpp
+++ b/src/caosdb/configuration.cpp
@@ -19,9 +19,6 @@
  *
  */
 #include "caosdb/configuration.h"
-#include <cstdlib>                            // for getenv
-#include <cassert>                            // for assert
-#include <string>                             // for char_traits, string
 #include "boost/iterator/iterator_facade.hpp" // for iterator_facade_base
 #include "boost/json/impl/object.hpp"         // for object::at, object::begin
 #include "boost/json/string.hpp"              // for string
@@ -30,6 +27,11 @@
 #include "caosdb/connection.h"                // for TlsConnectionConfiguration
 #include "caosdb/constants.h"                 // for LIBCAOSDB_CONFIGURATIO...
 #include "caosdb/exceptions.h"                // for ConfigurationError
+#include "caosdb/utility.h"                   // for load_string_file
+#include <cassert>                            // for assert
+#include <cstdlib>                            // for getenv
+#include <grpcpp/security/credentials.h>      // for SslCredentials
+#include <string>                             // for char_traits, string
 
 namespace caosdb::configuration {
 using boost::filesystem::exists;
@@ -38,14 +40,113 @@ using boost::json::object;
 using boost::json::value;
 using caosdb::authentication::Authenticator;
 using caosdb::authentication::PlainPasswordAuthenticator;
-using caosdb::connection::CertificateProvider;
-using caosdb::connection::ConnectionConfiguration;
-using caosdb::connection::InsecureConnectionConfiguration;
-using caosdb::connection::PemFileCertificateProvider;
-using caosdb::connection::TlsConnectionConfiguration;
+using caosdb::connection::ConnectionManager;
 using caosdb::exceptions::ConfigurationError;
 using caosdb::utility::get_home_directory;
 using caosdb::utility::load_json_file;
+using caosdb::utility::load_string_file;
+using grpc::InsecureChannelCredentials;
+using grpc::SslCredentials;
+using grpc::SslCredentialsOptions;
+
+PemFileCertificateProvider::PemFileCertificateProvider(const path &path) {
+  this->certificate_provider = load_string_file(path);
+}
+
+auto PemFileCertificateProvider::GetCertificatePem() const -> std::string {
+  return this->certificate_provider;
+}
+
+PemCertificateProvider::PemCertificateProvider(
+  const std::string &certificate_provider) {
+  this->certificate_provider = certificate_provider;
+}
+
+auto PemCertificateProvider::GetCertificatePem() const -> std::string {
+  return this->certificate_provider;
+}
+
+ConnectionConfiguration::ConnectionConfiguration(const std::string &host,
+                                                 int port) {
+  this->host = host;
+  this->port = port;
+}
+
+auto ConnectionConfiguration::GetHost() const -> std::string {
+  return this->host;
+}
+
+auto ConnectionConfiguration::GetPort() const -> int { return this->port; }
+
+auto operator<<(std::ostream &out, const ConnectionConfiguration &configuration)
+  -> std::ostream & {
+  out << configuration.ToString();
+  return out;
+}
+
+InsecureConnectionConfiguration::InsecureConnectionConfiguration(
+  const std::string &host, int port)
+  : ConnectionConfiguration(host, port) {
+  this->credentials = InsecureChannelCredentials();
+}
+
+auto InsecureConnectionConfiguration::GetChannelCredentials() const
+  -> std::shared_ptr<ChannelCredentials> {
+  return this->credentials;
+}
+
+auto InsecureConnectionConfiguration::ToString() const -> std::string {
+  return "InsecureConnectionConfiguration(" + this->GetHost() + "," +
+         std::to_string(this->GetPort()) + ")";
+}
+
+TlsConnectionConfiguration::TlsConnectionConfiguration(const std::string &host,
+                                                       int port)
+  : ConnectionConfiguration(host, port) {
+  SslCredentialsOptions options;
+  this->credentials = SslCredentials(options);
+}
+
+TlsConnectionConfiguration::TlsConnectionConfiguration(
+  const std::string &host, int port,
+  const CertificateProvider &certificate_provider)
+  : ConnectionConfiguration(host, port) {
+  SslCredentialsOptions options;
+  options.pem_root_certs = certificate_provider.GetCertificatePem();
+  this->credentials = SslCredentials(options);
+}
+
+TlsConnectionConfiguration::TlsConnectionConfiguration(
+  const std::string &host, int port, const Authenticator &authenticator)
+  : ConnectionConfiguration(host, port) {
+
+  SslCredentialsOptions options;
+  this->credentials = grpc::CompositeChannelCredentials(
+    SslCredentials(options), authenticator.GetCallCredentials());
+}
+
+TlsConnectionConfiguration::TlsConnectionConfiguration(
+  const std::string &host, int port,
+  const CertificateProvider &certificate_provider,
+  const Authenticator &authenticator)
+  : ConnectionConfiguration(host, port) {
+
+  SslCredentialsOptions options;
+  options.pem_root_certs = certificate_provider.GetCertificatePem();
+  this->credentials = grpc::CompositeChannelCredentials(
+    SslCredentials(options), authenticator.GetCallCredentials());
+}
+
+auto TlsConnectionConfiguration::GetChannelCredentials() const
+  -> std::shared_ptr<ChannelCredentials> {
+  return this->credentials;
+}
+
+auto TlsConnectionConfiguration::ToString() const -> std::string {
+  return "TlsConnectionConfiguration(" + this->GetHost() + "," +
+         std::to_string(this->GetPort()) + "," + this->certificate_provider +
+         ")";
+}
 
 auto ConnectionConfigurationHelper::CreateCertificateProvider(
   const object &from) const -> std::unique_ptr<CertificateProvider> {
diff --git a/src/caosdb/connection.cpp b/src/caosdb/connection.cpp
index 8607857..853996e 100644
--- a/src/caosdb/connection.cpp
+++ b/src/caosdb/connection.cpp
@@ -20,28 +20,24 @@
  *
  */
 #include "caosdb/connection.h"
-#include <grpcpp/create_channel.h>              // for CreateChannel
-#include <grpcpp/impl/codegen/client_context.h> // for ClientContext
-#include <grpcpp/impl/codegen/status.h>         // for Status
-#include <grpcpp/security/credentials.h>        // for SslCredentials
-#include <iostream>                             // for operator<<, basic_...
-#include <stdexcept>                            // for runtime_error
-#include <string>                               // for operator+, char_tr...
-#include <memory>
-#include "caosdb/authentication.h" // for Authenticator
-#include "caosdb/configuration.h"
+#include "caosdb/configuration.h"                 // for ConnectionConfigur...
 #include "caosdb/exceptions.h"                    // for AuthenticationError
+#include "caosdb/info.h"                          // for VersionInfo
 #include "caosdb/info/v1alpha1/main.grpc.pb.h"    // for GeneralInfoService
 #include "caosdb/info/v1alpha1/main.pb.h"         // for GetVersionInfoResp...
 #include "caosdb/transaction.h"                   // for Transaction
-#include "caosdb/utility.h"                       // for load_string_file
-#include "caosdb/info.h"                          // for VersionInfo
 #include "grpcpp/impl/codegen/status_code_enum.h" // for StatusCode, UNAUTH...
+#include <grpcpp/create_channel.h>                // for CreateChannel
+#include <grpcpp/impl/codegen/client_context.h>   // for ClientContext
+#include <grpcpp/impl/codegen/status.h>           // for Status
+#include <iostream>                               // for operator<<
+#include <memory>                                 // for allocator, shared_ptr
+#include <stdexcept>                              // for runtime_error
+#include <string>                                 // for string, operator+
 
 namespace caosdb::connection {
-using boost::filesystem::path;
-using caosdb::authentication::Authenticator;
 using caosdb::configuration::ConfigurationManager;
+using caosdb::configuration::ConnectionConfiguration;
 using caosdb::entity::v1alpha1::EntityTransactionService;
 using caosdb::exceptions::AuthenticationError;
 using caosdb::exceptions::ConnectionError;
@@ -50,109 +46,6 @@ using caosdb::info::v1alpha1::GeneralInfoService;
 using caosdb::info::v1alpha1::GetVersionInfoRequest;
 using caosdb::info::v1alpha1::GetVersionInfoResponse;
 using caosdb::transaction::Transaction;
-using caosdb::utility::load_string_file;
-using grpc::InsecureChannelCredentials;
-using grpc::SslCredentials;
-using grpc::SslCredentialsOptions;
-
-PemFileCertificateProvider::PemFileCertificateProvider(const path &path) {
-  this->certificate_provider = load_string_file(path);
-}
-
-auto PemFileCertificateProvider::GetCertificatePem() const -> std::string {
-  return this->certificate_provider;
-}
-
-PemCertificateProvider::PemCertificateProvider(
-  const std::string &certificate_provider) {
-  this->certificate_provider = certificate_provider;
-}
-
-auto PemCertificateProvider::GetCertificatePem() const -> std::string {
-  return this->certificate_provider;
-}
-
-ConnectionConfiguration::ConnectionConfiguration(const std::string &host,
-                                                 int port) {
-  this->host = host;
-  this->port = port;
-}
-
-auto ConnectionConfiguration::GetHost() const -> std::string {
-  return this->host;
-}
-
-auto ConnectionConfiguration::GetPort() const -> int { return this->port; }
-
-auto operator<<(std::ostream &out, const ConnectionConfiguration &configuration)
-  -> std::ostream & {
-  out << configuration.ToString();
-  return out;
-}
-
-InsecureConnectionConfiguration::InsecureConnectionConfiguration(
-  const std::string &host, int port)
-  : ConnectionConfiguration(host, port) {
-  this->credentials = InsecureChannelCredentials();
-}
-
-auto InsecureConnectionConfiguration::GetChannelCredentials() const
-  -> std::shared_ptr<ChannelCredentials> {
-  return this->credentials;
-}
-
-auto InsecureConnectionConfiguration::ToString() const -> std::string {
-  return "InsecureConnectionConfiguration(" + this->GetHost() + "," +
-         std::to_string(this->GetPort()) + ")";
-}
-
-TlsConnectionConfiguration::TlsConnectionConfiguration(const std::string &host,
-                                                       int port)
-  : ConnectionConfiguration(host, port) {
-  SslCredentialsOptions options;
-  this->credentials = SslCredentials(options);
-}
-
-TlsConnectionConfiguration::TlsConnectionConfiguration(
-  const std::string &host, int port,
-  const CertificateProvider &certificate_provider)
-  : ConnectionConfiguration(host, port) {
-  SslCredentialsOptions options;
-  options.pem_root_certs = certificate_provider.GetCertificatePem();
-  this->credentials = SslCredentials(options);
-}
-
-TlsConnectionConfiguration::TlsConnectionConfiguration(
-  const std::string &host, int port, const Authenticator &authenticator)
-  : ConnectionConfiguration(host, port) {
-
-  SslCredentialsOptions options;
-  this->credentials = grpc::CompositeChannelCredentials(
-    SslCredentials(options), authenticator.GetCallCredentials());
-}
-
-TlsConnectionConfiguration::TlsConnectionConfiguration(
-  const std::string &host, int port,
-  const CertificateProvider &certificate_provider,
-  const Authenticator &authenticator)
-  : ConnectionConfiguration(host, port) {
-
-  SslCredentialsOptions options;
-  options.pem_root_certs = certificate_provider.GetCertificatePem();
-  this->credentials = grpc::CompositeChannelCredentials(
-    SslCredentials(options), authenticator.GetCallCredentials());
-}
-
-auto TlsConnectionConfiguration::GetChannelCredentials() const
-  -> std::shared_ptr<ChannelCredentials> {
-  return this->credentials;
-}
-
-auto TlsConnectionConfiguration::ToString() const -> std::string {
-  return "TlsConnectionConfiguration(" + this->GetHost() + "," +
-         std::to_string(this->GetPort()) + "," + this->certificate_provider +
-         ")";
-}
 
 Connection::Connection(const ConnectionConfiguration &configuration) {
   const std::string target =
diff --git a/src/caosdb/transaction.cpp b/src/caosdb/transaction.cpp
index bf2e884..7adcb21 100644
--- a/src/caosdb/transaction.cpp
+++ b/src/caosdb/transaction.cpp
@@ -17,19 +17,17 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  *
  */
-
-#include "caosdb/entity.h"
-#include "caosdb/exceptions.h" // for AuthenticationError
 #include "caosdb/transaction.h"
-#include <memory>
-#include <utility>
-#include <iostream>                               // for basic_ostream::ope...
-#include <stdexcept>                              // for runtime_error
+#include "caosdb/entity/v1alpha1/main.grpc.pb.h"  // for EntityTransactionS...
+#include "caosdb/entity/v1alpha1/main.pb.h"       // for RetrieveRequest
+#include "caosdb/exceptions.h"                    // for AuthenticationError
+#include "grpcpp/impl/codegen/status_code_enum.h" // for StatusCode, UNAUTH...
 #include <grpcpp/impl/codegen/client_context.h>   // for ClientContext
 #include <grpcpp/impl/codegen/status.h>           // for Status
-#include "grpcpp/impl/codegen/status_code_enum.h" // for StatusCode, UNAUTH...
-#include "caosdb/entity/v1alpha1/main.pb.h"
-#include "caosdb/entity/v1alpha1/main.grpc.pb.h"
+#include <iostream>                               // for basic_ostream::ope...
+#include <memory>                                 // for make_unique, share...
+#include <stdexcept>                              // for runtime_error
+#include <utility>                                // for move
 
 namespace caosdb::transaction {
 using caosdb::entity::v1alpha1::EntityTransactionService;
diff --git a/src/ccaosdb.cpp b/src/ccaosdb.cpp
index 4888766..42ca048 100644
--- a/src/ccaosdb.cpp
+++ b/src/ccaosdb.cpp
@@ -1,11 +1,10 @@
-#include <iostream>
-#include <stdio.h>
-#include <cassert>
+#include "ccaosdb.h"
+#include "caosdb/connection.h"
 #include "caosdb/constants.h"
 #include "caosdb/utility.h"
-#include "caosdb/constants.h"
-#include "caosdb/connection.h"
-#include "ccaosdb.h"
+#include <cassert>
+#include <iostream>
+#include <stdio.h>
 
 extern "C" {
 
@@ -45,13 +44,13 @@ const char *caosdb_utility_get_env_var(const char *name,
 int caosdb_connection_create_pem_file_certificate_provider(
   caosdb_connection_certificate_provider *out, const char *path) {
   out->wrapped_certificate_provider =
-    new caosdb::connection::PemFileCertificateProvider(std::string(path));
+    new caosdb::configuration::PemFileCertificateProvider(std::string(path));
   return 0;
 }
 
 int caosdb_connection_delete_certificate_provider(
   caosdb_connection_certificate_provider *provider) {
-  delete static_cast<caosdb::connection::CertificateProvider *>(
+  delete static_cast<caosdb::configuration::CertificateProvider *>(
     provider->wrapped_certificate_provider);
   return 0;
 }
@@ -80,31 +79,31 @@ int caosdb_connection_create_tls_connection_configuration(
   auto host_str = std::string(host);
   if (authenticator != nullptr && provider != nullptr) {
     auto wrapped_provider =
-      static_cast<caosdb::connection::CertificateProvider *>(
+      static_cast<caosdb::configuration::CertificateProvider *>(
         provider->wrapped_certificate_provider);
     auto wrapped_authenticator =
       static_cast<caosdb::authentication::Authenticator *>(
         authenticator->wrapped_authenticator);
     out->wrapped_connection_configuration =
-      new caosdb::connection::TlsConnectionConfiguration(
+      new caosdb::configuration::TlsConnectionConfiguration(
         host_str, port, *wrapped_provider, *wrapped_authenticator);
   } else if (authenticator != nullptr) {
     auto wrapped_authenticator =
       static_cast<caosdb::authentication::Authenticator *>(
         authenticator->wrapped_authenticator);
     out->wrapped_connection_configuration =
-      new caosdb::connection::TlsConnectionConfiguration(
+      new caosdb::configuration::TlsConnectionConfiguration(
         host_str, port, *wrapped_authenticator);
   } else if (provider != nullptr) {
     auto wrapped_provider =
-      static_cast<caosdb::connection::CertificateProvider *>(
+      static_cast<caosdb::configuration::CertificateProvider *>(
         provider->wrapped_certificate_provider);
     out->wrapped_connection_configuration =
-      new caosdb::connection::TlsConnectionConfiguration(host_str, port,
-                                                         *wrapped_provider);
+      new caosdb::configuration::TlsConnectionConfiguration(host_str, port,
+                                                            *wrapped_provider);
   } else {
     out->wrapped_connection_configuration =
-      new caosdb::connection::TlsConnectionConfiguration(host_str, port);
+      new caosdb::configuration::TlsConnectionConfiguration(host_str, port);
   }
   return 0;
 }
@@ -113,13 +112,13 @@ int caosdb_connection_create_insecure_connection_configuration(
   caosdb_connection_connection_configuration *out, const char *host,
   const int port) {
   out->wrapped_connection_configuration =
-    new caosdb::connection::InsecureConnectionConfiguration(host, port);
+    new caosdb::configuration::InsecureConnectionConfiguration(host, port);
   return 0;
 }
 
 int caosdb_connection_delete_connection_configuration(
   caosdb_connection_connection_configuration *configuration) {
-  delete static_cast<caosdb::connection::ConnectionConfiguration *>(
+  delete static_cast<caosdb::configuration::ConnectionConfiguration *>(
     configuration->wrapped_connection_configuration);
   return 0;
 }
@@ -127,8 +126,8 @@ int caosdb_connection_delete_connection_configuration(
 int caosdb_connection_create_connection(
   caosdb_connection_connection *out,
   const caosdb_connection_connection_configuration *configuration) {
-  caosdb::connection::ConnectionConfiguration *config =
-    static_cast<caosdb::connection::ConnectionConfiguration *>(
+  caosdb::configuration::ConnectionConfiguration *config =
+    static_cast<caosdb::configuration::ConnectionConfiguration *>(
       configuration->wrapped_connection_configuration);
   out->wrapped_connection = new caosdb::connection::Connection(*config);
   return 0;
diff --git a/src/ccaosdbcli.c b/src/ccaosdbcli.c
index eaadc3c..ba30b8d 100644
--- a/src/ccaosdbcli.c
+++ b/src/ccaosdbcli.c
@@ -1,6 +1,6 @@
-#include <stdio.h>            // for printf
 #include "caosdb/constants.h" // for LIBCAOSDB_VERSION_MAJOR, LIBCAOSDB_VER...
 #include "ccaosdb.h"          // for caosdb_info_version_info, caosdb_conne...
+#include <stdio.h>            // for printf
 
 int main(void) {
   printf(
diff --git a/src/cxxcaosdbcli.cpp b/src/cxxcaosdbcli.cpp
index 763ddb5..0603af1 100644
--- a/src/cxxcaosdbcli.cpp
+++ b/src/cxxcaosdbcli.cpp
@@ -21,14 +21,14 @@
  */
 
 // A simple caosdb client
-#include <iostream>             // for operator<<, basic_ostream, basic_ost...
-#include <memory>               // for unique_ptr, allocator, __shared_ptr_...
-#include <string>               // for operator<<, char_traits
 #include "caosdb/connection.h"  // for Connection, ConnectionManager
 #include "caosdb/constants.h"   // for LIBCAOSDB_VERSION_MINOR, LIBCAOSDB_V...
 #include "caosdb/entity.h"      // for Entity
 #include "caosdb/info.h"        // for VersionInfo
 #include "caosdb/transaction.h" // for Transaction, UniqueResult, ResultSet
+#include <iostream>             // for operator<<, basic_ostream, basic_ost...
+#include <memory>               // for unique_ptr, allocator, __shared_ptr_...
+#include <string>               // for operator<<, char_traits
 
 auto main() -> int {
   std::cout << "CaosDB C++ client (libcaosdb "
diff --git a/test/test_ccaosdb.cpp b/test/test_ccaosdb.cpp
index b32ace9..abb06dd 100644
--- a/test/test_ccaosdb.cpp
+++ b/test/test_ccaosdb.cpp
@@ -20,13 +20,13 @@
  *
  */
 
+#include "caosdb/configuration.h"
+#include "caosdb_test_utility.h"   // for EXPECT_THROW_MESSAGE, TEST_DATA_DIR
+#include "ccaosdb.h"               // for caosdb_utility_get_env_var
 #include <gtest/gtest-message.h>   // for Message
 #include <gtest/gtest-test-part.h> // for SuiteApiResolver, TestFactoryImpl
 #include <gtest/gtest_pred_impl.h> // for Test, TestInfo, EXPECT_EQ, TEST
 #include <string>                  // for allocator
-#include "caosdb_test_utility.h"   // for EXPECT_THROW_MESSAGE, TEST_DATA_DIR
-#include "ccaosdb.h"               // for caosdb_utility_get_env_var
-#include "caosdb/configuration.h"
 
 class test_ccaosdb : public ::testing::Test {
 protected:
diff --git a/test/test_configuration.cpp b/test/test_configuration.cpp
index c7db039..fa5ecb2 100644
--- a/test/test_configuration.cpp
+++ b/test/test_configuration.cpp
@@ -19,13 +19,13 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  *
  */
+#include "caosdb/configuration.h"  // for ConfigurationManager, Configurati...
+#include "caosdb/exceptions.h"     // for ConfigurationError
+#include "caosdb_test_utility.h"   // for EXPECT_THROW_MESSAGE, TEST_DATA_DIR
 #include <gtest/gtest-message.h>   // for Message
 #include <gtest/gtest-test-part.h> // for TestPartResult, SuiteApiResolver
 #include <gtest/gtest_pred_impl.h> // for Test, TestInfo, TEST
 #include <string>                  // for operator+, allocator, string
-#include "caosdb/configuration.h"  // for ConfigurationManager, Configurati...
-#include "caosdb/exceptions.h"     // for ConfigurationError
-#include "caosdb_test_utility.h"   // for EXPECT_THROW_MESSAGE, TEST_DATA_DIR
 
 namespace caosdb::configuration {
 
diff --git a/test/test_connection.cpp b/test/test_connection.cpp
index 556b49e..7c2efab 100644
--- a/test/test_connection.cpp
+++ b/test/test_connection.cpp
@@ -19,19 +19,22 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  *
  */
-
-#include <gtest/gtest-message.h>   // for Message
-#include <gtest/gtest-test-part.h> // for TestPartResult, SuiteApiResolver
-#include <memory>                  // for allocator, operator!=, shared_ptr
-#include <string>                  // for operator+, string
-#include "caosdb/configuration.h"  // for ConfigurationManager
-#include "caosdb/connection.h"     // for ConnectionManager, InsecureConnec...
-#include "caosdb/exceptions.h"     // for UnknownConnectionError
-#include "caosdb_test_utility.h"   // for EXPECT_THROW_MESSAGE, TEST_DATA_DIR
-#include "gtest/gtest_pred_impl.h" // for Test, AssertionResult, TestInfo
+#include "caosdb/certificate_provider.h" // for PemCertificateProvider
+#include "caosdb/configuration.h"        // for InsecureConnectionConfigura...
+#include "caosdb/connection.h"           // for ConnectionManager
+#include "caosdb/exceptions.h"           // for UnknownConnectionError
+#include "caosdb_test_utility.h"         // for EXPECT_THROW_MESSAGE, TEST_...
+#include <gtest/gtest-message.h>         // for Message
+#include <gtest/gtest-test-part.h>       // for SuiteApiResolver, TestPartR...
+#include "gtest/gtest_pred_impl.h"       // for AssertionResult, TestInfo
+#include <memory>                        // for allocator, operator!=, shar...
+#include <string>                        // for operator+, string
 
 namespace caosdb::connection {
 using caosdb::configuration::ConfigurationManager;
+using caosdb::configuration::InsecureConnectionConfiguration;
+using caosdb::configuration::PemCertificateProvider;
+using caosdb::configuration::TlsConnectionConfiguration;
 
 class test_connection : public ::testing::Test {
 protected:
diff --git a/test/test_info.cpp b/test/test_info.cpp
index 2a806a6..a958702 100644
--- a/test/test_info.cpp
+++ b/test/test_info.cpp
@@ -20,12 +20,12 @@
  *
  */
 
-#include <gtest/gtest-message.h>          // for Message
-#include <gtest/gtest-test-part.h>        // for TestPartResult, SuiteApiRe...
-#include <memory>                         // for allocator
 #include "caosdb/info.h"                  // for VersionInfo
 #include "caosdb/info/v1alpha1/main.pb.h" // for VersionInfo
+#include <gtest/gtest-message.h>          // for Message
+#include <gtest/gtest-test-part.h>        // for TestPartResult, SuiteApiRe...
 #include "gtest/gtest_pred_impl.h"        // for Test, EXPECT_EQ, TEST
+#include <memory>                         // for allocator
 
 namespace caosdb::info {
 using ProtoVersionInfo = caosdb::info::v1alpha1::VersionInfo;
diff --git a/test/test_transaction.cpp b/test/test_transaction.cpp
index b528ae2..e970b6d 100644
--- a/test/test_transaction.cpp
+++ b/test/test_transaction.cpp
@@ -19,9 +19,8 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  *
  */
-
-#include <memory>                           // for allocator, make_shared
-#include "caosdb/connection.h"              // for InsecureConnection...
+#include "caosdb/configuration.h"           // for InsecureConnectionConfig...
+#include "caosdb/connection.h"              // for Connection
 #include "caosdb/entity.h"                  // for Entity
 #include "caosdb/entity/v1alpha1/main.pb.h" // for Entity
 #include "caosdb/exceptions.h"              // for ConnectionError
@@ -30,10 +29,11 @@
 #include "gtest/gtest-message.h"            // for Message
 #include "gtest/gtest-test-part.h"          // for SuiteApiResolver, TestPa...
 #include "gtest/gtest_pred_impl.h"          // for Test, TestInfo, TEST
+#include <memory>                           // for allocator, unique_ptr
 
 namespace caosdb::transaction {
+using caosdb::configuration::InsecureConnectionConfiguration;
 using caosdb::connection::Connection;
-using caosdb::connection::InsecureConnectionConfiguration;
 using caosdb::exceptions::ConnectionError;
 using caosdb::transaction::UniqueResult;
 using ProtoEntity = caosdb::entity::v1alpha1::Entity;
diff --git a/test/test_utility.cpp b/test/test_utility.cpp
index 400e0a6..eec6264 100644
--- a/test/test_utility.cpp
+++ b/test/test_utility.cpp
@@ -20,16 +20,16 @@
  *
  */
 
-#include <gtest/gtest-message.h>              // for Message
-#include <gtest/gtest-test-part.h>            // for TestPartResult, SuiteA...
-#include <gtest/gtest_pred_impl.h>            // for Test, EXPECT_EQ, TestInfo
-#include <boost/beast/core/detail/base64.hpp> // for encoded_size
-#include <string>                             // for allocator, string, ope...
 #include "boost/json/object.hpp"              // for object
 #include "boost/json/value.hpp"               // for value
 #include "caosdb/utility.h"                   // for base64_encode, load_js...
 #include "caosdb_test_utility.h"              // for TEST_DATA_DIR
 #include "gmock/gmock-matchers.h"             // for ElementsAre, EXPECT_THAT
+#include <boost/beast/core/detail/base64.hpp> // for encoded_size
+#include <gtest/gtest-message.h>              // for Message
+#include <gtest/gtest-test-part.h>            // for TestPartResult, SuiteA...
+#include <gtest/gtest_pred_impl.h>            // for Test, EXPECT_EQ, TestInfo
+#include <string>                             // for allocator, string, ope...
 
 namespace caosdb::utility {
 using ::testing::ElementsAre;
-- 
GitLab