diff options
author | Anita Zhang <the.anitazha@gmail.com> | 2020-05-04 17:48:13 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-04 17:48:13 -0700 |
commit | 848cfa74d275180c1c74213c4abc2ba04170e053 (patch) | |
tree | 9a46d1ae715380f7464f8e70e6adfebd392a0377 | |
parent | 53491f7fe7d203a514b001a7b3866521e936f7b9 (diff) | |
parent | 560a3e5dd6ff12cfbe1cedfa8838dd8423a0dadd (diff) | |
download | systemd-848cfa74d275180c1c74213c4abc2ba04170e053.tar.gz |
Merge pull request #15636 from poettering/sensitivity-training
be more careful when setting json variant + dbus message sensitive flag
-rw-r--r-- | src/home/home-util.c | 2 | ||||
-rw-r--r-- | src/home/homectl.c | 4 | ||||
-rw-r--r-- | src/home/user-record-util.c | 9 | ||||
-rw-r--r-- | src/shared/json.c | 31 | ||||
-rw-r--r-- | src/shared/json.h | 1 |
5 files changed, 45 insertions, 2 deletions
diff --git a/src/home/home-util.c b/src/home/home-util.c index 69ab645484..51406fd234 100644 --- a/src/home/home-util.c +++ b/src/home/home-util.c @@ -124,6 +124,8 @@ int bus_message_append_secret(sd_bus_message *m, UserRecord *secret) { if (r < 0) return r; + (void) sd_bus_message_sensitive(m); + return sd_bus_message_append(m, "s", formatted); } diff --git a/src/home/homectl.c b/src/home/homectl.c index 9b614325a5..c98bf8b540 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -1435,6 +1435,8 @@ static int create_home(int argc, char *argv[], void *userdata) { if (r < 0) return bus_log_create_error(r); + (void) sd_bus_message_sensitive(m); + r = sd_bus_message_append(m, "s", formatted); if (r < 0) return bus_log_create_error(r); @@ -1637,6 +1639,8 @@ static int update_home(int argc, char *argv[], void *userdata) { if (r < 0) return r; + (void) sd_bus_message_sensitive(m); + r = sd_bus_message_append(m, "s", formatted); if (r < 0) return bus_log_create_error(r); diff --git a/src/home/user-record-util.c b/src/home/user-record-util.c index c4a0d95081..430a952e6f 100644 --- a/src/home/user-record-util.c +++ b/src/home/user-record-util.c @@ -840,6 +840,8 @@ int user_record_set_password(UserRecord *h, char **password, bool prepend) { if (r < 0) return r; + json_variant_sensitive(w); + r = json_variant_set_field(&h->json, "secret", w); if (r < 0) return r; @@ -900,6 +902,8 @@ int user_record_set_pkcs11_pin(UserRecord *h, char **pin, bool prepend) { if (r < 0) return r; + json_variant_sensitive(w); + r = json_variant_set_field(&h->json, "secret", w); if (r < 0) return r; @@ -927,8 +931,11 @@ int user_record_set_pkcs11_protected_authentication_path_permitted(UserRecord *h if (json_variant_is_blank_object(w)) r = json_variant_filter(&h->json, STRV_MAKE("secret")); - else + else { + json_variant_sensitive(w); + r = json_variant_set_field(&h->json, "secret", w); + } if (r < 0) return r; diff --git a/src/shared/json.c b/src/shared/json.c index 132dda14fc..330ad456ee 100644 --- a/src/shared/json.c +++ b/src/shared/json.c @@ -1396,6 +1396,19 @@ void json_variant_sensitive(JsonVariant *v) { v->sensitive = true; } +bool json_variant_is_sensitive(JsonVariant *v) { + v = json_variant_formalize(v); + if (!json_variant_is_regular(v)) + return false; + + return v->sensitive; +} + +static void json_variant_propagate_sensitive(JsonVariant *from, JsonVariant *to) { + if (json_variant_is_sensitive(from)) + json_variant_sensitive(to); +} + int json_variant_get_source(JsonVariant *v, const char **ret_source, unsigned *ret_line, unsigned *ret_column) { assert_return(v, -EINVAL); @@ -1829,6 +1842,8 @@ int json_variant_filter(JsonVariant **v, char **to_remove) { if (r < 0) return r; + json_variant_propagate_sensitive(*v, w); + json_variant_unref(*v); *v = TAKE_PTR(w); @@ -1898,6 +1913,8 @@ int json_variant_set_field(JsonVariant **v, const char *field, JsonVariant *valu if (r < 0) return r; + json_variant_propagate_sensitive(*v, w); + json_variant_unref(*v); *v = TAKE_PTR(w); @@ -2005,6 +2022,9 @@ int json_variant_merge(JsonVariant **v, JsonVariant *m) { if (r < 0) return r; + json_variant_propagate_sensitive(*v, w); + json_variant_propagate_sensitive(m, w); + json_variant_unref(*v); *v = TAKE_PTR(w); @@ -2044,10 +2064,11 @@ int json_variant_append_array(JsonVariant **v, JsonVariant *element) { r = json_variant_new_array(&nv, array, i + 1); } - if (r < 0) return r; + json_variant_propagate_sensitive(*v, nv); + json_variant_unref(*v); *v = TAKE_PTR(nv); @@ -2193,6 +2214,8 @@ static int json_variant_copy(JsonVariant **nv, JsonVariant *v) { memcpy_safe(&c->value, source, k); + json_variant_propagate_sensitive(v, c); + *nv = c; return 0; } @@ -4178,6 +4201,9 @@ int json_variant_sort(JsonVariant **v) { r = json_variant_new_object(&n, a, m); if (r < 0) return r; + + json_variant_propagate_sensitive(*v, n); + if (!n->sorted) /* Check if this worked. This will fail if there are multiple identical keys used. */ return -ENOTUNIQ; @@ -4226,6 +4252,9 @@ int json_variant_normalize(JsonVariant **v) { } if (r < 0) goto finish; + + json_variant_propagate_sensitive(*v, n); + if (!n->normalized) { /* Let's see if normalization worked. It will fail if there are multiple * identical keys used in the same object anywhere, or if there are floating * point numbers used (see below) */ diff --git a/src/shared/json.h b/src/shared/json.h index a4e5b6f507..ceb01a2028 100644 --- a/src/shared/json.h +++ b/src/shared/json.h @@ -135,6 +135,7 @@ JsonVariant *json_variant_by_key_full(JsonVariant *v, const char *key, JsonVaria bool json_variant_equal(JsonVariant *a, JsonVariant *b); void json_variant_sensitive(JsonVariant *v); +bool json_variant_is_sensitive(JsonVariant *v); struct json_variant_foreach_state { JsonVariant *variant; |