const std::string clientSocketPath("/run/cynara/cynara.socket");
Logic::Logic() {
- m_cache = std::make_shared<CapacityCache>(
- std::make_shared<PolicyGetter>(
- std::make_shared<SocketClient>(clientSocketPath,
- std::make_shared<ProtocolClient>())));
+ m_socket = std::make_shared<SocketClient>(clientSocketPath, std::make_shared<ProtocolClient>());
+ m_cache = std::make_shared<CapacityCache>(std::make_shared<PolicyGetter>(m_socket));
auto naiveInterpreter = std::make_shared<NaiveInterpreter>();
m_cache->registerPlugin(PredefinedPolicyType::ALLOW, naiveInterpreter);
m_cache->registerPlugin(PredefinedPolicyType::DENY, naiveInterpreter);
{
PolicyKey key(client, user, privilege);
+ if (!m_socket->isConnected())
+ onDisconnected();
+
auto ret = m_cache->get(session, key);
if (ret == CYNARA_API_SERVICE_NOT_AVAILABLE)
onDisconnected();
#include <string>
+#include <sockets/SocketClient.h>
+
#include <api/ApiInterface.h>
#include <cache/CacheInterface.h>
class Logic : public ApiInterface {
private:
PluginCachePtr m_cache;
+ SocketClientPtr m_socket;
void onDisconnected(void);
return true;
}
-bool Socket::receiveFromServer(BinaryQueue &queue)
+bool Socket::waitAndReceiveFromServer(BinaryQueue &queue)
{
if (!waitForSocket(POLLIN)) {
LOGE("Error in poll(POLLIN)");
return true;
}
+bool Socket::receiveFromServer(BinaryQueue &queue)
+{
+ RawBuffer readBuffer(BUFSIZ);
+ ssize_t size = TEMP_FAILURE_RETRY(read(m_sock, readBuffer.data(), BUFSIZ));
+
+ if (size == -1) {
+ int err = errno;
+ if (err == EAGAIN) {
+ LOGD("is connected, but no data available");
+ return true;
+ }
+ LOGE("'read' function error [%d] : <%s>", err, strerror(err));
+ throw UnexpectedErrorException(err, strerror(err));
+ }
+
+ if (size == 0) {
+ LOGW("read return 0 / Connection closed by server.");
+ return false;
+ }
+ queue.appendCopy(readBuffer.data(), size);
+
+ return true;
+}
+
} // namespace Cynara
//returns false if connection was lost
//throws ServerConnectionErrorException if cannot connect server (or timeout)
//throws other exceptions in critical situations
+ bool waitAndReceiveFromServer(BinaryQueue &queue);
+
+ //returns true if data was successfully read from server
+ //returns false if connection was lost
+ //throws other exceptions in critical situations
bool receiveFromServer(BinaryQueue &queue);
};
// receive response from cynara
while (true) {
- if (!m_socket.receiveFromServer(m_readQueue)) {
+ if (!m_socket.waitAndReceiveFromServer(m_readQueue)) {
LOGW("Error receiving response from Cynara. Service not available.");
return nullptr;
}
}
}
+bool SocketClient::isConnected(void) {
+ return m_socket.isConnected() && m_socket.receiveFromServer(m_readQueue);
+}
+
} // namespace Cynara
//returns pointer to response
// or nullptr when connection to cynara service is lost
ResponsePtr askCynaraServer(RequestPtr request);
+
+ bool isConnected(void);
};
} // namespace Cynara