181 lines
6.7 KiB
C
181 lines
6.7 KiB
C
// SPDX-License-Identifier: LGPL-2.1+
|
|
|
|
#include "nm-default.h"
|
|
|
|
#include "nm-libnm-core-utils.h"
|
|
|
|
#include "nm-common-macros.h"
|
|
|
|
/*****************************************************************************/
|
|
|
|
gboolean
|
|
nm_utils_vlan_priority_map_parse_str (NMVlanPriorityMap map_type,
|
|
const char *str,
|
|
gboolean allow_wildcard_to,
|
|
guint32 *out_from,
|
|
guint32 *out_to,
|
|
gboolean *out_has_wildcard_to)
|
|
{
|
|
const char *s2;
|
|
gint64 v1, v2;
|
|
|
|
nm_assert (str);
|
|
|
|
s2 = strchr (str, ':');
|
|
|
|
if (!s2) {
|
|
if (!allow_wildcard_to)
|
|
return FALSE;
|
|
v1 = _nm_utils_ascii_str_to_int64 (str, 10, 0, G_MAXUINT32, -1);
|
|
v2 = -1;
|
|
} else {
|
|
gs_free char *s1_free = NULL;
|
|
gsize s1_len = (s2 - str);
|
|
|
|
s2 = nm_str_skip_leading_spaces (&s2[1]);
|
|
if ( s2[0] == '\0'
|
|
|| ( s2[0] == '*'
|
|
&& NM_STRCHAR_ALL (&s2[1], ch, g_ascii_isspace (ch)))) {
|
|
if (!allow_wildcard_to)
|
|
return FALSE;
|
|
v2 = -1;
|
|
} else {
|
|
v2 = _nm_utils_ascii_str_to_int64 (s2, 10, 0, G_MAXUINT32, -1);
|
|
if ( v2 < 0
|
|
|| (guint32) v2 > nm_utils_vlan_priority_map_get_max_prio (map_type, FALSE))
|
|
return FALSE;
|
|
}
|
|
|
|
v1 = _nm_utils_ascii_str_to_int64 (nm_strndup_a (100, str, s1_len, &s1_free),
|
|
10, 0, G_MAXUINT32, -1);
|
|
}
|
|
|
|
if ( v1 < 0
|
|
|| (guint32) v1 > nm_utils_vlan_priority_map_get_max_prio (map_type, TRUE))
|
|
return FALSE;
|
|
|
|
NM_SET_OUT (out_from, v1);
|
|
NM_SET_OUT (out_to, v2 < 0
|
|
? 0u
|
|
: (guint) v2);
|
|
NM_SET_OUT (out_has_wildcard_to, v2 < 0);
|
|
return TRUE;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
|
|
const char *const nm_auth_permission_names_by_idx[NM_CLIENT_PERMISSION_LAST] = {
|
|
[NM_CLIENT_PERMISSION_CHECKPOINT_ROLLBACK - 1] = NM_AUTH_PERMISSION_CHECKPOINT_ROLLBACK,
|
|
[NM_CLIENT_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK,
|
|
[NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK,
|
|
[NM_CLIENT_PERMISSION_ENABLE_DISABLE_STATISTICS - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_STATISTICS,
|
|
[NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI,
|
|
[NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_WIMAX,
|
|
[NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN,
|
|
[NM_CLIENT_PERMISSION_NETWORK_CONTROL - 1] = NM_AUTH_PERMISSION_NETWORK_CONTROL,
|
|
[NM_CLIENT_PERMISSION_RELOAD - 1] = NM_AUTH_PERMISSION_RELOAD,
|
|
[NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS - 1] = NM_AUTH_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS,
|
|
[NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME - 1] = NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME,
|
|
[NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN - 1] = NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN,
|
|
[NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM - 1] = NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM,
|
|
[NM_CLIENT_PERMISSION_SLEEP_WAKE - 1] = NM_AUTH_PERMISSION_SLEEP_WAKE,
|
|
[NM_CLIENT_PERMISSION_WIFI_SCAN - 1] = NM_AUTH_PERMISSION_WIFI_SCAN,
|
|
[NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN - 1] = NM_AUTH_PERMISSION_WIFI_SHARE_OPEN,
|
|
[NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED - 1] = NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED,
|
|
};
|
|
|
|
const NMClientPermission nm_auth_permission_sorted[NM_CLIENT_PERMISSION_LAST] = {
|
|
NM_CLIENT_PERMISSION_CHECKPOINT_ROLLBACK,
|
|
NM_CLIENT_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK,
|
|
NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK,
|
|
NM_CLIENT_PERMISSION_ENABLE_DISABLE_STATISTICS,
|
|
NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI,
|
|
NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX,
|
|
NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN,
|
|
NM_CLIENT_PERMISSION_NETWORK_CONTROL,
|
|
NM_CLIENT_PERMISSION_RELOAD,
|
|
NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS,
|
|
NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME,
|
|
NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN,
|
|
NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM,
|
|
NM_CLIENT_PERMISSION_SLEEP_WAKE,
|
|
NM_CLIENT_PERMISSION_WIFI_SCAN,
|
|
NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN,
|
|
NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED,
|
|
};
|
|
|
|
const char *
|
|
nm_auth_permission_to_string (NMClientPermission permission)
|
|
{
|
|
if (permission < 1)
|
|
return NULL;
|
|
if (permission > NM_CLIENT_PERMISSION_LAST)
|
|
return NULL;
|
|
return nm_auth_permission_names_by_idx[permission - 1];
|
|
}
|
|
|
|
#define AUTH_PERMISSION_PREFIX "org.freedesktop.NetworkManager."
|
|
|
|
static int
|
|
_nm_auth_permission_from_string_cmp (gconstpointer a, gconstpointer b, gpointer user_data)
|
|
{
|
|
const NMClientPermission *const p = a;
|
|
const char *const needle = b;
|
|
const char *ss = nm_auth_permission_names_by_idx[*p - 1];
|
|
|
|
nm_assert (NM_STR_HAS_PREFIX (ss, AUTH_PERMISSION_PREFIX));
|
|
nm_assert (ss[NM_STRLEN (AUTH_PERMISSION_PREFIX)] != '\0');
|
|
|
|
return strcmp (&ss[NM_STRLEN (AUTH_PERMISSION_PREFIX)], needle);
|
|
}
|
|
|
|
NMClientPermission
|
|
nm_auth_permission_from_string (const char *str)
|
|
{
|
|
gssize idx;
|
|
|
|
if (!str)
|
|
return NM_CLIENT_PERMISSION_NONE;
|
|
|
|
if (!NM_STR_HAS_PREFIX (str, AUTH_PERMISSION_PREFIX))
|
|
return NM_CLIENT_PERMISSION_NONE;
|
|
idx = nm_utils_array_find_binary_search (nm_auth_permission_sorted,
|
|
sizeof (nm_auth_permission_sorted[0]),
|
|
G_N_ELEMENTS (nm_auth_permission_sorted),
|
|
&str[NM_STRLEN (AUTH_PERMISSION_PREFIX)],
|
|
_nm_auth_permission_from_string_cmp,
|
|
NULL);
|
|
if (idx < 0)
|
|
return NM_CLIENT_PERMISSION_NONE;
|
|
return nm_auth_permission_sorted[idx];
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
|
|
NMClientPermissionResult
|
|
nm_client_permission_result_from_string (const char *nm)
|
|
{
|
|
if (!nm)
|
|
return NM_CLIENT_PERMISSION_RESULT_UNKNOWN;
|
|
if (nm_streq (nm, "yes"))
|
|
return NM_CLIENT_PERMISSION_RESULT_YES;
|
|
if (nm_streq (nm, "no"))
|
|
return NM_CLIENT_PERMISSION_RESULT_NO;
|
|
if (nm_streq (nm, "auth"))
|
|
return NM_CLIENT_PERMISSION_RESULT_AUTH;
|
|
return NM_CLIENT_PERMISSION_RESULT_UNKNOWN;
|
|
}
|
|
|
|
const char *
|
|
nm_client_permission_result_to_string (NMClientPermissionResult permission)
|
|
{
|
|
switch (permission) {
|
|
case NM_CLIENT_PERMISSION_RESULT_YES: return "yes";
|
|
case NM_CLIENT_PERMISSION_RESULT_NO: return "no";
|
|
case NM_CLIENT_PERMISSION_RESULT_AUTH: return "auth";
|
|
case NM_CLIENT_PERMISSION_RESULT_UNKNOWN: return "unknown";
|
|
}
|
|
nm_assert_not_reached ();
|
|
return NULL;
|
|
}
|