Merge pull request #19941 from bluca/condition_os_release
core: add ConditionOSRelease= directive
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
#include "log.h"
|
||||
#include "macro.h"
|
||||
#include "nulstr-util.h"
|
||||
#include "os-util.h"
|
||||
#include "process-util.h"
|
||||
#include "selinux-util.h"
|
||||
#include "set.h"
|
||||
@@ -890,6 +891,150 @@ static void test_condition_test_environment(void) {
|
||||
test_condition_test_environment_one("EXISTINGENVVAR=", false);
|
||||
}
|
||||
|
||||
static void test_condition_test_os_release(void) {
|
||||
_cleanup_strv_free_ char **os_release_pairs = NULL;
|
||||
_cleanup_free_ char *version_id = NULL;
|
||||
const char *key_value_pair;
|
||||
Condition *condition;
|
||||
|
||||
/* Should not happen, but it's a test so we don't know the environment. */
|
||||
if (load_os_release_pairs(NULL, &os_release_pairs) < 0)
|
||||
return;
|
||||
if (strv_length(os_release_pairs) < 2)
|
||||
return;
|
||||
|
||||
condition = condition_new(CONDITION_OS_RELEASE, "_THISHOPEFULLYWONTEXIST=01234 56789", false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == 0);
|
||||
condition_free(condition);
|
||||
|
||||
condition = condition_new(CONDITION_OS_RELEASE, "WRONG FORMAT", false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == -EINVAL);
|
||||
condition_free(condition);
|
||||
|
||||
condition = condition_new(CONDITION_OS_RELEASE, "WRONG!<>=FORMAT", false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == -EINVAL);
|
||||
condition_free(condition);
|
||||
|
||||
condition = condition_new(CONDITION_OS_RELEASE, "WRONG FORMAT=", false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == -EINVAL);
|
||||
condition_free(condition);
|
||||
|
||||
condition = condition_new(CONDITION_OS_RELEASE, "WRONG =FORMAT", false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == -EINVAL);
|
||||
condition_free(condition);
|
||||
|
||||
condition = condition_new(CONDITION_OS_RELEASE, "WRONG = FORMAT", false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == -EINVAL);
|
||||
condition_free(condition);
|
||||
|
||||
condition = condition_new(CONDITION_OS_RELEASE, "WRONGFORMAT= ", false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == -EINVAL);
|
||||
condition_free(condition);
|
||||
|
||||
condition = condition_new(CONDITION_OS_RELEASE, "WRO NG=FORMAT", false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == -EINVAL);
|
||||
condition_free(condition);
|
||||
|
||||
condition = condition_new(CONDITION_OS_RELEASE, "", false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ));
|
||||
condition_free(condition);
|
||||
|
||||
/* load_os_release_pairs() removes quotes, we have to add them back,
|
||||
* otherwise we get a string: "PRETTY_NAME=Debian GNU/Linux 10 (buster)"
|
||||
* which is wrong, as the value is not quoted anymore. */
|
||||
const char *quote = strchr(os_release_pairs[1], ' ') ? "\"" : "";
|
||||
key_value_pair = strjoina(os_release_pairs[0], "=", quote, os_release_pairs[1], quote);
|
||||
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ));
|
||||
condition_free(condition);
|
||||
|
||||
key_value_pair = strjoina(os_release_pairs[0], "!=", quote, os_release_pairs[1], quote);
|
||||
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == 0);
|
||||
condition_free(condition);
|
||||
|
||||
/* Some distros (eg: Arch) do not set VERSION_ID */
|
||||
if (parse_os_release(NULL, "VERSION_ID", &version_id) <= 0)
|
||||
return;
|
||||
|
||||
key_value_pair = strjoina("VERSION_ID", "=", version_id);
|
||||
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ));
|
||||
condition_free(condition);
|
||||
|
||||
key_value_pair = strjoina("VERSION_ID", "!=", version_id);
|
||||
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == 0);
|
||||
condition_free(condition);
|
||||
|
||||
key_value_pair = strjoina("VERSION_ID", "<=", version_id);
|
||||
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ));
|
||||
condition_free(condition);
|
||||
|
||||
key_value_pair = strjoina("VERSION_ID", ">=", version_id);
|
||||
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ));
|
||||
condition_free(condition);
|
||||
|
||||
key_value_pair = strjoina("VERSION_ID", "<", version_id, ".1");
|
||||
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ));
|
||||
condition_free(condition);
|
||||
|
||||
key_value_pair = strjoina("VERSION_ID", ">", version_id, ".1");
|
||||
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == 0);
|
||||
condition_free(condition);
|
||||
|
||||
key_value_pair = strjoina("VERSION_ID", "=", version_id, " ", os_release_pairs[0], "=", quote, os_release_pairs[1], quote);
|
||||
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ));
|
||||
condition_free(condition);
|
||||
|
||||
key_value_pair = strjoina("VERSION_ID", "!=", version_id, " ", os_release_pairs[0], "=", quote, os_release_pairs[1], quote);
|
||||
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == 0);
|
||||
condition_free(condition);
|
||||
|
||||
key_value_pair = strjoina("VERSION_ID", "=", version_id, " ", os_release_pairs[0], "!=", quote, os_release_pairs[1], quote);
|
||||
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == 0);
|
||||
condition_free(condition);
|
||||
|
||||
key_value_pair = strjoina("VERSION_ID", "!=", version_id, " ", os_release_pairs[0], "!=", quote, os_release_pairs[1], quote);
|
||||
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ) == 0);
|
||||
condition_free(condition);
|
||||
|
||||
key_value_pair = strjoina("VERSION_ID", "<", version_id, ".1", " ", os_release_pairs[0], "=", quote, os_release_pairs[1], quote);
|
||||
condition = condition_new(CONDITION_OS_RELEASE, key_value_pair, false, false);
|
||||
assert_se(condition);
|
||||
assert_se(condition_test(condition, environ));
|
||||
condition_free(condition);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
test_setup_logging(LOG_DEBUG);
|
||||
|
||||
@@ -912,6 +1057,7 @@ int main(int argc, char *argv[]) {
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
test_condition_test_cpufeature();
|
||||
#endif
|
||||
test_condition_test_os_release();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -482,6 +482,58 @@ static void test_extract_first_word(void) {
|
||||
assert_se(extract_first_word(&p, &t, ",", EXTRACT_UNQUOTE) > 0);
|
||||
assert_se(streq(t, "context=system_u:object_r:svirt_sandbox_file_t:s0:c0,c1"));
|
||||
free(t);
|
||||
|
||||
p = "a:b";
|
||||
assert_se(extract_first_word(&p, &t, ":", EXTRACT_RETAIN_SEPARATORS) == 1);
|
||||
assert_se(streq(t, "a"));
|
||||
assert_se(streq(p, ":b"));
|
||||
free(t);
|
||||
assert_se(extract_first_word(&p, &t, ":", EXTRACT_RETAIN_SEPARATORS) == 1);
|
||||
assert_se(streq(t, "b"));
|
||||
free(t);
|
||||
|
||||
p = "a>:b";
|
||||
assert_se(extract_first_word(&p, &t, ">:", EXTRACT_RETAIN_SEPARATORS) == 1);
|
||||
assert_se(streq(t, "a"));
|
||||
assert_se(streq(p, ">:b"));
|
||||
free(t);
|
||||
assert_se(extract_first_word(&p, &t, ">:", EXTRACT_RETAIN_SEPARATORS) == 1);
|
||||
assert_se(streq(t, "b"));
|
||||
free(t);
|
||||
|
||||
p = "a>:b";
|
||||
assert_se(extract_first_word(&p, &t, ">:", EXTRACT_RETAIN_SEPARATORS|EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
|
||||
assert_se(streq(t, "a"));
|
||||
assert_se(streq(p, ">:b"));
|
||||
free(t);
|
||||
assert_se(extract_first_word(&p, &t, ">:", EXTRACT_RETAIN_SEPARATORS|EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
|
||||
assert_se(streq(t, ""));
|
||||
assert_se(streq(p, ">:b"));
|
||||
free(t);
|
||||
|
||||
p = "a\\:b";
|
||||
assert_se(extract_first_word(&p, &t, ":", EXTRACT_RETAIN_SEPARATORS|EXTRACT_RETAIN_ESCAPE) == 1);
|
||||
assert_se(streq(t, "a\\"));
|
||||
assert_se(streq(p, ":b"));
|
||||
free(t);
|
||||
|
||||
p = "a\\:b";
|
||||
assert_se(extract_first_word(&p, &t, ":", EXTRACT_RETAIN_SEPARATORS) == 1);
|
||||
assert_se(streq(t, "a:b"));
|
||||
assert_se(!p);
|
||||
free(t);
|
||||
|
||||
p = "a\\:b";
|
||||
assert_se(extract_first_word(&p, &t, ":", EXTRACT_RETAIN_SEPARATORS|EXTRACT_UNESCAPE_SEPARATORS) == 1);
|
||||
assert_se(streq(t, "a:b"));
|
||||
assert_se(!p);
|
||||
free(t);
|
||||
|
||||
p = "a\\:a:b";
|
||||
assert_se(extract_first_word(&p, &t, ":", EXTRACT_RETAIN_SEPARATORS|EXTRACT_UNESCAPE_SEPARATORS) == 1);
|
||||
assert_se(streq(t, "a:a"));
|
||||
assert_se(streq(p, ":b"));
|
||||
free(t);
|
||||
}
|
||||
|
||||
static void test_extract_first_word_and_warn(void) {
|
||||
|
||||
Reference in New Issue
Block a user