| 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
| 2 | /* |
| 3 | * Copyright (C) 2007 - 2011 Red Hat, Inc. |
| 4 | * Copyright (C) 2007 - 2008 Novell, Inc. |
| 5 | */ |
| 6 | |
| 7 | #ifndef __NM_SETTING_H__ |
| 8 | #define __NM_SETTING_H__ |
| 9 | |
| 10 | #if !defined(__NETWORKMANAGER_H_INSIDE__) && !defined(NETWORKMANAGER_COMPILATION) |
| 11 | #error "Only <NetworkManager.h> can be included directly." |
| 12 | #endif |
| 13 | |
| 14 | #include "nm-core-types.h" |
| 15 | |
| 16 | G_BEGIN_DECLS |
| 17 | |
| 18 | #define NM_TYPE_SETTING (nm_setting_get_type()) |
| 19 | #define NM_SETTING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_SETTING, NMSetting)) |
| 20 | #define NM_SETTING_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_SETTING, NMSettingClass)) |
| 21 | #define NM_IS_SETTING(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_SETTING)) |
| 22 | #define NM_IS_SETTING_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_SETTING)) |
| 23 | #define NM_SETTING_GET_CLASS(obj) \ |
| 24 | (G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_SETTING, NMSettingClass)) |
| 25 | |
| 26 | /* The property of the #NMSetting is required for the setting to be valid */ |
| 27 | #define NM_SETTING_PARAM_REQUIRED (1 << (1 + G_PARAM_USER_SHIFT)) |
| 28 | |
| 29 | /* The property of the #NMSetting is a secret */ |
| 30 | #define NM_SETTING_PARAM_SECRET (1 << (2 + G_PARAM_USER_SHIFT)) |
| 31 | |
| 32 | /* The property of the #NMSetting should be ignored during comparisons that |
| 33 | * use the %NM_SETTING_COMPARE_FLAG_FUZZY flag. |
| 34 | */ |
| 35 | #define NM_SETTING_PARAM_FUZZY_IGNORE (1 << (3 + G_PARAM_USER_SHIFT)) |
| 36 | |
| 37 | /* Note: all non-glib GParamFlags bits are reserved by NetworkManager */ |
| 38 | |
| 39 | #define NM_SETTING_NAME "name" |
| 40 | |
| 41 | /** |
| 42 | * NMSettingSecretFlags: |
| 43 | * @NM_SETTING_SECRET_FLAG_NONE: the system is responsible for providing and |
| 44 | * storing this secret (default) |
| 45 | * @NM_SETTING_SECRET_FLAG_AGENT_OWNED: a user secret agent is responsible |
| 46 | * for providing and storing this secret; when it is required agents will be |
| 47 | * asked to retrieve it |
| 48 | * @NM_SETTING_SECRET_FLAG_NOT_SAVED: this secret should not be saved, but |
| 49 | * should be requested from the user each time it is needed |
| 50 | * @NM_SETTING_SECRET_FLAG_NOT_REQUIRED: in situations where it cannot be |
| 51 | * automatically determined that the secret is required (some VPNs and PPP |
| 52 | * providers don't require all secrets) this flag indicates that the specific |
| 53 | * secret is not required |
| 54 | * |
| 55 | * These flags indicate specific behavior related to handling of a secret. Each |
| 56 | * secret has a corresponding set of these flags which indicate how the secret |
| 57 | * is to be stored and/or requested when it is needed. |
| 58 | * |
| 59 | **/ |
| 60 | typedef enum { /*< flags >*/ |
| 61 | NM_SETTING_SECRET_FLAG_NONE = 0x00000000, |
| 62 | NM_SETTING_SECRET_FLAG_AGENT_OWNED = 0x00000001, |
| 63 | NM_SETTING_SECRET_FLAG_NOT_SAVED = 0x00000002, |
| 64 | NM_SETTING_SECRET_FLAG_NOT_REQUIRED = 0x00000004 |
| 65 | |
| 66 | /* NOTE: if adding flags, update nm-core-internal.h as well */ |
| 67 | } NMSettingSecretFlags; |
| 68 | |
| 69 | /** |
| 70 | * NMSettingCompareFlags: |
| 71 | * @NM_SETTING_COMPARE_FLAG_EXACT: match all properties exactly |
| 72 | * @NM_SETTING_COMPARE_FLAG_FUZZY: match only important attributes, like SSID, |
| 73 | * type, security settings, etc. Does not match, for example, connection ID |
| 74 | * or UUID. |
| 75 | * @NM_SETTING_COMPARE_FLAG_IGNORE_ID: ignore the connection's ID |
| 76 | * @NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS: ignore all secrets |
| 77 | * @NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS: ignore secrets for which |
| 78 | * the secret's flags indicate the secret is owned by a user secret agent |
| 79 | * (ie, the secret's flag includes @NM_SETTING_SECRET_FLAG_AGENT_OWNED) |
| 80 | * @NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS: ignore secrets for which |
| 81 | * the secret's flags indicate the secret should not be saved to persistent |
| 82 | * storage (ie, the secret's flag includes @NM_SETTING_SECRET_FLAG_NOT_SAVED) |
| 83 | * @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT: if this flag is set, |
| 84 | * nm_setting_diff() and nm_connection_diff() will also include properties that |
| 85 | * are set to their default value. See also @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT. |
| 86 | * @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT: if this flag is set, |
| 87 | * nm_setting_diff() and nm_connection_diff() will not include properties that |
| 88 | * are set to their default value. This is the opposite of |
| 89 | * @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT. If both flags are set together, |
| 90 | * @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT wins. If both flags are unset, |
| 91 | * this means to exclude default properties if there is a setting to compare, |
| 92 | * but include all properties, if the setting 'b' is missing. This is the legacy |
| 93 | * behaviour of libnm-util, where nm_setting_diff() behaved differently depending |
| 94 | * on whether the setting 'b' was available. If @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT |
| 95 | * is set, nm_setting_diff() will also set the flags @NM_SETTING_DIFF_RESULT_IN_A_DEFAULT |
| 96 | * and @NM_SETTING_DIFF_RESULT_IN_B_DEFAULT, if the values are default values. |
| 97 | * @NM_SETTING_COMPARE_FLAG_IGNORE_TIMESTAMP: ignore the connection's timestamp |
| 98 | * |
| 99 | * These flags modify the comparison behavior when comparing two settings or |
| 100 | * two connections. |
| 101 | * |
| 102 | **/ |
| 103 | typedef enum { |
| 104 | NM_SETTING_COMPARE_FLAG_EXACT = 0x00000000, |
| 105 | NM_SETTING_COMPARE_FLAG_FUZZY = 0x00000001, |
| 106 | NM_SETTING_COMPARE_FLAG_IGNORE_ID = 0x00000002, |
| 107 | NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS = 0x00000004, |
| 108 | NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS = 0x00000008, |
| 109 | NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS = 0x00000010, |
| 110 | NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT = 0x00000020, |
| 111 | NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT = 0x00000040, |
| 112 | NM_SETTING_COMPARE_FLAG_IGNORE_TIMESTAMP = 0x00000080, |
| 113 | |
| 114 | /* Higher flags like 0x80000000 and 0x40000000 are used internally as private flags */ |
| 115 | } NMSettingCompareFlags; |
| 116 | |
| 117 | /** |
| 118 | * NMSettingMacRandomization: |
| 119 | * @NM_SETTING_MAC_RANDOMIZATION_DEFAULT: the default value, which unless |
| 120 | * overridden by user-controlled defaults configuration, is "never". |
| 121 | * @NM_SETTING_MAC_RANDOMIZATION_NEVER: the device's MAC address is always used. |
| 122 | * @NM_SETTING_MAC_RANDOMIZATION_ALWAYS: a random MAC address is used. |
| 123 | * |
| 124 | * Controls if and how the MAC address of a device is randomzied. |
| 125 | **/ |
| 126 | typedef enum { |
| 127 | NM_SETTING_MAC_RANDOMIZATION_DEFAULT = 0, |
| 128 | NM_SETTING_MAC_RANDOMIZATION_NEVER, |
| 129 | NM_SETTING_MAC_RANDOMIZATION_ALWAYS, |
| 130 | } NMSettingMacRandomization; |
| 131 | |
| 132 | /** |
| 133 | * NMSettingClearSecretsWithFlagsFn: |
| 134 | * @setting: The setting for which secrets are being iterated |
| 135 | * @secret: The secret's name |
| 136 | * @flags: The secret's flags, eg %NM_SETTING_SECRET_FLAG_AGENT_OWNED |
| 137 | * @user_data: User data passed to nm_connection_clear_secrets_with_flags() |
| 138 | * |
| 139 | * Returns: %TRUE to clear the secret, %FALSE to not clear the secret |
| 140 | */ |
| 141 | typedef gboolean (*NMSettingClearSecretsWithFlagsFn)(NMSetting *setting, |
| 142 | const char *secret, |
| 143 | NMSettingSecretFlags flags, |
| 144 | gpointer user_data); |
| 145 | |
| 146 | struct _NMMetaSettingInfo; |
| 147 | struct _NMSettInfoSetting; |
| 148 | struct _NMSettInfoProperty; |
| 149 | |
| 150 | /** |
| 151 | * NMSettingValueIterFn: |
| 152 | * @setting: The setting for which properties are being iterated, given to |
| 153 | * nm_setting_enumerate_values() |
| 154 | * @key: The value/property name |
| 155 | * @value: The property's value |
| 156 | * @flags: The property's flags, like %NM_SETTING_PARAM_SECRET |
| 157 | * @user_data: User data passed to nm_setting_enumerate_values() |
| 158 | */ |
| 159 | typedef void (*NMSettingValueIterFn)(NMSetting *setting, |
| 160 | const char *key, |
| 161 | const GValue *value, |
| 162 | GParamFlags flags, |
| 163 | gpointer user_data); |
| 164 | |
| 165 | /*< private >*/ |
| 166 | typedef gboolean (*_NMConnectionForEachSecretFunc)(NMSettingSecretFlags flags, gpointer user_data); |
| 167 | |
| 168 | typedef struct _NMSettingClass NMSettingClass; |
| 169 | |
| 170 | GType nm_setting_get_type(void); |
| 171 | |
| 172 | GType nm_setting_lookup_type(const char *name); |
| 173 | |
| 174 | NMSetting *nm_setting_duplicate(NMSetting *setting); |
| 175 | |
| 176 | const char *nm_setting_get_name(NMSetting *setting); |
| 177 | |
| 178 | gboolean nm_setting_verify(NMSetting *setting, NMConnection *connection, GError **error); |
| 179 | |
| 180 | NM_AVAILABLE_IN_1_2 |
| 181 | gboolean nm_setting_verify_secrets(NMSetting *setting, NMConnection *connection, GError **error); |
| 182 | |
| 183 | gboolean nm_setting_compare(NMSetting *a, NMSetting *b, NMSettingCompareFlags flags); |
| 184 | |
| 185 | /** |
| 186 | * NMSettingDiffResult: |
| 187 | * @NM_SETTING_DIFF_RESULT_UNKNOWN: unknown result |
| 188 | * @NM_SETTING_DIFF_RESULT_IN_A: the property is present in setting A |
| 189 | * @NM_SETTING_DIFF_RESULT_IN_B: the property is present in setting B |
| 190 | * @NM_SETTING_DIFF_RESULT_IN_A_DEFAULT: the property is present in |
| 191 | * setting A but is set to the default value. This flag is only set, |
| 192 | * if you specify @NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT. |
| 193 | * @NM_SETTING_DIFF_RESULT_IN_B_DEFAULT: analog to @NM_SETTING_DIFF_RESULT_IN_A_DEFAULT. |
| 194 | * |
| 195 | * These values indicate the result of a setting difference operation. |
| 196 | **/ |
| 197 | typedef enum { |
| 198 | NM_SETTING_DIFF_RESULT_UNKNOWN = 0x00000000, |
| 199 | NM_SETTING_DIFF_RESULT_IN_A = 0x00000001, |
| 200 | NM_SETTING_DIFF_RESULT_IN_B = 0x00000002, |
| 201 | NM_SETTING_DIFF_RESULT_IN_A_DEFAULT = 0x00000004, |
| 202 | NM_SETTING_DIFF_RESULT_IN_B_DEFAULT = 0x00000008, |
| 203 | } NMSettingDiffResult; |
| 204 | |
| 205 | gboolean nm_setting_diff(NMSetting *a, |
| 206 | NMSetting *b, |
| 207 | NMSettingCompareFlags flags, |
| 208 | gboolean invert_results, |
| 209 | GHashTable **results); |
| 210 | |
| 211 | void nm_setting_enumerate_values(NMSetting *setting, NMSettingValueIterFn func, gpointer user_data); |
| 212 | |
| 213 | char *nm_setting_to_string(NMSetting *setting); |
| 214 | |
| 215 | /*****************************************************************************/ |
| 216 | |
| 217 | gboolean nm_setting_get_secret_flags(NMSetting *setting, |
| 218 | const char *secret_name, |
| 219 | NMSettingSecretFlags *out_flags, |
| 220 | GError **error); |
| 221 | |
| 222 | gboolean nm_setting_set_secret_flags(NMSetting *setting, |
| 223 | const char *secret_name, |
| 224 | NMSettingSecretFlags flags, |
| 225 | GError **error); |
| 226 | |
| 227 | /*****************************************************************************/ |
| 228 | |
| 229 | NM_AVAILABLE_IN_1_26 |
| 230 | GVariant *nm_setting_option_get(NMSetting *setting, const char *opt_name); |
| 231 | |
| 232 | NM_AVAILABLE_IN_1_26 |
| 233 | gboolean |
| 234 | nm_setting_option_get_boolean(NMSetting *setting, const char *opt_name, gboolean *out_value); |
| 235 | |
| 236 | NM_AVAILABLE_IN_1_26 |
| 237 | gboolean nm_setting_option_get_uint32(NMSetting *setting, const char *opt_name, guint32 *out_value); |
| 238 | |
| 239 | NM_AVAILABLE_IN_1_26 |
| 240 | void nm_setting_option_set(NMSetting *setting, const char *opt_name, GVariant *variant); |
| 241 | |
| 242 | NM_AVAILABLE_IN_1_26 |
| 243 | void nm_setting_option_set_uint32(NMSetting *setting, const char *opt_name, guint32 value); |
| 244 | |
| 245 | NM_AVAILABLE_IN_1_26 |
| 246 | void nm_setting_option_set_boolean(NMSetting *setting, const char *opt_name, gboolean value); |
| 247 | |
| 248 | NM_AVAILABLE_IN_1_26 |
| 249 | const char *const *nm_setting_option_get_all_names(NMSetting *setting, guint *out_len); |
| 250 | |
| 251 | NM_AVAILABLE_IN_1_26 |
| 252 | void nm_setting_option_clear_by_name(NMSetting *setting, NMUtilsPredicateStr predicate); |
| 253 | |
| 254 | /*****************************************************************************/ |
| 255 | |
| 256 | const GVariantType *nm_setting_get_dbus_property_type(NMSetting *setting, |
| 257 | const char *property_name); |
| 258 | |
| 259 | /*****************************************************************************/ |
| 260 | |
| 261 | G_END_DECLS |
| 262 | |
| 263 | #endif /* __NM_SETTING_H__ */ |
| 264 | |