summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-02-09 11:14:51 +0100
committerThomas Haller <thaller@redhat.com>2019-02-14 08:00:29 +0100
commitd93845e2c2c67349abcfc1f5377d820f02247b8b (patch)
tree1783426d6408ff5fd2c19e9641a36a8f396620ef
parent28c53ea37ee7e83cbb16c4e15959b6b177f733cf (diff)
downloadNetworkManager-d93845e2c2c67349abcfc1f5377d820f02247b8b.tar.gz
libnm: add internal _nm_utils_secret_flags_validate() util
-rw-r--r--libnm-core/nm-utils-private.h6
-rw-r--r--libnm-core/nm-utils.c56
2 files changed, 62 insertions, 0 deletions
diff --git a/libnm-core/nm-utils-private.h b/libnm-core/nm-utils-private.h
index b61260cb22..46af26ed02 100644
--- a/libnm-core/nm-utils-private.h
+++ b/libnm-core/nm-utils-private.h
@@ -41,6 +41,12 @@ struct _NMVariantAttributeSpec {
gboolean _nm_utils_string_slist_validate (GSList *list,
const char **valid_values);
+gboolean _nm_utils_secret_flags_validate (NMSettingSecretFlags secret_flags,
+ const char *setting_name,
+ const char *property_name,
+ NMSettingSecretFlags disallowed_flags,
+ GError **error);
+
gboolean _nm_utils_wps_method_validate (NMSettingWirelessSecurityWpsMethod wps_method,
const char *setting_name,
const char *property_name,
diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c
index f2d0e94fe5..b5f9fb8676 100644
--- a/libnm-core/nm-utils.c
+++ b/libnm-core/nm-utils.c
@@ -4309,6 +4309,62 @@ _nm_utils_hwaddr_from_dbus (GVariant *dbus_value,
/*****************************************************************************/
+/* Validate secret-flags. Most settings don't validate them, which is a bug.
+ * But we possibly cannot enforce a strict validation now.
+ *
+ * For new settings, they shall validate the secret-flags strictly. */
+gboolean
+_nm_utils_secret_flags_validate (NMSettingSecretFlags secret_flags,
+ const char *setting_name,
+ const char *property_name,
+ NMSettingSecretFlags disallowed_flags,
+ GError **error)
+{
+ if (secret_flags == NM_SETTING_SECRET_FLAG_NONE)
+ return TRUE;
+
+ if (NM_FLAGS_ANY (secret_flags, ~NM_SETTING_SECRET_FLAG_ALL)) {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("unknown secret flags"));
+ if (setting_name)
+ g_prefix_error (error, "%s.%s: ", setting_name, property_name);
+ return FALSE;
+ }
+
+ if (!nm_utils_is_power_of_two (secret_flags)) {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("conflicting secret flags"));
+ if (setting_name)
+ g_prefix_error (error, "%s.%s: ", setting_name, property_name);
+ return FALSE;
+ }
+
+ if (NM_FLAGS_ANY (secret_flags, disallowed_flags)) {
+ if (NM_FLAGS_HAS (secret_flags, NM_SETTING_SECRET_FLAG_NOT_REQUIRED)) {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("secret flags must not be \"not-required\""));
+ if (setting_name)
+ g_prefix_error (error, "%s.%s: ", setting_name, property_name);
+ return FALSE;
+ }
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("unsupported secret flags"));
+ if (setting_name)
+ g_prefix_error (error, "%s.%s: ", setting_name, property_name);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
gboolean
_nm_utils_wps_method_validate (NMSettingWirelessSecurityWpsMethod wps_method,
const char *setting_name,