keyfile: don't hack certain properties to be skipped in reader

For writer there is no such hack either. The property-info table
should describe whether to skip a property or not.
This commit is contained in:
Thomas Haller
2018-04-16 15:12:38 +02:00
parent 8c4ce431a6
commit 3b03b2caee

View File

@@ -2001,6 +2001,7 @@ typedef struct {
NMSetting *setting, NMSetting *setting,
const char *key, const char *key,
const GValue *value); const GValue *value);
bool parser_skip;
bool parser_no_check_key:1; bool parser_no_check_key:1;
bool writer_skip:1; bool writer_skip:1;
@@ -2117,6 +2118,7 @@ static const ParseInfoSetting parse_infos[] = {
PARSE_INFO_SETTING (NM_SETTING_CONNECTION_SETTING_NAME, PARSE_INFO_SETTING (NM_SETTING_CONNECTION_SETTING_NAME,
PARSE_INFO_PROPERTIES ( PARSE_INFO_PROPERTIES (
PARSE_INFO_PROPERTY (NM_SETTING_CONNECTION_READ_ONLY, PARSE_INFO_PROPERTY (NM_SETTING_CONNECTION_READ_ONLY,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_CONNECTION_TYPE, PARSE_INFO_PROPERTY (NM_SETTING_CONNECTION_TYPE,
@@ -2209,48 +2211,63 @@ static const ParseInfoSetting parse_infos[] = {
.parser = team_config_parser, .parser = team_config_parser,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_LINK_WATCHERS, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_LINK_WATCHERS,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_MCAST_REJOIN_COUNT, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_MCAST_REJOIN_COUNT,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_MCAST_REJOIN_INTERVAL, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_MCAST_REJOIN_INTERVAL,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_NOTIFY_PEERS_COUNT, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_NOTIFY_PEERS_COUNT,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_NOTIFY_PEERS_INTERVAL, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_NOTIFY_PEERS_INTERVAL,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_ACTIVE, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_ACTIVE,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_AGG_SELECT_POLICY, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_AGG_SELECT_POLICY,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_FAST_RATE, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_FAST_RATE,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_HWADDR_POLICY, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_HWADDR_POLICY,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_MIN_PORTS, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_MIN_PORTS,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_SYS_PRIO, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_SYS_PRIO,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_TX_BALANCER, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_TX_BALANCER,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_TX_BALANCER_INTERVAL, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_TX_BALANCER_INTERVAL,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_TX_HASH, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_RUNNER_TX_HASH,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
), ),
@@ -2261,21 +2278,27 @@ static const ParseInfoSetting parse_infos[] = {
.parser = team_config_parser, .parser = team_config_parser,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_LACP_KEY, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_LACP_KEY,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_LACP_PRIO, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_LACP_PRIO,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_LINK_WATCHERS, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_LINK_WATCHERS,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_PRIO, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_PRIO,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_QUEUE_ID, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_QUEUE_ID,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_STICKY, PARSE_INFO_PROPERTY (NM_SETTING_TEAM_PORT_STICKY,
.parser_skip = TRUE,
.writer_skip = TRUE, .writer_skip = TRUE,
), ),
), ),
@@ -2402,30 +2425,20 @@ read_one_setting_value (NMSetting *setting,
if (info->error) if (info->error)
return; return;
/* Property is not writable */
if (!(flags & G_PARAM_WRITABLE)) if (!(flags & G_PARAM_WRITABLE))
return; return;
/* Setting name gets picked up from the keyfile's section name instead */
if (!strcmp (key, NM_SETTING_NAME))
return;
/* Don't read the NMSettingConnection object's 'read-only' property */
if ( NM_IS_SETTING_CONNECTION (setting)
&& !strcmp (key, NM_SETTING_CONNECTION_READ_ONLY))
return;
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"). */
return;
}
setting_name = nm_setting_get_name (setting); setting_name = nm_setting_get_name (setting);
pip = _parse_info_find (setting_name, key); pip = _parse_info_find (setting_name, key);
if ( !pip
&& nm_streq (key, NM_SETTING_NAME))
return;
if (pip && pip->parser_skip)
return;
/* Check for the exact key in the GKeyFile if required. Most setting /* 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 * properties map 1:1 to a key in the GKeyFile, but for those properties
* like IP addresses and routes where more than one value is actually * like IP addresses and routes where more than one value is actually
@@ -2789,15 +2802,20 @@ write_setting_value (NMSetting *setting,
if (info->error) if (info->error)
return; 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); setting_name = nm_setting_get_name (setting);
pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), key); pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), key);
nm_assert (pspec); 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 /* 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 * supposed to be saved. VPN secrets are handled specially though since
* the secret flags there are in a third-level hash in the 'secrets' * the secret flags there are in a third-level hash in the 'secrets'
@@ -2813,10 +2831,6 @@ write_setting_value (NMSetting *setting,
return; return;
} }
pip = _parse_info_find (setting_name, key);
if (pip && pip->writer_skip)
return;
if ( (!pip || !pip->writer_persist_default) if ( (!pip || !pip->writer_persist_default)
&& g_param_value_defaults (pspec, (GValue *) value)) { && g_param_value_defaults (pspec, (GValue *) value)) {
nm_assert (!g_key_file_has_key (info->keyfile, setting_name, key, NULL)); nm_assert (!g_key_file_has_key (info->keyfile, setting_name, key, NULL));