From 537bfce2bda471c92caabd388589230200891509 Mon Sep 17 00:00:00 2001 From: Michael Biebl Date: Fri, 3 Jul 2026 19:53:18 +0200 Subject: New upstream version 1.58~rc1 --- src/nmcli/devices.c | 167 ++++++++++++++++++++++++---------------------------- 1 file changed, 78 insertions(+), 89 deletions(-) (limited to 'src/nmcli/devices.c') diff --git a/src/nmcli/devices.c b/src/nmcli/devices.c index 2787439e..bc24bcde 100644 --- a/src/nmcli/devices.c +++ b/src/nmcli/devices.c @@ -732,21 +732,22 @@ const NmcMetaGenericInfo *const nmc_fields_dev_wifi_list[] = { NMC_META_GENERIC("BSSID"), /* 3 */ NMC_META_GENERIC("MODE"), /* 4 */ NMC_META_GENERIC("CHAN"), /* 5 */ - NMC_META_GENERIC("FREQ"), /* 6 */ - NMC_META_GENERIC("RATE"), /* 7 */ - NMC_META_GENERIC("BANDWIDTH"), /* 8 */ - NMC_META_GENERIC("SIGNAL"), /* 9 */ - NMC_META_GENERIC("BARS"), /* 10 */ - NMC_META_GENERIC("SECURITY"), /* 11 */ - NMC_META_GENERIC("WPA-FLAGS"), /* 12 */ - NMC_META_GENERIC("RSN-FLAGS"), /* 13 */ - NMC_META_GENERIC("DEVICE"), /* 14 */ - NMC_META_GENERIC("ACTIVE"), /* 15 */ - NMC_META_GENERIC("IN-USE"), /* 16 */ - NMC_META_GENERIC("DBUS-PATH"), /* 17 */ + NMC_META_GENERIC("BAND"), /* 6 */ + NMC_META_GENERIC("FREQ"), /* 7 */ + NMC_META_GENERIC("RATE"), /* 8 */ + NMC_META_GENERIC("BANDWIDTH"), /* 9 */ + NMC_META_GENERIC("SIGNAL"), /* 10 */ + NMC_META_GENERIC("BARS"), /* 11 */ + NMC_META_GENERIC("SECURITY"), /* 12 */ + NMC_META_GENERIC("WPA-FLAGS"), /* 13 */ + NMC_META_GENERIC("RSN-FLAGS"), /* 14 */ + NMC_META_GENERIC("DEVICE"), /* 15 */ + NMC_META_GENERIC("ACTIVE"), /* 16 */ + NMC_META_GENERIC("IN-USE"), /* 17 */ + NMC_META_GENERIC("DBUS-PATH"), /* 18 */ NULL, }; -#define NMC_FIELDS_DEV_WIFI_LIST_COMMON "IN-USE,BSSID,SSID,MODE,CHAN,RATE,SIGNAL,BARS,SECURITY" +#define NMC_FIELDS_DEV_WIFI_LIST_COMMON "IN-USE,BSSID,SSID,MODE,BAND,CHAN,RATE,SIGNAL,BARS,SECURITY" #define NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST "NAME," NMC_FIELDS_DEV_WIFI_LIST_COMMON const NmcMetaGenericInfo *const nmc_fields_dev_wimax_list[] = { @@ -765,17 +766,19 @@ const NmcMetaGenericInfo *const nmc_fields_dev_wimax_list[] = { const NmcMetaGenericInfo *const nmc_fields_dev_show_controller_prop[] = { NMC_META_GENERIC("NAME"), /* 0 */ NMC_META_GENERIC("SLAVES"), /* 1 */ + NMC_META_GENERIC("PORTS"), /* 2 */ NULL, }; -#define NMC_FIELDS_DEV_SHOW_CONTROLLER_PROP_COMMON "NAME,SLAVES" +#define NMC_FIELDS_DEV_SHOW_CONTROLLER_PROP_COMMON "NAME,SLAVES,PORTS" const NmcMetaGenericInfo *const nmc_fields_dev_show_team_prop[] = { NMC_META_GENERIC("NAME"), /* 0 */ NMC_META_GENERIC("SLAVES"), /* 1 */ - NMC_META_GENERIC("CONFIG"), /* 2 */ + NMC_META_GENERIC("PORTS"), /* 2 */ + NMC_META_GENERIC("CONFIG"), /* 3 */ NULL, }; -#define NMC_FIELDS_DEV_SHOW_TEAM_PROP_COMMON "NAME,SLAVES,CONFIG" +#define NMC_FIELDS_DEV_SHOW_TEAM_PROP_COMMON "NAME,SLAVES,PORTS,CONFIG" const NmcMetaGenericInfo *const nmc_fields_dev_show_vlan_prop[] = { NMC_META_GENERIC("NAME"), /* 0 */ @@ -867,7 +870,7 @@ usage(void) "]\n" " [bssid ] [name ] [private yes|no] [hidden " "yes|no]\n\n" - " wifi hotspot [ifname ] [con-name ] [ssid ] [band a|bg] " + " wifi hotspot [ifname ] [con-name ] [ssid ] [band a|bg|6GHz] " "[channel ] [password ]\n\n" " wifi rescan [ifname ] [[ssid ] ...]\n\n" " wifi show-password [ifname ]\n\n" @@ -1023,7 +1026,7 @@ usage_device_wifi(void) "It is also assumed that IP configuration is obtained via DHCP.\n" "\n" "ARGUMENTS := hotspot [ifname ] [con-name ] [ssid ]\n" - " [band a|bg] [channel ] [password ]\n" + " [band a|bg|6GHz] [channel ] [password ]\n" "\n" "Create a Wi-Fi hotspot. Use 'connection down' or 'device disconnect'\n" "to stop the hotspot.\n" @@ -1325,6 +1328,7 @@ fill_output_access_point(NMAccessPoint *ap, const APInfo *info) const char *bssid; NM80211Mode mode; char *channel_str; + const char *band_str; char *freq_str; char *ssid_str = NULL; char *ssid_hex_str = NULL; @@ -1369,6 +1373,22 @@ fill_output_access_point(NMAccessPoint *ap, const APInfo *info) rsn_flags_str = ap_wpa_rsn_flags_to_string(rsn_flags, NM_META_ACCESSOR_GET_TYPE_PRETTY); sig_bars = nmc_wifi_strength_bars(strength); + switch (nm_utils_wifi_freq_to_band(freq)) { + case NM_WIFI_BAND_2_4_GHZ: + band_str = _("2.4 GHz"); + break; + case NM_WIFI_BAND_5_GHZ: + band_str = _("5 GHz"); + break; + case NM_WIFI_BAND_6_GHZ: + band_str = _("6 GHz"); + break; + default: + case NM_WIFI_BAND_UNKNOWN: + band_str = ""; + break; + } + security_str = g_string_new(NULL); if (_ap_is_wep(ap)) { @@ -1417,18 +1437,19 @@ fill_output_access_point(NMAccessPoint *ap, const APInfo *info) : mode == NM_802_11_MODE_MESH ? _("Mesh") : _("N/A")); set_val_str(arr, 5, channel_str); - set_val_str(arr, 6, freq_str); - set_val_str(arr, 7, bitrate_str); - set_val_str(arr, 8, bandwidth_str); - set_val_str(arr, 9, strength_str); - set_val_strc(arr, 10, sig_bars); - set_val_str(arr, 11, g_string_free(security_str, FALSE)); - set_val_str(arr, 12, wpa_flags_str); - set_val_str(arr, 13, rsn_flags_str); - set_val_strc(arr, 14, info->device); - set_val_strc(arr, 15, active ? _("yes") : _("no")); - set_val_strc(arr, 16, active ? "*" : " "); - set_val_strc(arr, 17, nm_object_get_path(NM_OBJECT(ap))); + set_val_strc(arr, 6, band_str); + set_val_str(arr, 7, freq_str); + set_val_str(arr, 8, bitrate_str); + set_val_str(arr, 9, bandwidth_str); + set_val_str(arr, 10, strength_str); + set_val_strc(arr, 11, sig_bars); + set_val_str(arr, 12, g_string_free(security_str, FALSE)); + set_val_str(arr, 13, wpa_flags_str); + set_val_str(arr, 14, rsn_flags_str); + set_val_strc(arr, 15, info->device); + set_val_strc(arr, 16, active ? _("yes") : _("no")); + set_val_strc(arr, 17, active ? "*" : " "); + set_val_strc(arr, 18, nm_object_get_path(NM_OBJECT(ap))); /* Set colors */ color = wifi_signal_to_color(strength); @@ -1520,7 +1541,8 @@ print_bond_bridge_info(NMDevice *device, arr = nmc_dup_fields_array(tmpl, NMC_OF_FLAG_SECTION_PREFIX); set_val_strc(arr, 0, group_prefix); /* i.e. BOND, TEAM, BRIDGE */ - set_val_str(arr, 1, g_string_free(ports_str, FALSE)); + set_val_str(arr, 1, g_strdup(ports_str->str)); + set_val_str(arr, 2, g_string_free(ports_str, FALSE)); g_ptr_array_add(out.output_data, arr); print_data_prepare_width(out.output_data); @@ -1583,8 +1605,9 @@ print_team_info(NMDevice *device, NmCli *nmc, const char *group_prefix, const ch arr = nmc_dup_fields_array(tmpl, NMC_OF_FLAG_SECTION_PREFIX); set_val_strc(arr, 0, group_prefix); /* TEAM */ - set_val_str(arr, 1, g_string_free(ports_str, FALSE)); - set_val_str(arr, 2, sanitize_team_config(nm_device_team_get_config(NM_DEVICE_TEAM(device)))); + set_val_str(arr, 1, g_strdup(ports_str->str)); + set_val_str(arr, 2, g_string_free(ports_str, FALSE)); + set_val_str(arr, 3, sanitize_team_config(nm_device_team_get_config(NM_DEVICE_TEAM(device)))); g_ptr_array_add(out.output_data, arr); print_data_prepare_width(out.output_data); @@ -4571,10 +4594,11 @@ do_device_wifi_hotspot(const NMCCommand *cmd, NmCli *nmc, int argc, const char * } band = *argv; if (argc == 1 && nmc->complete) - nmc_complete_strings(band, "a", "bg"); - if (strcmp(band, "a") && strcmp(band, "bg")) { + nmc_complete_strings(band, "a", "bg", "6GHz"); + if (!NM_IN_STRSET(band, "a", "bg", "6GHz")) { g_string_printf(nmc->return_text, - _("Error: band argument value '%s' is invalid; use 'a' or 'bg'."), + _("Error: band argument value '%s' is invalid; use 'a', 'bg' " + "or '6GHz'."), band); nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; return; @@ -4622,7 +4646,7 @@ do_device_wifi_hotspot(const NMCCommand *cmd, NmCli *nmc, int argc, const char * nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; return; } - if (!nmc_string_to_uint(channel, TRUE, 1, 5825, &value) + if (!nmc_string_to_uint(channel, TRUE, 1, G_MAXUINT32, &value) || !nm_utils_wifi_is_channel_valid(value, band)) { g_string_printf(nmc->return_text, _("Error: channel '%s' not valid for band '%s'."), @@ -4809,45 +4833,16 @@ do_device_wifi_rescan(const NMCCommand *cmd, NmCli *nmc, int argc, const char *c nmc->should_wait++; } -static void -string_append_mecard(GString *string, const char *tag, const char *text) -{ - const char *p; - bool is_hex = TRUE; - int start; - - if (!text) - return; - - g_string_append(string, tag); - start = string->len; - - for (p = text; *p; p++) { - if (!g_ascii_isxdigit(*p)) - is_hex = FALSE; - if (strchr("\\\":;,", *p)) - g_string_append_c(string, '\\'); - g_string_append_c(string, *p); - } - - if (is_hex) { - g_string_insert_c(string, start, '\"'); - g_string_append_c(string, '\"'); - } - g_string_append_c(string, ';'); -} - static void print_wifi_connection(const NmcConfig *nmc_config, NMConnection *connection) { - NMSettingWireless *s_wireless; - NMSettingWirelessSecurity *s_wsec; - const char *key_mgmt = NULL; - const char *psk = NULL; - const char *type = NULL; - GBytes *ssid_bytes; - gs_free char *ssid = NULL; - nm_auto_free_gstring GString *string = NULL; + NMSettingWireless *s_wireless; + NMSettingWirelessSecurity *s_wsec; + const char *key_mgmt = NULL; + const char *psk = NULL; + GBytes *ssid_bytes; + gs_free char *ssid = NULL; + nm_auto_free_secret char *uri = NULL; s_wireless = nm_connection_get_setting_wireless(connection); g_return_if_fail(s_wireless); @@ -4858,9 +4853,6 @@ print_wifi_connection(const NmcConfig *nmc_config, NMConnection *connection) g_return_if_fail(ssid); nmc_print("SSID: %s\n", ssid); - string = g_string_sized_new(64); - g_string_append(string, "WIFI:"); - s_wsec = nm_connection_get_setting_wireless_security(connection); if (s_wsec) { key_mgmt = nm_setting_wireless_security_get_key_mgmt(s_wsec); @@ -4868,33 +4860,30 @@ print_wifi_connection(const NmcConfig *nmc_config, NMConnection *connection) } if (key_mgmt == NULL) { - type = "nopass"; nmc_print("%s: %s\n", _("Security"), _("None")); } else if (strcmp(key_mgmt, "none") == 0 || strcmp(key_mgmt, "ieee8021x") == 0) { - type = "WEP"; nmc_print("%s: WEP\n", _("Security")); } else if (strcmp(key_mgmt, "wpa-none") == 0 || strcmp(key_mgmt, "wpa-psk") == 0 || strcmp(key_mgmt, "sae") == 0) { - type = "WPA"; nmc_print("%s: WPA\n", _("Security")); } else if (strcmp(key_mgmt, "owe") == 0) { - type = "nopass"; nmc_print("%s: OWE\n", _("Security")); } - if (psk) + if (psk && psk[0]) { nmc_print("%s: %s\n", _("Password"), psk); + } else if (nmc_wifi_key_mgmt_uses_psk(key_mgmt)) { + /* A QR code for a secured network without its password connects to + * nothing, so don't print one. */ + nmc_printerr( + _("Warning: cannot read the Wi-Fi password due to insufficient privileges.\n")); + return; + } - string_append_mecard(string, "T:", type); - string_append_mecard(string, "S:", ssid); - string_append_mecard(string, "P:", psk); - - if (nm_setting_wireless_get_hidden(s_wireless)) - g_string_append(string, "H:true;"); + uri = nmc_wifi_qr_uri_new(ssid, key_mgmt, psk, nm_setting_wireless_get_hidden(s_wireless)); - g_string_append_c(string, ';'); if (nmc_config->use_colors) - nmc_print_qrcode(string->str); + nmc_print_qrcode(uri); nmc_print("\n"); } -- cgit 1.3.0-6-gf8a5