Blame libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c

Packit Service 87a54e
/* SPDX-License-Identifier: LGPL-2.1-or-later */
Packit 5756e2
Packit Service 2bceb2
#include "libnm-core/nm-default-libnm-core.h"
Packit 5756e2
Packit 5756e2
#include "nm-libnm-core-utils.h"
Packit 5756e2
Packit 5756e2
#include <linux/rtnetlink.h>
Packit 5756e2
Packit 5756e2
#include "nm-common-macros.h"
Packit 5756e2
#include "nm-errors.h"
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
const char **
Packit Service a1bd4f
nm_utils_bond_option_arp_ip_targets_split(const char *arp_ip_target)
Packit 5756e2
{
Packit Service a1bd4f
    return nm_utils_strsplit_set_full(arp_ip_target, ",", NM_UTILS_STRSPLIT_SET_FLAGS_STRSTRIP);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
void
Packit Service a1bd4f
_nm_setting_bond_remove_options_miimon(NMSettingBond *s_bond)
Packit 5756e2
{
Packit Service a1bd4f
    g_return_if_fail(NM_IS_SETTING_BOND(s_bond));
Packit 5756e2
Packit Service a1bd4f
    nm_setting_bond_remove_option(s_bond, NM_SETTING_BOND_OPTION_MIIMON);
Packit Service a1bd4f
    nm_setting_bond_remove_option(s_bond, NM_SETTING_BOND_OPTION_UPDELAY);
Packit Service a1bd4f
    nm_setting_bond_remove_option(s_bond, NM_SETTING_BOND_OPTION_DOWNDELAY);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
void
Packit Service a1bd4f
_nm_setting_bond_remove_options_arp_interval(NMSettingBond *s_bond)
Packit 5756e2
{
Packit Service a1bd4f
    g_return_if_fail(NM_IS_SETTING_BOND(s_bond));
Packit 5756e2
Packit Service a1bd4f
    nm_setting_bond_remove_option(s_bond, NM_SETTING_BOND_OPTION_ARP_INTERVAL);
Packit Service a1bd4f
    nm_setting_bond_remove_option(s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET);
Packit 5756e2
}
Packit 5756e2
Packit Service a1bd4f
/*****************************************************************************/
Packit Service a1bd4f
Packit Service a1bd4f
NM_UTILS_STRING_TABLE_LOOKUP_DEFINE(
Packit Service a1bd4f
    _nm_setting_bond_mode_from_string,
Packit Service a1bd4f
    NMBondMode,
Packit Service a1bd4f
    {
Packit Service a1bd4f
        G_STATIC_ASSERT_EXPR(_NM_BOND_MODE_NUM <= 9);
Packit Service a1bd4f
Packit Service a1bd4f
        if (name && name[0] < '0' + _NM_BOND_MODE_NUM && name[0] >= '0' && name[1] == '\0') {
Packit Service a1bd4f
            return name[0] - '0';
Packit Service a1bd4f
        }
Packit Service a1bd4f
    },
Packit Service a1bd4f
    { return NM_BOND_MODE_UNKNOWN; },
Packit Service a1bd4f
    {"802.3ad", NM_BOND_MODE_8023AD},
Packit Service a1bd4f
    {"active-backup", NM_BOND_MODE_ACTIVEBACKUP},
Packit Service a1bd4f
    {"balance-alb", NM_BOND_MODE_ALB},
Packit Service a1bd4f
    {"balance-rr", NM_BOND_MODE_ROUNDROBIN},
Packit Service a1bd4f
    {"balance-tlb", NM_BOND_MODE_TLB},
Packit Service a1bd4f
    {"balance-xor", NM_BOND_MODE_XOR},
Packit Service a1bd4f
    {"broadcast", NM_BOND_MODE_BROADCAST}, );
Packit Service a1bd4f
Packit Service a1bd4f
const char *
Packit Service a1bd4f
_nm_setting_bond_mode_to_string(int mode)
Packit Service a1bd4f
{
Packit Service a1bd4f
    static const char *const modes[] = {
Packit Service a1bd4f
        [NM_BOND_MODE_8023AD]       = "802.3ad",
Packit Service a1bd4f
        [NM_BOND_MODE_ACTIVEBACKUP] = "active-backup",
Packit Service a1bd4f
        [NM_BOND_MODE_ALB]          = "balance-alb",
Packit Service a1bd4f
        [NM_BOND_MODE_BROADCAST]    = "broadcast",
Packit Service a1bd4f
        [NM_BOND_MODE_ROUNDROBIN]   = "balance-rr",
Packit Service a1bd4f
        [NM_BOND_MODE_TLB]          = "balance-tlb",
Packit Service a1bd4f
        [NM_BOND_MODE_XOR]          = "balance-xor",
Packit Service a1bd4f
    };
Packit Service a1bd4f
Packit Service a1bd4f
    G_STATIC_ASSERT(G_N_ELEMENTS(modes) == _NM_BOND_MODE_NUM);
Packit Service a1bd4f
Packit Service a1bd4f
    if (NM_MORE_ASSERT_ONCE(5)) {
Packit Service a1bd4f
        char       sbuf[100];
Packit Service a1bd4f
        int        i;
Packit Service a1bd4f
        NMBondMode m;
Packit Service a1bd4f
Packit Service a1bd4f
        for (i = 0; i < (int) G_N_ELEMENTS(modes); i++) {
Packit Service a1bd4f
            nm_assert(modes[i]);
Packit Service a1bd4f
            nm_assert(i == _nm_setting_bond_mode_from_string(modes[i]));
Packit Service a1bd4f
            nm_assert(i == _nm_setting_bond_mode_from_string(nm_sprintf_buf(sbuf, "%d", i)));
Packit Service a1bd4f
        }
Packit Service a1bd4f
        nm_assert(NM_BOND_MODE_UNKNOWN == _nm_setting_bond_mode_from_string(NULL));
Packit Service a1bd4f
        nm_assert(NM_BOND_MODE_UNKNOWN == _nm_setting_bond_mode_from_string(""));
Packit Service a1bd4f
        for (i = -2; i < ((int) G_N_ELEMENTS(modes)) + 20; i++) {
Packit Service a1bd4f
            if (i < 0 || i >= G_N_ELEMENTS(modes))
Packit Service a1bd4f
                m = NM_BOND_MODE_UNKNOWN;
Packit Service a1bd4f
            else
Packit Service a1bd4f
                m = i;
Packit Service a1bd4f
            nm_assert(m == _nm_setting_bond_mode_from_string(nm_sprintf_buf(sbuf, "%d", i)));
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (mode >= 0 && mode < (int) G_N_ELEMENTS(modes))
Packit Service a1bd4f
        return modes[mode];
Packit Service a1bd4f
    return NULL;
Packit Service a1bd4f
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
gboolean
Packit Service a1bd4f
nm_utils_vlan_priority_map_parse_str(NMVlanPriorityMap map_type,
Packit Service a1bd4f
                                     const char *      str,
Packit Service a1bd4f
                                     gboolean          allow_wildcard_to,
Packit Service a1bd4f
                                     guint32 *         out_from,
Packit Service a1bd4f
                                     guint32 *         out_to,
Packit Service a1bd4f
                                     gboolean *        out_has_wildcard_to)
Packit 5756e2
{
Packit Service a1bd4f
    const char *s2;
Packit Service a1bd4f
    gint64      v1, v2;
Packit Service a1bd4f
Packit Service a1bd4f
    nm_assert(str);
Packit Service a1bd4f
Packit Service a1bd4f
    s2 = strchr(str, ':');
Packit Service a1bd4f
Packit Service a1bd4f
    if (!s2) {
Packit Service a1bd4f
        if (!allow_wildcard_to)
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        v1 = _nm_utils_ascii_str_to_int64(str, 10, 0, G_MAXUINT32, -1);
Packit Service a1bd4f
        v2 = -1;
Packit Service a1bd4f
    } else {
Packit Service a1bd4f
        gs_free char *s1_free = NULL;
Packit Service a1bd4f
        gsize         s1_len  = (s2 - str);
Packit Service a1bd4f
Packit Service a1bd4f
        s2 = nm_str_skip_leading_spaces(&s2[1]);
Packit Service a1bd4f
        if (s2[0] == '\0' || (s2[0] == '*' && NM_STRCHAR_ALL(&s2[1], ch, g_ascii_isspace(ch)))) {
Packit Service a1bd4f
            if (!allow_wildcard_to)
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
            v2 = -1;
Packit Service a1bd4f
        } else {
Packit Service a1bd4f
            v2 = _nm_utils_ascii_str_to_int64(s2, 10, 0, G_MAXUINT32, -1);
Packit Service a1bd4f
            if (v2 < 0 || (guint32) v2 > nm_utils_vlan_priority_map_get_max_prio(map_type, FALSE))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
Packit Service a1bd4f
        v1 = _nm_utils_ascii_str_to_int64(nm_strndup_a(100, str, s1_len, &s1_free),
Packit Service a1bd4f
                                          10,
Packit Service a1bd4f
                                          0,
Packit Service a1bd4f
                                          G_MAXUINT32,
Packit Service a1bd4f
                                          -1);
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (v1 < 0 || (guint32) v1 > nm_utils_vlan_priority_map_get_max_prio(map_type, TRUE))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    NM_SET_OUT(out_from, v1);
Packit Service a1bd4f
    NM_SET_OUT(out_to, v2 < 0 ? 0u : (guint) v2);
Packit Service a1bd4f
    NM_SET_OUT(out_has_wildcard_to, v2 < 0);
Packit Service a1bd4f
    return TRUE;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
const char *const nm_auth_permission_names_by_idx[NM_CLIENT_PERMISSION_LAST] = {
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_CHECKPOINT_ROLLBACK - 1] = NM_AUTH_PERMISSION_CHECKPOINT_ROLLBACK,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK - 1] =
Packit Service a1bd4f
        NM_AUTH_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_ENABLE_DISABLE_STATISTICS - 1] =
Packit Service a1bd4f
        NM_AUTH_PERMISSION_ENABLE_DISABLE_STATISTICS,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI - 1]  = NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_WIMAX,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN - 1]  = NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_NETWORK_CONTROL - 1]      = NM_AUTH_PERMISSION_NETWORK_CONTROL,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_RELOAD - 1]               = NM_AUTH_PERMISSION_RELOAD,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS - 1] =
Packit Service a1bd4f
        NM_AUTH_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME - 1] =
Packit Service a1bd4f
        NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN - 1]    = NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM - 1] = NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_SLEEP_WAKE - 1]             = NM_AUTH_PERMISSION_SLEEP_WAKE,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_WIFI_SCAN - 1]              = NM_AUTH_PERMISSION_WIFI_SCAN,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN - 1]        = NM_AUTH_PERMISSION_WIFI_SHARE_OPEN,
Packit Service a1bd4f
    [NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED - 1]   = NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED,
Packit 5756e2
};
Packit 5756e2
Packit 5756e2
const NMClientPermission nm_auth_permission_sorted[NM_CLIENT_PERMISSION_LAST] = {
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_CHECKPOINT_ROLLBACK,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_ENABLE_DISABLE_STATISTICS,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_NETWORK_CONTROL,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_RELOAD,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_SLEEP_WAKE,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_WIFI_SCAN,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN,
Packit Service a1bd4f
    NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED,
Packit 5756e2
};
Packit 5756e2
Packit 5756e2
const char *
Packit Service a1bd4f
nm_auth_permission_to_string(NMClientPermission permission)
Packit 5756e2
{
Packit Service a1bd4f
    if (permission < 1)
Packit Service a1bd4f
        return NULL;
Packit Service a1bd4f
    if (permission > NM_CLIENT_PERMISSION_LAST)
Packit Service a1bd4f
        return NULL;
Packit Service a1bd4f
    return nm_auth_permission_names_by_idx[permission - 1];
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
#define AUTH_PERMISSION_PREFIX "org.freedesktop.NetworkManager."
Packit 5756e2
Packit 5756e2
static int
Packit Service a1bd4f
_nm_auth_permission_from_string_cmp(gconstpointer a, gconstpointer b, gpointer user_data)
Packit 5756e2
{
Packit Service a1bd4f
    const NMClientPermission *const p      = a;
Packit Service a1bd4f
    const char *const               needle = b;
Packit Service a1bd4f
    const char *                    ss     = nm_auth_permission_names_by_idx[*p - 1];
Packit 5756e2
Packit Service a1bd4f
    nm_assert(NM_STR_HAS_PREFIX(ss, AUTH_PERMISSION_PREFIX));
Packit Service a1bd4f
    nm_assert(ss[NM_STRLEN(AUTH_PERMISSION_PREFIX)] != '\0');
Packit 5756e2
Packit Service a1bd4f
    return strcmp(&ss[NM_STRLEN(AUTH_PERMISSION_PREFIX)], needle);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
NMClientPermission
Packit Service a1bd4f
nm_auth_permission_from_string(const char *str)
Packit 5756e2
{
Packit Service a1bd4f
    gssize idx;
Packit Service a1bd4f
Packit Service a1bd4f
    if (!str)
Packit Service a1bd4f
        return NM_CLIENT_PERMISSION_NONE;
Packit Service a1bd4f
Packit Service a1bd4f
    if (!NM_STR_HAS_PREFIX(str, AUTH_PERMISSION_PREFIX))
Packit Service a1bd4f
        return NM_CLIENT_PERMISSION_NONE;
Packit Service a1bd4f
    idx = nm_utils_array_find_binary_search(nm_auth_permission_sorted,
Packit Service a1bd4f
                                            sizeof(nm_auth_permission_sorted[0]),
Packit Service a1bd4f
                                            G_N_ELEMENTS(nm_auth_permission_sorted),
Packit Service a1bd4f
                                            &str[NM_STRLEN(AUTH_PERMISSION_PREFIX)],
Packit Service a1bd4f
                                            _nm_auth_permission_from_string_cmp,
Packit Service a1bd4f
                                            NULL);
Packit Service a1bd4f
    if (idx < 0)
Packit Service a1bd4f
        return NM_CLIENT_PERMISSION_NONE;
Packit Service a1bd4f
    return nm_auth_permission_sorted[idx];
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
NMClientPermissionResult
Packit Service a1bd4f
nm_client_permission_result_from_string(const char *nm)
Packit 5756e2
{
Packit Service a1bd4f
    if (!nm)
Packit Service a1bd4f
        return NM_CLIENT_PERMISSION_RESULT_UNKNOWN;
Packit Service a1bd4f
    if (nm_streq(nm, "yes"))
Packit Service a1bd4f
        return NM_CLIENT_PERMISSION_RESULT_YES;
Packit Service a1bd4f
    if (nm_streq(nm, "no"))
Packit Service a1bd4f
        return NM_CLIENT_PERMISSION_RESULT_NO;
Packit Service a1bd4f
    if (nm_streq(nm, "auth"))
Packit Service a1bd4f
        return NM_CLIENT_PERMISSION_RESULT_AUTH;
Packit Service a1bd4f
    return NM_CLIENT_PERMISSION_RESULT_UNKNOWN;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
const char *
Packit Service a1bd4f
nm_client_permission_result_to_string(NMClientPermissionResult permission)
Packit 5756e2
{
Packit Service a1bd4f
    switch (permission) {
Packit Service a1bd4f
    case NM_CLIENT_PERMISSION_RESULT_YES:
Packit Service a1bd4f
        return "yes";
Packit Service a1bd4f
    case NM_CLIENT_PERMISSION_RESULT_NO:
Packit Service a1bd4f
        return "no";
Packit Service a1bd4f
    case NM_CLIENT_PERMISSION_RESULT_AUTH:
Packit Service a1bd4f
        return "auth";
Packit Service a1bd4f
    case NM_CLIENT_PERMISSION_RESULT_UNKNOWN:
Packit Service a1bd4f
        return "unknown";
Packit Service a1bd4f
    }
Packit Service a1bd4f
    nm_assert_not_reached();
Packit Service a1bd4f
    return NULL;
Packit 5756e2
}
Packit 5756e2
Packit Service a1bd4f
NM_UTILS_STRING_TABLE_LOOKUP_DEFINE(
Packit Service a1bd4f
    nm_utils_route_type_by_name,
Packit Service a1bd4f
    guint8,
Packit Service a1bd4f
    { nm_assert(name); },
Packit Service a1bd4f
    { return RTN_UNSPEC; },
Packit Service a1bd4f
    {"blackhole", RTN_BLACKHOLE},
Packit Service a1bd4f
    {"broadcast", RTN_BROADCAST},
Packit Service a1bd4f
    {"local", RTN_LOCAL},
Packit Service a1bd4f
    {"multicast", RTN_MULTICAST},
Packit Service a1bd4f
    {"nat", RTN_NAT},
Packit Service a1bd4f
    {"prohibit", RTN_PROHIBIT},
Packit Service a1bd4f
    {"throw", RTN_THROW},
Packit Service a1bd4f
    {"unicast", RTN_UNICAST},
Packit Service a1bd4f
    {"unreachable", RTN_UNREACHABLE}, );
Packit Service a1bd4f
Packit Service a1bd4f
NM_UTILS_ENUM2STR_DEFINE(nm_utils_route_type2str,
Packit Service a1bd4f
                         guint8,
Packit Service a1bd4f
                         NM_UTILS_ENUM2STR(RTN_BLACKHOLE, "blackhole"),
Packit Service a1bd4f
                         NM_UTILS_ENUM2STR(RTN_BROADCAST, "broadcast"),
Packit Service a1bd4f
                         NM_UTILS_ENUM2STR(RTN_LOCAL, "local"),
Packit Service a1bd4f
                         NM_UTILS_ENUM2STR(RTN_MULTICAST, "multicast"),
Packit Service a1bd4f
                         NM_UTILS_ENUM2STR(RTN_NAT, "nat"),
Packit Service a1bd4f
                         NM_UTILS_ENUM2STR(RTN_PROHIBIT, "prohibit"),
Packit Service a1bd4f
                         NM_UTILS_ENUM2STR(RTN_THROW, "throw"),
Packit Service a1bd4f
                         NM_UTILS_ENUM2STR(RTN_UNICAST, "unicast"),
Packit Service a1bd4f
                         NM_UTILS_ENUM2STR(RTN_UNREACHABLE, "unreachable"),
Packit Service a1bd4f
                         NM_UTILS_ENUM2STR(RTN_UNSPEC, "unspecified"), );
Packit 5756e2
Packit 5756e2
gboolean
Packit Service a1bd4f
nm_utils_validate_dhcp4_vendor_class_id(const char *vci, GError **error)
Packit 5756e2
{
Packit Service a1bd4f
    const char *  bin;
Packit Service a1bd4f
    gsize         unescaped_len;
Packit Service a1bd4f
    gs_free char *to_free = NULL;
Packit Service a1bd4f
Packit Service a1bd4f
    g_return_val_if_fail(!error || !(*error), FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(vci, FALSE);
Packit Service a1bd4f
Packit Service a1bd4f
    if (vci[0] == '\0') {
Packit Service a1bd4f
        g_set_error_literal(error,
Packit Service a1bd4f
                            NM_CONNECTION_ERROR,
Packit Service a1bd4f
                            NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service a1bd4f
                            _("property cannot be an empty string"));
Packit Service a1bd4f
        g_prefix_error(error,
Packit Service a1bd4f
                       "%s.%s: ",
Packit Service a1bd4f
                       NM_SETTING_IP4_CONFIG_SETTING_NAME,
Packit Service a1bd4f
                       NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER);
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    bin = nm_utils_buf_utf8safe_unescape(vci,
Packit Service a1bd4f
                                         NM_UTILS_STR_UTF8_SAFE_FLAG_NONE,
Packit Service a1bd4f
                                         &unescaped_len,
Packit Service a1bd4f
                                         (gpointer *) &to_free);
Packit Service a1bd4f
    /* a DHCP option cannot be longer than 255 bytes */
Packit Service a1bd4f
    if (unescaped_len > 255) {
Packit Service a1bd4f
        g_set_error_literal(error,
Packit Service a1bd4f
                            NM_CONNECTION_ERROR,
Packit Service a1bd4f
                            NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service a1bd4f
                            _("property cannot be longer than 255 bytes"));
Packit Service a1bd4f
        g_prefix_error(error,
Packit Service a1bd4f
                       "%s.%s: ",
Packit Service a1bd4f
                       NM_SETTING_IP4_CONFIG_SETTING_NAME,
Packit Service a1bd4f
                       NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER);
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
    if (strlen(bin) != unescaped_len) {
Packit Service a1bd4f
        g_set_error_literal(error,
Packit Service a1bd4f
                            NM_CONNECTION_ERROR,
Packit Service a1bd4f
                            NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service a1bd4f
                            _("property cannot contain any nul bytes"));
Packit Service a1bd4f
        g_prefix_error(error,
Packit Service a1bd4f
                       "%s.%s: ",
Packit Service a1bd4f
                       NM_SETTING_IP4_CONFIG_SETTING_NAME,
Packit Service a1bd4f
                       NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER);
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    return TRUE;
Packit Service a1bd4f
}
Packit Service a1bd4f
Packit Service a1bd4f
gboolean
Packit Service a1bd4f
nm_settings_connection_validate_permission_user(const char *item, gssize len)
Packit Service a1bd4f
{
Packit Service a1bd4f
    gsize l;
Packit Service a1bd4f
Packit Service a1bd4f
    if (!item)
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    if (len < 0) {
Packit Service a1bd4f
        nm_assert(len == -1);
Packit Service a1bd4f
        l = strlen(item);
Packit Service a1bd4f
    } else
Packit Service a1bd4f
        l = (gsize) len;
Packit Service a1bd4f
Packit Service a1bd4f
    if (l == 0)
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    if (!g_utf8_validate(item, l, NULL))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    if (l >= 100)
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    if (memchr(item, ':', l))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    return TRUE;
Packit 5756e2
}