Support policy activation to client
authorSangwan Kwon <sangwan.kwon@samsung.com>
Tue, 10 Dec 2019 04:58:50 +0000 (13:58 +0900)
committer권상완/Security 2Lab(SR)/Engineer/삼성전자 <sangwan.kwon@samsung.com>
Thu, 12 Dec 2019 10:16:10 +0000 (19:16 +0900)
Signed-off-by: Sangwan Kwon <sangwan.kwon@samsung.com>
14 files changed:
CMakeLists.txt
specs/tizen/policy_admin.table
src/osquery/tables/tizen/policy_admin.cpp
src/vist/CMakeLists.txt
src/vist/client/CMakeLists.txt
src/vist/client/tests/client.cpp [deleted file]
src/vist/client/tests/query.cpp [new file with mode: 0644]
src/vist/main/main.cpp
src/vist/policy/api.cpp
src/vist/policy/api.hpp
src/vist/policy/policy-manager.cpp
src/vist/policy/policy-manager.hpp
src/vist/policy/policy-storage.cpp
src/vist/policy/policy-storage.hpp

index 751954c8b9d6b40df0d4178b8334890de0825b4a..c3b574520cf816c681a2190ec15b5f453370be68 100644 (file)
@@ -25,7 +25,7 @@ ELSE(DEFINED GBS_BUILD)
 ENDIF(DEFINED GBS_BUILD)
 
 IF(NOT CMAKE_BUILD_TYPE)
-       SET(CMAKE_BUILD_TYPE "RELEASE")
+       SET(CMAKE_BUILD_TYPE "DEBUG")
 ENDIF(NOT CMAKE_BUILD_TYPE)
 
 SET(CMAKE_CXX_FLAGS_DEBUG   "-g -std=c++1y -O0 -ggdb -Wp,-U_FORTIFY_SOURCE")
index 3cd32278d68910f2a71761cb16411abfee261fbd..6c6ee9baf6bfacdd5f2904dae6cb64e23ced79d1 100644 (file)
@@ -2,7 +2,9 @@ table_name("policy_admin")
 description("Policy administrator.")
 schema([
     Column("name", TEXT, "Policy admin name"),
+    Column("activated", INTEGER, "State of activation"),
 ])
 implementation("tizen/policy_admin@genPolicyAdmin")
 implementation_delete("tizen/policy_admin@deletePolicyAdmin")
 implementation_insert("tizen/policy_admin@insertPolicyAdmin")
+implementation_update("tizen/policy_admin@updatePolicyAdmin")
index bb507f29c836f5c76b3da8ca4e3b383f4f9e2339..4b068dc659da55f2edaef6b3d230d10f923ac72c 100644 (file)
@@ -65,11 +65,29 @@ QueryData genPolicyAdmin(QueryContext& context) try {
        auto admins = vist::policy::API::Admin::GetAll();
 
        for (auto& admin : admins) {
-               Row r;
-               r["name"] = SQL_TEXT(admin);
-
-               DEBUG(VIST) << "Admin info [name]: " << r["name"];
-               results.emplace_back(std::move(r));
+               if (context.constraints["name"].exists(EQUALS)) { /// where clause
+                       auto names = context.constraints["name"].getAll(EQUALS);
+                       for (const auto& name : names) {
+                               if (name == admin.first) {
+                                       Row row;
+                                       row["name"] = admin.first;
+                                       row["activated"] = std::to_string(admin.second);
+
+                                       DEBUG(VIST) << "Admin info [name]: " << row["name"]
+                                                               << ", [activated]:" << row["activated"];
+
+                                       results.emplace_back(std::move(row));
+                               }
+                       }
+               } else { /// select *;
+                       Row row;
+                       row["name"] = admin.first;
+                       row["activated"] = std::to_string(admin.second);
+
+                       DEBUG(VIST) << "Admin info [name]: " << row["name"]
+                                               << ", [activated]:" << row["activated"];
+                       results.emplace_back(std::move(row));
+               }
        }
 
        return results;
@@ -115,5 +133,33 @@ QueryData deletePolicyAdmin(QueryContext& context, const PluginRequest& request)
        return { r };
 }
 
+QueryData updatePolicyAdmin(QueryContext& context, const PluginRequest& request) try {
+       INFO(VIST) << "Update query about policy-admin table.";
+       if (request.count("json_value_array") == 0)
+               throw std::runtime_error("Wrong request format. Not found json value.");
+
+       std::string str = request.at("json_value_array");
+       rapidjson::Document document;
+       document.Parse(str.c_str());
+       if (document.HasParseError() || !document.IsArray())
+               throw std::runtime_error("Cannot parse request.");
+
+       if (document.Size() != 2)
+               throw std::runtime_error("Wrong request format.");
+
+       std::string name = document[0].GetString();
+       int activated = document[1].GetInt();
+
+       vist::policy::API::Admin::Activate(name, activated);
+
+       Row r;
+       r["status"] = "success";
+       return { r };
+} catch (...) {
+       ERROR(VIST) << "Failed to insert query on policy-admin.";
+       Row r;
+       return { r };
+}
+
 } // namespace tables
 } // namespace osquery
index 369eda9addbe8994cd77a96af1d631335b4b214f..07a686b58d0448c14934b9656627dc76de60a64d 100644 (file)
@@ -67,36 +67,34 @@ TARGET_LINK_LIBRARIES(${TARGET_VIST_LIB} ${TARGET_VIST_COMMON_LIB}
                                                                                 ${TARGET_VIST_POLICY_LIB}
                                                                                 ${TARGET_OSQUERY_LIB})
 
-IF(DEFINED GBS_BUILD)
-       ADD_EXECUTABLE(${TARGET_VIST_DAEMON} main/main.cpp)
-       TARGET_LINK_LIBRARIES(${TARGET_VIST_DAEMON} ${TARGET_VIST_LIB})
-       TARGET_LINK_WHOLE(${TARGET_VIST_DAEMON} ${TARGET_OSQUERY_LIB})
-       SET_TARGET_PROPERTIES(${TARGET_VIST_DAEMON} PROPERTIES COMPILE_FLAGS "-fPIE")
-       SET_TARGET_PROPERTIES(${TARGET_VIST_DAEMON} PROPERTIES LINK_FLAGS "-pie")
-       INSTALL(TARGETS ${TARGET_VIST_DAEMON}
-                       DESTINATION ${CMAKE_INSTALL_BINDIR}
-                       PERMISSIONS OWNER_READ
-                                               OWNER_WRITE
-                                               OWNER_EXECUTE
-                                               GROUP_READ
-                                               GROUP_EXECUTE
-                                               WORLD_READ
-                                               WORLD_EXECUTE)
+ADD_EXECUTABLE(${TARGET_VIST_DAEMON} main/main.cpp)
+TARGET_LINK_LIBRARIES(${TARGET_VIST_DAEMON} ${TARGET_VIST_LIB})
+TARGET_LINK_WHOLE(${TARGET_VIST_DAEMON} ${TARGET_OSQUERY_LIB})
+SET_TARGET_PROPERTIES(${TARGET_VIST_DAEMON} PROPERTIES COMPILE_FLAGS "-fPIE")
+SET_TARGET_PROPERTIES(${TARGET_VIST_DAEMON} PROPERTIES LINK_FLAGS "-pie")
+INSTALL(TARGETS ${TARGET_VIST_DAEMON}
+               DESTINATION ${CMAKE_INSTALL_BINDIR}
+               PERMISSIONS OWNER_READ
+                                       OWNER_WRITE
+                                       OWNER_EXECUTE
+                                       GROUP_READ
+                                       GROUP_EXECUTE
+                                       WORLD_READ
+                                       WORLD_EXECUTE)
 
-       ADD_EXECUTABLE(${TARGET_VIST_CLI} main/cli.cpp)
-       TARGET_LINK_LIBRARIES(${TARGET_VIST_CLI} ${TARGET_VIST_CLIENT_LIB})
-       SET_TARGET_PROPERTIES(${TARGET_VIST_CLI} PROPERTIES COMPILE_FLAGS "-fPIE")
-       SET_TARGET_PROPERTIES(${TARGET_VIST_CLI} PROPERTIES LINK_FLAGS "-pie")
-       INSTALL(TARGETS ${TARGET_VIST_CLI}
-                       DESTINATION ${CMAKE_INSTALL_BINDIR}
-                       PERMISSIONS OWNER_READ
-                                               OWNER_WRITE
-                                               OWNER_EXECUTE
-                                               GROUP_READ
-                                               GROUP_EXECUTE
-                                               WORLD_READ
-                                               WORLD_EXECUTE)
-ENDIF(DEFINED GBS_BUILD)
+ADD_EXECUTABLE(${TARGET_VIST_CLI} main/cli.cpp)
+TARGET_LINK_LIBRARIES(${TARGET_VIST_CLI} ${TARGET_VIST_CLIENT_LIB})
+SET_TARGET_PROPERTIES(${TARGET_VIST_CLI} PROPERTIES COMPILE_FLAGS "-fPIE")
+SET_TARGET_PROPERTIES(${TARGET_VIST_CLI} PROPERTIES LINK_FLAGS "-pie")
+INSTALL(TARGETS ${TARGET_VIST_CLI}
+               DESTINATION ${CMAKE_INSTALL_BINDIR}
+               PERMISSIONS OWNER_READ
+                                       OWNER_WRITE
+                                       OWNER_EXECUTE
+                                       GROUP_READ
+                                       GROUP_EXECUTE
+                                       WORLD_READ
+                                       WORLD_EXECUTE)
 
 ADD_EXECUTABLE(${TARGET_VIST_TEST} main/tests.cpp
                                                                   ${${TARGET_VIST_LIB}_TESTS})
index 05dca46de4439e4e5ecbf9abd980b620aee95d53..0cf045cc324b373f640822165fb9001616ad50d3 100644 (file)
@@ -18,9 +18,9 @@ ADD_VIST_CLIENT_LIBRARY(vist_client query.cpp
                                                                        virtual-table.cpp)
 
 FILE(GLOB CLIENT_TESTS "tests/*.cpp")
-IF(DEFINED GBS_BUILD)
+#IF(DEFINED GBS_BUILD)
        ADD_VIST_TEST(${CLIENT_TESTS})
-ENDIF(DEFINED GBS_BUILD)
+       #ENDIF(DEFINED GBS_BUILD)
 
 ADD_LIBRARY(${TARGET_VIST_CLIENT_LIB} STATIC ${${TARGET_VIST_CLIENT_LIB}_SRCS})
 TARGET_LINK_LIBRARIES(${TARGET_VIST_CLIENT_LIB} ${VIST_CLIENT_DEPS_LIBRARIES}
diff --git a/src/vist/client/tests/client.cpp b/src/vist/client/tests/client.cpp
deleted file mode 100644 (file)
index f21bd66..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2019 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
- */
-
-#include <gtest/gtest.h>
-
-#include <vist/client/query.hpp>
-
-#include <chrono>
-#include <thread>
-
-using namespace vist;
-
-class ClientTests : public testing::Test {};
-
-TEST(ClientTests, query) {
-       auto rows = Query::Execute("SELECT * FROM policy");
-
-       EXPECT_TRUE(rows.size() > 0);
-}
-
-TEST(ClientTests, admin_enrollment) {
-       /// Default policy admin is always exist.
-       auto rows = Query::Execute("SELECT * FROM policy_admin");
-       EXPECT_EQ(rows.size(), 1);
-
-       rows = Query::Execute("INSERT INTO policy_admin (name) VALUES ('testAdmin')");
-       EXPECT_EQ(rows.size(), 0);
-
-       rows = Query::Execute("SELECT * FROM policy_admin");
-       EXPECT_EQ(rows.size(), 2);
-
-       Query::Execute("INSERT INTO policy_admin (name) VALUES ('testAdmin2')");
-       rows = Query::Execute("SELECT * FROM policy_admin");
-       EXPECT_EQ(rows.size(), 3);
-
-       rows = Query::Execute("DELETE FROM policy_admin WHERE name = 'testAdmin'");
-       EXPECT_EQ(rows.size(), 0);
-
-       rows = Query::Execute("SELECT * FROM policy_admin");
-       EXPECT_EQ(rows.size(), 2);
-
-       Query::Execute("DELETE FROM policy_admin WHERE name = 'testAdmin2'");
-       rows = Query::Execute("SELECT * FROM policy_admin");
-       EXPECT_EQ(rows.size(), 1);
-}
diff --git a/src/vist/client/tests/query.cpp b/src/vist/client/tests/query.cpp
new file mode 100644 (file)
index 0000000..1d215f9
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ *  Copyright (c) 2019 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
+ */
+
+#include <gtest/gtest.h>
+
+#include <vist/client/query.hpp>
+
+#include <chrono>
+#include <thread>
+
+using namespace vist;
+
+class QueryTests : public testing::Test {};
+
+TEST(QueryTests, query)
+{
+       auto rows = Query::Execute("SELECT * FROM policy");
+
+       EXPECT_TRUE(rows.size() > 0);
+}
+
+TEST(QueryTests, admin_enrollment)
+{
+       /// Default policy admin is always exist.
+       auto rows = Query::Execute("SELECT * FROM policy_admin");
+       EXPECT_EQ(rows.size(), 1);
+
+       rows = Query::Execute("INSERT INTO policy_admin (name) VALUES ('testAdmin')");
+       EXPECT_EQ(rows.size(), 0);
+
+       rows = Query::Execute("SELECT * FROM policy_admin");
+       EXPECT_EQ(rows.size(), 2);
+
+       Query::Execute("INSERT INTO policy_admin (name) VALUES ('testAdmin2')");
+       rows = Query::Execute("SELECT * FROM policy_admin");
+       EXPECT_EQ(rows.size(), 3);
+
+       rows = Query::Execute("DELETE FROM policy_admin WHERE name = 'testAdmin'");
+       EXPECT_EQ(rows.size(), 0);
+
+       rows = Query::Execute("SELECT * FROM policy_admin");
+       EXPECT_EQ(rows.size(), 2);
+
+       Query::Execute("DELETE FROM policy_admin WHERE name = 'testAdmin2'");
+       rows = Query::Execute("SELECT * FROM policy_admin");
+       EXPECT_EQ(rows.size(), 1);
+}
+
+TEST(QueryTests, admin_activation)
+{
+       /// Default policy admin is always exist.
+       auto rows = Query::Execute("SELECT * FROM policy_admin");
+       EXPECT_EQ(rows.size(), 1);
+
+       Query::Execute("INSERT INTO policy_admin (name) VALUES ('testAdmin')");
+       rows = Query::Execute("SELECT * FROM policy_admin WHERE name = 'testAdmin'");
+       EXPECT_EQ(rows.size(), 1);
+       EXPECT_EQ(rows[0]["name"], "testAdmin");
+       EXPECT_EQ(rows[0]["activated"], "0");
+
+       Query::Execute("UPDATE policy_admin SET activated = 1 where name = 'testAdmin'");
+       rows = Query::Execute("SELECT * FROM policy_admin WHERE name = 'testAdmin'");
+       EXPECT_EQ(rows.size(), 1);
+       EXPECT_EQ(rows[0]["name"], "testAdmin");
+       EXPECT_EQ(rows[0]["activated"], "1");
+
+       rows = Query::Execute("DELETE FROM policy_admin WHERE name = 'testAdmin'");
+       EXPECT_EQ(rows.size(), 0);
+}
index a1815788c5c1d6290139e87b0a3c3cec8d3f8d3c..8e64bbcc50a7c44af6e1682149a2daf141e0f8c0 100644 (file)
 
 #include <vist/exception.hpp>
 #include <vist/logger.hpp>
-#include <vist/logger/dlog.hpp>
 
 #include <cstdlib>
 
 using namespace vist;
 
 int main() try {
-       LogStream::Init(std::make_shared<Dlog>());
        Vist::Instance().start();
        return EXIT_SUCCESS;
 } catch(const Exception<ErrCode>& e) {
index 3c99d067a033158d5dadd56284f26e7cf6f87b8e..6c0386fd58762569d4967c7dbcd967523e494c8a 100644 (file)
@@ -52,7 +52,7 @@ void API::Admin::Activate(const std::string& admin, bool state)
        PolicyManager::Instance().activate(admin, state);
 }
 
-std::vector<std::string> API::Admin::GetAll()
+std::unordered_map<std::string, int> API::Admin::GetAll()
 {
        return PolicyManager::Instance().getAdmins();
 }
index d5059bb4d7f2208016c25b9cfcec7e3196f41cae..dabbcd7a995ee98ff721e5df643335e2f4351f61 100644 (file)
@@ -20,7 +20,6 @@
 
 #include <string>
 #include <unordered_map>
-#include <vector>
 
 namespace vist {
 namespace policy {
@@ -37,7 +36,7 @@ struct API {
 
                static void Activate(const std::string& admin, bool state = true);
 
-               static std::vector<std::string> GetAll();
+               static std::unordered_map<std::string, int> GetAll();
        };
 };
 
index 06d7b7454ae97d93818c157f33591d0339ab22f3..f03b8277fd1815f3955ac642e2d27c1102622e1b 100644 (file)
@@ -134,7 +134,7 @@ std::unordered_map<std::string, PolicyValue> PolicyManager::getAll()
        return policies;
 }
 
-std::vector<std::string> PolicyManager::getAdmins()
+std::unordered_map<std::string, int> PolicyManager::getAdmins()
 {
        return storage.getAdmins();
 }
index c93ba7374bd144f7c05bbebf790ae87b0e3b1100..67d499409552fb2e092f6165d7de5283e34e301c 100644 (file)
@@ -56,7 +56,7 @@ public:
        PolicyValue get(const std::string& policy);
        std::unordered_map<std::string, PolicyValue> getAll();
 
-       std::vector<std::string> getAdmins();
+       std::unordered_map<std::string, int> getAdmins();
 
 private:
        explicit PolicyManager();
index a0131d56dd3f21fe18f54c58b6a378aeb085e179..d5b2b28ba72cfe4f9e371fa5a90d4d3f6fd50f83 100644 (file)
@@ -214,6 +214,7 @@ void PolicyStorage::activate(const std::string& admin, bool state)
                THROW(ErrCode::RuntimeError) << "Failed to activate admin: " << admin;
 
        this->admins[admin].activated = state;
+       INFO(VIST) << "Admin[" << admin << "]'s activated value is set: " << state; 
 }
 
 bool PolicyStorage::isActivated(const std::string& admin)
@@ -285,13 +286,13 @@ PolicyValue PolicyStorage::strictest(const std::shared_ptr<PolicyModel>& policy)
        return std::move(*strictestPtr);
 }
 
-std::vector<std::string> PolicyStorage::getAdmins() const noexcept
+std::unordered_map<std::string, int> PolicyStorage::getAdmins() const noexcept
 {
-       std::vector<std::string> tmp;
+       std::unordered_map<std::string, int> ret;
        for (const auto& admin : this->admins)
-               tmp.push_back(admin.first);
+               ret[admin.second.name] = admin.second.activated;
 
-       return tmp;
+       return ret;
 }
 
 } // namespace policy
index 540694a45f1e4dcc6d58edc051a70ea9bea4a29f..e86ecaec77ce20ab7b38df542f58666dce9cdcb5 100644 (file)
@@ -24,8 +24,6 @@
 
 #include <memory>
 #include <unordered_map>
-#include <vector>
-
 
 namespace vist {
 namespace policy {
@@ -60,7 +58,7 @@ public:
 
        PolicyValue strictest(const std::shared_ptr<PolicyModel>& policy);
 
-       std::vector<std::string> getAdmins() const noexcept;
+       std::unordered_map<std::string, int> getAdmins() const noexcept;
 
 private:
        std::string getScript(const std::string& name);