From: Zofia Grzelewska Date: Thu, 19 Apr 2018 13:23:00 +0000 (+0200) Subject: Removed unused files X-Git-Tag: submit/tizen/20180425.043505~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F92%2F176492%2F1;p=platform%2Fcore%2Fsecurity%2Faskuser.git Removed unused files Agent code is not used not built anymore. This commit deletes it. Change-Id: I93d054707ced2622a9317a8e34620232a288e2a3 --- diff --git a/src/agent/CMakeLists.txt b/src/agent/CMakeLists.txt deleted file mode 100644 index 17f0dd7..0000000 --- a/src/agent/CMakeLists.txt +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright (c) 2014-2017 Samsung Electronics Co., Ltd All Rights Reserved -# -# 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 CMakeLists.txt -# @author Adam Malinowski -# - -PKG_CHECK_MODULES(AGENT_DEP - REQUIRED - cynara-agent - cynara-plugin - libsystemd - security-manager - pkgmgr-info - ) - -SET(ASKUSER_AGENT_PATH ${ASKUSER_PATH}/agent) - -SET(ASKUSER_SOURCES - ${ASKUSER_AGENT_PATH}/main/Agent.cpp - ${ASKUSER_AGENT_PATH}/main/CynaraTalker.cpp - ${ASKUSER_AGENT_PATH}/main/main.cpp - ${ASKUSER_AGENT_PATH}/main/PolicyUpdater.cpp - ${ASKUSER_AGENT_PATH}/main/Policy.cpp - ${ASKUSER_AGENT_PATH}/ui/NotificationBackend.cpp - ${ASKUSER_AGENT_PATH}/ui/FdNotifyObject.cpp - ) - -INCLUDE_DIRECTORIES( - ${ASKUSER_PATH}/common - ${AGENT_DEP_INCLUDE_DIRS} - ${ASKUSER_AGENT_PATH} - ) - -ADD_DEFINITIONS("-fPIE") -ADD_EXECUTABLE(${TARGET_ASKUSER} ${ASKUSER_SOURCES}) - -TARGET_LINK_LIBRARIES(${TARGET_ASKUSER} - ${AGENT_DEP_LIBRARIES} - ${TARGET_ASKUSER_COMMON} - "-pthread" - "-pie" - ) - -INSTALL(TARGETS ${TARGET_ASKUSER} DESTINATION ${BIN_INSTALL_DIR}) diff --git a/src/agent/main/Agent.cpp b/src/agent/main/Agent.cpp deleted file mode 100644 index eb1b7ba..0000000 --- a/src/agent/main/Agent.cpp +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright (c) 2014-2017 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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 Agent.cpp - * @author Adam Malinowski - * @brief This file implements main class of ask user agent - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include "Agent.h" -#include "Policy.h" - -namespace AskUser { - -namespace Agent { - -volatile sig_atomic_t Agent::m_stopFlag = 0; - -Agent::Agent() : m_cynaraTalker([&](Request *request) -> void { requestHandler(request); }) { - init(); -} - -Agent::~Agent() { - finish(); -} - -void Agent::init() { - ALOGD("Agent daemon initialized"); -} - -void Agent::run() { - m_cynaraTalker.start(); - m_policyUpdater.start(); - - while (!m_stopFlag) { - std::unique_lock lock(m_mutex); - m_event.wait_for(lock, std::chrono::milliseconds(1000)); - - if (m_stopFlag) { - break; - } - - while (!m_incomingRequests.empty() || !m_incomingResponses.empty()) { - - if (!m_incomingRequests.empty()) { - Request *request = m_incomingRequests.front(); - m_incomingRequests.pop(); - lock.unlock(); - - ALOGD("Request popped from queue:" - " type [" << request->type() << "]," - " id [" << request->id() << "]," - " data length [" << request->data().size() << "]"); - - if (request->type() == RT_Close) { - delete request; - m_stopFlag = 1; - break; - } - - processCynaraRequest(request); - - lock.lock(); - } - - if (!m_incomingResponses.empty()) { - Response response = m_incomingResponses.front(); - m_incomingResponses.pop(); - lock.unlock(); - - ALOGD("Response popped from queue:" - " type [" << response.type() << "]," - " id [" << response.id() << "]"); - - processUIResponse(response); - - lock.lock(); - } - - lock.unlock(); - cleanupUIThreads(); - lock.lock(); - } - } - - ALOGD("Agent task stopped"); -} - -void Agent::finish() { - m_policyUpdater.stop(); - if (!m_cynaraTalker.stop()) { - ALOGE("Threads could not be stopped. Calling quick_exit()"); - quick_exit(EXIT_SUCCESS); - } - - while (!m_incomingRequests.empty()) { - Request *request = m_incomingRequests.front(); - m_incomingRequests.pop(); - delete request; - } - - if (!cleanupUIThreads()) { - ALOGE("At least one of UI threads could not be stopped. Calling quick_exit()"); - quick_exit(EXIT_SUCCESS); - } - - for (auto it = m_requests.begin(); it != m_requests.end();) { - delete it->second; - it = m_requests.erase(it); - } - - ALOGD("Agent daemon has stopped commonly"); -} - -void Agent::requestHandler(Request *request) { - ALOGD("Cynara request received:" - " type [" << request->type() << "]," - " id [" << request->id() << "]," - " data length: [" << request->data().size() << "]"); - - std::unique_lock lock(m_mutex); - m_incomingRequests.push(request); - m_event.notify_one(); -} - -void Agent::processCynaraRequest(Request *request) { - std::unique_ptr requestPtr(request); - - auto existingRequest = m_requests.find(request->id()); - if (existingRequest != m_requests.end()) { - if (request->type() == RT_Cancel) { - delete existingRequest->second; - m_requests.erase(existingRequest); - m_cynaraTalker.sendResponse(request->type(), request->id()); - dismissUI(request->id()); - } else { - ALOGE("Incoming request with ID: [" << request->id() << "] is being already processed"); - } - return; - } - - if (request->type() == RT_Cancel) { - ALOGE("Cancel request for unknown request: ID: [" << request->id() << "]"); - return; - } - - if (!startUIForRequest(request)) { - auto data = Translator::Agent::answerToData(Cynara::PolicyType(), AgentErrorMsg::Error); - m_cynaraTalker.sendResponse(RT_Action, request->id(), data); - return; - } - - m_requests.insert(std::make_pair(request->id(), request)); - requestPtr.release(); -} - -void Agent::processUIResponse(const Response &response) { - auto requestIt = m_requests.find(response.id()); - if (requestIt != m_requests.end()) { - Cynara::PluginData pluginData; - if (response.type() == URT_ERROR) { - pluginData = Translator::Agent::answerToData(Cynara::PolicyType(), - AgentErrorMsg::Error); - } else if (response.type() == URT_TIMEOUT) { - pluginData = Translator::Agent::answerToData(Cynara::PolicyType(), - AgentErrorMsg::Timeout); - } else { - pluginData = Translator::Agent::answerToData( - UIResponseToPolicyType(response.type()), - AgentErrorMsg::NoError); - } - m_cynaraTalker.sendResponse(RT_Action, requestIt->second->id(), pluginData); - auto data = Translator::Agent::dataToRequest(requestIt->second->data()); - - std::string appId, pkgLabel; - identifyApp(data.client, data.user, appId, pkgLabel); - - switch (response.type()) { - case URT_NO_LIFE: - m_policyUpdater.update(appId, data.user, data.privilege, "Deny"); - break; - case URT_YES_LIFE: - m_policyUpdater.update(appId, data.user, data.privilege, "Allow"); - break; - default: - break; - } - - delete requestIt->second; - m_requests.erase(requestIt); - } - - dismissUI(response.id()); -} - -bool Agent::startUIForRequest(Request *request) { - auto data = Translator::Agent::dataToRequest(request->data()); - - AskUIInterfacePtr ui(new NotificationBackend()); - - auto handler = [&](RequestId requestId, UIResponseType resultType) -> void { - UIResponseHandler(requestId, resultType); - }; - - std::string appId, pkgLabel; - identifyApp(data.client, data.user, appId, pkgLabel); - - bool ret = ui->start(data.client, pkgLabel, data.user, data.privilege, request->id(), handler); - if (ret) { - m_UIs.insert(std::make_pair(request->id(), std::move(ui))); - } - - return ret; -} - -void Agent::UIResponseHandler(RequestId requestId, UIResponseType responseType) { - ALOGD("UI response received: type [" << responseType << "], id [" << requestId << "]"); - - std::unique_lock lock(m_mutex); - m_incomingResponses.push(Response(requestId, responseType)); - m_event.notify_one(); -} - -bool Agent::cleanupUIThreads() { - bool ret = true; - for (auto it = m_UIs.begin(); it != m_UIs.end();) { - if (it->second->isDismissing() && it->second->dismiss()) { - it = m_UIs.erase(it); - } else { - ret = false; - ++it; - } - } - return ret; -} - -void Agent::dismissUI(RequestId requestId) { - auto it = m_UIs.find(requestId); - if (it != m_UIs.end()) { - if (it->second->dismiss()) { - it = m_UIs.erase(it); - } - } -} - -Cynara::PolicyType Agent::UIResponseToPolicyType(UIResponseType responseType) { - switch (responseType) { - case URT_YES_ONCE: - return AskUser::SupportedTypes::Client::ALLOW_ONCE; - case URT_YES_SESSION: - return AskUser::SupportedTypes::Client::ALLOW_PER_SESSION; - case URT_YES_LIFE: - return AskUser::SupportedTypes::Client::ALLOW_PER_LIFE; - case URT_NO_ONCE: - return AskUser::SupportedTypes::Client::DENY_ONCE; - case URT_NO_SESSION: - return AskUser::SupportedTypes::Client::DENY_PER_SESSION; - case URT_NO_LIFE: - return AskUser::SupportedTypes::Client::DENY_PER_LIFE; - default: - return AskUser::SupportedTypes::Client::DENY_ONCE; - } -} - -} // namespace Agent - -} // namespace AskUser diff --git a/src/agent/main/Agent.h b/src/agent/main/Agent.h deleted file mode 100644 index c85f8c8..0000000 --- a/src/agent/main/Agent.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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 Agent.h - * @author Adam Malinowski - * @brief This file defines main class of ask user agent - */ - -#pragma once - -#include -#include -#include -#include -#include - -#include
-#include
-#include
-#include
- -#include - -namespace AskUser { - -namespace Agent { - -class Agent { -public: - Agent(); - ~Agent(); - - void run(); - - static void stop() { - m_stopFlag = 1; - } - -private: - CynaraTalker m_cynaraTalker; - PolicyUpdater m_policyUpdater; - std::map m_requests; - std::queue m_incomingRequests; - std::queue m_incomingResponses; - std::condition_variable m_event; - std::mutex m_mutex; - static volatile sig_atomic_t m_stopFlag; - std::map m_UIs; - - void init(); - void finish(); - - void requestHandler(Request *request); - void processCynaraRequest(Request *request); - bool startUIForRequest(Request *request); - void UIResponseHandler(RequestId requestId, UIResponseType responseType); - - void processUIResponse(const Response &response); - bool cleanupUIThreads(); - void dismissUI(RequestId requestId); - - static Cynara::PolicyType UIResponseToPolicyType(UIResponseType responseType); -}; - -} // namespace Agent - -} // namespace AskUser diff --git a/src/agent/main/CynaraTalker.cpp b/src/agent/main/CynaraTalker.cpp deleted file mode 100644 index 8ca77cc..0000000 --- a/src/agent/main/CynaraTalker.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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 CynaraTalker.cpp - * @author Adam Malinowski - * @brief This file implements class of cynara talker - */ - -#include -#include - -#include -#include - -#include - -#include "CynaraTalker.h" - -namespace { - -class TypeException : std::exception { -public: - TypeException(const std::string &msg) : m_what(msg) {}; - virtual const char* what() const noexcept { - return m_what.c_str(); - } - -private: - std::string m_what; -}; - -AskUser::Agent::RequestType cynaraType2AgentType(cynara_agent_msg_type type) { - switch (type) { - case CYNARA_MSG_TYPE_ACTION: - return AskUser::Agent::RT_Action; - case CYNARA_MSG_TYPE_CANCEL: - return AskUser::Agent::RT_Cancel; - } - - throw TypeException("Unsupported request type: " + std::to_string(type) + - " received from cynara."); -} - -cynara_agent_msg_type agentType2CynaraType(AskUser::Agent::RequestType type) { - switch (type) { - case AskUser::Agent::RT_Action: - return CYNARA_MSG_TYPE_ACTION; - case AskUser::Agent::RT_Cancel: - return CYNARA_MSG_TYPE_CANCEL; - default: // let's make compiler happy - break; - } - - throw TypeException("Invalid response type: " + std::to_string(type) + " to send to cynara."); -} - -} - -namespace AskUser { - -namespace Agent { - -CynaraTalker::CynaraTalker(RequestHandler requestHandler) : m_requestHandler(requestHandler), - m_cynara(nullptr) -{ - m_future = m_threadFinished.get_future(); -} - -bool CynaraTalker::start() { - if (!m_requestHandler) { - ALOGE("Empty request handler!"); - return false; - } - - m_thread = std::thread(&CynaraTalker::run, this); - return true; -} - -bool CynaraTalker::stop() { - if (!m_thread.joinable()) - return true; - // There is no possibility to stop this thread nicely when it waits for requests from cynara - // We can only try to get rid of thread - auto status = m_future.wait_for(std::chrono::milliseconds(10)); - if (status == std::future_status::ready) { - ALOGD("Cynara thread finished and ready to join."); - m_thread.join(); - return true; - } - - ALOGD("Cynara thread not finished."); - return false; -} - -void CynaraTalker::run() { - int ret; - sigset_t mask; - - sigemptyset(&mask); - sigaddset(&mask, SIGTERM); - if ((ret = sigprocmask(SIG_BLOCK, &mask, nullptr)) < 0) { - ALOGE("sigprocmask failed [<<" << ret << "]"); - } - - ret = cynara_agent_initialize(&m_cynara, SupportedTypes::Agent::AgentType); - if (ret != CYNARA_API_SUCCESS) { - ALOGE("Initialization of cynara structure failed with error: [" << ret << "]"); - m_requestHandler(new Request(RT_Close, 0, nullptr, 0)); // Notify agent he should die - return; - } - - void *data = nullptr; - - try { - while (true) { - cynara_agent_msg_type req_type; - cynara_agent_req_id req_id; - size_t data_size = 0; - - ret = cynara_agent_get_request(m_cynara, &req_type, &req_id, &data, &data_size); - if (ret != CYNARA_API_SUCCESS) { - ALOGE("Receiving request from cynara failed with error: [" << ret << "]"); - m_requestHandler(new Request(RT_Close, 0, nullptr, 0)); - break; - } - - try { - m_requestHandler(new Request(cynaraType2AgentType(req_type), req_id, data, - data_size)); - } catch (const TypeException &e) { - ALOGE("TypeException: <" << e.what() << "> Request dropped!"); - } - free(data); - data = nullptr; - } - } catch (const std::exception &e) { - ALOGC("Unexpected exception: <" << e.what() << ">"); - } catch (...) { - ALOGE("Unexpected unknown exception caught!"); - } - - free(data); - - std::unique_lock mlock(m_mutex); - ret = cynara_agent_finish(m_cynara); - m_cynara = nullptr; - if (ret != CYNARA_API_SUCCESS) { - ALOGE("Finishing cynara connection failed with error: [" << ret << "]"); - } - - m_threadFinished.set_value(true); -} - -bool CynaraTalker::sendResponse(RequestType requestType, RequestId requestId, - const Cynara::PluginData &data) { - - std::unique_lock mlock(m_mutex); - - if (!m_cynara) { - ALOGE("Trying to send response using uninitialized cynara connection!"); - return false; - } - - int ret; - try { - ret = cynara_agent_put_response(m_cynara, agentType2CynaraType(requestType), requestId, - data.size() ? data.data() : nullptr, data.size()); - } catch (const TypeException &e) { - ALOGE("TypeException: <" << e.what() << "> Response dropped!"); - ret = CYNARA_API_INVALID_PARAM; - } - - if (ret != CYNARA_API_SUCCESS) { - ALOGE("Sending response to cynara failed with error: [" << ret << "]"); - return false; - } - - return true; -} - -} // namespace Agent - -} // namespace AskUser diff --git a/src/agent/main/CynaraTalker.h b/src/agent/main/CynaraTalker.h deleted file mode 100644 index c26dc28..0000000 --- a/src/agent/main/CynaraTalker.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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 CynaraTalker.h - * @author Adam Malinowski - * @brief This file declares class representing request from cynara service - */ - -#pragma once - -#include -#include -#include -#include - -#include -#include - -#include
- -namespace AskUser { - -namespace Agent { - -typedef std::function RequestHandler; - -class CynaraTalker { -public: - CynaraTalker(RequestHandler requestHandler); - ~CynaraTalker() {} - - bool start(); - bool stop(); - - bool sendResponse(RequestType requestType, RequestId requestId, - const Cynara::PluginData &data = Cynara::PluginData()); - -private: - RequestHandler m_requestHandler; - cynara_agent *m_cynara; - std::thread m_thread; - std::mutex m_mutex; - std::promise m_threadFinished; - std::future m_future; - - void run(); -}; - -} // namespace Agent - -} // namespace AskUser diff --git a/src/agent/main/Request.h b/src/agent/main/Request.h deleted file mode 100644 index 95b8aac..0000000 --- a/src/agent/main/Request.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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 Request.h - * @author Adam Malinowski - * @brief This file declares class representing request from cynara service - */ - -#pragma once - -#include -#include - -#include - -#include - -namespace AskUser { - -namespace Agent { - -typedef enum { - RT_Action, - RT_Cancel, - RT_Close -} RequestType; - -class Request { -public: - Request() = default; - Request(RequestType type, RequestId id, void *data, std::size_t dataSize) - : m_type(type), m_id(id), m_data(static_cast(data), dataSize) {} - ~Request() {} - - RequestType type() const { - return m_type; - } - - RequestId id() const { - return m_id; - } - - const Cynara::PluginData &data() const { - return m_data; - } - -private: - RequestType m_type; - RequestId m_id; - Cynara::PluginData m_data; -}; - -} // namespace Agent - -} // namespace AskUser diff --git a/src/agent/main/Response.h b/src/agent/main/Response.h deleted file mode 100644 index cb20353..0000000 --- a/src/agent/main/Response.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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 Response.h - * @author Adam Malinowski - * @brief This file declares class representing response from user interface - */ - -#pragma once - -#include
-#include - -namespace AskUser { - -namespace Agent { - -class Response { -public: - Response() = default; - Response(RequestId requestId, UIResponseType responseType) : m_id(requestId), - m_type(responseType) {} - ~Response() {} - - RequestId id() const { - return m_id; - } - - UIResponseType type() const { - return m_type; - } - -private: - RequestId m_id; - UIResponseType m_type; -}; - -} // namespace Agent - -} // namespace AskUser diff --git a/src/agent/main/main.cpp b/src/agent/main/main.cpp deleted file mode 100644 index d60bf25..0000000 --- a/src/agent/main/main.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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 src/main/main.cpp - * @author Adam Malinowski - * @brief Main ask user daemon file - */ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef BUILD_WITH_SYSTEMD_DAEMON -#include -#endif - -#include "Agent.h" - -// Handle kill message from systemd -void kill_handler(int sig UNUSED) { - ALOGD("Ask user agent service is going down now"); - AskUser::Agent::Agent::stop(); -} - -int main(int argc UNUSED, char **argv UNUSED) { - init_agent_log(); - - int ret; - struct sigaction act; - - // Install kill handler - TERM signal will be delivered form systemd to kill this service - memset(&act, 0, sizeof(act)); - act.sa_handler = &kill_handler; - if ((ret = sigaction(SIGTERM, &act, NULL)) < 0) { - ALOGE("sigaction failed [<<" << ret << "]"); - return EXIT_FAILURE; - } - - char *locale = setlocale(LC_ALL, ""); - ALOGD("Current locale is: <" << locale << ">"); - - try { - AskUser::Agent::Agent agent; - -#ifdef BUILD_WITH_SYSTEMD_DAEMON - int ret = sd_notify(0, "READY=1"); - if (ret == 0) { - ALOGW("Agent was not configured to notify its status"); - } else if (ret < 0) { - ALOGE("sd_notify failed: [" << ret << "]"); - } -#endif - agent.run(); - } catch (const std::exception &e) { - ALOGC("Agent stopped because of unhandled exception: <" << e.what() << ">"); - return EXIT_FAILURE; - } catch (...) { - ALOGC("Agent stopped because of unknown unhandled exception."); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} diff --git a/src/agent/ui/AskUIInterface.h b/src/agent/ui/AskUIInterface.h deleted file mode 100644 index 09e8240..0000000 --- a/src/agent/ui/AskUIInterface.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2015-2017 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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 AskUIInterface.h - * @author Adam Malinowski - * @brief This file contains ask user UI interface declaration. - */ - -#pragma once - -#include -#include -#include - -#include
- -namespace AskUser { - -namespace Agent { - -typedef enum { - URT_NO_ONCE, - URT_NO_SESSION, - URT_NO_LIFE, - URT_YES_ONCE, - URT_YES_SESSION, - URT_YES_LIFE, - URT_TIMEOUT, - URT_ERROR -} UIResponseType; - -typedef std::function UIResponseCallback; - -class AskUIInterface { -public: - virtual ~AskUIInterface() {}; - - virtual bool start(const std::string &client, const std::string &pkgLabel, - const std::string &user, const std::string &privilege, - RequestId requestId, UIResponseCallback) = 0; - virtual bool setOutdated() = 0; - virtual bool dismiss() = 0; - virtual bool isDismissing() const = 0; -}; - -typedef std::unique_ptr AskUIInterfacePtr; - -} // namespace Agent - -} // namespace AskUser diff --git a/src/agent/ui/FdNotifyObject.cpp b/src/agent/ui/FdNotifyObject.cpp deleted file mode 100644 index 5d752fe..0000000 --- a/src/agent/ui/FdNotifyObject.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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 src/monitor/notify/FdNotifyObject.cpp - * @author Zofia Abramowska - * @version 1.0 - * @brief This file contains implementation of cynara's fd notification object - */ - -#include -#include -#include - -#include -#include - -#include "FdNotifyObject.h" - -using namespace AskUser::Util; - -namespace AskUser { - -FdNotifyObject::FdNotifyObject() : m_pipeFd{-1, -1} { -} - -bool FdNotifyObject::init(void) { - int ret = pipe(m_pipeFd); - if (ret != 0) { - int err = errno; - ALOGE("Couldn't initialize pipes: " << safeStrError(err)); - return false; - } - return true; -} - -int FdNotifyObject::getNotifyFd(void) { - return m_pipeFd[0]; -} - -bool FdNotifyObject::notify(void) { - const char wakeup[] = "w"; - int ret = TEMP_FAILURE_RETRY(write(m_pipeFd[1], wakeup, sizeof(wakeup))); - if (ret == -1) { - return false; - } - return true; -} - -FdNotifyObject::~FdNotifyObject() { - if (m_pipeFd[0] != -1) - close(m_pipeFd[0]); - if (m_pipeFd[1] != -1) - close(m_pipeFd[1]); -} - -} /* namespace Cynara */ diff --git a/src/agent/ui/FdNotifyObject.h b/src/agent/ui/FdNotifyObject.h deleted file mode 100644 index db7ceb9..0000000 --- a/src/agent/ui/FdNotifyObject.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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 src/agent/ui/FdNotifyObject.h - * @author Zofia Abramowska - * @version 1.0 - * @brief This file contains definition of fd notification object - */ - -#pragma once - -namespace AskUser { - -class FdNotifyObject { -public: - FdNotifyObject(); - ~FdNotifyObject(); - int getNotifyFd(void); - bool init(void); - bool notify(void); -private: - int m_pipeFd[2]; -}; - -} /* namespace AskUser */ diff --git a/src/agent/ui/NotificationBackend.cpp b/src/agent/ui/NotificationBackend.cpp deleted file mode 100644 index 269375a..0000000 --- a/src/agent/ui/NotificationBackend.cpp +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2016-2017 Samsung Electronics Co. - * - * 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 src/daemon/NotificationBackend.cpp - * @author Zofia Abramowska - * @brief Definition of NotificationBackend class - */ - -#include "NotificationBackend.h" - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -namespace AskUser { - -namespace Agent { - -namespace { - UIResponseType NResponseTypeToUI(NResponseType responseType) { - switch (responseType) { - case NResponseType::Allow: - return UIResponseType::URT_YES_ONCE; - case NResponseType::AllowAlways: - return UIResponseType::URT_YES_LIFE; - case NResponseType::DenyAlways: - return UIResponseType::URT_NO_LIFE; - case NResponseType::Error: - return UIResponseType::URT_ERROR; - case NResponseType::None: - return UIResponseType::URT_TIMEOUT; - case NResponseType::Deny: - default: - return UIResponseType::URT_NO_ONCE; - } - } -} - -bool NotificationBackend::start(const std::string &client, const std::string &pkgLabel, - const std::string &user, const std::string &privilege, - RequestId requestId, UIResponseCallback responseCb) { - if (!m_notify.init()) { - ALOGW("Couldn't initialize notification object."); - return false; - } - m_responseHandler = responseCb; - m_request.id = static_cast(requestId); - m_request.data.client = client; - m_request.data.user = user; - m_request.data.privilege = privilege; - m_request.pkgLabel = pkgLabel; - - m_thread = std::thread(&NotificationBackend::run, this); - return true; -} -bool NotificationBackend::setOutdated() { - return false; -} -bool NotificationBackend::dismiss() { - ALOGD("Dismissing"); - m_running = false; - return m_notify.notify(); -} -bool NotificationBackend::isDismissing() const { - return m_running; -} - -NotificationBackend::~NotificationBackend() { - dismiss(); - m_clientSocket.close(); - m_thread.join(); -} - -void NotificationBackend::reportError() { - m_responseHandler(static_cast(m_request.id), NResponseTypeToUI(NResponseType::Error)); -} - -bool NotificationBackend::sendRequest() -{ - std::string data = Translator::Gui::notificationRequestToData(m_request.id, - m_request.data.client, - m_request.pkgLabel, - m_request.data.privilege); - return m_clientSocket.send(data); -} - -bool NotificationBackend::parseResponse(NotificationResponse response) -{ - if (response.id != m_request.id) { - ALOGE("Got response with different id (" << response.id - << ") than request (" << m_request.id << ")"); - return false; - } - - ALOGD("For user: <" << m_request.data.user - << "> client: <" << m_request.data.client - << "> privilege: <" << m_request.data.privilege - << "> received: <" << Translator::Gui::responseToString(response.response) << ">"); - - return true; -} - -bool NotificationBackend::recvResponse(NotificationResponse &response) -{ - int requestId, responseType; - if (!m_clientSocket.recv(requestId) || !m_clientSocket.recv(responseType)) { - ALOGE("Failed to fetch response"); - return false; - } - response.id = static_cast(requestId); - response.response = static_cast(responseType); - return true; -} - -void NotificationBackend::run() -{ - try { - if (!m_clientSocket.connect(Path::getUserSocketPath(m_request.data.user))) { - ALOGE("Cannot connect to proper service"); - reportError(); - return; - } - - if (!mainLoop()) { - reportError(); - return; - } - - } catch (const std::exception &e) { - ALOGE("Got exception : " << e.what()); - reportError(); - } catch (...) { - ALOGE("Got unknown exception"); - reportError(); - } -} - -bool NotificationBackend::mainLoop() { - ALOGD("Notification loop started"); - m_poller.setEvents(m_clientSocket.getFd(), POLLOUT | POLLERR | POLLHUP); - m_poller.setEvents(m_notify.getNotifyFd(), POLLIN); - while (!m_running) { - int eCount = m_poller.wait(); - if (eCount == -1) { - ALOGE_ERRNO("Polling failed"); - return false; - } - - if (m_poller.getEvents(m_notify.getNotifyFd()) & POLLIN) { - ALOGW("Got signal to stop"); - return true; - } - - if (m_poller.getEvents(m_clientSocket.getFd()) & POLLERR) { - ALOGE("Error on socket connection"); - return false; - } - - if (m_poller.getEvents(m_clientSocket.getFd()) & POLLIN) { - NotificationResponse response; - if (!recvResponse(response)) { - ALOGE("Couldn't receive response"); - return false; - } - if (!parseResponse(response)) { - ALOGE("Incorrect response received"); - return false; - } - m_responseHandler(static_cast(m_request.id), NResponseTypeToUI(response.response)); - return true; - } - - if (m_poller.getEvents(m_clientSocket.getFd()) & POLLHUP) { - ALOGE("Service disconnected"); - return false; - } - - if (m_poller.getEvents(m_clientSocket.getFd()) & POLLOUT) { - if (!sendRequest()) { - ALOGE("Couldn't send request"); - return false; - } - - m_poller.setEvents(m_clientSocket.getFd(), POLLIN | POLLERR); - continue; - } - } - - ALOGD("NotificationBackend loop ended"); - return true; -} - -} /* namespace Agent */ - -} /* namespace AskUser */ diff --git a/src/agent/ui/NotificationBackend.h b/src/agent/ui/NotificationBackend.h deleted file mode 100644 index efbfa76..0000000 --- a/src/agent/ui/NotificationBackend.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2016-2017 Samsung Electronics Co. - * - * 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 src/daemon/NotificationBackend.cpp - * @author Zofia Abramowska - * @brief Declaration of NotificationBackend class - */ - -#pragma once - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace AskUser { - -namespace Agent { - -typedef std::function ResponseHandler; - -class NotificationBackend : public AskUIInterface { -public: - NotificationBackend() : m_poller(2), m_clientSocket(Socket::PeerType::CLIENT), m_running(false) {} - virtual ~NotificationBackend(); - - virtual bool start(const std::string &client, const std::string &pkgLabel, - const std::string &user, const std::string &privilege, RequestId requestId, - UIResponseCallback responseCb); - virtual bool setOutdated(); - virtual bool dismiss(); - virtual bool isDismissing() const; - -protected: - void reportError(); - bool mainLoop(); - void run(); - - bool sendRequest(); - bool parseResponse(NotificationResponse response); - bool recvResponse(NotificationResponse &response); - - FdNotifyObject m_notify; - UIResponseCallback m_responseHandler; - NotificationRequest m_request; - Poll m_poller; - Socket m_clientSocket; - std::thread m_thread; - std::atomic m_running; -}; - -} /* namespace Agent */ - -} /* namespace AskUser */