]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test: Test user record selfModifiable behavior 31153/head
authorAdrian Vovk <adrianvovk@gmail.com>
Wed, 24 Apr 2024 23:41:03 +0000 (19:41 -0400)
committerLuca Boccassi <luca.boccassi@gmail.com>
Fri, 1 Nov 2024 10:41:46 +0000 (10:41 +0000)
src/test/meson.build
src/test/test-user-record.c [new file with mode: 0644]

index 2157e7c1f3d90c46b34dfbf008a310e00b6971f7..9f74a7b56aa84f7478699d5da67ecb9b2f8f4612 100644 (file)
@@ -183,6 +183,7 @@ simple_tests += files(
         'test-umask-util.c',
         'test-unaligned.c',
         'test-unit-file.c',
+        'test-user-record.c',
         'test-user-util.c',
         'test-utf8.c',
         'test-verbs.c',
diff --git a/src/test/test-user-record.c b/src/test/test-user-record.c
new file mode 100644 (file)
index 0000000..3a7e8e2
--- /dev/null
@@ -0,0 +1,101 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "json-util.h"
+#include "macro.h"
+#include "tests.h"
+#include "user-record.h"
+
+#define USER(ret, ...)                          \
+        ({                                      \
+                typeof(ret) _r = (ret);         \
+                user_record_unref(*_r);         \
+                assert_se(user_record_build((ret), SD_JSON_BUILD_OBJECT(__VA_ARGS__)) >= 0); \
+                0;                              \
+        })
+
+TEST(self_changes) {
+        _cleanup_(user_record_unrefp) UserRecord *curr = NULL, *new = NULL;
+
+        /* not allowlisted */
+        USER(&curr,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_UNSIGNED("notInHardCodedList", 11111));
+        USER(&new,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_UNSIGNED("notInHardCodedList", 99999));
+        assert_se(!user_record_self_changes_allowed(curr, new));
+
+        /* manually allowlisted */
+        USER(&curr,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_UNSIGNED("notInHardCodedList", 11111),
+             SD_JSON_BUILD_PAIR_ARRAY("selfModifiableFields", SD_JSON_BUILD_STRING("notInHardCodedList")));
+        USER(&new,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_ARRAY("selfModifiableFields", SD_JSON_BUILD_STRING("notInHardCodedList")),
+             /* change in order shouldn't affect things */
+             SD_JSON_BUILD_PAIR_UNSIGNED("notInHardCodedList", 99999));
+        assert_se(user_record_self_changes_allowed(curr, new));
+
+        /* default allowlisted */
+        USER(&curr,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_STRING("realName", "Old Name"));
+        USER(&new,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_STRING("realName", "New Name"));
+        assert_se(user_record_self_changes_allowed(curr, new));
+
+        /* introduced new default allowlisted */
+        USER(&curr,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"));
+        USER(&new,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_STRING("realName", "New Name"));
+        assert_se(user_record_self_changes_allowed(curr, new));
+
+        /* introduced new not allowlisted */
+        USER(&curr,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"));
+        USER(&new,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_UNSIGNED("notInHardCodedList", 99999));
+        assert_se(!user_record_self_changes_allowed(curr, new));
+
+        /* privileged section: default allowlisted */
+        USER(&curr,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_OBJECT("privileged",
+                                    SD_JSON_BUILD_PAIR_STRING("passwordHint", "Old Hint")));
+        USER(&new,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_OBJECT("privileged",
+                                    SD_JSON_BUILD_PAIR_STRING("passwordHint", "New Hint")));
+        assert_se(user_record_self_changes_allowed(curr, new));
+
+        /* privileged section: not allowlisted */
+        USER(&curr,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_OBJECT("privileged",
+                                    SD_JSON_BUILD_PAIR_UNSIGNED("notInHardCodedList", 11111)));
+        USER(&new,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_OBJECT("privileged",
+                                    SD_JSON_BUILD_PAIR_UNSIGNED("notInHardCodedList", 99999)));
+        assert_se(!user_record_self_changes_allowed(curr, new));
+
+        /* privileged section: manually allowlisted */
+        USER(&curr,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_ARRAY("selfModifiablePrivileged", SD_JSON_BUILD_STRING("notInHardCodedList")),
+             SD_JSON_BUILD_PAIR_OBJECT("privileged",
+                                    SD_JSON_BUILD_PAIR_UNSIGNED("notInHardCodedList", 11111)));
+        USER(&new,
+             SD_JSON_BUILD_PAIR_STRING("userName", "test"),
+             SD_JSON_BUILD_PAIR_ARRAY("selfModifiablePrivileged", SD_JSON_BUILD_STRING("notInHardCodedList")),
+             SD_JSON_BUILD_PAIR_OBJECT("privileged",
+                                    SD_JSON_BUILD_PAIR_UNSIGNED("notInHardCodedList", 99999)));
+        assert_se(user_record_self_changes_allowed(curr, new));
+}
+
+DEFINE_TEST_MAIN(LOG_INFO);