From 5fa34a3e3d4d667c76479d5f23849441aa63bf2c Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 23 Apr 2012 16:48:40 +0200 Subject: [PATCH] Funnel messages through the generic SendUnicastRequest method to take advantage of the centralised security features. --- icinga/endpointmanager.cpp | 29 ++++++++++++++++++----------- icinga/endpointmanager.h | 1 + icinga/subscriptioncomponent.cpp | 3 ++- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/icinga/endpointmanager.cpp b/icinga/endpointmanager.cpp index 1f6172eb2..6e499fed8 100644 --- a/icinga/endpointmanager.cpp +++ b/icinga/endpointmanager.cpp @@ -73,6 +73,23 @@ void EndpointManager::UnregisterEndpoint(Endpoint::Ptr endpoint) m_Endpoints.remove(endpoint); } +void EndpointManager::SendUnicastRequest(Endpoint::Ptr sender, Endpoint::Ptr recipient, const JsonRpcRequest& request, bool fromLocal) +{ + if (sender == recipient) + return; + + /* don't forward messages between non-local endpoints */ + if (!fromLocal && !recipient->IsLocal()) + return; + + string method; + if (!request.GetMethod(&method)) + throw InvalidArgumentException("Missing 'method' parameter."); + + if (recipient->IsMethodSink(method) && recipient->IsAllowedMethodSink(method)) + recipient->ProcessRequest(sender, request); +} + void EndpointManager::SendAnycastRequest(Endpoint::Ptr sender, const JsonRpcRequest& request, bool fromLocal) { throw NotImplementedException(); @@ -92,17 +109,7 @@ void EndpointManager::SendMulticastRequest(Endpoint::Ptr sender, const JsonRpcRe for (list::iterator i = m_Endpoints.begin(); i != m_Endpoints.end(); i++) { - Endpoint::Ptr endpoint = *i; - - if (endpoint == sender) - continue; - - /* send non-local messages to just the local endpoints */ - if (!fromLocal && !endpoint->IsLocal()) - continue; - - if (endpoint->IsMethodSink(method) && endpoint->IsAllowedMethodSink(method)) - endpoint->ProcessRequest(sender, request); + SendUnicastRequest(sender, *i, request, fromLocal); } } diff --git a/icinga/endpointmanager.h b/icinga/endpointmanager.h index e125dc94d..34815d735 100644 --- a/icinga/endpointmanager.h +++ b/icinga/endpointmanager.h @@ -36,6 +36,7 @@ public: void RegisterEndpoint(Endpoint::Ptr endpoint); void UnregisterEndpoint(Endpoint::Ptr endpoint); + void SendUnicastRequest(Endpoint::Ptr sender, Endpoint::Ptr recipient, const JsonRpcRequest& request, bool fromLocal = true); void SendAnycastRequest(Endpoint::Ptr sender, const JsonRpcRequest& request, bool fromLocal = true); void SendMulticastRequest(Endpoint::Ptr sender, const JsonRpcRequest& request, bool fromLocal = true); diff --git a/icinga/subscriptioncomponent.cpp b/icinga/subscriptioncomponent.cpp index 6af4bffbd..60fc67748 100644 --- a/icinga/subscriptioncomponent.cpp +++ b/icinga/subscriptioncomponent.cpp @@ -46,7 +46,8 @@ int SubscriptionComponent::SyncSubscription(Endpoint::Ptr target, string type, c subscriptionMessage.SetMethod(nmea.Method); request.SetParams(subscriptionMessage); - target->ProcessRequest(m_SubscriptionEndpoint, request); + EndpointManager::Ptr endpointManager = GetIcingaApplication()->GetEndpointManager(); + endpointManager->SendUnicastRequest(m_SubscriptionEndpoint, target, request); return 0; } -- 2.40.0