#include <cinttypes>
#include <memory>
+#include <utility>
#include <cynara-error.h>
#include <common.h>
namespace Cynara {
-OnlineLogic::OnlineLogic() {
- m_socketClient = std::make_shared<SocketClient>(PathConfig::SocketPath::admin,
- std::make_shared<ProtocolAdmin>());
+OnlineLogic::OnlineLogic() : m_socketClient(PathConfig::SocketPath::admin,
+ std::make_shared<ProtocolAdmin>()) {
}
ProtocolFrameSequenceNumber generateSequenceNumber(void) {
}
bool OnlineLogic::ensureConnection(void) {
- return m_socketClient->isConnected() || m_socketClient->connect();
+ return m_socketClient.isConnected() || m_socketClient.connect();
}
template<typename Req, typename Res, typename... ReqArgs>
-int OnlineLogic::getResponse(std::shared_ptr<Res> &retResponse, ReqArgs... args) {
+int OnlineLogic::getResponse(std::shared_ptr<Res> &retResponse, ReqArgs&&... args) {
if (!ensureConnection()) {
LOGE("Cannot connect to cynara. Service not available.");
return CYNARA_API_SERVICE_NOT_AVAILABLE;
ProtocolFrameSequenceNumber sequenceNumber = generateSequenceNumber();
- RequestPtr request = std::make_shared<Req>(args..., sequenceNumber);
+ Req request(std::forward<ReqArgs>(args)..., sequenceNumber);
ResponsePtr response;
- while (!(response = m_socketClient->askCynaraServer(request))) {
- if (!m_socketClient->connect())
+ while (!(response = m_socketClient.askCynaraServer(request))) {
+ if (!m_socketClient.connect())
return CYNARA_API_SERVICE_NOT_AVAILABLE;
}
/*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
class OnlineLogic : public ApiInterface {
private:
- SocketClientPtr m_socketClient;
+ SocketClient m_socketClient;
bool ensureConnection(void);
template<typename Req, typename Res, typename... ReqArgs>
- int getResponse(std::shared_ptr<Res> &retResponse, ReqArgs... args);
+ int getResponse(std::shared_ptr<Res> &retResponse, ReqArgs&&... args);
public:
OnlineLogic();
namespace Cynara {
-Logic::Logic(const AgentType &agentType) : m_agentType(agentType), m_registered(false) {
- m_agentSocket = std::make_shared<AgentSocketClient>(PathConfig::SocketPath::agent,
- std::make_shared<ProtocolAgent>());
+Logic::Logic(const AgentType &agentType) : m_agentType(agentType),
+ m_socketClient(PathConfig::SocketPath::agent, std::make_shared<ProtocolAgent>()),
+ m_registered(false) {
m_responseTakerPtr = std::make_shared<ProtocolAgent>();
m_responseBuffer = std::make_shared<BinaryQueue>();
}
//Ask cynara service
AgentRegisterResponsePtr registerResponsePtr;
- RequestPtr request = std::make_shared<AgentRegisterRequest>(m_agentType, sequenceNumber);
- ResponsePtr response = m_agentSocket->askCynaraServer(request);
+ AgentRegisterRequest request(m_agentType, sequenceNumber);
+ ResponsePtr response = m_socketClient.askCynaraServer(request);
if (!response) {
LOGW("Disconnected by cynara server.");
return CYNARA_API_SERVICE_NOT_AVAILABLE;
}
int Logic::ensureConnection(void) {
- switch (m_agentSocket->connect()) {
+ switch (m_socketClient.connect()) {
case SS_CONNECTED:
return CYNARA_API_SUCCESS;
case SS_RECONNECTED:
if (ret != CYNARA_API_SUCCESS)
return ret;
- ResponsePtr responsePtr = m_agentSocket->receiveResponseFromServer();
+ ResponsePtr responsePtr = m_socketClient.receiveResponseFromServer();
if (!responsePtr) {
LOGW("Disconnected by cynara server.");
return CYNARA_API_SERVICE_NOT_AVAILABLE;
int Logic::putResponse(const AgentResponseType responseType,
const ProtocolFrameSequenceNumber sequenceNumber,
const RawBuffer &pluginData) {
- if (!m_agentSocket->isConnected()) {
+ if (!m_socketClient.isConnected()) {
LOGE("Agent not connected to cynara service.");
return CYNARA_API_SERVICE_NOT_AVAILABLE;
}
m_responseBuffer->clear();
RequestContext context(ResponseTakerPtr(), m_responseBuffer);
request.execute(*m_responseTakerPtr, context);
- return m_agentSocket->sendDataToServer(*m_responseBuffer) ? CYNARA_API_SUCCESS :
+ return m_socketClient.sendDataToServer(*m_responseBuffer) ? CYNARA_API_SUCCESS :
CYNARA_API_SERVICE_NOT_AVAILABLE;
}
private:
AgentType m_agentType;
- AgentSocketPtr m_agentSocket;
+ AgentSocketClient m_socketClient;
bool m_registered;
RequestTakerPtr m_responseTakerPtr;
BinaryQueuePtr m_responseBuffer;
m_readQueue = std::make_shared<BinaryQueue>();
}
-ResponsePtr AgentSocketClient::askCynaraServer(RequestPtr request) {
+ResponsePtr AgentSocketClient::askCynaraServer(const Request &request) {
//pass request to protocol
RequestContext context(ResponseTakerPtr(), m_writeQueue);
- request->execute(*m_protocol, context);
+ request.execute(*m_protocol, context);
//send request to cynara
if (!sendDataToServer(*m_writeQueue)) {
/*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
ResponsePtr receiveResponseFromServer(void);
bool sendDataToServer(BinaryQueue &data);
- ResponsePtr askCynaraServer(RequestPtr request);
+ ResponsePtr askCynaraServer(const Request &request);
private:
Socket m_socket;
namespace Cynara {
Logic::Logic(cynara_status_callback callback, void *userStatusData, const Configuration &conf)
- : m_statusCallback(callback, userStatusData),
+ : m_statusCallback(callback, userStatusData), m_cache(conf.getCacheSize()),
+ m_socketClient(PathConfig::SocketPath::client, std::make_shared<ProtocolClient>()),
m_operationPermitted(true), m_inAnswerCancelResponseCallback(false) {
- m_socketClient = std::make_shared<SocketClientAsync>(
- PathConfig::SocketPath::client, std::make_shared<ProtocolClient>());
-
- m_cache = std::make_shared<CapacityCache>(conf.getCacheSize());
auto naiveInterpreter = std::make_shared<NaiveInterpreter>();
for (auto &descr : naiveInterpreter->getSupportedPolicyDescr()) {
- m_cache->registerPlugin(descr, naiveInterpreter);
+ m_cache.registerPlugin(descr, naiveInterpreter);
}
}
if (!checkCacheValid())
return CYNARA_API_CACHE_MISS;
- return m_cache->get(session, PolicyKey(client, user, privilege));
+ return m_cache.get(session, PolicyKey(client, user, privilege));
}
int Logic::createCheckRequest(const std::string &client, const std::string &session,
m_checks.insert(CheckPair(sequenceNumber, CheckData(key, session, responseCallback,
simple)));
if (simple)
- m_socketClient->appendRequest(std::make_shared<SimpleCheckRequest>(key, sequenceNumber));
+ m_socketClient.appendRequest(SimpleCheckRequest(key, sequenceNumber));
else
- m_socketClient->appendRequest(std::make_shared<CheckRequest>(key, sequenceNumber));
+ m_socketClient.appendRequest(CheckRequest(key, sequenceNumber));
- onStatusChange(m_socketClient->getSockFd(), cynara_async_status::CYNARA_STATUS_FOR_RW);
+ onStatusChange(m_socketClient.getSockFd(), cynara_async_status::CYNARA_STATUS_FOR_RW);
checkId = static_cast<cynara_check_id>(sequenceNumber);
return CYNARA_API_SUCCESS;
if (it == m_checks.end() || it->second.cancelled())
return CYNARA_API_INVALID_PARAM;
- m_socketClient->appendRequest(std::make_shared<CancelRequest>(it->first));
+ m_socketClient.appendRequest(CancelRequest(it->first));
it->second.cancel();
it->second.callback().onCancel(it->first);
m_inAnswerCancelResponseCallback = onAnswerCancel;
- onStatusChange(m_socketClient->getSockFd(), cynara_async_status::CYNARA_STATUS_FOR_RW);
+ onStatusChange(m_socketClient.getSockFd(), cynara_async_status::CYNARA_STATUS_FOR_RW);
return CYNARA_API_SUCCESS;
}
}
bool Logic::checkCacheValid(void) {
- return m_socketClient->isConnected();
+ return m_socketClient.isConnected();
}
void Logic::prepareRequestsToSend(void) {
it = m_checks.erase(it);
} else {
if (it->second.isSimple())
- m_socketClient->appendRequest(std::make_shared<SimpleCheckRequest>(it->second.key(),
- it->first));
+ m_socketClient.appendRequest(SimpleCheckRequest(it->second.key(), it->first));
else
- m_socketClient->appendRequest(std::make_shared<CheckRequest>(it->second.key(),
- it->first));
+ m_socketClient.appendRequest(CheckRequest(it->second.key(), it->first));
++it;
}
}
}
bool Logic::processOut(void) {
- switch (m_socketClient->sendToCynara()) {
+ switch (m_socketClient.sendToCynara()) {
case Socket::SendStatus::ALL_DATA_SENT:
- onStatusChange(m_socketClient->getSockFd(),
+ onStatusChange(m_socketClient.getSockFd(),
cynara_async_status::CYNARA_STATUS_FOR_READ);
case Socket::SendStatus::PARTIAL_DATA_SENT:
return true;
}
}
-Logic::CheckMap::iterator Logic::checkResponseValid(ResponsePtr response) {
- auto it = m_checks.find(response->sequenceNumber());
+Logic::CheckMap::iterator Logic::checkResponseValid(const Response &response) {
+ auto it = m_checks.find(response.sequenceNumber());
if (it == m_checks.end()) {
LOGC("Critical error. Unknown checkResponse received: sequenceNumber = [%" PRIu16 "]",
- response->sequenceNumber());
+ response.sequenceNumber());
throw UnexpectedErrorException("Unexpected response from cynara service");
}
return it;
m_checks.erase(reqIt);
}
-void Logic::processCheckResponse(CheckResponsePtr checkResponse) {
+void Logic::processCheckResponse(const CheckResponse &checkResponse) {
LOGD("checkResponse: policyType = [%" PRIu16 "], metadata = <%s>",
- checkResponse->m_resultRef.policyType(),
- checkResponse->m_resultRef.metadata().c_str());
+ checkResponse.m_resultRef.policyType(),
+ checkResponse.m_resultRef.metadata().c_str());
auto it = checkResponseValid(checkResponse);
- int result = m_cache->update(it->second.session(), it->second.key(),
- checkResponse->m_resultRef);
+ int result = m_cache.update(it->second.session(), it->second.key(),
+ checkResponse.m_resultRef);
CheckData checkData(std::move(it->second));
releaseRequest(it);
bool onAnswerCancel = m_inAnswerCancelResponseCallback;
m_inAnswerCancelResponseCallback = true;
checkData.callback().onAnswer(
- static_cast<cynara_check_id>(checkResponse->sequenceNumber()), result);
+ static_cast<cynara_check_id>(checkResponse.sequenceNumber()), result);
m_inAnswerCancelResponseCallback = onAnswerCancel;
}
}
-void Logic::processSimpleCheckResponse(SimpleCheckResponsePtr response) {
+void Logic::processSimpleCheckResponse(const SimpleCheckResponse &response) {
LOGD("simpleCheckResponse");
LOGD("checkResponse: policyType = [%" PRIu16 "], metadata = <%s>",
- response->getResult().policyType(),
- response->getResult().metadata().c_str());
+ response.getResult().policyType(),
+ response.getResult().metadata().c_str());
auto it = checkResponseValid(response);
- int result = response->getReturnValue();
+ int result = response.getReturnValue();
if (result == CYNARA_API_SUCCESS)
- result = m_cache->update(it->second.session(), it->second.key(),
- response->getResult());
+ result = m_cache.update(it->second.session(), it->second.key(),
+ response.getResult());
CheckData checkData(std::move(it->second));
releaseRequest(it);
bool onAnswerCancel = m_inAnswerCancelResponseCallback;
m_inAnswerCancelResponseCallback = true;
checkData.callback().onAnswer(
- static_cast<cynara_check_id>(response->sequenceNumber()), result);
+ static_cast<cynara_check_id>(response.sequenceNumber()), result);
m_inAnswerCancelResponseCallback = onAnswerCancel;
}
}
-void Logic::processCancelResponse(CancelResponsePtr cancelResponse) {
- LOGD("cancelResponse");
+void Logic::processCancelResponse(const CancelResponse &cancelResponse) {
auto it = checkResponseValid(cancelResponse);
if (!it->second.cancelled()) {
LOGC("Critical error. CancelRequest not sent: sequenceNumber = [%" PRIu16 "]",
- cancelResponse->sequenceNumber());
+ cancelResponse.sequenceNumber());
throw UnexpectedErrorException("Unexpected response from cynara service");
}
releaseRequest(it);
CheckResponsePtr checkResponse;
CancelResponsePtr cancelResponse;
SimpleCheckResponsePtr simpleResponse;
- while ((response = m_socketClient->getResponse())) {
+ while (response = m_socketClient.getResponse()) {
checkResponse = std::dynamic_pointer_cast<CheckResponse>(response);
if (checkResponse) {
- processCheckResponse(checkResponse);
+ processCheckResponse(*checkResponse);
continue;
}
cancelResponse = std::dynamic_pointer_cast<CancelResponse>(response);
if (cancelResponse) {
- processCancelResponse(cancelResponse);
+ processCancelResponse(*cancelResponse);
continue;
}
simpleResponse = std::dynamic_pointer_cast<SimpleCheckResponse>(response);
if (simpleResponse) {
- processSimpleCheckResponse(simpleResponse);
+ processSimpleCheckResponse(*simpleResponse);
continue;
}
}
bool Logic::processIn(void) {
- if (!m_socketClient->receiveFromCynara())
+ if (!m_socketClient.receiveFromCynara())
return false;
processResponses();
return true;
}
cynara_async_status Logic::socketDataStatus(void) {
- return m_socketClient->isDataToSend() ? cynara_async_status::CYNARA_STATUS_FOR_RW
+ return m_socketClient.isDataToSend() ? cynara_async_status::CYNARA_STATUS_FOR_RW
: cynara_async_status::CYNARA_STATUS_FOR_READ;
}
bool Logic::ensureConnection(void) {
- if (m_socketClient->isConnected())
+ if (m_socketClient.isConnected())
return true;
onDisconnected();
}
bool Logic::connect(void) {
- switch (m_socketClient->connect()) {
+ switch (m_socketClient.connect()) {
case Socket::ConnectionStatus::CONNECTION_SUCCEEDED:
prepareRequestsToSend();
- onStatusChange(m_socketClient->getSockFd(), socketDataStatus());
+ onStatusChange(m_socketClient.getSockFd(), socketDataStatus());
return true;
case Socket::ConnectionStatus::CONNECTION_IN_PROGRESS:
prepareRequestsToSend();
- onStatusChange(m_socketClient->getSockFd(), cynara_async_status::CYNARA_STATUS_FOR_RW);
+ onStatusChange(m_socketClient.getSockFd(), cynara_async_status::CYNARA_STATUS_FOR_RW);
return true;
default:
onServiceNotAvailable();
}
int Logic::completeConnection(bool &completed) {
- switch (m_socketClient->completeConnection()) {
+ switch (m_socketClient.completeConnection()) {
case Socket::ConnectionStatus::ALREADY_CONNECTED:
completed = true;
return CYNARA_API_SUCCESS;
case Socket::ConnectionStatus::CONNECTION_SUCCEEDED:
- onStatusChange(m_socketClient->getSockFd(), socketDataStatus());
+ onStatusChange(m_socketClient.getSockFd(), socketDataStatus());
completed = true;
return CYNARA_API_SUCCESS;
case Socket::ConnectionStatus::CONNECTION_IN_PROGRESS:
void Logic::onDisconnected(void) {
m_operationPermitted = false;
- m_cache->clear();
+ m_cache.clear();
m_statusCallback.onDisconnected();
m_operationPermitted = true;
}
#include <types/ProtocolFields.h>
#include <api/ApiInterface.h>
+#include <cache/CapacityCache.h>
#include <callback/StatusCallback.h>
#include <check/CheckData.h>
#include <cynara-client-async.h>
typedef std::pair<ProtocolFrameSequenceNumber, CheckData> CheckPair;
StatusCallback m_statusCallback;
- PluginCachePtr m_cache;
- SocketClientAsyncPtr m_socketClient;
+ CapacityCache m_cache;
+ SocketClientAsync m_socketClient;
CheckMap m_checks;
SequenceContainer m_sequenceContainer;
bool m_operationPermitted;
void prepareRequestsToSend(void);
cynara_async_status socketDataStatus(void);
bool processOut(void);
- CheckMap::iterator checkResponseValid(ResponsePtr response);
- void releaseRequest(Logic::CheckMap::iterator reqIt);
- void processCheckResponse(CheckResponsePtr checkResponse);
- void processCancelResponse(CancelResponsePtr cancelResponse);
- void processSimpleCheckResponse(SimpleCheckResponsePtr response);
+ CheckMap::iterator checkResponseValid(const Response &response);
+ void releaseRequest(CheckMap::iterator reqIt);
+ void processCheckResponse(const CheckResponse &checkResponse);
+ void processCancelResponse(const CancelResponse &cancelResponse);
+ void processSimpleCheckResponse(const SimpleCheckResponse &response);
void processResponses(void);
bool processIn(void);
bool ensureConnection(void);
return m_socket.isConnected();
}
-void SocketClientAsync::appendRequest(RequestPtr request) {
+void SocketClientAsync::appendRequest(const Request &request) {
RequestContext context(ResponseTakerPtr(), m_writeQueue);
- request->execute(*m_protocol, context);
+ request.execute(*m_protocol, context);
}
bool SocketClientAsync::isDataToSend(void) {
Socket::ConnectionStatus completeConnection(void);
int getSockFd(void);
bool isConnected(void);
- void appendRequest(RequestPtr request);
+ void appendRequest(const Request &request);
bool isDataToSend(void);
Socket::SendStatus sendToCynara(void);
bool receiveFromCynara(void);
return ++sequenceNumber;
}
-Logic::Logic(const Configuration &conf) {
- m_socket = std::make_shared<SocketClient>(PathConfig::SocketPath::client,
- std::make_shared<ProtocolClient>());
- m_cache = std::make_shared<CapacityCache>(conf.getCacheSize());
+Logic::Logic(const Configuration &conf) :
+ m_socketClient(PathConfig::SocketPath::client, std::make_shared<ProtocolClient>()),
+ m_cache(conf.getCacheSize()) {
auto naiveInterpreter = std::make_shared<NaiveInterpreter>();
for (auto &descr : naiveInterpreter->getSupportedPolicyDescr()) {
- m_cache->registerPlugin(descr, naiveInterpreter);
+ m_cache.registerPlugin(descr, naiveInterpreter);
}
}
return CYNARA_API_SERVICE_NOT_AVAILABLE;
PolicyKey key(client, user, privilege);
- int ret = m_cache->get(session, key);
+ int ret = m_cache.get(session, key);
if (ret != CYNARA_API_CACHE_MISS) {
return ret;
}
return ret;
}
- return m_cache->update(session, key, result);
+ return m_cache.update(session, key, result);
}
int Logic::simpleCheck(const std::string &client, const ClientSession &session,
return CYNARA_API_SERVICE_NOT_AVAILABLE;
PolicyKey key(client, user, privilege);
- int ret = m_cache->get(session, key);
+ int ret = m_cache.get(session, key);
if (ret != CYNARA_API_CACHE_MISS) {
return ret;
}
return ret;
}
- return m_cache->update(session, key, result);
+ return m_cache.update(session, key, result);
}
bool Logic::ensureConnection(void) {
- if (m_socket->isConnected())
+ if (m_socketClient.isConnected())
return true;
onDisconnected();
- if (m_socket->connect())
+ if (m_socketClient.connect())
return true;
LOGW("Cannot connect to cynara. Service not available.");
return false;
//Ask cynara service
std::shared_ptr<Res> reqResponse;
- RequestPtr request = std::make_shared<Req>(key, sequenceNumber);
+ Req request(key, sequenceNumber);
ResponsePtr response;
- while (!(response = m_socket->askCynaraServer(request))) {
+ while (!(response = m_socketClient.askCynaraServer(request))) {
onDisconnected();
- if (!m_socket->connect())
+ if (!m_socketClient.connect())
return nullptr;
}
}
void Logic::onDisconnected(void) {
- m_cache->clear();
+ m_cache.clear();
}
} // namespace Cynara
#include <configuration/Configuration.h>
#include <api/ApiInterface.h>
-#include <cache/CacheInterface.h>
+#include <cache/CapacityCache.h>
namespace Cynara {
virtual int simpleCheck(const std::string &client, const ClientSession &session,
const std::string &user, const std::string &privilege);
private:
- SocketClientPtr m_socket;
- PluginCachePtr m_cache;
+ SocketClient m_socketClient;
+ CapacityCache m_cache;
void onDisconnected(void);
bool ensureConnection(void);
* @brief This file contains implementation of cynara's socket client
*/
-#include <memory>
-#include <string>
-
#include <log/log.h>
-#include <protocol/Protocol.h>
-#include <request/pointers.h>
#include <request/Request.h>
#include <request/RequestContext.h>
-#include <response/pointers.h>
#include <sockets/Socket.h>
#include "SocketClient.h"
return m_socket.isConnected();
}
-ResponsePtr SocketClient::askCynaraServer(RequestPtr request) {
+ResponsePtr SocketClient::askCynaraServer(const Request &request) {
//pass request to protocol
RequestContext context(ResponseTakerPtr(), m_writeQueue);
- request->execute(*m_protocol, context);
+ request.execute(*m_protocol, context);
//send request to cynara
if (m_socket.sendToServer(*m_writeQueue) == Socket::SendStatus::CONNECTION_LOST) {
#define SRC_COMMON_SOCKETS_SOCKETCLIENT_H_
#include <memory>
+#include <string>
#include <containers/BinaryQueue.h>
#include <protocol/Protocol.h>
#include <request/pointers.h>
#include <response/pointers.h>
-#include <response/ResponseTaker.h>
#include <sockets/Socket.h>
namespace Cynara {
//returns pointer to response
// or nullptr when connection to cynara service is lost
- ResponsePtr askCynaraServer(RequestPtr request);
+ ResponsePtr askCynaraServer(const Request &request);
};
} // namespace Cynara