${SERVER_PATH}/main/generic-socket-manager.cpp
${SERVER_PATH}/main/socket-manager.cpp
${SERVER_PATH}/main/server-main.cpp
+ ${SERVER_PATH}/service/base-service.cpp
${SERVER_PATH}/service/service.cpp
)
--- /dev/null
+/*
+ * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Contact: Rafal Krypa <r.krypa@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+/*
+ * @file base-service.cpp
+ * @author Lukasz Kostyra <l.kostyra@samsung.com>
+ * @author Rafal Krypa <r.krypa@samsung.com>
+ * @brief Implementation of security-manager base service.
+ */
+
+#include <cstring>
+#include <unordered_set>
+
+#include <dpl/log/log.h>
+
+#include "base-service.h"
+
+namespace SecurityManager {
+
+BaseService::BaseService()
+{
+}
+
+void BaseService::accept(const AcceptEvent &event)
+{
+ LogDebug("Accept event. ConnectionID.sock: " << event.connectionID.sock <<
+ " ConnectionID.counter: " << event.connectionID.counter <<
+ " ServiceID: " << event.interfaceID);
+
+ auto &info = m_connectionInfoMap[event.connectionID.counter];
+ info.interfaceID = event.interfaceID;
+}
+
+void BaseService::write(const WriteEvent &event)
+{
+ LogDebug("WriteEvent. ConnectionID: " << event.connectionID.sock <<
+ " Size: " << event.size <<
+ " Left: " << event.left);
+
+ if (event.left == 0)
+ m_serviceManager->Close(event.connectionID);
+}
+
+void BaseService::process(const ReadEvent &event)
+{
+ LogDebug("Read event for counter: " << event.connectionID.counter);
+ auto &info = m_connectionInfoMap[event.connectionID.counter];
+ info.buffer.Push(event.rawBuffer);
+
+ // We can get several requests in one package.
+ // Extract and process them all
+ while (processOne(event.connectionID, info.buffer, info.interfaceID));
+}
+
+void BaseService::close(const CloseEvent &event)
+{
+ LogDebug("CloseEvent. ConnectionID: " << event.connectionID.sock);
+ m_connectionInfoMap.erase(event.connectionID.counter);
+}
+
+} // namespace SecurityManager
--- /dev/null
+/*
+ * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Contact: Rafal Krypa <r.krypa@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+/*
+ * @file base-service.h
+ * @author Lukasz Kostyra <l.kostyra@samsung.com>
+ * @author Rafal Krypa <r.krypa@samsung.com>
+ * @brief Implementation of security-manager base service
+ */
+
+#ifndef _SECURITY_MANAGER_BASE_SERVICE_
+#define _SECURITY_MANAGER_BASE_SERVICE_
+
+#include <service-thread.h>
+#include <generic-socket-manager.h>
+#include <message-buffer.h>
+#include <connection-info.h>
+
+namespace SecurityManager {
+
+class BaseServiceException
+{
+public:
+ DECLARE_EXCEPTION_TYPE(SecurityManager::Exception, Base)
+ DECLARE_EXCEPTION_TYPE(Base, InvalidAction)
+};
+
+class BaseService :
+ public SecurityManager::GenericSocketService,
+ public SecurityManager::ServiceThread<BaseService>
+{
+public:
+ BaseService();
+ virtual ServiceDescriptionVector GetServiceDescription() = 0;
+
+ DECLARE_THREAD_EVENT(AcceptEvent, accept)
+ DECLARE_THREAD_EVENT(WriteEvent, write)
+ DECLARE_THREAD_EVENT(ReadEvent, process)
+ DECLARE_THREAD_EVENT(CloseEvent, close)
+
+ void accept(const AcceptEvent &event);
+ void write(const WriteEvent &event);
+ void process(const ReadEvent &event);
+ void close(const CloseEvent &event);
+
+protected:
+ ConnectionInfoMap m_connectionInfoMap;
+
+ /**
+ * Handle request from a client
+ *
+ * @param conn Socket connection information
+ * @param buffer Raw received data buffer
+ * @param interfaceID identifier used to distinguish source socket
+ * @return true on success
+ */
+ virtual bool processOne(const ConnectionID &conn,
+ MessageBuffer &buffer,
+ InterfaceID interfaceID) = 0;
+};
+
+} // namespace SecurityManager
+
+#endif // _SECURITY_MANAGER_BASE_SERVICE_
#ifndef _SECURITY_MANAGER_SERVICE_
#define _SECURITY_MANAGER_SERVICE_
-#include <service-thread.h>
-#include <generic-socket-manager.h>
-#include <message-buffer.h>
-#include <connection-info.h>
+#include "base-service.h"
namespace SecurityManager {
};
class Service :
- public SecurityManager::GenericSocketService,
- public SecurityManager::ServiceThread<Service>
+ public SecurityManager::BaseService
{
public:
Service();
ServiceDescriptionVector GetServiceDescription();
- DECLARE_THREAD_EVENT(AcceptEvent, accept)
- DECLARE_THREAD_EVENT(WriteEvent, write)
- DECLARE_THREAD_EVENT(ReadEvent, process)
- DECLARE_THREAD_EVENT(CloseEvent, close)
-
- void accept(const AcceptEvent &event);
- void write(const WriteEvent &event);
- void process(const ReadEvent &event);
- void close(const CloseEvent &event);
-
private:
- ConnectionInfoMap m_connectionInfoMap;
-
/**
* Handle request from a client
*
};
}
-void Service::accept(const AcceptEvent &event)
-{
- LogDebug("Accept event. ConnectionID.sock: " << event.connectionID.sock <<
- " ConnectionID.counter: " << event.connectionID.counter <<
- " ServiceID: " << event.interfaceID);
-
- auto &info = m_connectionInfoMap[event.connectionID.counter];
- info.interfaceID = event.interfaceID;
-}
-
-void Service::write(const WriteEvent &event)
-{
- LogDebug("WriteEvent. ConnectionID: " << event.connectionID.sock <<
- " Size: " << event.size <<
- " Left: " << event.left);
-
- if (event.left == 0)
- m_serviceManager->Close(event.connectionID);
-}
-
-void Service::process(const ReadEvent &event)
-{
- LogDebug("Read event for counter: " << event.connectionID.counter);
- auto &info = m_connectionInfoMap[event.connectionID.counter];
- info.buffer.Push(event.rawBuffer);
-
- // We can get several requests in one package.
- // Extract and process them all
- while (processOne(event.connectionID, info.buffer, info.interfaceID));
-}
-
-void Service::close(const CloseEvent &event)
-{
- LogDebug("CloseEvent. ConnectionID: " << event.connectionID.sock);
- m_connectionInfoMap.erase(event.connectionID.counter);
-}
-
static bool getPeerID(int sock, uid_t &uid, pid_t &pid) {
struct ucred cr;
socklen_t len = sizeof(cr);
uid_t uid;
pid_t pid;
- if(!getPeerID(conn.sock, uid, pid)) {
+ if (!getPeerID(conn.sock, uid, pid)) {
LogError("Closing socket because of error: unable to get peer's uid and pid");
m_serviceManager->Close(conn);
return false;
LogError("Broken protocol.");
} Catch (ServiceException::Base) {
LogError("Broken protocol.");
- } catch (std::exception &e) {
+ } catch (const std::exception &e) {
LogError("STD exception " << e.what());
} catch (...) {
LogError("Unknown exception");