typedef std::function<bool(const Connection& connection)> ConnectionCallback;
typedef std::function<bool(const Credentials& cred, const std::string& privilege)> PrivilegeChecker;
+typedef std::function<void(const Credentials& cred, const std::string& method, int condition)> AuditTrail;
class Service {
public:
void start(bool useGMainloop = false);
void stop();
+ void setAuditTrail(const AuditTrail& trail);
void setPrivilegeChecker(const PrivilegeChecker& checker);
void setNewConnectionCallback(const ConnectionCallback& callback);
void setCloseConnectionCallback(const ConnectionCallback& callback);
CallbackDispatcher onNewConnection;
CallbackDispatcher onCloseConnection;
- PrivilegeChecker onMethodCall;
+ PrivilegeChecker onPrivilegeCheck;
+ AuditTrail onAuditTrail;
MethodRegistry methodRegistry;
NotificationRegistry notificationRegistry;
setNewConnectionCallback(nullptr);
setCloseConnectionCallback(nullptr);
- onMethodCall = [](const Credentials& cred, const std::string& privilege) {
+ onPrivilegeCheck = [](const Credentials& cred, const std::string& privilege) {
return true;
};
+
+ onAuditTrail = [](const Credentials& cred, const std::string& name, int condition) {
+ };
}
Service::~Service()
void Service::setPrivilegeChecker(const PrivilegeChecker& checker)
{
- onMethodCall = std::move(checker);
+ onPrivilegeCheck = std::move(checker);
+}
+
+void Service::setAuditTrail(const AuditTrail& trail)
+{
+ onAuditTrail = std::move(trail);
}
void Service::setNewConnectionCallback(const ConnectionCallback& connectionCallback)
std::shared_ptr<MethodContext> methodContext = methodRegistry.at(request.target());
processingContext = ProcessingContext(connection);
- if (onMethodCall(processingContext.credentials, methodContext->privilege) != true) {
+ bool allowed = onPrivilegeCheck(processingContext.credentials, methodContext->privilege);
+ onAuditTrail(processingContext.credentials, request.target(), allowed);
+ if (!allowed) {
throw runtime::Exception("Permission denied");
}
#include <klay/testbench.h>
+namespace {
+
const std::string IPC_TEST_ADDRESS = "/tmp/.dpm-test";
+void AuditTrail(const rmi::Credentials& cred, const std::string& method, int condition)
+{
+ std::cout << "AuditTrail pid: " << cred.pid << " method: " << method << std::endl;
+}
+
+};
+
class TestServer {
public:
TestServer()
service->expose(this, "", (int)(TestServer::sendSignal)());
service->expose(this, "", (int)(TestServer::sendPolicyChangeNotification)());
+ service->setAuditTrail(AuditTrail);
+
service->createNotification("TestPolicyChanged");
service->createNotification("TestSignal");
}