diff --git a/services/tunnelbroker/old/cxx_bridge.rs b/services/tunnelbroker/old/cxx_bridge.rs deleted file mode 100644 index 1e221e940..000000000 --- a/services/tunnelbroker/old/cxx_bridge.rs +++ /dev/null @@ -1,89 +0,0 @@ -#[cxx::bridge] -pub mod ffi { - enum GRPCStatusCodes { - Ok, - Cancelled, - Unknown, - InvalidArgument, - DeadlineExceeded, - NotFound, - AlreadyExists, - PermissionDenied, - ResourceExhausted, - FailedPrecondition, - Aborted, - OutOfRange, - Unimplemented, - Internal, - Unavailable, - DataLoss, - Unauthenticated, - } - struct GrpcResult { - statusCode: GRPCStatusCodes, - errorText: String, - } - struct SessionSignatureResult { - toSign: String, - grpcStatus: GrpcResult, - } - struct NewSessionResult { - sessionID: String, - grpcStatus: GrpcResult, - } - struct SessionItem { - deviceID: String, - publicKey: String, - notifyToken: String, - deviceType: i32, - appVersion: String, - deviceOS: String, - isOnline: bool, - } - struct MessageItem { - messageID: String, - fromDeviceID: String, - toDeviceID: String, - payload: String, - blobHashes: String, - deliveryTag: u64, - } - - unsafe extern "C++" { - include!("tunnelbroker/src/libcpp/Tunnelbroker.h"); - pub fn initialize(); - pub fn getConfigParameter(parameter: &str) -> Result; - pub fn isConfigParameterSet(parameter: &str) -> Result; - pub fn isSandbox() -> Result; - pub fn sessionSignatureHandler(deviceID: &str) -> SessionSignatureResult; - pub fn getSavedNonceToSign(deviceID: &str) -> Result; - pub fn newSessionHandler( - deviceID: &str, - publicKey: &str, - deviceType: i32, - deviceAppVersion: &str, - deviceOS: &str, - notifyToken: &str, - ) -> NewSessionResult; - pub fn getSessionItem(sessionID: &str) -> Result; - pub fn updateSessionItemIsOnline( - sessionID: &str, - isOnline: bool, - ) -> Result<()>; - pub fn updateSessionItemDeviceToken( - sessionID: &str, - newNotifToken: &str, - ) -> Result<()>; - pub fn getMessagesFromDatabase(deviceID: &str) -> Result>; - pub fn sendMessages(messages: &Vec) -> Result>; - pub fn eraseMessagesFromAMQP(deviceID: &str) -> Result<()>; - pub fn ackMessageFromAMQP(deliveryTag: u64) -> Result<()>; - pub fn waitMessageFromDeliveryBroker(deviceID: &str) - -> Result; - pub fn removeMessages( - deviceID: &str, - messagesIDs: &Vec, - ) -> Result<()>; - pub fn deleteDeliveryBrokerQueueIfEmpty(deviceID: &str) -> Result<()>; - } -} diff --git a/services/tunnelbroker/old/libcpp/Tunnelbroker.cpp b/services/tunnelbroker/old/libcpp/Tunnelbroker.cpp deleted file mode 100644 index a8d70432e..000000000 --- a/services/tunnelbroker/old/libcpp/Tunnelbroker.cpp +++ /dev/null @@ -1,277 +0,0 @@ -#include "Tunnelbroker.h" -#include "AmqpManager.h" -#include "AwsTools.h" -#include "ConfigManager.h" -#include "DatabaseManager.h" -#include "DeliveryBroker.h" -#include "GlobalTools.h" -#include "Tools.h" - -#include "rust/cxx.h" -#include "tunnelbroker/src/cxx_bridge.rs.h" - -#include - -void initialize() { - comm::network::tools::InitLogging("tunnelbroker"); - comm::network::config::ConfigManager::getInstance().load(); - Aws::InitAPI({}); - // List of AWS DynamoDB tables to check if they are created and can be - // accessed before any AWS API methods - const std::list tablesList = { - comm::network::config::ConfigManager::getInstance().getParameter( - comm::network::config::ConfigManager::OPTION_DYNAMODB_SESSIONS_TABLE), - comm::network::config::ConfigManager::getInstance().getParameter( - comm::network::config::ConfigManager:: - OPTION_DYNAMODB_SESSIONS_VERIFICATION_TABLE), - comm::network::config::ConfigManager::getInstance().getParameter( - comm::network::config::ConfigManager:: - OPTION_DYNAMODB_SESSIONS_PUBLIC_KEY_TABLE), - comm::network::config::ConfigManager::getInstance().getParameter( - comm::network::config::ConfigManager:: - OPTION_DYNAMODB_MESSAGES_TABLE)}; - for (const std::string &table : tablesList) { - if (!comm::network::database::DatabaseManager::getInstance() - .isTableAvailable(table)) { - throw std::runtime_error( - "Error: AWS DynamoDB table '" + table + "' is not available"); - } - }; - comm::network::AmqpManager::getInstance().init(); -} - -rust::String getConfigParameter(rust::Str parameter) { - return rust::String{ - comm::network::config::ConfigManager::getInstance().getParameter( - std::string{parameter})}; -} - -bool isConfigParameterSet(rust::Str parameter) { - return comm::network::config::ConfigManager::getInstance().isParameterSet( - std::string{parameter}); -} - -bool isSandbox() { - return comm::network::tools::isSandbox(); -} - -SessionSignatureResult sessionSignatureHandler(rust::Str deviceID) { - const std::string requestedDeviceID(deviceID); - if (!comm::network::tools::validateDeviceID(requestedDeviceID)) { - return SessionSignatureResult{ - .grpcStatus = { - .statusCode = GRPCStatusCodes::InvalidArgument, - .errorText = - "Format validation failed for deviceID: " + requestedDeviceID}}; - } - const std::string toSign = comm::network::tools::generateRandomString( - comm::network::SIGNATURE_REQUEST_LENGTH); - std::shared_ptr SessionSignItem = - std::make_shared( - toSign, requestedDeviceID); - comm::network::database::DatabaseManager::getInstance().putSessionSignItem( - *SessionSignItem); - - return SessionSignatureResult{ - .toSign = toSign, .grpcStatus = {.statusCode = GRPCStatusCodes::Ok}}; -} - -rust::String getSavedNonceToSign(rust::Str deviceID) { - const auto sessionSignatureItem = - comm::network::database::DatabaseManager::getInstance() - .findSessionSignItem(std::string{deviceID}); - if (sessionSignatureItem == nullptr) { - throw std::invalid_argument( - "No requests found for 'deviceID': " + std::string{deviceID}); - }; - return rust::String{sessionSignatureItem->getSign()}; -} - -NewSessionResult newSessionHandler( - rust::Str deviceID, - rust::Str publicKey, - int32_t deviceType, - rust::Str deviceAppVersion, - rust::Str deviceOS, - rust::Str notifyToken) { - std::shared_ptr deviceSessionItem; - std::shared_ptr sessionSignItem; - std::shared_ptr publicKeyItem; - const std::string stringDeviceID{deviceID}; - if (!comm::network::tools::validateDeviceID(stringDeviceID)) { - return NewSessionResult{ - .grpcStatus = { - .statusCode = GRPCStatusCodes::InvalidArgument, - .errorText = "Format validation failed for deviceID"}}; - } - const std::string stringPublicKey{publicKey}; - const std::string newSessionID = comm::network::tools::generateUUID(); - try { - publicKeyItem = comm::network::database::DatabaseManager::getInstance() - .findPublicKeyItem(stringDeviceID); - if (publicKeyItem == nullptr) { - std::shared_ptr newPublicKeyItem = - std::make_shared( - stringDeviceID, stringPublicKey); - comm::network::database::DatabaseManager::getInstance().putPublicKeyItem( - *newPublicKeyItem); - } else if (stringPublicKey != publicKeyItem->getPublicKey()) { - return NewSessionResult{ - .grpcStatus = { - .statusCode = GRPCStatusCodes::PermissionDenied, - .errorText = "The public key doesn't match for deviceID"}}; - } - comm::network::database::DatabaseManager::getInstance() - .removeSessionSignItem(stringDeviceID); - - deviceSessionItem = - std::make_shared( - newSessionID, - stringDeviceID, - stringPublicKey, - std::string{notifyToken}, - deviceType, - std::string{deviceAppVersion}, - std::string{deviceOS}); - comm::network::database::DatabaseManager::getInstance().putSessionItem( - *deviceSessionItem); - } catch (std::runtime_error &e) { - LOG(ERROR) << "gRPC: " - << "Error while processing 'NewSession' request: " << e.what(); - return NewSessionResult{ - .grpcStatus = { - .statusCode = GRPCStatusCodes::Internal, .errorText = e.what()}}; - } - return NewSessionResult{ - .sessionID = newSessionID, - .grpcStatus = {.statusCode = GRPCStatusCodes::Ok}}; -} - -SessionItem getSessionItem(rust::Str sessionID) { - const std::string stringSessionID = std::string{sessionID}; - if (!comm::network::tools::validateSessionID(stringSessionID)) { - throw std::invalid_argument("Invalid format for 'sessionID'"); - } - std::shared_ptr sessionItem = - comm::network::database::DatabaseManager::getInstance().findSessionItem( - stringSessionID); - if (sessionItem == nullptr) { - throw std::invalid_argument( - "No sessions found for 'sessionID': " + stringSessionID); - } - return SessionItem{ - .deviceID = sessionItem->getDeviceID(), - .publicKey = sessionItem->getPubKey(), - .notifyToken = sessionItem->getNotifyToken(), - .deviceType = static_cast(sessionItem->getDeviceType()), - .appVersion = sessionItem->getAppVersion(), - .deviceOS = sessionItem->getDeviceOs(), - .isOnline = sessionItem->getIsOnline()}; -} - -void updateSessionItemIsOnline(rust::Str sessionID, bool isOnline) { - if (comm::network::config::ConfigManager::getInstance().isParameterSet( - comm::network::config::ConfigManager:: - OPTION_SESSIONS_SKIP_AUTH_KEY)) { - return; - } - comm::network::database::DatabaseManager::getInstance() - .updateSessionItemIsOnline(std::string{sessionID}, isOnline); -} - -void updateSessionItemDeviceToken( - rust::Str sessionID, - rust::Str newNotifToken) { - if (comm::network::config::ConfigManager::getInstance().isParameterSet( - comm::network::config::ConfigManager:: - OPTION_SESSIONS_SKIP_AUTH_KEY)) { - return; - } - comm::network::database::DatabaseManager::getInstance() - .updateSessionItemDeviceToken( - std::string{sessionID}, std::string{newNotifToken}); -} - -rust::Vec getMessagesFromDatabase(rust::Str deviceID) { - std::vector> - messagesFromDatabase = - comm::network::database::DatabaseManager::getInstance() - .findMessageItemsByReceiver(std::string{deviceID}); - rust::Vec result; - for (auto &messageFromDatabase : messagesFromDatabase) { - result.push_back(MessageItem{ - .messageID = messageFromDatabase->getMessageID(), - .fromDeviceID = messageFromDatabase->getFromDeviceID(), - .payload = messageFromDatabase->getPayload(), - .blobHashes = messageFromDatabase->getBlobHashes(), - }); - } - return result; -} - -void eraseMessagesFromAMQP(rust::Str deviceID) { - comm::network::DeliveryBroker::getInstance().erase(std::string{deviceID}); -} - -void ackMessageFromAMQP(uint64_t deliveryTag) { - comm::network::AmqpManager::getInstance().ack(deliveryTag); -} - -MessageItem waitMessageFromDeliveryBroker(rust::Str deviceID) { - const auto message = - comm::network::DeliveryBroker::getInstance().pop(std::string{deviceID}); - return MessageItem{ - .messageID = message.messageID, - .fromDeviceID = message.fromDeviceID, - .payload = message.payload, - .deliveryTag = message.deliveryTag}; -} - -void removeMessages( - rust::Str deviceID, - const rust::Vec &messagesIDs) { - std::vector vectorOfmessagesIDs; - for (auto id : messagesIDs) { - vectorOfmessagesIDs.push_back(std::string{id}); - }; - comm::network::database::DatabaseManager::getInstance() - .removeMessageItemsByIDsForDeviceID( - vectorOfmessagesIDs, std::string{deviceID}); -} - -void deleteDeliveryBrokerQueueIfEmpty(rust::Str deviceID) { - // If messages queue for `deviceID` is empty we don't need to store - // `folly::MPMCQueue` for it and need to free memory to fix possible - // 'ghost' queues in DeliveryBroker. - // We call `deleteQueueIfEmpty()` for this purpose here after removing - // messages. - comm::network::DeliveryBroker::DeliveryBroker::getInstance() - .deleteQueueIfEmpty(std::string{deviceID}); -} - -rust::Vec sendMessages(const rust::Vec &messages) { - std::vector vectorOfMessages; - rust::Vec messagesIDs; - for (auto &message : messages) { - std::string messageID = comm::network::tools::generateUUID(); - vectorOfMessages.push_back(comm::network::database::MessageItem{ - comm::network::database::MessageItem{ - messageID, - std::string{message.fromDeviceID}, - std::string{message.toDeviceID}, - std::string{message.payload}, - std::string{message.blobHashes}, - }}); - messagesIDs.push_back(rust::String{messageID}); - }; - if (!comm::network::config::ConfigManager::getInstance().isParameterSet( - comm::network::config::ConfigManager:: - OPTION_MESSAGES_SKIP_PERSISTENCE)) { - comm::network::database::DatabaseManager::getInstance() - .putMessageItemsByBatch(vectorOfMessages); - }; - for (auto message : vectorOfMessages) { - comm::network::AmqpManager::getInstance().send(&message); - } - return messagesIDs; -} diff --git a/services/tunnelbroker/old/libcpp/Tunnelbroker.h b/services/tunnelbroker/old/libcpp/Tunnelbroker.h deleted file mode 100644 index 3e7a1add0..000000000 --- a/services/tunnelbroker/old/libcpp/Tunnelbroker.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "rust/cxx.h" -#include "tunnelbroker/src/cxx_bridge.rs.h" - -void initialize(); -rust::String getConfigParameter(rust::Str parameter); -bool isConfigParameterSet(rust::Str parameter); -bool isSandbox(); -SessionSignatureResult sessionSignatureHandler(rust::Str deviceID); -rust::String getSavedNonceToSign(rust::Str deviceID); -NewSessionResult newSessionHandler( - rust::Str deviceID, - rust::Str publicKey, - int32_t deviceType, - rust::Str deviceAppVersion, - rust::Str deviceOS, - rust::Str notifyToken); -SessionItem getSessionItem(rust::Str sessionID); -void updateSessionItemIsOnline(rust::Str sessionID, bool isOnline); -void updateSessionItemDeviceToken(rust::Str sessionID, rust::Str newNotifToken); -rust::Vec getMessagesFromDatabase(rust::Str deviceID); -rust::Vec sendMessages(const rust::Vec &messages); -void eraseMessagesFromAMQP(rust::Str deviceID); -void ackMessageFromAMQP(uint64_t deliveryTag); -MessageItem waitMessageFromDeliveryBroker(rust::Str deviceID); -void removeMessages( - rust::Str deviceID, - const rust::Vec &messagesIDs); -void deleteDeliveryBrokerQueueIfEmpty(rust::Str deviceID); diff --git a/services/tunnelbroker/old/libcpp/src/Amqp/AmqpManager.cpp b/services/tunnelbroker/old/libcpp/src/Amqp/AmqpManager.cpp deleted file mode 100644 index 0bd6420b1..000000000 --- a/services/tunnelbroker/old/libcpp/src/Amqp/AmqpManager.cpp +++ /dev/null @@ -1,151 +0,0 @@ -#include "AmqpManager.h" -#include "ConfigManager.h" -#include "Constants.h" -#include "DeliveryBroker.h" -#include "GlobalTools.h" - -#include - -#include -#include -#include - -namespace comm { -namespace network { - -AmqpManager &AmqpManager::getInstance() { - static AmqpManager instance; - return instance; -} - -void AmqpManager::init() { - std::call_once(initOnceFlag, [&]() { - std::thread amqpClientThread([&]() { this->connect(); }); - amqpClientThread.detach(); - }); -} - -void AmqpManager::connectInternal() { - const std::string amqpUri = config::ConfigManager::getInstance().getParameter( - config::ConfigManager::OPTION_AMQP_URI); - const std::string tunnelbrokerID = - config::ConfigManager::getInstance().getParameter( - config::ConfigManager::OPTION_TUNNELBROKER_ID); - const std::string fanoutExchangeName = - config::ConfigManager::getInstance().getParameter( - config::ConfigManager::OPTION_AMQP_FANOUT_EXCHANGE); - LOG(INFO) << "AMQP: Connecting to " << amqpUri; - uv_loop_t *localUvLoop = uv_default_loop(); - AMQP::LibUvHandler uvHandler(localUvLoop); - AMQP::TcpConnection tcpConnection(&uvHandler, AMQP::Address(amqpUri)); - this->amqpChannel = std::make_unique(&tcpConnection); - this->amqpChannel->onReady([this]() { - LOG(INFO) << "AMQP: Channel is ready"; - this->amqpReady = true; - this->reconnectAttempt = 0; - }); - this->amqpChannel->onError([this](const char *message) { - LOG(ERROR) << "AMQP: Channel error: " << message; - this->amqpReady = false; - }); - - AMQP::Table arguments; - arguments["x-message-ttl"] = (uint64_t)AMQP_MESSAGE_TTL; - arguments["x-expires"] = (uint64_t)AMQP_QUEUE_TTL; - this->amqpChannel->declareExchange(fanoutExchangeName, AMQP::fanout); - this->amqpChannel->declareQueue(tunnelbrokerID, AMQP::durable, arguments) - .onSuccess([this, tunnelbrokerID, fanoutExchangeName]( - const std::string &name, - uint32_t messagecount, - uint32_t consumercount) { - LOG(INFO) << "AMQP: Queue " << name << " created"; - this->amqpChannel->bindQueue(fanoutExchangeName, tunnelbrokerID, "") - .onError([this, tunnelbrokerID, fanoutExchangeName]( - const char *message) { - LOG(ERROR) << "AMQP: Failed to bind queue: " << tunnelbrokerID - << " to exchange: " << fanoutExchangeName; - }); - this->amqpChannel->consume(tunnelbrokerID) - .onReceived([](const AMQP::Message &message, - uint64_t deliveryTag, - bool redelivered) { - try { - AMQP::Table headers = message.headers(); - const std::string payload(message.body(), message.bodySize()); - const std::string messageID(headers[AMQP_HEADER_MESSAGEID]); - const std::string toDeviceID(headers[AMQP_HEADER_TO_DEVICEID]); - const std::string fromDeviceID( - headers[AMQP_HEADER_FROM_DEVICEID]); - DeliveryBroker::getInstance().push( - messageID, deliveryTag, toDeviceID, fromDeviceID, payload); - } catch (const std::exception &e) { - LOG(ERROR) << "AMQP: Message parsing exception: " << e.what(); - } - }) - .onError([](const char *message) { - LOG(ERROR) << "AMQP: Error on message consume: " << message; - }); - }) - .onError([](const char *message) { - LOG(ERROR) << "AMQP: Queue creation error: " + std::string(message); - }); - uv_run(localUvLoop, UV_RUN_DEFAULT); -}; - -void AmqpManager::connect() { - this->connectInternal(); - while (this->reconnectAttempt < AMQP_RECONNECT_MAX_ATTEMPTS) { - this->reconnectAttempt++; - LOG(INFO) << "AMQP: Attempt " << this->reconnectAttempt - << " to reconnect in " << AMQP_RECONNECT_ATTEMPT_INTERVAL_MS - << " ms"; - std::this_thread::sleep_for( - std::chrono::milliseconds(AMQP_RECONNECT_ATTEMPT_INTERVAL_MS)); - this->connectInternal(); - } - LOG(FATAL) << "Cannot connect to AMQP server after " - << AMQP_RECONNECT_MAX_ATTEMPTS << " attempts"; -} - -bool AmqpManager::send(const database::MessageItem *message) { - waitUntilReady(); - try { - const std::string messagePayload = message->getPayload(); - AMQP::Envelope env(messagePayload.c_str(), messagePayload.size()); - AMQP::Table headers; - headers[AMQP_HEADER_MESSAGEID] = message->getMessageID(); - headers[AMQP_HEADER_FROM_DEVICEID] = message->getFromDeviceID(); - headers[AMQP_HEADER_TO_DEVICEID] = message->getToDeviceID(); - // Set delivery mode to: Durable (2) - env.setDeliveryMode(2); - env.setHeaders(std::move(headers)); - - std::scoped_lock lock{this->channelMutex}; - this->amqpChannel->publish( - config::ConfigManager::getInstance().getParameter( - config::ConfigManager::OPTION_AMQP_FANOUT_EXCHANGE), - "", - env); - } catch (std::runtime_error &e) { - LOG(ERROR) << "AMQP: Error while publishing message: " << e.what(); - return false; - } - return true; -}; - -void AmqpManager::ack(uint64_t deliveryTag) { - waitUntilReady(); - std::scoped_lock lock{this->channelMutex}; - this->amqpChannel->ack(deliveryTag); -} - -void AmqpManager::waitUntilReady() { - while (!this->amqpReady) { - LOG(INFO) << "AMQP: Connection is not ready, waiting"; - std::this_thread::sleep_for( - std::chrono::milliseconds(AMQP_RECONNECT_ATTEMPT_INTERVAL_MS)); - } -} - -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Amqp/AmqpManager.h b/services/tunnelbroker/old/libcpp/src/Amqp/AmqpManager.h deleted file mode 100644 index 90adef73a..000000000 --- a/services/tunnelbroker/old/libcpp/src/Amqp/AmqpManager.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include "DatabaseManager.h" - -#include -#include - -#include -#include -#include -#include - -namespace comm { -namespace network { - -class AmqpManager { - AmqpManager(){}; - - std::mutex channelMutex; - std::once_flag initOnceFlag; - std::unique_ptr amqpChannel; - std::atomic amqpReady; - std::atomic reconnectAttempt; - void connectInternal(); - void connect(); - void waitUntilReady(); - -public: - static AmqpManager &getInstance(); - void init(); - bool send(const database::MessageItem *message); - void ack(uint64_t deliveryTag); - - AmqpManager(AmqpManager const &) = delete; - void operator=(AmqpManager const &) = delete; -}; - -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Constants.h b/services/tunnelbroker/old/libcpp/src/Constants.h deleted file mode 100644 index b017627a8..000000000 --- a/services/tunnelbroker/old/libcpp/src/Constants.h +++ /dev/null @@ -1,71 +0,0 @@ -#pragma once - -#include -#include -#include - -namespace comm { -namespace network { - -// AWS DynamoDB -const size_t DYNAMODB_MAX_BATCH_ITEMS = 25; -const size_t DYNAMODB_BACKOFF_FIRST_RETRY_DELAY = 50; -const size_t DYNAMODB_MAX_BACKOFF_TIME = 10000; // 10 seconds - -const std::string DEVICE_SESSIONS_TABLE_NAME = "tunnelbroker-device-sessions"; -const std::string DEVICE_SESSIONS_VERIFICATION_MESSAGES_TABLE_NAME = - "tunnelbroker-verification-messages"; -const std::string DEVICE_PUBLIC_KEY_TABLE_NAME = "tunnelbroker-public-keys"; -const std::string MESSAGES_TABLE_NAME = "tunnelbroker-messages"; - -// Sessions -const size_t SIGNATURE_REQUEST_LENGTH = 64; -const size_t SESSION_ID_LENGTH = 64; -const size_t SESSION_RECORD_TTL = 30 * 24 * 3600; // 30 days -const size_t SESSION_SIGN_RECORD_TTL = 24 * 3600; // 24 hours -const std::regex SESSION_ID_FORMAT_REGEX( - "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"); - -// AMQP (RabbitMQ) -const std::string AMQP_FANOUT_EXCHANGE_NAME = "allBrokers"; -// Message broker queue message TTL -const size_t AMQP_MESSAGE_TTL = 300 * 1000; // 5 min -// queue TTL in case of no consumers (tunnelbroker is down) -const size_t AMQP_QUEUE_TTL = 24 * 3600 * 1000; // 24 hours -// routing message headers name -const std::string AMQP_HEADER_FROM_DEVICEID = "fromDeviceID"; -const std::string AMQP_HEADER_TO_DEVICEID = "toDeviceID"; -const std::string AMQP_HEADER_MESSAGEID = "messageID"; - -const size_t AMQP_RECONNECT_ATTEMPT_INTERVAL_MS = 3000; -const size_t AMQP_RECONNECT_MAX_ATTEMPTS = 10; - -// DeviceID -// DEVICEID_CHAR_LENGTH has to be kept in sync with deviceIDCharLength -// which is defined in web/utils/device-id.js -// and with DEVICE_ID_CHAR_LENGTH -// defined in native/native_rust_library/src/crypto_tools.rs -const size_t DEVICEID_CHAR_LENGTH = 64; -// DEVICEID_FORMAT_REGEX has to be kept in sync with deviceIDFormatRegex -// which is defined in web/utils/device-id.js -// and with DEVICE_ID_FORMAT_REGEX -// defined in native/native_rust_library/src/crypto_tools.rs -const std::regex DEVICEID_FORMAT_REGEX( - "^(ks|mobile|web):[a-zA-Z0-9]{" + std::to_string(DEVICEID_CHAR_LENGTH) + - "}$"); -const size_t DEVICE_ONLINE_PING_INTERVAL_MS = 3000; - -// Config -const std::string CONFIG_FILE_DIRECTORY_ENV_VARIABLE = - "TUNNELBROKER_CONFIG_FILE_DIRECTORY"; -const std::string DEFAULT_CONFIG_FILE_DIRECTORY = - std::string(std::getenv("HOME")) + "/.config"; -const std::string CONFIG_FILE_NAME = "tunnelbroker.ini"; - -// DeliveryBroker -const size_t DELIVERY_BROKER_MAX_QUEUE_SIZE = 100; -// Database messages TTL -const size_t MESSAGE_RECORD_TTL = 300 * 24 * 60 * 60; // 300 days - -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Database/DatabaseManager.cpp b/services/tunnelbroker/old/libcpp/src/Database/DatabaseManager.cpp deleted file mode 100644 index 0688df61b..000000000 --- a/services/tunnelbroker/old/libcpp/src/Database/DatabaseManager.cpp +++ /dev/null @@ -1,348 +0,0 @@ -#include "DatabaseManager.h" -#include "DynamoDBTools.h" -#include "GlobalTools.h" - -#include - -namespace comm { -namespace network { -namespace database { - -DatabaseManager &DatabaseManager::getInstance() { - static DatabaseManager instance; - return instance; -} - -bool DatabaseManager::isTableAvailable(const std::string &tableName) { - Aws::DynamoDB::Model::DescribeTableRequest request; - request.SetTableName(tableName); - - // Check table availability by invoking DescribeTable - const Aws::DynamoDB::Model::DescribeTableOutcome &result = - getDynamoDBClient()->DescribeTable(request); - return result.IsSuccess(); -} - -void DatabaseManager::putSessionItem(const DeviceSessionItem &item) { - Aws::DynamoDB::Model::PutItemRequest request; - request.SetTableName(item.getTableName()); - request.AddItem( - DeviceSessionItem::FIELD_SESSION_ID, - Aws::DynamoDB::Model::AttributeValue(item.getSessionID())); - request.AddItem( - DeviceSessionItem::FIELD_DEVICE_ID, - Aws::DynamoDB::Model::AttributeValue(item.getDeviceID())); - request.AddItem( - DeviceSessionItem::FIELD_PUBKEY, - Aws::DynamoDB::Model::AttributeValue(item.getPubKey())); - request.AddItem( - DeviceSessionItem::FIELD_NOTIFY_TOKEN, - Aws::DynamoDB::Model::AttributeValue(item.getNotifyToken())); - request.AddItem( - DeviceSessionItem::FIELD_DEVICE_TYPE, - Aws::DynamoDB::Model::AttributeValue( - std::to_string(item.getDeviceType()))); - request.AddItem( - DeviceSessionItem::FIELD_APP_VERSION, - Aws::DynamoDB::Model::AttributeValue(item.getAppVersion())); - request.AddItem( - DeviceSessionItem::FIELD_DEVICE_OS, - Aws::DynamoDB::Model::AttributeValue(item.getDeviceOs())); - request.AddItem( - DeviceSessionItem::FIELD_EXPIRE, - Aws::DynamoDB::Model::AttributeValue(std::to_string( - static_cast(std::time(0)) + SESSION_RECORD_TTL))); - request.AddItem( - DeviceSessionItem::FIELD_IS_ONLINE, - Aws::DynamoDB::Model::AttributeValue().SetBool(false)); - this->innerPutItem(std::make_shared(item), request); -} - -std::shared_ptr -DatabaseManager::findSessionItem(const std::string &sessionID) { - Aws::DynamoDB::Model::GetItemRequest request; - request.AddKey( - DeviceSessionItem::FIELD_SESSION_ID, - Aws::DynamoDB::Model::AttributeValue(sessionID)); - return this->innerFindItem(request); -} - -void DatabaseManager::removeSessionItem(const std::string &sessionID) { - std::shared_ptr item = this->findSessionItem(sessionID); - if (item == nullptr) { - return; - } - this->innerRemoveItem(*item); -} - -void DatabaseManager::updateSessionItemIsOnline( - const std::string &sessionID, - bool isOnline) { - std::shared_ptr item = this->findSessionItem(sessionID); - if (item == nullptr) { - LOG(ERROR) << "Can't find for update sessionItem for sessionID: " - << sessionID; - return; - } - Aws::DynamoDB::Model::UpdateItemRequest request; - request.SetTableName(item->getTableName()); - - Aws::DynamoDB::Model::AttributeValue attributeKeyValue; - attributeKeyValue.SetS(sessionID); - request.AddKey(DeviceSessionItem::FIELD_SESSION_ID, attributeKeyValue); - Aws::String update_expression("SET #a = :valueA"); - request.SetUpdateExpression(update_expression); - Aws::Map expressionAttributeNames; - expressionAttributeNames["#a"] = DeviceSessionItem::FIELD_IS_ONLINE; - request.SetExpressionAttributeNames(expressionAttributeNames); - - Aws::DynamoDB::Model::AttributeValue attributeUpdatedValue; - attributeUpdatedValue.SetBool(isOnline); - Aws::Map - expressionAttributeValue; - expressionAttributeValue[":valueA"] = attributeUpdatedValue; - request.SetExpressionAttributeValues(expressionAttributeValue); - - const Aws::DynamoDB::Model::UpdateItemOutcome &result = - getDynamoDBClient()->UpdateItem(request); - if (!result.IsSuccess()) { - LOG(ERROR) << "Error updating device online status at " - "`updateSessionItemIsOnline`: " - << result.GetError().GetMessage(); - } -} - -bool DatabaseManager::updateSessionItemDeviceToken( - const std::string &sessionID, - const std::string &newDeviceToken) { - std::shared_ptr item = this->findSessionItem(sessionID); - if (item == nullptr) { - LOG(ERROR) << "Can't find for update sessionItem for sessionID: " - << sessionID; - return false; - } - Aws::DynamoDB::Model::UpdateItemRequest request; - request.SetTableName(item->getTableName()); - - Aws::DynamoDB::Model::AttributeValue attributeKeyValue; - attributeKeyValue.SetS(sessionID); - request.AddKey(DeviceSessionItem::FIELD_SESSION_ID, attributeKeyValue); - Aws::String update_expression("SET #a = :valueA"); - request.SetUpdateExpression(update_expression); - Aws::Map expressionAttributeNames; - expressionAttributeNames["#a"] = DeviceSessionItem::FIELD_NOTIFY_TOKEN; - request.SetExpressionAttributeNames(expressionAttributeNames); - - Aws::DynamoDB::Model::AttributeValue attributeUpdatedValue; - attributeUpdatedValue.SetS(newDeviceToken); - Aws::Map - expressionAttributeValue; - expressionAttributeValue[":valueA"] = attributeUpdatedValue; - request.SetExpressionAttributeValues(expressionAttributeValue); - - const Aws::DynamoDB::Model::UpdateItemOutcome &result = - getDynamoDBClient()->UpdateItem(request); - if (!result.IsSuccess()) { - LOG(ERROR) - << "Error updating device token at updateSessionItemDeviceToken: " - << result.GetError().GetMessage(); - return false; - } - return true; -} - -void DatabaseManager::putSessionSignItem(const SessionSignItem &item) { - Aws::DynamoDB::Model::PutItemRequest request; - request.SetTableName(item.getTableName()); - request.AddItem( - SessionSignItem::FIELD_SESSION_VERIFICATION, - Aws::DynamoDB::Model::AttributeValue(item.getSign())); - request.AddItem( - SessionSignItem::FIELD_DEVICE_ID, - Aws::DynamoDB::Model::AttributeValue(item.getDeviceID())); - request.AddItem( - SessionSignItem::FIELD_EXPIRE, - Aws::DynamoDB::Model::AttributeValue(std::to_string( - static_cast(std::time(0)) + SESSION_SIGN_RECORD_TTL))); - this->innerPutItem(std::make_shared(item), request); -} - -std::shared_ptr -DatabaseManager::findSessionSignItem(const std::string &deviceID) { - Aws::DynamoDB::Model::GetItemRequest request; - request.AddKey( - SessionSignItem::FIELD_DEVICE_ID, - Aws::DynamoDB::Model::AttributeValue(deviceID)); - return this->innerFindItem(request); -} - -void DatabaseManager::removeSessionSignItem(const std::string &deviceID) { - std::shared_ptr item = this->findSessionSignItem(deviceID); - if (item == nullptr) { - return; - } - this->innerRemoveItem(*item); -} - -void DatabaseManager::putPublicKeyItem(const PublicKeyItem &item) { - Aws::DynamoDB::Model::PutItemRequest request; - request.SetTableName(item.getTableName()); - request.AddItem( - PublicKeyItem::FIELD_DEVICE_ID, - Aws::DynamoDB::Model::AttributeValue(item.getDeviceID())); - request.AddItem( - PublicKeyItem::FIELD_PUBLIC_KEY, - Aws::DynamoDB::Model::AttributeValue(item.getPublicKey())); - this->innerPutItem(std::make_shared(item), request); -} - -std::shared_ptr -DatabaseManager::findPublicKeyItem(const std::string &deviceID) { - Aws::DynamoDB::Model::GetItemRequest request; - request.AddKey( - PublicKeyItem::FIELD_DEVICE_ID, - Aws::DynamoDB::Model::AttributeValue(deviceID)); - return this->innerFindItem(request); -} - -void DatabaseManager::removePublicKeyItem(const std::string &deviceID) { - std::shared_ptr item = this->findPublicKeyItem(deviceID); - if (item == nullptr) { - return; - } - this->innerRemoveItem(*item); -} - -template -T DatabaseManager::populatePutRequestFromMessageItem( - T &putRequest, - const MessageItem &item) { - putRequest.AddItem( - MessageItem::FIELD_MESSAGE_ID, - Aws::DynamoDB::Model::AttributeValue(item.getMessageID())); - putRequest.AddItem( - MessageItem::FIELD_FROM_DEVICE_ID, - Aws::DynamoDB::Model::AttributeValue(item.getFromDeviceID())); - putRequest.AddItem( - MessageItem::FIELD_TO_DEVICE_ID, - Aws::DynamoDB::Model::AttributeValue(item.getToDeviceID())); - putRequest.AddItem( - MessageItem::FIELD_PAYLOAD, - Aws::DynamoDB::Model::AttributeValue(item.getPayload())); - putRequest.AddItem( - MessageItem::FIELD_BLOB_HASHES, - Aws::DynamoDB::Model::AttributeValue(item.getBlobHashes())); - putRequest.AddItem( - MessageItem::FIELD_EXPIRE, - Aws::DynamoDB::Model::AttributeValue(std::to_string( - static_cast(std::time(0) + MESSAGE_RECORD_TTL)))); - putRequest.AddItem( - MessageItem::FIELD_CREATED_AT, - Aws::DynamoDB::Model::AttributeValue( - std::to_string(tools::getCurrentTimestamp()))); - return putRequest; -} - -void DatabaseManager::putMessageItem(const MessageItem &item) { - Aws::DynamoDB::Model::PutItemRequest request; - request = this->populatePutRequestFromMessageItem(request, item); - request.SetTableName(item.getTableName()); - this->innerPutItem(std::make_shared(item), request); -} - -void DatabaseManager::putMessageItemsByBatch( - const std::vector &messageItems) { - std::vector writeRequests; - for (MessageItem messageItem : messageItems) { - Aws::DynamoDB::Model::PutRequest putRequest; - putRequest = - this->populatePutRequestFromMessageItem(putRequest, messageItem); - Aws::DynamoDB::Model::WriteRequest writeRequest; - writeRequest.SetPutRequest(putRequest); - writeRequests.push_back(writeRequest); - } - this->innerBatchWriteItem( - messageItems[0].getTableName(), - DYNAMODB_MAX_BATCH_ITEMS, - DYNAMODB_BACKOFF_FIRST_RETRY_DELAY, - DYNAMODB_MAX_BACKOFF_TIME, - writeRequests); -} - -std::shared_ptr DatabaseManager::findMessageItem( - const std::string &toDeviceID, - const std::string &messageID) { - Aws::DynamoDB::Model::GetItemRequest request; - request.AddKey( - MessageItem::FIELD_TO_DEVICE_ID, - Aws::DynamoDB::Model::AttributeValue(toDeviceID)); - request.AddKey( - MessageItem::FIELD_MESSAGE_ID, - Aws::DynamoDB::Model::AttributeValue(messageID)); - return this->innerFindItem(request); -} - -std::vector> -DatabaseManager::findMessageItemsByReceiver(const std::string &toDeviceID) { - std::vector> result; - - Aws::DynamoDB::Model::QueryRequest req; - req.SetTableName(MessageItem().getTableName()); - req.SetKeyConditionExpression( - MessageItem::FIELD_TO_DEVICE_ID + " = :valueToMatch"); - - AttributeValues attributeValues; - attributeValues.emplace(":valueToMatch", toDeviceID); - - req.SetExpressionAttributeValues(attributeValues); - const Aws::DynamoDB::Model::QueryOutcome &outcome = - getDynamoDBClient()->Query(req); - if (!outcome.IsSuccess()) { - throw std::runtime_error(outcome.GetError().GetMessage()); - } - const Aws::Vector &items = outcome.GetResult().GetItems(); - for (auto &item : items) { - result.push_back(std::make_shared(item)); - } - - return result; -} - -void DatabaseManager::removeMessageItem( - const std::string &toDeviceID, - const std::string &messageID) { - std::shared_ptr item = - this->findMessageItem(toDeviceID, messageID); - if (item == nullptr) { - return; - } - this->innerRemoveItem(*item); -} - -void DatabaseManager::removeMessageItemsByIDsForDeviceID( - std::vector &messageIDs, - const std::string &toDeviceID) { - std::vector writeRequests; - for (std::string &messageID : messageIDs) { - Aws::DynamoDB::Model::DeleteRequest deleteRequest; - deleteRequest.AddKey( - MessageItem::FIELD_TO_DEVICE_ID, - Aws::DynamoDB::Model::AttributeValue(toDeviceID)); - deleteRequest.AddKey( - MessageItem::FIELD_MESSAGE_ID, - Aws::DynamoDB::Model::AttributeValue(messageID)); - Aws::DynamoDB::Model::WriteRequest currentWriteRequest; - currentWriteRequest.SetDeleteRequest(deleteRequest); - writeRequests.push_back(currentWriteRequest); - } - this->innerBatchWriteItem( - MessageItem().getTableName(), - DYNAMODB_MAX_BATCH_ITEMS, - DYNAMODB_BACKOFF_FIRST_RETRY_DELAY, - DYNAMODB_MAX_BACKOFF_TIME, - writeRequests); -} - -} // namespace database -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Database/DatabaseManager.h b/services/tunnelbroker/old/libcpp/src/Database/DatabaseManager.h deleted file mode 100644 index c750ef124..000000000 --- a/services/tunnelbroker/old/libcpp/src/Database/DatabaseManager.h +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once - -#include "AwsTools.h" -#include "Constants.h" -#include "DatabaseEntitiesTools.h" -#include "DatabaseManagerBase.h" -#include "DeviceSessionItem.h" -#include "MessageItem.h" -#include "PublicKeyItem.h" -#include "SessionSignItem.h" -#include "Tools.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -namespace comm { -namespace network { -namespace database { - -class DatabaseManager : public DatabaseManagerBase { -private: - template - T populatePutRequestFromMessageItem(T &putRequest, const MessageItem &item); - -public: - static DatabaseManager &getInstance(); - bool isTableAvailable(const std::string &tableName); - - void putSessionItem(const DeviceSessionItem &item); - std::shared_ptr - findSessionItem(const std::string &deviceID); - void removeSessionItem(const std::string &sessionID); - void updateSessionItemIsOnline(const std::string &sessionID, bool isOnline); - bool updateSessionItemDeviceToken( - const std::string &sessionID, - const std::string &newDeviceToken); - - void putSessionSignItem(const SessionSignItem &item); - std::shared_ptr - findSessionSignItem(const std::string &deviceID); - void removeSessionSignItem(const std::string &deviceID); - - void putPublicKeyItem(const PublicKeyItem &item); - std::shared_ptr findPublicKeyItem(const std::string &deviceID); - void removePublicKeyItem(const std::string &deviceID); - - void putMessageItem(const MessageItem &item); - void putMessageItemsByBatch(const std::vector &messageItems); - std::shared_ptr - findMessageItem(const std::string &toDeviceID, const std::string &messageID); - std::vector> - findMessageItemsByReceiver(const std::string &toDeviceID); - void removeMessageItem( - const std::string &toDeviceID, - const std::string &messageID); - void removeMessageItemsByIDsForDeviceID( - std::vector &messageIDs, - const std::string &toDeviceID); -}; - -} // namespace database -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Database/DeviceSessionItem.cpp b/services/tunnelbroker/old/libcpp/src/Database/DeviceSessionItem.cpp deleted file mode 100644 index 52612dea5..000000000 --- a/services/tunnelbroker/old/libcpp/src/Database/DeviceSessionItem.cpp +++ /dev/null @@ -1,124 +0,0 @@ -#include "DeviceSessionItem.h" -#include "ConfigManager.h" -#include "Tools.h" - -#include - -namespace comm { -namespace network { -namespace database { - -const std::string DeviceSessionItem::FIELD_SESSION_ID = "SessionID"; -const std::string DeviceSessionItem::FIELD_DEVICE_ID = "DeviceID"; -const std::string DeviceSessionItem::FIELD_PUBKEY = "PubKey"; -const std::string DeviceSessionItem::FIELD_NOTIFY_TOKEN = "NotifyToken"; -const std::string DeviceSessionItem::FIELD_DEVICE_TYPE = "DeviceType"; -const std::string DeviceSessionItem::FIELD_APP_VERSION = "AppVersion"; -const std::string DeviceSessionItem::FIELD_DEVICE_OS = "DeviceOS"; -const std::string DeviceSessionItem::FIELD_EXPIRE = "Expire"; -const std::string DeviceSessionItem::FIELD_IS_ONLINE = "IsOnline"; - -DeviceSessionItem::DeviceSessionItem( - const std::string sessionID, - const std::string deviceID, - const std::string pubKey, - const std::string notifyToken, - const size_t deviceType, - const std::string appVersion, - const std::string deviceOs) - : sessionID(sessionID), - deviceID(deviceID), - pubKey(pubKey), - notifyToken(notifyToken), - deviceType(deviceType), - appVersion(appVersion), - deviceOs(deviceOs) { - this->validate(); -} - -DeviceSessionItem::DeviceSessionItem(const AttributeValues &itemFromDB) { - this->assignItemFromDatabase(itemFromDB); -} - -void DeviceSessionItem::validate() const { - if (!tools::validateSessionID(this->sessionID)) { - throw std::runtime_error("Error: SessionID format is wrong."); - } - if (!tools::validateDeviceID(this->deviceID)) { - throw std::runtime_error("Error: DeviceID format is wrong."); - } - tools::checkIfNotEmpty("pubKey", this->pubKey); - tools::checkIfNotEmpty("appVersion", this->appVersion); - tools::checkIfNotEmpty("deviceOs", this->deviceOs); -} - -void DeviceSessionItem::assignItemFromDatabase( - const AttributeValues &itemFromDB) { - try { - this->sessionID = itemFromDB.at(DeviceSessionItem::FIELD_SESSION_ID).GetS(); - this->deviceID = itemFromDB.at(DeviceSessionItem::FIELD_DEVICE_ID).GetS(); - this->pubKey = itemFromDB.at(DeviceSessionItem::FIELD_PUBKEY).GetS(); - this->notifyToken = - itemFromDB.at(DeviceSessionItem::FIELD_NOTIFY_TOKEN).GetS(); - this->deviceType = - std::stoul(itemFromDB.at(DeviceSessionItem::FIELD_DEVICE_TYPE).GetS()); - this->appVersion = - itemFromDB.at(DeviceSessionItem::FIELD_APP_VERSION).GetS(); - this->deviceOs = itemFromDB.at(DeviceSessionItem::FIELD_DEVICE_OS).GetS(); - this->isOnline = - itemFromDB.at(DeviceSessionItem::FIELD_IS_ONLINE).GetBool(); - } catch (std::logic_error &e) { - throw std::runtime_error( - "Invalid device session database value " + std::string(e.what())); - } - this->validate(); -} - -std::string DeviceSessionItem::getTableName() const { - return config::ConfigManager::getInstance().getParameter( - config::ConfigManager::OPTION_DYNAMODB_SESSIONS_TABLE); -} - -PrimaryKeyDescriptor DeviceSessionItem::getPrimaryKeyDescriptor() const { - return PrimaryKeyDescriptor(DeviceSessionItem::FIELD_SESSION_ID); -} - -PrimaryKeyValue DeviceSessionItem::getPrimaryKeyValue() const { - return PrimaryKeyValue(this->sessionID); -} - -std::string DeviceSessionItem::getSessionID() const { - return this->sessionID; -} - -std::string DeviceSessionItem::getDeviceID() const { - return this->deviceID; -} - -std::string DeviceSessionItem::getPubKey() const { - return this->pubKey; -} - -std::string DeviceSessionItem::getNotifyToken() const { - return this->notifyToken; -} - -size_t DeviceSessionItem::getDeviceType() const { - return this->deviceType; -} - -std::string DeviceSessionItem::getAppVersion() const { - return this->appVersion; -} - -std::string DeviceSessionItem::getDeviceOs() const { - return this->deviceOs; -} - -bool DeviceSessionItem::getIsOnline() const { - return this->isOnline; -} - -} // namespace database -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Database/DeviceSessionItem.h b/services/tunnelbroker/old/libcpp/src/Database/DeviceSessionItem.h deleted file mode 100644 index 9fc316c20..000000000 --- a/services/tunnelbroker/old/libcpp/src/Database/DeviceSessionItem.h +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once - -#include "Item.h" - -#include - -namespace comm { -namespace network { -namespace database { - -class DeviceSessionItem : public Item { - std::string sessionID; - std::string deviceID; - std::string pubKey; - std::string notifyToken; - size_t deviceType; - std::string appVersion; - std::string deviceOs; - bool isOnline = false; - - void validate() const override; - -public: - static const std::string FIELD_SESSION_ID; - static const std::string FIELD_DEVICE_ID; - static const std::string FIELD_PUBKEY; - static const std::string FIELD_NOTIFY_TOKEN; - static const std::string FIELD_DEVICE_TYPE; - static const std::string FIELD_APP_VERSION; - static const std::string FIELD_DEVICE_OS; - static const std::string FIELD_EXPIRE; - static const std::string FIELD_IS_ONLINE; - - enum DeviceTypes { MOBILE = 0, WEB = 1, KEYSERVER = 2 }; - - PrimaryKeyDescriptor getPrimaryKeyDescriptor() const override; - PrimaryKeyValue getPrimaryKeyValue() const override; - std::string getTableName() const override; - std::string getSessionID() const; - std::string getDeviceID() const; - std::string getPubKey() const; - std::string getNotifyToken() const; - size_t getDeviceType() const; - std::string getAppVersion() const; - std::string getDeviceOs() const; - bool getIsOnline() const; - - DeviceSessionItem() { - } - DeviceSessionItem( - const std::string sessionID, - const std::string deviceID, - const std::string pubKey, - const std::string notifyToken, - size_t deviceType, - const std::string appVersion, - const std::string deviceOs); - DeviceSessionItem(const AttributeValues &itemFromDB); - void assignItemFromDatabase(const AttributeValues &itemFromDB) override; -}; - -} // namespace database -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Database/MessageItem.cpp b/services/tunnelbroker/old/libcpp/src/Database/MessageItem.cpp deleted file mode 100644 index 62417cc71..000000000 --- a/services/tunnelbroker/old/libcpp/src/Database/MessageItem.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include "MessageItem.h" -#include "ConfigManager.h" -#include "Tools.h" - -#include - -namespace comm { -namespace network { -namespace database { - -const std::string MessageItem::FIELD_MESSAGE_ID = "MessageID"; -const std::string MessageItem::FIELD_FROM_DEVICE_ID = "FromDeviceID"; -const std::string MessageItem::FIELD_TO_DEVICE_ID = "ToDeviceID"; -const std::string MessageItem::FIELD_PAYLOAD = "Payload"; -const std::string MessageItem::FIELD_BLOB_HASHES = "BlobHashes"; -const std::string MessageItem::FIELD_EXPIRE = "Expire"; -const std::string MessageItem::FIELD_CREATED_AT = "CreatedAt"; - -MessageItem::MessageItem( - const std::string messageID, - const std::string fromDeviceID, - const std::string toDeviceID, - const std::string payload, - const std::string blobHashes) - : messageID(messageID), - fromDeviceID(fromDeviceID), - toDeviceID(toDeviceID), - payload(payload), - blobHashes(blobHashes) { - this->validate(); -} - -MessageItem::MessageItem(const AttributeValues &itemFromDB) { - this->assignItemFromDatabase(itemFromDB); -} - -void MessageItem::validate() const { - if (!tools::validateDeviceID(this->fromDeviceID)) { - throw std::runtime_error("Error: FromDeviceID format is wrong."); - } - if (!tools::validateDeviceID(this->toDeviceID)) { - throw std::runtime_error("Error: ToDeviceID format is wrong."); - } - tools::checkIfNotEmpty("messageID", this->messageID); -} - -void MessageItem::assignItemFromDatabase(const AttributeValues &itemFromDB) { - try { - this->messageID = itemFromDB.at(MessageItem::FIELD_MESSAGE_ID).GetS(); - this->fromDeviceID = - itemFromDB.at(MessageItem::FIELD_FROM_DEVICE_ID).GetS(); - this->toDeviceID = itemFromDB.at(MessageItem::FIELD_TO_DEVICE_ID).GetS(); - this->payload = itemFromDB.at(MessageItem::FIELD_PAYLOAD).GetS(); - this->blobHashes = itemFromDB.at(MessageItem::FIELD_BLOB_HASHES).GetS(); - this->expire = std::stoull(itemFromDB.at(MessageItem::FIELD_EXPIRE).GetS()); - this->createdAt = - std::stoull(itemFromDB.at(MessageItem::FIELD_CREATED_AT).GetS()); - } catch (const std::exception &e) { - throw std::runtime_error( - "Got an exception at MessageItem: " + std::string(e.what())); - } - this->validate(); -} - -std::string MessageItem::getTableName() const { - return config::ConfigManager::getInstance().getParameter( - config::ConfigManager::OPTION_DYNAMODB_MESSAGES_TABLE); -} - -PrimaryKeyDescriptor MessageItem::getPrimaryKeyDescriptor() const { - return PrimaryKeyDescriptor( - MessageItem::FIELD_TO_DEVICE_ID, MessageItem::FIELD_MESSAGE_ID); -} - -PrimaryKeyValue MessageItem::getPrimaryKeyValue() const { - return PrimaryKeyValue(this->toDeviceID, this->messageID); -} - -std::string MessageItem::getMessageID() const { - return this->messageID; -} - -std::string MessageItem::getFromDeviceID() const { - return this->fromDeviceID; -} - -std::string MessageItem::getToDeviceID() const { - return this->toDeviceID; -} - -std::string MessageItem::getPayload() const { - return this->payload; -} - -std::string MessageItem::getBlobHashes() const { - return this->blobHashes; -} - -uint64_t MessageItem::getExpire() const { - return this->expire; -} - -uint64_t MessageItem::getCreatedAt() const { - return this->createdAt; -} - -} // namespace database -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Database/MessageItem.h b/services/tunnelbroker/old/libcpp/src/Database/MessageItem.h deleted file mode 100644 index 9f4a253aa..000000000 --- a/services/tunnelbroker/old/libcpp/src/Database/MessageItem.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include "Item.h" - -#include - -namespace comm { -namespace network { -namespace database { - -class MessageItem : public Item { - std::string messageID; - std::string fromDeviceID; - std::string toDeviceID; - std::string payload; - std::string blobHashes; - uint64_t expire; - uint64_t createdAt; - - void validate() const override; - -public: - static const std::string FIELD_MESSAGE_ID; - static const std::string FIELD_FROM_DEVICE_ID; - static const std::string FIELD_TO_DEVICE_ID; - static const std::string FIELD_PAYLOAD; - static const std::string FIELD_BLOB_HASHES; - static const std::string FIELD_EXPIRE; - static const std::string FIELD_CREATED_AT; - - PrimaryKeyDescriptor getPrimaryKeyDescriptor() const override; - PrimaryKeyValue getPrimaryKeyValue() const override; - std::string getTableName() const override; - std::string getMessageID() const; - std::string getFromDeviceID() const; - std::string getToDeviceID() const; - std::string getPayload() const; - std::string getBlobHashes() const; - uint64_t getExpire() const; - uint64_t getCreatedAt() const; - - MessageItem() { - } - MessageItem( - const std::string messageID, - const std::string fromDeviceID, - const std::string toDeviceID, - const std::string payload, - const std::string blobHashes); - MessageItem(const AttributeValues &itemFromDB); - void assignItemFromDatabase(const AttributeValues &itemFromDB) override; -}; - -} // namespace database -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Database/PublicKeyItem.cpp b/services/tunnelbroker/old/libcpp/src/Database/PublicKeyItem.cpp deleted file mode 100644 index 711d1ef3c..000000000 --- a/services/tunnelbroker/old/libcpp/src/Database/PublicKeyItem.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include "PublicKeyItem.h" -#include "ConfigManager.h" -#include "Tools.h" - -namespace comm { -namespace network { -namespace database { - -const std::string PublicKeyItem::FIELD_DEVICE_ID = "DeviceID"; -const std::string PublicKeyItem::FIELD_PUBLIC_KEY = "PublicKey"; - -PublicKeyItem::PublicKeyItem( - const std::string deviceID, - const std::string publicKey) - : deviceID(deviceID), publicKey(publicKey) { - this->validate(); -} - -PublicKeyItem::PublicKeyItem(const AttributeValues &itemFromDB) { - this->assignItemFromDatabase(itemFromDB); -} - -void PublicKeyItem::validate() const { - if (!tools::validateDeviceID(this->deviceID)) { - throw std::runtime_error("Error: DeviceID format is wrong."); - } - tools::checkIfNotEmpty("publicKey", this->publicKey); -} - -void PublicKeyItem::assignItemFromDatabase(const AttributeValues &itemFromDB) { - try { - this->publicKey = itemFromDB.at(PublicKeyItem::FIELD_PUBLIC_KEY).GetS(); - this->deviceID = itemFromDB.at(PublicKeyItem::FIELD_DEVICE_ID).GetS(); - } catch (const std::exception &e) { - throw std::runtime_error( - "Got an exception at PublicKeyItem: " + std::string(e.what())); - } - this->validate(); -} - -std::string PublicKeyItem::getTableName() const { - return config::ConfigManager::getInstance().getParameter( - config::ConfigManager::OPTION_DYNAMODB_SESSIONS_PUBLIC_KEY_TABLE); -} - -PrimaryKeyDescriptor PublicKeyItem::getPrimaryKeyDescriptor() const { - return PrimaryKeyDescriptor(PublicKeyItem::FIELD_DEVICE_ID); -} - -PrimaryKeyValue PublicKeyItem::getPrimaryKeyValue() const { - return PrimaryKeyValue(this->deviceID); -} - -std::string PublicKeyItem::getDeviceID() const { - return this->deviceID; -} - -std::string PublicKeyItem::getPublicKey() const { - return this->publicKey; -} - -} // namespace database -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Database/PublicKeyItem.h b/services/tunnelbroker/old/libcpp/src/Database/PublicKeyItem.h deleted file mode 100644 index d689a203b..000000000 --- a/services/tunnelbroker/old/libcpp/src/Database/PublicKeyItem.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include "Item.h" - -#include - -namespace comm { -namespace network { -namespace database { - -class PublicKeyItem : public Item { - std::string deviceID; - std::string publicKey; - - void validate() const override; - -public: - static const std::string FIELD_DEVICE_ID; - static const std::string FIELD_PUBLIC_KEY; - - PrimaryKeyDescriptor getPrimaryKeyDescriptor() const override; - PrimaryKeyValue getPrimaryKeyValue() const override; - std::string getTableName() const override; - std::string getDeviceID() const; - std::string getPublicKey() const; - - PublicKeyItem() { - } - PublicKeyItem(const std::string deviceID, const std::string publicKey); - PublicKeyItem(const AttributeValues &itemFromDB); - void assignItemFromDatabase(const AttributeValues &itemFromDB) override; -}; - -} // namespace database -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Database/SessionSignItem.cpp b/services/tunnelbroker/old/libcpp/src/Database/SessionSignItem.cpp deleted file mode 100644 index 3b9a6630e..000000000 --- a/services/tunnelbroker/old/libcpp/src/Database/SessionSignItem.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "SessionSignItem.h" -#include "ConfigManager.h" -#include "Tools.h" - -namespace comm { -namespace network { -namespace database { - -const std::string SessionSignItem::FIELD_SESSION_VERIFICATION = - "VerificationMessage"; -const std::string SessionSignItem::FIELD_DEVICE_ID = "DeviceID"; -const std::string SessionSignItem::FIELD_EXPIRE = "Expire"; - -SessionSignItem::SessionSignItem( - const std::string sign, - const std::string deviceID) - : sign(sign), deviceID(deviceID) { - this->validate(); -} - -SessionSignItem::SessionSignItem(const AttributeValues &itemFromDB) { - this->assignItemFromDatabase(itemFromDB); -} - -void SessionSignItem::validate() const { - if (!tools::validateDeviceID(this->deviceID)) { - throw std::runtime_error("Error: DeviceID format is wrong."); - } - tools::checkIfNotEmpty("sign", this->sign); -} - -void SessionSignItem::assignItemFromDatabase( - const AttributeValues &itemFromDB) { - try { - this->sign = - itemFromDB.at(SessionSignItem::FIELD_SESSION_VERIFICATION).GetS(); - this->deviceID = itemFromDB.at(SessionSignItem::FIELD_DEVICE_ID).GetS(); - } catch (const std::exception &e) { - throw std::runtime_error( - "Got an exception at SessionSignItem: " + std::string(e.what())); - } - this->validate(); -} - -std::string SessionSignItem::getTableName() const { - return config::ConfigManager::getInstance().getParameter( - config::ConfigManager::OPTION_DYNAMODB_SESSIONS_VERIFICATION_TABLE); -} - -PrimaryKeyDescriptor SessionSignItem::getPrimaryKeyDescriptor() const { - return PrimaryKeyDescriptor(SessionSignItem::FIELD_DEVICE_ID); -} - -PrimaryKeyValue SessionSignItem::getPrimaryKeyValue() const { - return PrimaryKeyValue(this->deviceID); -} - -std::string SessionSignItem::getSign() const { - return this->sign; -} - -std::string SessionSignItem::getDeviceID() const { - return this->deviceID; -} - -} // namespace database -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Database/SessionSignItem.h b/services/tunnelbroker/old/libcpp/src/Database/SessionSignItem.h deleted file mode 100644 index 3df6fbab0..000000000 --- a/services/tunnelbroker/old/libcpp/src/Database/SessionSignItem.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include "Item.h" - -#include - -namespace comm { -namespace network { -namespace database { - -class SessionSignItem : public Item { - std::string sign; - std::string deviceID; - - void validate() const override; - -public: - static const std::string FIELD_SESSION_VERIFICATION; - static const std::string FIELD_DEVICE_ID; - static const std::string FIELD_EXPIRE; - - PrimaryKeyDescriptor getPrimaryKeyDescriptor() const override; - PrimaryKeyValue getPrimaryKeyValue() const override; - std::string getTableName() const override; - std::string getSign() const; - std::string getDeviceID() const; - - SessionSignItem() { - } - SessionSignItem(const std::string sign, const std::string deviceID); - SessionSignItem(const AttributeValues &itemFromDB); - void assignItemFromDatabase(const AttributeValues &itemFromDB) override; -}; - -} // namespace database -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/DeliveryBroker/DeliveryBroker.cpp b/services/tunnelbroker/old/libcpp/src/DeliveryBroker/DeliveryBroker.cpp deleted file mode 100644 index 2e953cee9..000000000 --- a/services/tunnelbroker/old/libcpp/src/DeliveryBroker/DeliveryBroker.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include "DeliveryBroker.h" - -#include - -namespace comm { -namespace network { - -DeliveryBroker &DeliveryBroker::getInstance() { - static DeliveryBroker instance; - return instance; -}; - -void DeliveryBroker::push( - const std::string messageID, - const uint64_t deliveryTag, - const std::string toDeviceID, - const std::string fromDeviceID, - const std::string payload) { - try { - if (this->messagesMap.find(toDeviceID) == this->messagesMap.end()) { - this->messagesMap.insert( - toDeviceID, - std::make_unique( - DELIVERY_BROKER_MAX_QUEUE_SIZE)); - } - this->messagesMap.find(toDeviceID) - ->second->blockingWrite(DeliveryBrokerMessage{ - .messageID = messageID, - .deliveryTag = deliveryTag, - .fromDeviceID = fromDeviceID, - .payload = payload}); - } catch (const std::exception &e) { - LOG(ERROR) << "DeliveryBroker push: " - << "Got an exception " << e.what(); - } -}; - -bool DeliveryBroker::isEmpty(const std::string deviceID) { - if (this->messagesMap.find(deviceID) == this->messagesMap.end()) { - return true; - }; - return this->messagesMap.find(deviceID)->second->isEmpty(); -}; - -DeliveryBrokerMessage DeliveryBroker::pop(const std::string deviceID) { - try { - // If we don't already have a queue, insert it for the blocking read purpose - // in case we listen first before the insert happens. - if (this->messagesMap.find(deviceID) == this->messagesMap.end()) { - this->messagesMap.insert( - deviceID, - std::make_unique( - DELIVERY_BROKER_MAX_QUEUE_SIZE)); - } - DeliveryBrokerMessage receievedMessage; - this->messagesMap.find(deviceID)->second->blockingRead(receievedMessage); - return receievedMessage; - } catch (const std::exception &e) { - LOG(ERROR) << "DeliveryBroker pop: " - << "Got an exception " << e.what(); - } - return {}; -}; - -void DeliveryBroker::erase(const std::string deviceID) { - this->messagesMap.erase(deviceID); -}; - -void DeliveryBroker::deleteQueueIfEmpty(const std::string clientDeviceID) { - if (DeliveryBroker::getInstance().isEmpty(clientDeviceID)) { - DeliveryBroker::getInstance().erase(clientDeviceID); - } -}; - -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/DeliveryBroker/DeliveryBroker.h b/services/tunnelbroker/old/libcpp/src/DeliveryBroker/DeliveryBroker.h deleted file mode 100644 index 76cb7814d..000000000 --- a/services/tunnelbroker/old/libcpp/src/DeliveryBroker/DeliveryBroker.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include "Constants.h" -#include "DeliveryBrokerEntites.h" - -#include - -#include - -namespace comm { -namespace network { - -class DeliveryBroker { - - folly::ConcurrentHashMap> - messagesMap; - -public: - static DeliveryBroker &getInstance(); - void push( - const std::string messageID, - const uint64_t deliveryTag, - const std::string toDeviceID, - const std::string fromDeviceID, - const std::string payload); - bool isEmpty(const std::string deviceID); - DeliveryBrokerMessage pop(const std::string deviceID); - void erase(const std::string deviceID); - void deleteQueueIfEmpty(const std::string clientDeviceID); -}; - -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/DeliveryBroker/DeliveryBrokerEntites.h b/services/tunnelbroker/old/libcpp/src/DeliveryBroker/DeliveryBrokerEntites.h deleted file mode 100644 index bbdd5efeb..000000000 --- a/services/tunnelbroker/old/libcpp/src/DeliveryBroker/DeliveryBrokerEntites.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include - -#include -#include - -namespace comm { -namespace network { - -struct DeliveryBrokerMessage { - std::string messageID; - uint64_t deliveryTag; - std::string fromDeviceID; - std::string payload; - std::vector blobHashes; -}; - -typedef folly::MPMCQueue DeliveryBrokerQueue; - -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Tools/AwsTools.cpp b/services/tunnelbroker/old/libcpp/src/Tools/AwsTools.cpp deleted file mode 100644 index ac864672c..000000000 --- a/services/tunnelbroker/old/libcpp/src/Tools/AwsTools.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "AwsTools.h" -#include "Constants.h" - -#include - -#include - -namespace comm { -namespace network { - -Aws::String getAwsRegionFromCredentials() { - const std::string regionParameter = "default.region"; - const std::string awsCredentialsPath = "~/.aws/credentials"; - std::ifstream fileStream; - fileStream.open(awsCredentialsPath, std::ifstream::in); - if (!fileStream.is_open()) { - throw std::runtime_error( - "Error: can not open AWS credentials file " + awsCredentialsPath); - } - - boost::program_options::options_description optionDescription{ - "AWS credentials options"}; - optionDescription.add_options()( - regionParameter.c_str(), - boost::program_options::value(), - "AWS region"); - - boost::program_options::parsed_options parsedDescription = - boost::program_options::parse_config_file( - fileStream, optionDescription, true); - boost::program_options::variables_map variablesMap; - boost::program_options::store(parsedDescription, variablesMap); - boost::program_options::notify(variablesMap); - fileStream.close(); - return variablesMap[regionParameter].as(); -} - -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Tools/AwsTools.h b/services/tunnelbroker/old/libcpp/src/Tools/AwsTools.h deleted file mode 100644 index a64d56f64..000000000 --- a/services/tunnelbroker/old/libcpp/src/Tools/AwsTools.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include - -namespace comm { -namespace network { - -Aws::String getAwsRegionFromCredentials(); - -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Tools/ConfigManager.cpp b/services/tunnelbroker/old/libcpp/src/Tools/ConfigManager.cpp deleted file mode 100644 index eb7d97b88..000000000 --- a/services/tunnelbroker/old/libcpp/src/Tools/ConfigManager.cpp +++ /dev/null @@ -1,176 +0,0 @@ -#include "ConfigManager.h" -#include "Constants.h" -#include "GlobalTools.h" - -#include - -namespace comm { -namespace network { -namespace config { - -const std::string ConfigManager::OPTION_TUNNELBROKER_ID = - "tunnelbroker.instance-id"; -const std::string ConfigManager::OPTION_DEFAULT_KEYSERVER_ID = - "keyserver.default_keyserver_id"; -const std::string ConfigManager::OPTION_AMQP_URI = "amqp.uri"; -const std::string ConfigManager::OPTION_AMQP_FANOUT_EXCHANGE = - "amqp.fanout_exchange_name"; -const std::string ConfigManager::OPTION_DYNAMODB_SESSIONS_TABLE = - "dynamodb.sessions_table_name"; -const std::string ConfigManager::OPTION_DYNAMODB_SESSIONS_VERIFICATION_TABLE = - "dynamodb.sessions_verification_table_name"; -const std::string ConfigManager::OPTION_DYNAMODB_SESSIONS_PUBLIC_KEY_TABLE = - "dynamodb.sessions_public_key_table_name"; -const std::string ConfigManager::OPTION_DYNAMODB_MESSAGES_TABLE = - "dynamodb.messages_table_name"; -const std::string ConfigManager::OPTION_NOTIFS_APNS_P12_CERT_PATH = - "notifications.apns_cert_path"; -const std::string ConfigManager::OPTION_NOTIFS_APNS_P12_CERT_PASSWORD = - "notifications.apns_cert_password"; -const std::string ConfigManager::OPTION_NOTIFS_APNS_TOPIC = - "notifications.apns_topic"; -const std::string ConfigManager::OPTION_NOTIFS_FCM_SERVER_KEY = - "notifications.fcm_server_key"; -const std::string ConfigManager::OPTION_SESSIONS_SKIP_AUTH_KEY = - "sessions.skip_authentication"; -const std::string ConfigManager::OPTION_DISABLE_DEVICEID_VALIDATION = - "sessions.disable_deviceid_validation"; -const std::string ConfigManager::OPTION_MESSAGES_SKIP_PERSISTENCE = - "messages.skip_persistence"; -const std::string ConfigManager::OPTION_DISABLE_NOTIFS_KEY = - "notifications.disable"; - -ConfigManager &ConfigManager::getInstance() { - static ConfigManager instance; - return instance; -} - -void ConfigManager::load() { - char const *configFileDirectoryFromEnvironment = - std::getenv(CONFIG_FILE_DIRECTORY_ENV_VARIABLE.c_str()); - std::string configFilePath = DEFAULT_CONFIG_FILE_DIRECTORY; - - if (configFileDirectoryFromEnvironment != nullptr) { - configFilePath = std::string{configFileDirectoryFromEnvironment}; - } - loadConfigFile(configFilePath + "/" + CONFIG_FILE_NAME); -} - -void ConfigManager::loadConfigFile(const std::string configFilePath) { - try { - std::ifstream fileStream; - fileStream.open(configFilePath.c_str(), std::ifstream::in); - if (!fileStream.is_open()) { - throw std::runtime_error("Error: can not open file " + configFilePath); - } - - boost::program_options::options_description description{ - "Tunnelbroker options"}; - description.add_options()( - this->OPTION_TUNNELBROKER_ID.c_str(), - boost::program_options::value()->required(), - "Tunnelbroker unique identification"); - description.add_options()( - this->OPTION_DEFAULT_KEYSERVER_ID.c_str(), - boost::program_options::value()->required(), - "Default and only allowed keyserver deviceID"); - description.add_options()( - this->OPTION_AMQP_URI.c_str(), - boost::program_options::value()->required(), - "AMQP URI connection string"); - description.add_options()( - this->OPTION_AMQP_FANOUT_EXCHANGE.c_str(), - boost::program_options::value()->default_value( - AMQP_FANOUT_EXCHANGE_NAME), - "AMQP Fanout exchange name"); - description.add_options()( - this->OPTION_DYNAMODB_SESSIONS_TABLE.c_str(), - boost::program_options::value()->default_value( - DEVICE_SESSIONS_TABLE_NAME), - "DynamoDB table name for sessions"); - description.add_options()( - this->OPTION_DYNAMODB_SESSIONS_VERIFICATION_TABLE.c_str(), - boost::program_options::value()->default_value( - DEVICE_SESSIONS_VERIFICATION_MESSAGES_TABLE_NAME), - "DynamoDB table name for sessions verification messages"); - description.add_options()( - this->OPTION_DYNAMODB_SESSIONS_PUBLIC_KEY_TABLE.c_str(), - boost::program_options::value()->default_value( - DEVICE_PUBLIC_KEY_TABLE_NAME), - "DynamoDB table name for public keys"); - description.add_options()( - this->OPTION_DYNAMODB_MESSAGES_TABLE.c_str(), - boost::program_options::value()->default_value( - MESSAGES_TABLE_NAME), - "DynamoDB table name for messages"); - - description.add_options()( - this->OPTION_NOTIFS_APNS_P12_CERT_PATH.c_str(), - boost::program_options::value()->required(), - "P12 certificate path for iOS notifications"); - description.add_options()( - this->OPTION_NOTIFS_APNS_P12_CERT_PASSWORD.c_str(), - boost::program_options::value()->required(), - "P12 certificate password for iOS notifications"); - description.add_options()( - this->OPTION_NOTIFS_APNS_TOPIC.c_str(), - boost::program_options::value()->required(), - "APNs messages topic for iOS notifications"); - description.add_options()( - this->OPTION_NOTIFS_FCM_SERVER_KEY.c_str(), - boost::program_options::value()->required(), - "Firebase Cloud Messaging server key for Android notifications"); - description.add_options()( - this->OPTION_DISABLE_NOTIFS_KEY.c_str(), - boost::program_options::value()->default_value(false), - "Disable push notifications mechanism"); - - description.add_options()( - this->OPTION_SESSIONS_SKIP_AUTH_KEY.c_str(), - boost::program_options::value()->default_value(false), - "Skip sessions authentication mechanism"); - description.add_options()( - this->OPTION_DISABLE_DEVICEID_VALIDATION.c_str(), - boost::program_options::value()->default_value(false), - "Disable deviceID format validation"); - - description.add_options()( - this->OPTION_MESSAGES_SKIP_PERSISTENCE.c_str(), - boost::program_options::value()->default_value(false), - "Disable messages persistence in DynamoDB database"); - - boost::program_options::parsed_options parsedDescription = - boost::program_options::parse_config_file( - fileStream, description, true); - boost::program_options::store(parsedDescription, this->variablesMap); - boost::program_options::notify(this->variablesMap); - fileStream.close(); - } catch (const std::exception &e) { - throw std::runtime_error( - "Got an exception at ConfigManager: " + std::string(e.what())); - } -} - -std::string ConfigManager::getParameter(std::string param) { - if (!this->variablesMap.count(param) && - !this->variablesMap[param].defaulted()) { - throw std::runtime_error( - "ConfigManager Error: config parameter " + param + " is not set."); - } - const std::string parameterValue = - this->variablesMap[param].as(); - if (parameterValue.empty()) { - throw std::runtime_error( - "ConfigManager Error: config parameter " + param + - " can not be empty."); - } - return parameterValue; -} - -bool ConfigManager::isParameterSet(std::string param) { - return this->variablesMap.count(param) != 0; -} - -} // namespace config -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Tools/ConfigManager.h b/services/tunnelbroker/old/libcpp/src/Tools/ConfigManager.h deleted file mode 100644 index 05dd7345a..000000000 --- a/services/tunnelbroker/old/libcpp/src/Tools/ConfigManager.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include - -#include - -namespace comm { -namespace network { -namespace config { - -class ConfigManager { -private: - boost::program_options::variables_map variablesMap; - void loadConfigFile(const std::string configFilePath); - -public: - static const std::string OPTION_TUNNELBROKER_ID; - static const std::string OPTION_DEFAULT_KEYSERVER_ID; - static const std::string OPTION_AMQP_URI; - static const std::string OPTION_AMQP_FANOUT_EXCHANGE; - static const std::string OPTION_DYNAMODB_SESSIONS_TABLE; - static const std::string OPTION_DYNAMODB_SESSIONS_VERIFICATION_TABLE; - static const std::string OPTION_DYNAMODB_SESSIONS_PUBLIC_KEY_TABLE; - static const std::string OPTION_DYNAMODB_MESSAGES_TABLE; - static const std::string OPTION_NOTIFS_APNS_P12_CERT_PATH; - static const std::string OPTION_NOTIFS_APNS_P12_CERT_PASSWORD; - static const std::string OPTION_NOTIFS_APNS_TOPIC; - static const std::string OPTION_NOTIFS_FCM_SERVER_KEY; - static const std::string OPTION_SESSIONS_SKIP_AUTH_KEY; - static const std::string OPTION_DISABLE_DEVICEID_VALIDATION; - static const std::string OPTION_MESSAGES_SKIP_PERSISTENCE; - static const std::string OPTION_DISABLE_NOTIFS_KEY; - - static ConfigManager &getInstance(); - void load(); - std::string getParameter(std::string param); - bool isParameterSet(std::string param); -}; - -} // namespace config -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Tools/Tools.cpp b/services/tunnelbroker/old/libcpp/src/Tools/Tools.cpp deleted file mode 100644 index e81465235..000000000 --- a/services/tunnelbroker/old/libcpp/src/Tools/Tools.cpp +++ /dev/null @@ -1,74 +0,0 @@ -#include "Tools.h" -#include "ConfigManager.h" -#include "Constants.h" - -#include - -#include -#include -#include - -namespace comm { -namespace network { -namespace tools { - -std::string generateRandomString(std::size_t length) { - const std::string CHARACTERS = - "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - thread_local std::random_device generator; - std::uniform_int_distribution<> distribution(0, CHARACTERS.size() - 1); - std::string random_string; - for (std::size_t i = 0; i < length; ++i) { - random_string += CHARACTERS[distribution(generator)]; - } - return random_string; -} - -bool validateDeviceID(std::string deviceID) { - if (config::ConfigManager::getInstance().isParameterSet( - config::ConfigManager::OPTION_DISABLE_DEVICEID_VALIDATION)) { - return true; - } - try { - static const std::regex deviceIDKeyserverRegexp("^ks:.*"); - if (std::regex_match(deviceID, deviceIDKeyserverRegexp)) { - return ( - deviceID == - config::ConfigManager::getInstance().getParameter( - config::ConfigManager::OPTION_DEFAULT_KEYSERVER_ID)); - } - return std::regex_match(deviceID, DEVICEID_FORMAT_REGEX); - } catch (const std::exception &e) { - LOG(ERROR) << "Tools: " - << "Got an exception at `validateDeviceID`: " << e.what(); - return false; - } -} - -bool validateSessionID(std::string sessionID) { - try { - return std::regex_match(sessionID, SESSION_ID_FORMAT_REGEX); - } catch (const std::exception &e) { - LOG(ERROR) << "Tools: " - << "Got an exception at `validateSessionId`: " << e.what(); - return false; - } -} - -void checkIfNotEmpty(std::string fieldName, std::string stringToCheck) { - if (stringToCheck.empty()) { - throw std::runtime_error( - "Error: Required text field " + fieldName + " is empty."); - } -} - -void checkIfNotZero(std::string fieldName, uint64_t numberToCheck) { - if (numberToCheck == 0) { - throw std::runtime_error( - "Error: Required number " + fieldName + " is zero."); - } -} - -} // namespace tools -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/src/Tools/Tools.h b/services/tunnelbroker/old/libcpp/src/Tools/Tools.h deleted file mode 100644 index 9cbaa41d6..000000000 --- a/services/tunnelbroker/old/libcpp/src/Tools/Tools.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include -#include - -namespace comm { -namespace network { -namespace tools { - -std::string generateRandomString(std::size_t length); -bool validateDeviceID(std::string deviceID); -bool validateSessionID(std::string sessionID); -void checkIfNotEmpty(std::string fieldName, std::string stringToCheck); -void checkIfNotZero(std::string fieldName, uint64_t numberToCheck); - -} // namespace tools -} // namespace network -} // namespace comm diff --git a/services/tunnelbroker/old/libcpp/test/AmqpManagerTest.cpp b/services/tunnelbroker/old/libcpp/test/AmqpManagerTest.cpp deleted file mode 100644 index 4a6126f8d..000000000 --- a/services/tunnelbroker/old/libcpp/test/AmqpManagerTest.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include "AmqpManager.h" -#include "ConfigManager.h" -#include "Constants.h" -#include "DeliveryBroker.h" -#include "GlobalTools.h" -#include "Tools.h" - -#include - -#include -#include - -using namespace comm::network; - -class AmqpManagerTest : public testing::Test { -protected: - virtual void SetUp() { - config::ConfigManager::getInstance().load(); - AmqpManager::getInstance().init(); - } -}; - -TEST_F(AmqpManagerTest, SentAndPopedMessagesAreSameOnStaticData) { - const std::string messageID = "bc0c1aa2-bf09-11ec-9d64-0242ac120002"; - const std::string fromDeviceID = - "web:JouLWf84zqRIsjBdHLOcHS9M4eSCz7VF84wT1uOD83u1qxDAqmqI4swmxNINjuhd"; - const std::string toDeviceID = - "mobile:EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm"; - const std::string payload = - "lYlNcO6RR4i9UW3G1DGjdJTRRGbqtPya2aj94ZRjIGZWoHwT5MB9ciAgnQf2VafYb9Tl" - "8SZkX37tg4yZ9pOb4lqslY4g4h58OmWjumghVRvrPUZDalUuK8OLs1Qoengpu9wccxAk" - "Bti2leDTNeiJDy36NnwS9aCIUc0ozsMvXfX1gWdBdmKbiRG1LvpNd6S7BNGG7Zly5zYj" - "xz7s6ZUSDoFfZe3eJWQ15ngYhgMw1TsfbECnMVQTYvY6OyqWPBQi5wiftFcluoxor8G5" - "RJ1NEDQq2q2FRfWjNHLhky92C2C7Nnfe4oVzSinfC1319uUkNLpSzI4MvEMi6g5Ukbl7" - "iGhpnX7Hp4xpBL3h2IkvGviDRQ98UvW0ugwUuPxm1NOQpjLG5dPoqQ0jrMst0Bl5rgPw" - "ajjNGsUWmp9r0ST0wRQXrQcY30PoSoqKSlCEgFMLzHWLrPQ86QFyCICismGSe7iBIqdD" - "6d37StvXBzfJoZVU79UeOF2bFvb3DNoArEOe"; - const database::MessageItem messageItem{ - messageID, fromDeviceID, toDeviceID, payload, ""}; - // To properly test multi-thread delivery we should send in another thread - std::thread sendThread([&messageItem]() { - EXPECT_EQ(AmqpManager::getInstance().send(&messageItem), true); - }); - sendThread.join(); - DeliveryBrokerMessage receivedMessage = - DeliveryBroker::getInstance().pop(toDeviceID); - EXPECT_EQ(messageID, receivedMessage.messageID); - EXPECT_EQ(fromDeviceID, receivedMessage.fromDeviceID); - EXPECT_EQ(payload, receivedMessage.payload); - AmqpManager::getInstance().ack(receivedMessage.deliveryTag); -} - -TEST_F(AmqpManagerTest, SentAndPopedMessagesAreSameOnGeneratedData) { - const std::string messageID = tools::generateUUID(); - const std::string fromDeviceID = - "web:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH); - const std::string toDeviceID = - "mobile:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH); - const std::string payload = tools::generateRandomString(512); - const database::MessageItem messageItem{ - messageID, fromDeviceID, toDeviceID, payload, ""}; - // To properly test multi-thread delivery we should send in another thread - std::thread sendThread([&messageItem]() { - EXPECT_EQ(AmqpManager::getInstance().send(&messageItem), true); - }); - sendThread.join(); - DeliveryBrokerMessage receivedMessage = - DeliveryBroker::getInstance().pop(toDeviceID); - EXPECT_EQ(messageID, receivedMessage.messageID) - << "Generated messageID \"" << messageID - << "\" differs from what was got from amqp message " - << receivedMessage.messageID; - EXPECT_EQ(fromDeviceID, receivedMessage.fromDeviceID) - << "Generated FromDeviceID \"" << fromDeviceID - << "\" differs from what was got from amqp message " - << receivedMessage.fromDeviceID; - EXPECT_EQ(payload, receivedMessage.payload) - << "Generated Payload \"" << payload - << "\" differs from what was got from amqp message " - << receivedMessage.payload; - AmqpManager::getInstance().ack(receivedMessage.deliveryTag); -} - -TEST_F(AmqpManagerTest, MultipleThreadsMessagesSendingStressTest) { - const size_t MESSAGES_NUMBER = 10; - const size_t THREADS_NUMBER = 100; - const std::string toDeviceID = - "mobile:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH); - - std::vector sendingThreads; - for (size_t i = 0; i < THREADS_NUMBER; ++i) { - sendingThreads.push_back(std::thread([toDeviceID, MESSAGES_NUMBER]() { - for (size_t i = 0; i < MESSAGES_NUMBER; ++i) { - const std::string messageID = tools::generateUUID(); - const std::string fromDeviceID = - "web:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH); - const std::string payload = tools::generateRandomString(512); - const database::MessageItem messageItem{ - messageID, fromDeviceID, toDeviceID, payload, ""}; - EXPECT_TRUE(AmqpManager::getInstance().send(&messageItem)); - } - })); - } - - std::vector receivedMessage; - for (size_t i = 0; i < MESSAGES_NUMBER * THREADS_NUMBER; ++i) { - receivedMessage.push_back(DeliveryBroker::getInstance().pop(toDeviceID)); - AmqpManager::getInstance().ack(receivedMessage.back().deliveryTag); - } - for (std::thread &thread : sendingThreads) { - thread.join(); - } - EXPECT_TRUE(DeliveryBroker::getInstance().isEmpty(toDeviceID)); - EXPECT_EQ(receivedMessage.size(), MESSAGES_NUMBER * THREADS_NUMBER); -} diff --git a/services/tunnelbroker/old/libcpp/test/CMakeLists.txt b/services/tunnelbroker/old/libcpp/test/CMakeLists.txt deleted file mode 100644 index ab66400fb..000000000 --- a/services/tunnelbroker/old/libcpp/test/CMakeLists.txt +++ /dev/null @@ -1,100 +0,0 @@ -PROJECT(tunnelbroker-libcpp C CXX) - -cmake_minimum_required(VERSION 3.16) - -# To fix full path libraries linking we are using the CMP0003 policy -# https://cmake.org/cmake/help/latest/policy/CMP0003.html -if(COMMAND cmake_policy) - cmake_policy(SET CMP0003 NEW) -endif(COMMAND cmake_policy) - -set(CMAKE_CXX_STANDARD 17) - -# For C++17 on MacOS, we must set minimum target to 10.14+ -set(CMAKE_OSX_DEPLOYMENT_TARGET 10.14) - -option(BUILD_TESTING "Build test suite" ON) -option(WITH_GFLAGS "Turn on GFLAGS" ON) -enable_testing() - -find_package(PkgConfig REQUIRED) -find_package(double-conversion REQUIRED) -find_package(Folly REQUIRED) -find_package(amqpcpp CONFIG REQUIRED) -find_package(AWSSDK REQUIRED COMPONENTS - core - dynamodb -) -find_package(Boost 1.40 REQUIRED COMPONENTS - system - program_options - context - filesystem - regex - thread -) -find_package(OpenSSL REQUIRED) -find_package(glog REQUIRED) -find_package(GTest REQUIRED) - -# Find Libuv installation -pkg_check_modules(LIBUV - REQUIRED - IMPORTED_TARGET - libuv>=1.43 -) - -file(GLOB_RECURSE SHARED_CODE "../../../../lib/src/*.cpp") -file(GLOB_RECURSE SOURCE_CODE "../src/*.cpp") -file(GLOB TEST_CODE "*.cpp") - -set(SHARED_INCLUDE_DIRS ../../../../lib/src) -set( - INCLUDE_DIRS - - ../src - ../src/Database - ../src/DeliveryBroker - ../src/Service - ../src/Tools - ../src/Amqp -) - -set( - LIBS - - ${AWSSDK_LINK_LIBRARIES} - ${Boost_LIBRARIES} - PkgConfig::LIBUV - amqpcpp - OpenSSL::SSL - glog::glog - double-conversion::double-conversion - Folly::folly -) - -add_executable( - runTests - - ${SHARED_CODE} - ${SOURCE_CODE} - ${TEST_CODE} -) -target_link_libraries( - runTests - - ${LIBS} - gtest - gtest_main -) - -target_include_directories( - runTests - PUBLIC - - ${INCLUDE_DIRS} - ${SHARED_INCLUDE_DIRS} -) - -include(GoogleTest) -gtest_discover_tests(runTests) diff --git a/services/tunnelbroker/old/libcpp/test/DatabaseManagerTest.cpp b/services/tunnelbroker/old/libcpp/test/DatabaseManagerTest.cpp deleted file mode 100644 index 270deb98f..000000000 --- a/services/tunnelbroker/old/libcpp/test/DatabaseManagerTest.cpp +++ /dev/null @@ -1,458 +0,0 @@ -#include "DatabaseManager.h" -#include "ConfigManager.h" -#include "Constants.h" -#include "GlobalTools.h" -#include "Tools.h" - -#include - -#include -#include -#include - -using namespace comm::network; - -class DatabaseManagerTest : public testing::Test { -protected: - virtual void SetUp() { - config::ConfigManager::getInstance().load(); - Aws::InitAPI({}); - } - - virtual void TearDown() { - Aws::ShutdownAPI({}); - } -}; - -TEST_F(DatabaseManagerTest, PutAndFoundMessageItemsStaticDataIsSame) { - const database::MessageItem item( - "bc0c1aa2-bf09-11ec-9d64-0242ac120002", - "mobile:EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm", - "web:JouLWf84zqRIsjBdHLOcHS9M4eSCz7VF84wT1uOD83u1qxDAqmqI4swmxNINjuhd", - "lYlNcO6RR4i9UW3G1DGjdJTRRGbqtPya2aj94ZRjIGZWoHwT5MB9ciAgnQf2VafYb9Tl" - "8SZkX37tg4yZ9pOb4lqslY4g4h58OmWjumghVRvrPUZDalUuK8OLs1Qoengpu9wccxAk" - "Bti2leDTNeiJDy36NnwS9aCIUc0ozsMvXfX1gWdBdmKbiRG1LvpNd6S7BNGG7Zly5zYj" - "xz7s6ZUSDoFfZe3eJWQ15ngYhgMw1TsfbECnMVQTYvY6OyqWPBQi5wiftFcluoxor8G5" - "RJ1NEDQq2q2FRfWjNHLhky92C2C7Nnfe4oVzSinfC1319uUkNLpSzI4MvEMi6g5Ukbl7" - "iGhpnX7Hp4xpBL3h2IkvGviDRQ98UvW0ugwUuPxm1NOQpjLG5dPoqQ0jrMst0Bl5rgPw" - "ajjNGsUWmp9r0ST0wRQXrQcY30PoSoqKSlCEgFMLzHWLrPQ86QFyCICismGSe7iBIqdD" - "6d37StvXBzfJoZVU79UeOF2bFvb3DNoArEOe", - "7s6ZUSDoFfZe3eJWQ15ngYhgMw1TsfbECnMVQTYvY6OyqWPBQi5wiftFcluoxor8"); - const size_t currentTimestamp = tools::getCurrentTimestamp(); - EXPECT_EQ( - database::DatabaseManager::getInstance().isTableAvailable( - item.getTableName()), - true); - database::DatabaseManager::getInstance().putMessageItem(item); - std::shared_ptr foundItem = - database::DatabaseManager::getInstance().findMessageItem( - item.getToDeviceID(), item.getMessageID()); - EXPECT_NE(foundItem, nullptr); - EXPECT_EQ(item.getFromDeviceID(), foundItem->getFromDeviceID()); - EXPECT_EQ(item.getToDeviceID(), foundItem->getToDeviceID()); - EXPECT_EQ(item.getPayload(), foundItem->getPayload()); - EXPECT_EQ(item.getBlobHashes(), foundItem->getBlobHashes()); - EXPECT_EQ( - (foundItem->getExpire() >= static_cast(std::time(0))) && - (foundItem->getExpire() <= - static_cast(std::time(0) + MESSAGE_RECORD_TTL)), - true); - EXPECT_EQ( - foundItem->getCreatedAt() >= currentTimestamp && - foundItem->getCreatedAt() <= tools::getCurrentTimestamp(), - true); - database::DatabaseManager::getInstance().removeMessageItem( - item.getToDeviceID(), item.getMessageID()); -} - -TEST_F(DatabaseManagerTest, PutAndFoundMessageItemsGeneratedDataIsSame) { - const database::MessageItem item( - tools::generateUUID(), - "mobile:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH), - "web:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH), - tools::generateRandomString(256), - tools::generateRandomString(256)); - EXPECT_EQ( - database::DatabaseManager::getInstance().isTableAvailable( - item.getTableName()), - true); - database::DatabaseManager::getInstance().putMessageItem(item); - std::shared_ptr foundItem = - database::DatabaseManager::getInstance().findMessageItem( - item.getToDeviceID(), item.getMessageID()); - EXPECT_NE(foundItem, nullptr); - EXPECT_EQ(item.getFromDeviceID(), foundItem->getFromDeviceID()) - << "Generated FromDeviceID \"" << item.getFromDeviceID() - << "\" differs from what is found in the database " - << foundItem->getFromDeviceID(); - EXPECT_EQ(item.getToDeviceID(), foundItem->getToDeviceID()) - << "Generated ToDeviceID \"" << item.getToDeviceID() - << "\" differs from what is found in the database " - << foundItem->getToDeviceID(); - EXPECT_EQ(item.getPayload(), foundItem->getPayload()) - << "Generated Payload \"" << item.getPayload() - << "\" differs from what is found in the database " - << foundItem->getPayload(); - EXPECT_EQ(item.getBlobHashes(), foundItem->getBlobHashes()) - << "Generated BlobHashes \"" << item.getBlobHashes() - << "\" differs from what is found in the database " - << foundItem->getBlobHashes(); - database::DatabaseManager::getInstance().removeMessageItem( - item.getToDeviceID(), item.getMessageID()); -} - -TEST_F(DatabaseManagerTest, BatchPutAndFoundMessagesItemsCountIsSame) { - const std::string receiverID = - "web:JouLWf84zqRIsjBdHLOcHS9M4eSCz7VF84wT1uOD83u1qxDAqmqI4swmxNINjuhd"; - const size_t itemsSize = 29; - std::vector messageItems; - - for (size_t i = 1; i <= itemsSize; ++i) { - database::MessageItem item{ - tools::generateUUID(), - "mobile:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH), - receiverID, - tools::generateRandomString(256), - tools::generateRandomString(256)}; - messageItems.push_back(item); - } - EXPECT_EQ( - database::DatabaseManager::getInstance().isTableAvailable( - messageItems[0].getTableName()), - true); - database::DatabaseManager::getInstance().putMessageItemsByBatch(messageItems); - std::vector> foundItems = - database::DatabaseManager::getInstance().findMessageItemsByReceiver( - receiverID); - EXPECT_EQ(foundItems.size(), itemsSize); - for (std::shared_ptr messageItem : foundItems) { - database::DatabaseManager::getInstance().removeMessageItem( - messageItem->getToDeviceID(), messageItem->getMessageID()); - } -} - -TEST_F(DatabaseManagerTest, PutAndFoundDeviceSessionItemStaticDataIsSame) { - const database::DeviceSessionItem item( - "bc0c1aa2-bf09-11ec-9d64-0242ac120002", - "mobile:" - "EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm", - "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9Q9wodsQdZNynbTnC35hA4mFW" - "mwZf9BhbI93aGAwPF9au0eYsawRz0jtYi4lSFXC9KleyQDg+6J+UW1kiWvE3ZRYG" - "ECqgx4zqajPTzVt7EAOGaIh/dPyQ6x2Ul1GlkkSYXUhhixEzExGp9g84eCyVkbCB" - "U3SK6SNKyR7anAXDVQIDAQAB", - "hbI93aGAwPF9au0eYsawRz0jtYi4lSFXC9KleyQDg+6J+UW1kiWvE3", - database::DeviceSessionItem::DeviceTypes::MOBILE, - "ios:1.1.1", - "iOS 99.99.99"); - EXPECT_EQ( - database::DatabaseManager::getInstance().isTableAvailable( - item.getTableName()), - true); - database::DatabaseManager::getInstance().putSessionItem(item); - std::shared_ptr foundItem = - database::DatabaseManager::getInstance().findSessionItem( - item.getSessionID()); - EXPECT_NE(foundItem, nullptr); - EXPECT_EQ(item.getDeviceID(), foundItem->getDeviceID()); - EXPECT_EQ(item.getPubKey(), foundItem->getPubKey()); - EXPECT_EQ(item.getNotifyToken(), foundItem->getNotifyToken()); - EXPECT_EQ(item.getDeviceType(), foundItem->getDeviceType()); - EXPECT_EQ(item.getAppVersion(), foundItem->getAppVersion()); - EXPECT_EQ(item.getDeviceOs(), foundItem->getDeviceOs()); - database::DatabaseManager::getInstance().removeSessionItem( - item.getSessionID()); -} - -TEST_F(DatabaseManagerTest, PutAndFoundDeviceSessionItemGeneratedDataIsSame) { - const database::DeviceSessionItem item( - tools::generateUUID(), - "mobile:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH), - tools::generateRandomString(451), - tools::generateRandomString(64), - database::DeviceSessionItem::DeviceTypes::MOBILE, - tools::generateRandomString(12), - tools::generateRandomString(12)); - EXPECT_EQ( - database::DatabaseManager::getInstance().isTableAvailable( - item.getTableName()), - true); - database::DatabaseManager::getInstance().putSessionItem(item); - std::shared_ptr foundItem = - database::DatabaseManager::getInstance().findSessionItem( - item.getSessionID()); - EXPECT_NE(foundItem, nullptr); - EXPECT_EQ(item.getDeviceID(), foundItem->getDeviceID()) - << "Generated DeviceID \"" << item.getDeviceID() - << "\" differs from what is found in the database " - << foundItem->getDeviceID(); - EXPECT_EQ(item.getPubKey(), foundItem->getPubKey()) - << "Generated PubKey \"" << item.getPubKey() - << "\" differs from what is found in the database " - << foundItem->getPubKey(); - EXPECT_EQ(item.getNotifyToken(), foundItem->getNotifyToken()) - << "Generated NotifyToken \"" << item.getNotifyToken() - << "\" differs from what is found in the database " - << foundItem->getNotifyToken(); - EXPECT_EQ(item.getDeviceType(), foundItem->getDeviceType()) - << "Generated DeviceType \"" << item.getDeviceType() - << "\" differs from what is found in the database " - << foundItem->getDeviceType(); - EXPECT_EQ(item.getAppVersion(), foundItem->getAppVersion()) - << "Generated AppVersion \"" << item.getAppVersion() - << "\" differs from what is found in the database " - << foundItem->getAppVersion(); - EXPECT_EQ(item.getDeviceOs(), foundItem->getDeviceOs()) - << "Generated DeviceOS \"" << item.getDeviceOs() - << "\" differs from what is found in the database " - << foundItem->getDeviceOs(); - database::DatabaseManager::getInstance().removeSessionItem( - item.getSessionID()); -} - -TEST_F(DatabaseManagerTest, UpdateIsOnlineDeviceSessionItem) { - const database::DeviceSessionItem item( - "bc0c1aa2-bf09-11ec-9d64-0242ac120002", - "mobile:" - "EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm", - "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9Q9wodsQdZNynbTnC35hA4mFW" - "mwZf9BhbI93aGAwPF9au0eYsawRz0jtYi4lSFXC9KleyQDg+6J+UW1kiWvE3ZRYG" - "ECqgx4zqajPTzVt7EAOGaIh/dPyQ6x2Ul1GlkkSYXUhhixEzExGp9g84eCyVkbCB" - "U3SK6SNKyR7anAXDVQIDAQAB", - "hbI93aGAwPF9au0eYsawRz0jtYi4lSFXC9KleyQDg+6J+UW1kiWvE3", - database::DeviceSessionItem::DeviceTypes::MOBILE, - "ios:1.1.1", - "iOS 99.99.99"); - EXPECT_EQ( - database::DatabaseManager::getInstance().isTableAvailable( - item.getTableName()), - true); - database::DatabaseManager::getInstance().putSessionItem(item); - std::shared_ptr foundItem = - database::DatabaseManager::getInstance().findSessionItem( - item.getSessionID()); - EXPECT_NE(foundItem, nullptr); - EXPECT_FALSE(foundItem->getIsOnline()); - - database::DatabaseManager::getInstance().updateSessionItemIsOnline( - item.getSessionID(), true); - foundItem = database::DatabaseManager::getInstance().findSessionItem( - item.getSessionID()); - EXPECT_NE(foundItem, nullptr); - EXPECT_TRUE(foundItem->getIsOnline()); - - database::DatabaseManager::getInstance().removeSessionItem( - item.getSessionID()); -} - -TEST_F(DatabaseManagerTest, UpdateNotifTokenInDeviceSessionItem) { - const database::DeviceSessionItem item( - "bc0c1aa2-bf09-11ec-9d64-0242ac120002", - "mobile:" - "EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm", - "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9Q9wodsQdZNynbTnC35hA4mFW" - "mwZf9BhbI93aGAwPF9au0eYsawRz0jtYi4lSFXC9KleyQDg+6J+UW1kiWvE3ZRYG" - "ECqgx4zqajPTzVt7EAOGaIh/dPyQ6x2Ul1GlkkSYXUhhixEzExGp9g84eCyVkbCB" - "U3SK6SNKyR7anAXDVQIDAQAB", - "hbI93aGAwPF9au0eYsawRz0jtYi4lSFXC9KleyQDg+6J+UW1kiWvE3", - database::DeviceSessionItem::DeviceTypes::MOBILE, - "ios:1.1.1", - "iOS 99.99.99"); - database::DatabaseManager::getInstance().putSessionItem(item); - std::shared_ptr foundItem = - database::DatabaseManager::getInstance().findSessionItem( - item.getSessionID()); - EXPECT_NE(foundItem, nullptr); - EXPECT_EQ(foundItem->getNotifyToken(), item.getNotifyToken()); - - const std::string newToken = - "HDVRgx4zqajPTzVt7EAOGaIh/dPyQ6x2Ul1GlkkSYXUhhixEzExGp9g84eCyVGHT"; - database::DatabaseManager::getInstance().updateSessionItemDeviceToken( - item.getSessionID(), newToken); - - foundItem = database::DatabaseManager::getInstance().findSessionItem( - item.getSessionID()); - EXPECT_NE(foundItem, nullptr); - EXPECT_EQ(foundItem->getNotifyToken(), newToken); - - database::DatabaseManager::getInstance().removeSessionItem( - item.getSessionID()); -} - -TEST_F(DatabaseManagerTest, PutAndFoundSessionSignItemStaticDataIsSame) { - const database::SessionSignItem item( - "bB3OSLdKlY60KPBpw6VoGKX7Lmw3SA07FmNhnqnclvVeaxXueAQ0dpQSpiQTtlGn", - "mobile:" - "EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm"); - EXPECT_EQ( - database::DatabaseManager::getInstance().isTableAvailable( - item.getTableName()), - true); - database::DatabaseManager::getInstance().putSessionSignItem(item); - std::shared_ptr foundItem = - database::DatabaseManager::getInstance().findSessionSignItem( - item.getDeviceID()); - EXPECT_NE(foundItem, nullptr); - EXPECT_EQ(item.getSign(), foundItem->getSign()); - database::DatabaseManager::getInstance().removeSessionSignItem( - item.getDeviceID()); -} - -TEST_F(DatabaseManagerTest, PutAndFoundSessionSignItemGeneratedDataIsSame) { - const database::SessionSignItem item( - tools::generateRandomString(SIGNATURE_REQUEST_LENGTH), - "mobile:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH)); - EXPECT_EQ( - database::DatabaseManager::getInstance().isTableAvailable( - item.getTableName()), - true); - database::DatabaseManager::getInstance().putSessionSignItem(item); - std::shared_ptr foundItem = - database::DatabaseManager::getInstance().findSessionSignItem( - item.getDeviceID()); - EXPECT_NE(foundItem, nullptr) << "Item with the key of deviceID \"" - << item.getDeviceID() << "\" is not found"; - EXPECT_EQ(item.getSign(), foundItem->getSign()) - << "Generated signature value \"" << item.getSign() - << "\" is not equal of \"" + foundItem->getSign() + - "\" from the database value"; - database::DatabaseManager::getInstance().removeSessionSignItem( - item.getDeviceID()); -} - -TEST_F(DatabaseManagerTest, PutAndFoundPublicKeyItemsStaticDataIsSame) { - const database::PublicKeyItem item( - "mobile:" - "EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm", - "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9Q9wodsQdZNynbTnC35hA4mFW" - "mwZf9BhbI93aGAwPF9au0eYsawRz0jtYi4lSFXC9KleyQDg+6J+UW1kiWvE3ZRYG" - "ECqgx4zqajPTzVt7EAOGaIh/dPyQ6x2Ul1GlkkSYXUhhixEzExGp9g84eCyVkbCB" - "U3SK6SNKyR7anAXDVQIDAQAB"); - EXPECT_EQ( - database::DatabaseManager::getInstance().isTableAvailable( - item.getTableName()), - true); - database::DatabaseManager::getInstance().putPublicKeyItem(item); - std::shared_ptr foundItem = - database::DatabaseManager::getInstance().findPublicKeyItem( - item.getDeviceID()); - EXPECT_NE(foundItem, nullptr); - EXPECT_EQ(item.getPublicKey(), foundItem->getPublicKey()); - database::DatabaseManager::getInstance().removePublicKeyItem( - item.getDeviceID()); -} - -TEST_F(DatabaseManagerTest, PutAndFoundPublicKeyItemsGeneratedDataIsSame) { - const database::PublicKeyItem item( - "mobile:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH), - tools::generateRandomString(451)); - EXPECT_EQ( - database::DatabaseManager::getInstance().isTableAvailable( - item.getTableName()), - true); - database::DatabaseManager::getInstance().putPublicKeyItem(item); - std::shared_ptr foundItem = - database::DatabaseManager::getInstance().findPublicKeyItem( - item.getDeviceID()); - EXPECT_NE(foundItem, nullptr); - EXPECT_EQ(item.getPublicKey(), foundItem->getPublicKey()) - << "Generated PublicKey \"" << item.getPublicKey() - << "\" differs from what is found in the database " - << foundItem->getPublicKey(); - database::DatabaseManager::getInstance().removePublicKeyItem( - item.getDeviceID()); -} - -TEST_F(DatabaseManagerTest, PutAndFoundByReceiverMessageItemsDataIsSame) { - const std::string receiverID = - "mobile:" - "EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm"; - const database::MessageItem item( - "bc0c1aa2-bf09-11ec-9d64-0242ac120002", - "mobile:" - "EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm", - receiverID, - "lYlNcO6RR4i9UW3G1DGjdJTRRGbqtPya2aj94ZRjIGZWoHwT5MB9ciAgnQf2VafYb9Tl" - "8SZkX37tg4yZ9pOb4lqslY4g4h58OmWjumghVRvrPUZDalUuK8OLs1Qoengpu9wccxAk" - "Bti2leDTNeiJDy36NnwS9aCIUc0ozsMvXfX1gWdBdmKbiRG1LvpNd6S7BNGG7Zly5zYj" - "xz7s6ZUSDoFfZe3eJWQ15ngYhgMw1TsfbECnMVQTYvY6OyqWPBQi5wiftFcluoxor8G5" - "RJ1NEDQq2q2FRfWjNHLhky92C2C7Nnfe4oVzSinfC1319uUkNLpSzI4MvEMi6g5Ukbl7" - "iGhpnX7Hp4xpBL3h2IkvGviDRQ98UvW0ugwUuPxm1NOQpjLG5dPoqQ0jrMst0Bl5rgPw" - "ajjNGsUWmp9r0ST0wRQXrQcY30PoSoqKSlCEgFMLzHWLrPQ86QFyCICismGSe7iBIqdD" - "6d37StvXBzfJoZVU79UeOF2bFvb3DNoArEOe", - "7s6ZUSDoFfZe3eJWQ15ngYhgMw1TsfbECnMVQTYvY6OyqWPBQi5wiftFcluoxor8"); - EXPECT_EQ( - database::DatabaseManager::getInstance().isTableAvailable( - item.getTableName()), - true); - database::DatabaseManager::getInstance().putMessageItem(item); - std::vector> foundItems = - database::DatabaseManager::getInstance().findMessageItemsByReceiver( - receiverID); - EXPECT_NE(foundItems.size(), 0); - EXPECT_EQ(item.getFromDeviceID(), foundItems[0]->getFromDeviceID()); - EXPECT_EQ(item.getToDeviceID(), foundItems[0]->getToDeviceID()); - EXPECT_EQ(item.getPayload(), foundItems[0]->getPayload()); - EXPECT_EQ(item.getBlobHashes(), foundItems[0]->getBlobHashes()); - EXPECT_EQ( - (foundItems[0]->getExpire() >= static_cast(std::time(0))) && - (foundItems[0]->getExpire() <= - static_cast(std::time(0) + MESSAGE_RECORD_TTL)), - true); - database::DatabaseManager::getInstance().removeMessageItem( - item.getToDeviceID(), item.getMessageID()); -} - -TEST_F(DatabaseManagerTest, RemoveMessageItemsInBatch) { - const size_t randomStringSize = 256; - const std::string receiverID = - "mobile:EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm"; - const database::MessageItem messageFirstToRemove( - tools::generateUUID(), - "mobile:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH), - receiverID, - tools::generateRandomString(randomStringSize), - tools::generateRandomString(randomStringSize)); - const database::MessageItem messageSecondToRemove( - tools::generateUUID(), - "web:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH), - receiverID, - tools::generateRandomString(randomStringSize), - tools::generateRandomString(randomStringSize)); - const database::MessageItem messageThirdToNotRemove( - tools::generateUUID(), - "web:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH), - receiverID, - tools::generateRandomString(randomStringSize), - tools::generateRandomString(randomStringSize)); - - EXPECT_EQ( - database::DatabaseManager::getInstance().isTableAvailable( - messageFirstToRemove.getTableName()), - true); - database::DatabaseManager::getInstance().putMessageItem(messageFirstToRemove); - database::DatabaseManager::getInstance().putMessageItem( - messageSecondToRemove); - database::DatabaseManager::getInstance().putMessageItem( - messageThirdToNotRemove); - std::vector> foundItems = - database::DatabaseManager::getInstance().findMessageItemsByReceiver( - receiverID); - EXPECT_EQ(foundItems.size(), 3) - << "Items count found by receiverID after insert is not equal to 3"; - std::vector messageIDs = { - messageFirstToRemove.getMessageID(), - messageSecondToRemove.getMessageID()}; - database::DatabaseManager::getInstance().removeMessageItemsByIDsForDeviceID( - messageIDs, receiverID); - foundItems = - database::DatabaseManager::getInstance().findMessageItemsByReceiver( - receiverID); - // `messageThirdToNotRemove` must not be removed and must be persisted - EXPECT_EQ(foundItems.size(), 1) - << "Items found by receiverID is not equal to 1 after calling " - "`removeMessageItemsByIDsForDeviceID`. The one message must be " - "persisted."; - database::DatabaseManager::getInstance().removeMessageItem( - messageThirdToNotRemove.getToDeviceID(), - messageThirdToNotRemove.getMessageID()); -} diff --git a/services/tunnelbroker/old/libcpp/test/DeliveryBrokerTest.cpp b/services/tunnelbroker/old/libcpp/test/DeliveryBrokerTest.cpp deleted file mode 100644 index 3de5711c6..000000000 --- a/services/tunnelbroker/old/libcpp/test/DeliveryBrokerTest.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include "DeliveryBroker.h" -#include "GlobalTools.h" -#include "Tools.h" - -#include - -#include -#include - -using namespace comm::network; - -class DeliveryBrokerTest : public testing::Test {}; - -TEST(DeliveryBrokerTest, CheckPushAndPopOnStaticValues) { - const std::string toDeviceID = - "mobile:EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm"; - const DeliveryBrokerMessage message{ - .messageID = "bc0c1aa2-bf09-11ec-9d64-0242ac120002", - .deliveryTag = 99, - .fromDeviceID = - "mobile:" - "uTfNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdooLkRt0S6TLzZWNM6XSvdWLop", - .payload = - "lYlNcO6RR4i9UW3G1DGjdJTRRGbqtPya2aj94ZRjIGZWoHwT5MB9ciAgnQf2VafYb9Tl" - "8SZkX37tg4yZ9pOb4lqslY4g4h58OmWjumghVRvrPUZDalUuK8OLs1Qoengpu9wccxAk" - "Bti2leDTNeiJDy36NnwS9aCIUc0ozsMvXfX1gWdBdmKbiRG1LvpNd6S7BNGG7Zly5zYj" - "xz7s6ZUSDoFfZe3eJWQ15ngYhgMw1TsfbECnMVQTYvY6OyqWPBQi5wiftFcluoxor8G5" - "RJ1NEDQq2q2FRfWjNHLhky92C2C7Nnfe4oVzSinfC1319uUkNLpSzI4MvEMi6g5Ukbl7" - "iGhpnX7Hp4xpBL3h2IkvGviDRQ98UvW0ugwUuPxm1NOQpjLG5dPoqQ0jrMst0Bl5rgPw" - "ajjNGsUWmp9r0ST0wRQXrQcY30PoSoqKSlCEgFMLzHWLrPQ86QFyCICismGSe7iBIqdD" - "6d37StvXBzfJoZVU79UeOF2bFvb3DNoArEOe"}; - DeliveryBroker::getInstance().push( - message.messageID, - message.deliveryTag, - toDeviceID, - message.fromDeviceID, - message.payload); - DeliveryBrokerMessage receivedMessage = - DeliveryBroker::getInstance().pop(toDeviceID); - EXPECT_EQ(message.messageID, receivedMessage.messageID); - EXPECT_EQ(message.deliveryTag, receivedMessage.deliveryTag); - EXPECT_EQ(message.fromDeviceID, receivedMessage.fromDeviceID); - EXPECT_EQ(message.payload, receivedMessage.payload); -} - -TEST(DeliveryBrokerTest, CheckPushAndPopOnGeneratedValues) { - const std::string toDeviceID = - "mobile:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH); - const DeliveryBrokerMessage message{ - .messageID = tools::generateUUID(), - .deliveryTag = static_cast(std::time(0)), - .fromDeviceID = - "mobile:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH), - .payload = tools::generateRandomString(512)}; - DeliveryBroker::getInstance().push( - message.messageID, - message.deliveryTag, - toDeviceID, - message.fromDeviceID, - message.payload); - DeliveryBrokerMessage receivedMessage = - DeliveryBroker::getInstance().pop(toDeviceID); - EXPECT_EQ(message.messageID, receivedMessage.messageID) - << "Generated MessageID \"" << message.messageID - << "\" differs from what was received " << receivedMessage.messageID; - EXPECT_EQ(message.deliveryTag, receivedMessage.deliveryTag) - << "Generated DeliveryTag \"" << message.deliveryTag - << "\" differs from what was received " << receivedMessage.deliveryTag; - EXPECT_EQ(message.fromDeviceID, receivedMessage.fromDeviceID) - << "Generated FromDeviceID \"" << message.fromDeviceID - << "\" differs from what was received " << receivedMessage.fromDeviceID; - EXPECT_EQ(message.payload, receivedMessage.payload) - << "Generated Payload \"" << message.payload - << "\" differs from what was received " << receivedMessage.payload; -} - -TEST(DeliveryBrokerTest, IsEmptyShoudBeFalseAfterPush) { - const std::string deviceID = - "mobile:" - "EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm"; - const DeliveryBrokerMessage message{ - .messageID = "bc0c1aa2-bf09-11ec-9d64-0242ac120002", - .deliveryTag = 99, - .fromDeviceID = - "mobile:" - "uTfNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdooLkRt0S6TLzZWNM6XSvdWLop", - .payload = - "lYlNcO6RR4i9UW3G1DGjdJTRRGbqtPya2aj94ZRjIGZWoHwT5MB9ciAgnQf2VafYb9Tl" - "8SZkX37tg4yZ9pOb4lqslY4g4h58OmWjumghVRvrPUZDalUuK8OLs1Qoengpu9wccxAk" - "Bti2leDTNeiJDy36NnwS9aCIUc0ozsMvXfX1gWdBdmKbiRG1LvpNd6S7BNGG7Zly5zYj" - "xz7s6ZUSDoFfZe3eJWQ15ngYhgMw1TsfbECnMVQTYvY6OyqWPBQi5wiftFcluoxor8G5" - "RJ1NEDQq2q2FRfWjNHLhky92C2C7Nnfe4oVzSinfC1319uUkNLpSzI4MvEMi6g5Ukbl7" - "iGhpnX7Hp4xpBL3h2IkvGviDRQ98UvW0ugwUuPxm1NOQpjLG5dPoqQ0jrMst0Bl5rgPw" - "ajjNGsUWmp9r0ST0wRQXrQcY30PoSoqKSlCEgFMLzHWLrPQ86QFyCICismGSe7iBIqdD" - "6d37StvXBzfJoZVU79UeOF2bFvb3DNoArEOe"}; - EXPECT_EQ(DeliveryBroker::getInstance().isEmpty(deviceID), true); - DeliveryBroker::getInstance().push( - message.messageID, - message.deliveryTag, - deviceID, - message.fromDeviceID, - message.payload); - EXPECT_EQ(DeliveryBroker::getInstance().isEmpty(deviceID), false); -} - -TEST(DeliveryBrokerTest, ShouldBeEmptyAfterErase) { - const std::string deviceID = - "mobile:" - "EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm"; - const DeliveryBrokerMessage message{ - .messageID = "bc0c1aa2-bf09-11ec-9d64-0242ac120002", - .deliveryTag = 99, - .fromDeviceID = - "mobile:" - "uTfNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdooLkRt0S6TLzZWNM6XSvdWLop", - .payload = - "lYlNcO6RR4i9UW3G1DGjdJTRRGbqtPya2aj94ZRjIGZWoHwT5MB9ciAgnQf2VafYb9Tl" - "8SZkX37tg4yZ9pOb4lqslY4g4h58OmWjumghVRvrPUZDalUuK8OLs1Qoengpu9wccxAk" - "Bti2leDTNeiJDy36NnwS9aCIUc0ozsMvXfX1gWdBdmKbiRG1LvpNd6S7BNGG7Zly5zYj" - "xz7s6ZUSDoFfZe3eJWQ15ngYhgMw1TsfbECnMVQTYvY6OyqWPBQi5wiftFcluoxor8G5" - "RJ1NEDQq2q2FRfWjNHLhky92C2C7Nnfe4oVzSinfC1319uUkNLpSzI4MvEMi6g5Ukbl7" - "iGhpnX7Hp4xpBL3h2IkvGviDRQ98UvW0ugwUuPxm1NOQpjLG5dPoqQ0jrMst0Bl5rgPw" - "ajjNGsUWmp9r0ST0wRQXrQcY30PoSoqKSlCEgFMLzHWLrPQ86QFyCICismGSe7iBIqdD" - "6d37StvXBzfJoZVU79UeOF2bFvb3DNoArEOe"}; - DeliveryBroker::getInstance().push( - message.messageID, - message.deliveryTag, - deviceID, - message.fromDeviceID, - message.payload); - EXPECT_EQ(DeliveryBroker::getInstance().isEmpty(deviceID), false); - DeliveryBroker::getInstance().erase(deviceID); - EXPECT_EQ(DeliveryBroker::getInstance().isEmpty(deviceID), true); -} diff --git a/services/tunnelbroker/old/libcpp/test/ToolsTest.cpp b/services/tunnelbroker/old/libcpp/test/ToolsTest.cpp deleted file mode 100644 index 78c8896cb..000000000 --- a/services/tunnelbroker/old/libcpp/test/ToolsTest.cpp +++ /dev/null @@ -1,98 +0,0 @@ -#include "Tools.h" -#include "Constants.h" -#include "GlobalTools.h" - -#include - -#include - -using namespace comm::network; - -class ToolsTest : public testing::Test {}; - -TEST(ToolsTest, GeneratedRandomStringHasValidLength) { - const std::size_t length = 32; - const std::string generated = tools::generateRandomString(length); - EXPECT_EQ(generated.length(), length) - << "Generated random string \"" << generated << "\" length " - << generated.length() << " is not equal to " << length; -} - -TEST(ToolsTest, ValidateDeviceIDReturnsTrueOnStaticValidDeviceID) { - const std::string validDeviceID = - "mobile:EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm"; - EXPECT_EQ(tools::validateDeviceID(validDeviceID), true) - << "Valid deviceID \"" << validDeviceID - << "\" is invalid by the function"; -} - -TEST(ToolsTest, ValidateDeviceIDReturnsTrueOnGeneratedValidDeviceID) { - const std::string validDeviceID = - "mobile:" + tools::generateRandomString(DEVICEID_CHAR_LENGTH); - EXPECT_EQ(tools::validateDeviceID(validDeviceID), true) - << "Valid generated deviceID \"" << validDeviceID - << "\" is invalid by the function"; -} - -TEST(ToolsTest, ValidateUUIDv4ReturnsTrueOnStaticValidUUID) { - const std::string validUUID = "9bfdd6ea-25de-418f-aa2e-869c78073d81"; - EXPECT_EQ(tools::validateUUIDv4(validUUID), true) - << "Valid UUID \"" << validUUID << "\" is invalid by the function"; -} - -TEST(ToolsTest, ValidateUUIDv4ReturnsTrueOnGeneratedValidUUID) { - const std::string validUUID = tools::generateUUID(); - EXPECT_EQ(tools::validateUUIDv4(validUUID), true) - << "Valid generated UUID \"" << validUUID - << "\" is invalid by the function"; -} - -TEST(ToolsTest, ValidateUUIDv4ReturnsFalseOnStaticInvalidUUID) { - const std::string invalidFormatUUID = "58g8141b-8e5b-48f4-b3a1-e5e495c65f93"; - EXPECT_EQ(tools::validateUUIDv4(invalidFormatUUID), false) - << "Invalid formatted UUID \"" << invalidFormatUUID - << "\" is valid by the function"; - const std::string uppercaseUUID = "58F8141B-8E5B-48F4-B3A1-E5E495C65F93"; - EXPECT_EQ(tools::validateUUIDv4(uppercaseUUID), false) - << "Uppercase UUID \"" << uppercaseUUID - << "\" must be invalid because we are using the lowercase UUID format " - "convention"; -} - -TEST(ToolsTest, ValidateDeviceIDReturnsFalseOnInvalidDeviceIDPrefix) { - const std::string invalidDeviceIDPrefix = - "invalid-" - "EMQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm"; - EXPECT_EQ(tools::validateDeviceID(invalidDeviceIDPrefix), false) - << "Invalid prefix deviceID \"" << invalidDeviceIDPrefix - << "\" is valid by the function"; -} - -TEST(ToolsTest, ValidateDeviceIDReturnsFalseOnInvalidDeviceIDSuffix) { - const std::string invalidDeviceIDSuffix = - "mobile:tQNoQ7b2ueEmQ4QsevRWlXxFCNt055y20T1PHdoYAQRt0S6TLzZWNM6XSvdWqxm"; - EXPECT_EQ(tools::validateDeviceID(invalidDeviceIDSuffix), false) - << "Invalid suffix deviceID \"" << invalidDeviceIDSuffix - << "\" is valid by the function"; -} - -TEST(ToolsTest, ValidateSessionIDReturnsTrueOnValidStaticSessionID) { - const std::string validSessionID = "bc0c1aa2-bf09-11ec-9d64-0242ac120002"; - EXPECT_EQ(tools::validateSessionID(validSessionID), true) - << "Valid sessionID \"" << validSessionID - << "\" is invalid by the function"; -} - -TEST(ToolsTest, ValidateSessionIDReturnsTrueOnValidGeneratedSessionID) { - const std::string validSessionID = tools::generateUUID(); - EXPECT_EQ(tools::validateSessionID(validSessionID), true) - << "Valid generated sessionID \"" << validSessionID - << "\" is invalid by the function"; -} - -TEST(ToolsTest, ValidateSessionIDReturnsFalseOnInvalidSessionID) { - const std::string invalidSessionID = "bc0c1aa29bf09-11ec-9d64-0242ac120002"; - EXPECT_EQ(tools::validateSessionID(invalidSessionID), false) - << "Invalid sessionID \"" << invalidSessionID - << "\" is valid by the function"; -} diff --git a/services/tunnelbroker/old/libcpp/test/TunnelBrokerTest.cpp b/services/tunnelbroker/old/libcpp/test/TunnelBrokerTest.cpp deleted file mode 100644 index d5239a302..000000000 --- a/services/tunnelbroker/old/libcpp/test/TunnelBrokerTest.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include - -class TunnelBrokerTest : public testing::Test { -protected: - virtual void SetUp() { - //... - } - - virtual void TearDown() { - //... - } -}; - -TEST_F(TunnelBrokerTest, passingTest) { - EXPECT_TRUE(true); -} - -TEST_F(TunnelBrokerTest, failingTest) { - // EXPECT_TRUE(false); -} diff --git a/services/tunnelbroker/old/libcpp/test/main.cpp b/services/tunnelbroker/old/libcpp/test/main.cpp deleted file mode 100644 index 4483c91af..000000000 --- a/services/tunnelbroker/old/libcpp/test/main.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "gtest/gtest.h" - -int main(int argc, char **argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/services/tunnelbroker/old/notifications/apns.rs b/services/tunnelbroker/old/notifications/apns.rs deleted file mode 100644 index 5f1656c02..000000000 --- a/services/tunnelbroker/old/notifications/apns.rs +++ /dev/null @@ -1,60 +0,0 @@ -use super::CONFIG; -use a2::{ - Client, Endpoint, Error, - ErrorReason::{BadDeviceToken, Unregistered}, - NotificationBuilder, NotificationOptions, PlainNotificationBuilder, -}; -use std::fs::File; - -pub enum ApnsError { - BadDeviceToken, - Unregistered, - CommonError(anyhow::Error), -} - -pub async fn send_by_a2_client( - device_token: &str, - message: &str, -) -> Result<(), ApnsError> { - let mut certificate = File::open(&CONFIG.apns_certificate_path) - .expect("Error opening apns certificate file"); - let endpoint = if CONFIG.is_sandbox { - Endpoint::Sandbox - } else { - Endpoint::Production - }; - let client = Client::certificate( - &mut certificate, - &CONFIG.apns_certificate_password, - endpoint, - ) - .expect("Error creating client on apns certificate"); - let options = NotificationOptions { - apns_topic: Some(&CONFIG.apns_topic), - ..Default::default() - }; - let builder = PlainNotificationBuilder::new(message); - let mut payload = builder.build(device_token, options); - payload.aps.content_available = Some(1); - match client.send(payload).await { - Ok(_) => Ok(()), - Err(Error::ResponseError(response)) => { - if let Some(error_body) = response.error { - match error_body.reason { - BadDeviceToken => Err(ApnsError::BadDeviceToken), - Unregistered => Err(ApnsError::Unregistered), - _ => Err(ApnsError::CommonError(anyhow::Error::msg(format!( - "Notification was not accepted by APNs, reason: {:?}", - error_body.reason - )))), - } - } else { - Err(ApnsError::CommonError(anyhow::Error::msg(format!( - "Unhandled response error from APNs, response: {:?}", - response - )))) - } - } - Err(error) => Err(ApnsError::CommonError(anyhow::Error::new(error))), - } -} diff --git a/services/tunnelbroker/old/notifications/config.rs b/services/tunnelbroker/old/notifications/config.rs deleted file mode 100644 index f0ae9684e..000000000 --- a/services/tunnelbroker/old/notifications/config.rs +++ /dev/null @@ -1,8 +0,0 @@ -#[derive(Default, Clone)] -pub struct Config { - pub fcm_api_key: String, - pub apns_certificate_path: String, - pub apns_certificate_password: String, - pub apns_topic: String, - pub is_sandbox: bool, -} diff --git a/services/tunnelbroker/old/notifications/fcm.rs b/services/tunnelbroker/old/notifications/fcm.rs deleted file mode 100644 index 2cce5cb8a..000000000 --- a/services/tunnelbroker/old/notifications/fcm.rs +++ /dev/null @@ -1,60 +0,0 @@ -use super::CONFIG; -use anyhow::Result; -use fcm::{ - response::ErrorReason::{InvalidRegistration, NotRegistered}, - Client, MessageBuilder, NotificationBuilder, -}; - -pub enum FcmError { - InvalidRegistration, - NotRegistered, - CommonError(anyhow::Error), -} - -pub async fn send_by_fcm_client( - device_registration_id: &str, - message_title: &str, - message_body: &str, -) -> Result<(), FcmError> { - let client = Client::new(); - let mut notification_builder = NotificationBuilder::new(); - notification_builder.title(message_title); - notification_builder.body(message_body); - let notification = notification_builder.finalize(); - - let mut message_builder = - MessageBuilder::new(&CONFIG.fcm_api_key, device_registration_id); - message_builder.notification(notification); - - let result = client.send(message_builder.finalize()).await; - match result { - Ok(result) => match result.results { - Some(results) => { - if results.len() == 0 { - return Err(FcmError::CommonError(anyhow::Error::msg( - "FCM client returned zero size results", - ))); - }; - if let Some(result_error) = results[0].error { - match result_error { - InvalidRegistration => return Err(FcmError::InvalidRegistration), - NotRegistered => return Err(FcmError::NotRegistered), - _ => { - return Err(FcmError::CommonError(anyhow::Error::msg(format!( - "Notification was not accepted by FCM, reason: {:?}", - result_error - )))) - } - } - } - } - None => { - return Err(FcmError::CommonError(anyhow::Error::msg( - "FCM client has no results set", - ))) - } - }, - Err(err) => return Err(FcmError::CommonError(anyhow::Error::from(err))), - } - Ok(()) -} diff --git a/services/tunnelbroker/old/notifications/mod.rs b/services/tunnelbroker/old/notifications/mod.rs deleted file mode 100644 index f800aba0a..000000000 --- a/services/tunnelbroker/old/notifications/mod.rs +++ /dev/null @@ -1,23 +0,0 @@ -pub mod apns; -pub mod config; -pub mod fcm; -use super::cxx_bridge::ffi::{getConfigParameter, isSandbox}; -use lazy_static::lazy_static; - -lazy_static! { - static ref CONFIG: config::Config = config::Config { - fcm_api_key: getConfigParameter("notifications.fcm_server_key") - .expect("Error getting `notifications.fcm_server_key` config parameter"), - apns_certificate_path: getConfigParameter("notifications.apns_cert_path") - .expect("Error getting `notifications.apns_cert_path` config parameter"), - apns_certificate_password: getConfigParameter( - "notifications.apns_cert_password" - ) - .expect( - "Error getting `notifications.apns_cert_password` config parameter" - ), - apns_topic: getConfigParameter("notifications.apns_topic") - .expect("Error getting `apns_topic` config parameter"), - is_sandbox: isSandbox().expect("Error determining of sandboxing"), - }; -} diff --git a/services/tunnelbroker/old/server/mod.rs b/services/tunnelbroker/old/server/mod.rs deleted file mode 100644 index 1e87590c6..000000000 --- a/services/tunnelbroker/old/server/mod.rs +++ /dev/null @@ -1,440 +0,0 @@ -use crate::cxx_bridge::ffi::{MessageItem, SessionItem}; - -use super::constants; -use super::cxx_bridge::ffi::{ - ackMessageFromAMQP, deleteDeliveryBrokerQueueIfEmpty, eraseMessagesFromAMQP, - getMessagesFromDatabase, getSavedNonceToSign, getSessionItem, - isConfigParameterSet, newSessionHandler, removeMessages, sendMessages, - sessionSignatureHandler, updateSessionItemDeviceToken, - updateSessionItemIsOnline, waitMessageFromDeliveryBroker, GRPCStatusCodes, -}; -use anyhow::Result; -use futures::Stream; -use std::pin::Pin; -use tokio::sync::mpsc; -use tokio_stream::{wrappers::ReceiverStream, StreamExt}; -use tonic::{transport::Server, Request, Response, Status, Streaming}; -use tracing::{debug, error}; -use tunnelbroker::message_to_tunnelbroker::Data::{ - MessagesToSend, NewNotifyToken, ProcessedMessages, -}; -use tunnelbroker::tunnelbroker_service_server::{ - TunnelbrokerService, TunnelbrokerServiceServer, -}; -mod tools; -mod tunnelbroker { - tonic::include_proto!("tunnelbroker"); -} - -#[derive(Debug, Default)] -struct TunnelbrokerServiceHandlers {} - -#[tonic::async_trait] -impl TunnelbrokerService for TunnelbrokerServiceHandlers { - async fn session_signature( - &self, - request: Request, - ) -> Result, Status> { - let result = sessionSignatureHandler(&request.into_inner().device_id); - if result.grpcStatus.statusCode != GRPCStatusCodes::Ok { - return Err(tools::create_tonic_status( - result.grpcStatus.statusCode, - &result.grpcStatus.errorText, - )); - } - Ok(Response::new(tunnelbroker::SessionSignatureResponse { - to_sign: result.toSign, - })) - } - - async fn new_session( - &self, - request: Request, - ) -> Result, Status> { - let inner_request = request.into_inner(); - let notify_token = inner_request.notify_token.unwrap_or(String::new()); - if !tunnelbroker::new_session_request::DeviceTypes::is_valid( - inner_request.device_type, - ) { - return Err(tools::create_tonic_status( - GRPCStatusCodes::InvalidArgument, - "Unsupported device type", - )); - }; - - let nonce_to_be_signed = match getSavedNonceToSign(&inner_request.device_id) - { - Ok(saved_nonce) => saved_nonce, - Err(err) => { - return Err(tools::create_tonic_status( - GRPCStatusCodes::Internal, - &err.what(), - )) - } - }; - match tools::verify_signed_string( - &inner_request.public_key, - &nonce_to_be_signed, - &inner_request.signature, - ) { - Ok(verifying_result) => { - if !verifying_result { - return Err(tools::create_tonic_status( - GRPCStatusCodes::PermissionDenied, - "Signature for the verification message is not valid", - )); - } - } - Err(_) => { - return Err(tools::create_tonic_status( - GRPCStatusCodes::Internal, - "Error while verifying the signature", - )) - } - } - - let result = newSessionHandler( - &inner_request.device_id, - &inner_request.public_key, - inner_request.device_type, - &inner_request.device_app_version, - &inner_request.device_os, - ¬ify_token, - ); - if result.grpcStatus.statusCode != GRPCStatusCodes::Ok { - return Err(tools::create_tonic_status( - result.grpcStatus.statusCode, - &result.grpcStatus.errorText, - )); - } - Ok(Response::new(tunnelbroker::NewSessionResponse { - session_id: result.sessionID, - })) - } - - type MessagesStreamStream = Pin< - Box< - dyn Stream> + Send, - >, - >; - - async fn messages_stream( - &self, - request: Request>, - ) -> Result, Status> { - let session_id: String; - let session_item: SessionItem; - if isConfigParameterSet("sessions.skip_authentication").expect( - "Error while checking the skip_authentication config file parameter", - ) { - session_id = String::new(); - let device_id = request - .metadata() - .get("deviceID") - .expect("Expected 'deviceID' value in metadata is not provided") - .to_str() - .expect("Metadata 'deviceID' value is not a valid UTF8") - .to_string(); - session_item = SessionItem { - deviceID: device_id, - publicKey: String::new(), - notifyToken: String::new(), - deviceType: 0, - appVersion: String::new(), - deviceOS: String::new(), - isOnline: true, - }; - } else { - session_id = match request.metadata().get("sessionID") { - Some(metadata_session_id) => metadata_session_id - .to_str() - .expect("metadata session id was not valid UTF8") - .to_string(), - None => { - return Err(Status::invalid_argument( - "No 'sessionID' in metadata was provided", - )); - } - }; - session_item = match getSessionItem(&session_id) { - Ok(database_item) => database_item, - Err(err) => return Err(Status::unauthenticated(err.what())), - }; - } - let (tx, rx) = mpsc::channel(constants::GRPC_TX_QUEUE_SIZE); - - // Through this function, we will write to the output stream from different Tokio - // tasks and update the device's online status if the write was unsuccessful - async fn tx_writer( - session_id: &str, - channel: &tokio::sync::mpsc::Sender, - payload: T, - ) -> Result<(), String> { - let result = channel.send(payload).await; - match result { - Ok(result) => Ok(result), - Err(err) => { - if let Err(err) = updateSessionItemIsOnline(&session_id, false) { - return Err(err.what().to_string()); - } - return Err(err.to_string()); - } - } - } - - if let Err(err) = updateSessionItemIsOnline(&session_id, true) { - return Err(Status::internal(err.what())); - } - - // Checking for an empty notif token and requesting the new one from the client - if !isConfigParameterSet("notifications.disable").expect( - "Error while checking the `notifications.disable` config file parameter", - ) && session_item.notifyToken.is_empty() - && session_item.deviceType - == tunnelbroker::new_session_request::DeviceTypes::Mobile as i32 - { - let result = tx_writer( - &session_id, - &tx, - Ok(tunnelbroker::MessageToClient { - data: Some( - tunnelbroker::message_to_client::Data::NewNotifyTokenRequired(()), - ), - }), - ); - if let Err(err) = result.await { - debug!( - "Error while sending notification token request to the client: {}", - err - ); - }; - } - - // When a client connects to the bidirectional messages stream, first we check - // if there are undelivered messages in the database - if !isConfigParameterSet("messages.skip_persistence").expect( - "Error while checking the `messages.skip_persistence` config file parameter", - ) { - let messages_from_database = - match getMessagesFromDatabase(&session_item.deviceID) { - Ok(messages) => messages, - Err(err) => return Err(Status::internal(err.what())), - }; - if messages_from_database.len() > 0 { - if let Err(err) = eraseMessagesFromAMQP(&session_item.deviceID) { - return Err(Status::internal(err.what())); - }; - let mut messages_to_response = vec![]; - for message in &messages_from_database { - messages_to_response.push(tunnelbroker::MessageToClientStruct { - message_id: message.messageID.clone(), - from_device_id: message.fromDeviceID.clone(), - payload: message.payload.clone(), - blob_hashes: vec![message.blobHashes.clone()], - }); - } - let result_from_writer = tx_writer( - &session_id, - &tx, - Ok(tunnelbroker::MessageToClient { - data: Some( - tunnelbroker::message_to_client::Data::MessagesToDeliver( - tunnelbroker::MessagesToDeliver { - messages: messages_to_response, - }, - ), - ), - }), - ); - if let Err(err) = result_from_writer.await { - debug!( - "Error while sending undelivered messages from database to the client: {}", - err - ); - return Err(Status::aborted(err)); - }; - } - } - - // Spawning asynchronous Tokio task to deliver new messages - // to the client from delivery broker - tokio::spawn({ - let device_id = session_item.deviceID.clone(); - let session_id = session_id.clone(); - let tx = tx.clone(); - async move { - loop { - let device_id = device_id.clone(); - let message_to_deliver = - match tokio::task::spawn_blocking(move || { - waitMessageFromDeliveryBroker(&device_id) - }) - .await - .expect("Error on waiting messages from DeliveryBroker") - { - Ok(message_item) => message_item, - Err(err) => { - error!( - "Error on waiting messages from DeliveryBroker: {}", - err.what() - ); - return; - } - }; - let writer_result = tx_writer( - &session_id, - &tx, - Ok(tunnelbroker::MessageToClient { - data: Some( - tunnelbroker::message_to_client::Data::MessagesToDeliver( - tunnelbroker::MessagesToDeliver { - messages: vec![tunnelbroker::MessageToClientStruct { - message_id: message_to_deliver.messageID, - from_device_id: message_to_deliver.fromDeviceID, - payload: message_to_deliver.payload, - blob_hashes: vec![message_to_deliver.blobHashes], - }], - }, - ), - ), - }), - ); - if let Err(err) = writer_result.await { - debug!("Error on writing to the stream: {}", err); - return; - }; - if let Err(err) = ackMessageFromAMQP(message_to_deliver.deliveryTag) { - debug!("Error on message acknowledgement in AMQP queue: {}", err); - return; - }; - } - } - }); - - let mut input_stream = request.into_inner(); - // Spawning asynchronous Tokio task for handling incoming messages from the client - tokio::spawn(async move { - while let Some(result) = input_stream.next().await { - if let Err(err) = result { - debug!("Error in input stream: {}", err); - break; - } - if let Some(message_data) = result.unwrap().data { - match message_data { - NewNotifyToken(new_token) => { - if let Err(err) = - updateSessionItemDeviceToken(&session_id, &new_token) - { - error!( - "Error in updating the device notification token in the database: {}", - err.what() - ); - let writer_result = tx_writer( - &session_id, - &tx, - Err( - Status::internal( - "Error in updating the device notification token in the database" - ) - ), - ); - if let Err(err) = writer_result.await { - debug!( - "Failed to write internal error to a channel: {}", - err - ); - }; - } - } - MessagesToSend(messages_to_send) => { - let mut messages_vec = vec![]; - for message in messages_to_send.messages { - messages_vec.push(MessageItem { - messageID: String::new(), - fromDeviceID: session_item.deviceID.clone(), - toDeviceID: message.to_device_id, - payload: message.payload, - blobHashes: String::new(), - deliveryTag: 0, - }); - } - let messages_ids = match sendMessages(&messages_vec) { - Err(err) => { - error!("Error on sending messages: {}", err.what()); - return; - } - Ok(ids) => ids, - }; - if let Err(err) = tx_writer( - &session_id, - &tx, - Ok(tunnelbroker::MessageToClient { - data: Some( - tunnelbroker::message_to_client::Data::ProcessedMessages( - tunnelbroker::ProcessedMessages { - message_id: messages_ids, - }, - ), - ), - }), - ) - .await - { - debug!( - "Error on sending back processed messages IDs to the stream: {}", - err); - }; - } - ProcessedMessages(processed_messages) => { - if !isConfigParameterSet("messages.skip_persistence").expect( - "Error on checking the `messages.skip_persistence` config parameter", - ){ - if let Err(err) = removeMessages( - &session_item.deviceID, - &processed_messages.message_id, - ) { - error!( - "Error removing messages from the database: {}", - err.what() - ); - }; - } - if let Err(err) = - deleteDeliveryBrokerQueueIfEmpty(&session_item.deviceID) - { - error!( - "Error deleting delivery broker queue when empty: {}", - err.what() - ); - } - } - } - } - } - if let Err(err) = updateSessionItemIsOnline(&session_id, false) { - error!( - "Error in updating the session online state in the database: {}", - err.what() - ); - } - }); - - let output_stream = ReceiverStream::new(rx); - Ok(Response::new( - Box::pin(output_stream) as Self::MessagesStreamStream - )) - } -} - -pub async fn run_grpc_server() -> Result<()> { - let addr = format!("[::1]:{}", constants::GRPC_SERVER_PORT).parse()?; - Server::builder() - .http2_keepalive_interval(Some(constants::GRPC_KEEP_ALIVE_PING_INTERVAL)) - .http2_keepalive_timeout(Some(constants::GRPC_KEEP_ALIVE_PING_TIMEOUT)) - .add_service(TunnelbrokerServiceServer::new( - TunnelbrokerServiceHandlers::default(), - )) - .serve(addr) - .await?; - Ok(()) -} diff --git a/services/tunnelbroker/old/server/tools.rs b/services/tunnelbroker/old/server/tools.rs deleted file mode 100644 index b29d2b92b..000000000 --- a/services/tunnelbroker/old/server/tools.rs +++ /dev/null @@ -1,43 +0,0 @@ -use crate::server::GRPCStatusCodes; -use openssl::pkey::PKey; -use openssl::sign::Verifier; -use openssl::{error::ErrorStack, hash::MessageDigest}; -use tonic::{Code, Status}; - -pub fn create_tonic_status(code: GRPCStatusCodes, text: &str) -> Status { - let status = match code { - GRPCStatusCodes::Ok => Code::Ok, - GRPCStatusCodes::Cancelled => Code::Cancelled, - GRPCStatusCodes::Unknown => Code::Unknown, - GRPCStatusCodes::InvalidArgument => Code::InvalidArgument, - GRPCStatusCodes::DeadlineExceeded => Code::DeadlineExceeded, - GRPCStatusCodes::NotFound => Code::NotFound, - GRPCStatusCodes::AlreadyExists => Code::AlreadyExists, - GRPCStatusCodes::PermissionDenied => Code::PermissionDenied, - GRPCStatusCodes::ResourceExhausted => Code::ResourceExhausted, - GRPCStatusCodes::FailedPrecondition => Code::FailedPrecondition, - GRPCStatusCodes::Aborted => Code::Aborted, - GRPCStatusCodes::OutOfRange => Code::OutOfRange, - GRPCStatusCodes::Unimplemented => Code::Unimplemented, - GRPCStatusCodes::Internal => Code::Internal, - GRPCStatusCodes::Unavailable => Code::Unavailable, - GRPCStatusCodes::DataLoss => Code::DataLoss, - GRPCStatusCodes::Unauthenticated => Code::Unauthenticated, - _ => Code::Internal, - }; - Status::new(status, text) -} - -pub fn verify_signed_string( - public_key_pem: &str, - string_to_be_signed: &str, - base64_signature: &str, -) -> Result { - let public_key = PKey::public_key_from_pem(public_key_pem.as_bytes())?; - let mut verifier = Verifier::new(MessageDigest::sha256(), &public_key)?; - verifier.update(string_to_be_signed.as_bytes()).unwrap(); - verifier.verify( - &base64::decode(base64_signature) - .expect("Error on decoding the signature from base64"), - ) -}