CKM: certificates refreshed (some were already expired).
[platform/core/test/security-tests.git] / tests / common / tests_common.cpp
index 34e7da5..1bf0236 100644 (file)
  */
 
 #include "tests_common.h"
+#include <unistd.h>
+#include <grp.h>
+#include <errno.h>
+#include <vector>
+#include <algorithm>
+
+int DB::Transaction::db_result = PC_OPERATION_SUCCESS;
+
+const char *WGT_APP_ID = "QwCqJ0ttyS";
 
 int smack_runtime_check(void)
 {
@@ -44,3 +53,86 @@ int smack_check(void)
     return smack_runtime_check();
 #endif
 }
+
+/**
+ * Dropping root privileges
+ * returns 0 on success, 1 on error
+ */
+int drop_root_privileges(uid_t appUid, gid_t appGid)
+{
+    if (getuid() == 0) {
+        /* process is running as root, drop privileges */
+        if (setgid(appGid) != 0)
+            return 1;
+        if (setuid(appUid) != 0)
+            return 1;
+    }
+    uid_t uid = getuid();
+    if (uid == appUid)
+        return 0;
+
+    return 1;
+}
+
+void setLabelForSelf(const int line, const char *label)
+{
+    int ret = smack_set_label_for_self(label);
+    RUNNER_ASSERT_MSG(ret == 0, "Error in smack_set_label_for_self(): " << ret << ", line: " << line);
+}
+
+/*
+ * Add a new group to the current process groups.
+ */
+void add_process_group(const char* group_name)
+{
+    // get group ID by group name
+    group *gr = getgrnam(group_name);
+    RUNNER_ASSERT_ERRNO_MSG(gr != nullptr, "getgrnam failed on '" << group_name << "' group");
+    const gid_t new_group_id = gr->gr_gid;
+
+    // get number of groups that the current process belongs to
+    int ngroups = getgroups(0, nullptr);
+
+    //allocate groups table + space for new group entry
+    std::vector<gid_t> groups(ngroups + 1);
+    getgroups(ngroups, groups.data());
+
+    // check if the process already belongs to the group
+    if (std::find(groups.begin(), groups.end(), new_group_id) != groups.end()) return;
+
+    // add new group & apply change
+    groups[ngroups] = new_group_id;
+    int ret = setgroups(groups.size(), groups.data());
+    RUNNER_ASSERT_ERRNO_MSG(ret == 0, "setgroups() failed");
+}
+
+/*
+ * Remove specific group from the current process groups.
+ */
+void remove_process_group(const char* group_name)
+{
+    // get group ID by group name
+    group *gr = getgrnam(group_name);
+    RUNNER_ASSERT_ERRNO_MSG(gr != nullptr, "getgrnam failed on '" << group_name << "' group");
+    const gid_t new_group_id = gr->gr_gid;
+
+    int ngroups = getgroups(0, nullptr);
+    std::vector<gid_t> groups(ngroups);
+    getgroups(ngroups, groups.data());
+
+    // remove group from the list
+    groups.erase(std::remove(groups.begin(), groups.end(), new_group_id), groups.end());
+
+    if (groups.size() != (size_t)ngroups) {
+        // apply change
+        int ret = setgroups(groups.size(), groups.data());
+        RUNNER_ASSERT_ERRNO_MSG(ret == 0, "setgroups() failed");
+    }
+}
+
+std::string formatCstr(const char *cstr)
+{
+    if (!cstr)
+        return std::string("nullptr");
+    return std::string("\"") + cstr + "\"";
+}