namespace Cynara {
int CapacityCache::get(const ClientSession &session, const PolicyKey &key) {
- //This can be very time heavy. This part is welcomed to be optimized.
- if (session != m_session) {
- LOGD("Session changed from %s to %s.", m_session.c_str(), session.c_str());
- clear();
- m_session = session;
- return CYNARA_API_CACHE_MISS;
- }
auto resultIt = m_keyValue.find(keyToString(key));
//Do we have entry in cache?
if (resultIt == m_keyValue.end()) {
key.user().toString().c_str(),
key.privilege().toString().c_str());
- auto pluginIt = m_plugins.find(resultIt->second.first.policyType());
+ auto &cachedValue = resultIt->second;
+ auto &policyResult = std::get<0>(cachedValue);
+
+ auto pluginIt = m_plugins.find(policyResult.policyType());
if (pluginIt == m_plugins.end()) {
LOGE("No plugin registered for given PolicyType : %" PRIu16,
- resultIt->second.first.policyType());
+ policyResult.policyType());
return CYNARA_API_ACCESS_DENIED;
}
//Is it still usable?
InterpreterInterfacePtr plugin = pluginIt->second;
- if (plugin->isUsable(resultIt->second.first)) {
+ auto &prevSession = std::get<1>(cachedValue);
+ auto usageIt = std::get<2>(cachedValue);
+ bool updateSession = false;
+ if (plugin->isUsable(session, prevSession, updateSession, policyResult)) {
LOGD("Entry usable.");
- m_keyUsage.splice(m_keyUsage.begin(), m_keyUsage, resultIt->second.second);
- return plugin->toResult(resultIt->second.first);
+ m_keyUsage.splice(m_keyUsage.begin(), m_keyUsage, usageIt);
+
+ if (updateSession) {
+ prevSession = session;
+ }
+
+ return plugin->toResult(session, policyResult);
}
//Remove unusable entry
LOGD("Entry not usable");
- auto usageIt = resultIt->second.second;
m_keyUsage.erase(usageIt);
m_keyValue.erase(resultIt);
return CYNARA_API_CACHE_MISS;
void CapacityCache::clear(void) {
m_keyUsage.clear();
m_keyValue.clear();
- m_session.clear();
}
std::string CapacityCache::keyToString(const PolicyKey &key) {
int CapacityCache::update(const ClientSession &session,
const PolicyKey &key,
const PolicyResult &result) {
- //This can be very time heavy. This part is welcomed to be optimized.
- if (session != m_session) {
- LOGD("Session changed from %s to %s.", m_session.c_str(), session.c_str());
- clear();
- m_session = session;
- }
auto pluginIt = m_plugins.find(result.policyType());
}
auto plugin = pluginIt->second;
- if (m_capacity != 0) {
- if (plugin->isCacheable(result)) {
+ PolicyResult storedResult = result;
+
+ if (m_capacity > 0) {
+ if (plugin->isCacheable(session, storedResult)) {
LOGD("Entry cacheable");
if (m_keyValue.size() == m_capacity) {
LOGD("Capacity reached.");
evict();
}
- m_keyUsage.push_front(keyToString(key));
- m_keyValue[keyToString(key)] = std::make_pair(result, m_keyUsage.begin());
+ std::string cacheKey = keyToString(key);
+ m_keyUsage.push_front(cacheKey);
+ m_keyValue[cacheKey] = std::make_tuple(storedResult, session, m_keyUsage.begin());
}
}
- return plugin->toResult(result);
+ return plugin->toResult(session, storedResult);
}
} // namespace Cynara
namespace Cynara {
class NaiveInterpreter : public InterpreterInterface {
- bool isUsable(const PolicyResult &result UNUSED) {
+ bool isUsable(const ClientSession &session UNUSED, const ClientSession &prevSession UNUSED,
+ bool &updateSession UNUSED, PolicyResult &result UNUSED) {
return true;
}
- bool isCacheable(const PolicyResult &result UNUSED) {
+ bool isCacheable(const ClientSession &session UNUSED,
+ const PolicyResult &result UNUSED) {
return true;
}
- int toResult(const PolicyResult &result) {
+ int toResult(const ClientSession &session UNUSED, PolicyResult &result) {
if (result.policyType() == PredefinedPolicyType::ALLOW)
return CYNARA_API_ACCESS_ALLOWED;
else
#include <memory>
+#include <types/ClientSession.h>
#include <types/PolicyResult.h>
namespace Cynara {
class InterpreterInterface {
public:
- virtual bool isCacheable(const PolicyResult &result) = 0;
- virtual bool isUsable(const PolicyResult &result) = 0;
- virtual int toResult(const PolicyResult &result) = 0;
+ virtual bool isCacheable(const ClientSession &session, const PolicyResult &result) = 0;
+ virtual bool isUsable(const ClientSession &session, const ClientSession &prevSession,
+ bool &updateSession, PolicyResult &result) = 0;
+ virtual int toResult(const ClientSession &session, PolicyResult &result) = 0;
virtual ~InterpreterInterface() {};
};
-}
+} // namespace Cynara
#endif // SRC_CLIENT_COMMON_PLUGINS_PLUGININTERFACE_H_