*/
#include <dpl/test/test_runner.h>
+#include <dpl/test/test_runner_child.h>
+
+#include <cynara_test_admin.h>
+#include <dbus_connection.h>
+#include <dbus_test_busconfig_writer.h>
+#include <smack_access.h>
+#include <tests_common.h>
+
+#include <sys/smack.h>
+
+#include <string>
+#include <unistd.h>
+#include <iostream>
+
+using namespace DBusTest;
+
+static const std::string ROOT_UID_STR("0");
+
+static const std::string connectionNameFromStr(const std::string &str)
+{
+ return "com.security_tests." + str;
+}
+
+static const std::string privilegeFromStr(const std::string &str)
+{
+ return str + "Privilege";
+}
+
+static const std::string smackLabelFromStr(const std::string &str)
+{
+ return str + "SmackLabel";
+}
+
+static void addBusconfigPolicyOwn(const std::string &id)
+{
+ BusConfigWriter writer;
+ writer.addPolicyCheck(privilegeFromStr(id), {{Attr::OWN, connectionNameFromStr(id)}});
+ writer.save();
+}
+
+static void assertUnlink(const std::string &filePath)
+{
+ RUNNER_ASSERT_MSG(0 == unlink(filePath.c_str()), "Unable to unlink " << filePath << " file");
+}
+
+static void addCynaraPolicy(const std::string &id)
+{
+ CynaraTestAdmin admin;
+ CynaraPoliciesContainer cp;
+ cp.add(CYNARA_ADMIN_DEFAULT_BUCKET,
+ smackLabelFromStr(id).c_str(), ROOT_UID_STR.c_str(), privilegeFromStr(id).c_str(),
+ CYNARA_ADMIN_ALLOW, nullptr);
+ admin.setPolicies(cp);
+}
+
+static void addSmackAccessForDbus(SmackAccess &access, const std::string &label)
+{
+ access.add("System", label, "rx");
+ access.apply();
+}
+
+static void removeSmackAccessForDbus(SmackAccess &access)
+{
+ access.clear();
+}
+
+static pid_t assertFork()
+{
+ pid_t pid = fork();
+ RUNNER_ASSERT_ERRNO_MSG(pid != -1, "fork() failed");
+ return pid;
+}
RUNNER_TEST_GROUP_INIT(CYNARA_DBUS);
+
+static void testOwn(const std::string &testId, bool allow)
+{
+ SmackAccess access;
+ const std::string label(smackLabelFromStr(testId));
+
+ addBusconfigPolicyOwn(testId);
+ addSmackAccessForDbus(access, label);
+ if (allow)
+ addCynaraPolicy(testId);
+
+ sleep(1);
+
+ pid_t pid = assertFork();
+
+ if (pid == 0) {
+ RUNNER_ASSERT(0 == smack_set_label_for_self(label.c_str()));
+ DBus::Connection client(DBUS_BUS_SYSTEM, true);
+ client.requestName(connectionNameFromStr(testId),
+ allow ? DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER : -1);
+ } else {
+ sleep(3);
+ removeSmackAccessForDbus(access);
+ assertUnlink(CONF_FILE_PATH);
+ }
+}
+
+RUNNER_MULTIPROCESS_TEST_SMACK(tcc_1130_own_deny)
+{
+ testOwn("tcc1130", false);
+}
+
+RUNNER_MULTIPROCESS_TEST_SMACK(tcc_1170_own_allow)
+{
+ testOwn("tcc1170", true);
+}