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>
13 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/query.cpp [moved from src/vist/client/tests/client.cpp with 64% similarity]
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 751954c..c3b5745 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 3cd3227..6c6ee9b 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 bb507f2..4b068dc 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 369eda9..07a686b 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 05dca46..0cf045c 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}
similarity index 64%
rename from src/vist/client/tests/client.cpp
rename to src/vist/client/tests/query.cpp
index f21bd66..1d215f9 100644 (file)
 
 using namespace vist;
 
-class ClientTests : public testing::Test {};
+class QueryTests : public testing::Test {};
 
-TEST(ClientTests, query) {
+TEST(QueryTests, query)
+{
        auto rows = Query::Execute("SELECT * FROM policy");
 
        EXPECT_TRUE(rows.size() > 0);
 }
 
-TEST(ClientTests, admin_enrollment) {
+TEST(QueryTests, admin_enrollment)
+{
        /// Default policy admin is always exist.
        auto rows = Query::Execute("SELECT * FROM policy_admin");
        EXPECT_EQ(rows.size(), 1);
@@ -56,3 +58,25 @@ TEST(ClientTests, admin_enrollment) {
        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 a181578..8e64bbc 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 3c99d06..6c0386f 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 d5059bb..dabbcd7 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 06d7b74..f03b827 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 c93ba73..67d4994 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 a0131d5..d5b2b28 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 540694a..e86ecae 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);