From 3f187e6a1cfd7e95e629adac64be9f8f6367b8d2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 16 Apr 2018 15:12:38 +0200 Subject: keyfile: don't hack certain properties to be skipped in reader For write there is no such a hack either. The property-info table should describe whether to skip a property or not. --- libnm-core/nm-keyfile.c | 62 ++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/libnm-core/nm-keyfile.c b/libnm-core/nm-keyfile.c index b102e2dd01..40bf89daff 100644 --- a/libnm-core/nm-keyfile.c +++ b/libnm-core/nm-keyfile.c @@ -2001,6 +2001,7 @@ typedef struct { NMSetting *setting, const char *key, const GValue *value); + bool parser_skip; bool parser_no_check_key:1; bool writer_skip:1; @@ -2117,6 +2118,7 @@ static const ParseInfoSetting parse_infos[] = { PARSE_INFO_SETTING (NM_SETTING_CONNECTION_SETTING_NAME, PARSE_INFO_PROPERTIES ( PARSE_INFO_PROPERTY (NM_SETTING_CONNECTION_READ_ONLY, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_CONNECTION_TYPE, @@ -2209,48 +2211,63 @@ static const ParseInfoSetting parse_infos[] = { .parser = team_config_parser, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_LINK_WATCHERS, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_MCAST_REJOIN_COUNT, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_MCAST_REJOIN_INTERVAL, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_NOTIFY_PEERS_COUNT, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_NOTIFY_PEERS_INTERVAL, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_ACTIVE, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_AGG_SELECT_POLICY, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_FAST_RATE, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_HWADDR_POLICY, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_MIN_PORTS, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_SYS_PRIO, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_TX_BALANCER, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_TX_BALANCER_INTERVAL, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_TX_HASH, + .parser_skip = TRUE, .writer_skip = TRUE, ), ), @@ -2261,21 +2278,27 @@ static const ParseInfoSetting parse_infos[] = { .parser = team_config_parser, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_LACP_KEY, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_LACP_PRIO, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_LINK_WATCHERS, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_PRIO, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_QUEUE_ID, + .parser_skip = TRUE, .writer_skip = TRUE, ), PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_STICKY, + .parser_skip = TRUE, .writer_skip = TRUE, ), ), @@ -2402,29 +2425,19 @@ read_one_setting_value (NMSetting *setting, if (info->error) return; - /* Property is not writable */ if (!(flags & G_PARAM_WRITABLE)) return; - /* Setting name gets picked up from the keyfile's section name instead */ - if (!strcmp (key, NM_SETTING_NAME)) - return; + setting_name = nm_setting_get_name (setting); - /* Don't read the NMSettingConnection object's 'read-only' property */ - if ( NM_IS_SETTING_CONNECTION (setting) - && !strcmp (key, NM_SETTING_CONNECTION_READ_ONLY)) - return; + pip = _parse_info_find (setting_name, key); - if ( ( NM_IS_SETTING_TEAM (setting) - || NM_IS_SETTING_TEAM_PORT (setting)) - && !NM_IN_STRSET (key, NM_SETTING_TEAM_CONFIG)) { - /* silently ignore all team properties (except "config"). */ + if ( !pip + && nm_streq (key, NM_SETTING_NAME)) return; - } - setting_name = nm_setting_get_name (setting); - - pip = _parse_info_find (setting_name, key); + if (pip && pip->parser_skip) + return; /* Check for the exact key in the GKeyFile if required. Most setting * properties map 1:1 to a key in the GKeyFile, but for those properties @@ -2789,15 +2802,20 @@ write_setting_value (NMSetting *setting, if (info->error) return; - /* Setting name gets picked up from the keyfile's section name instead */ - if (nm_streq (key, NM_SETTING_NAME)) - return; - setting_name = nm_setting_get_name (setting); pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), key); nm_assert (pspec); + pip = _parse_info_find (setting_name, key); + + if ( !pip + && nm_streq (key, NM_SETTING_NAME)) + return; + + if (pip && pip->writer_skip) + return; + /* Don't write secrets that are owned by user secret agents or aren't * supposed to be saved. VPN secrets are handled specially though since * the secret flags there are in a third-level hash in the 'secrets' @@ -2813,10 +2831,6 @@ write_setting_value (NMSetting *setting, return; } - pip = _parse_info_find (setting_name, key); - if (pip && pip->writer_skip) - return; - if ( (!pip || !pip->writer_persist_default) && g_param_value_defaults (pspec, (GValue *) value)) { nm_assert (!g_key_file_has_key (info->keyfile, setting_name, key, NULL)); -- cgit v1.2.1