about summary refs log tree commit diff
path: root/src/nmcli/devices.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nmcli/devices.c')
-rw-r--r--src/nmcli/devices.c167
1 files changed, 78 insertions, 89 deletions
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)
           "<ifname>]\n"
           "                         [bssid <BSSID>] [name <name>] [private yes|no] [hidden "
           "yes|no]\n\n"
-          "  wifi hotspot [ifname <ifname>] [con-name <name>] [ssid <SSID>] [band a|bg] "
+          "  wifi hotspot [ifname <ifname>] [con-name <name>] [ssid <SSID>] [band a|bg|6GHz] "
           "[channel <channel>] [password <password>]\n\n"
           "  wifi rescan [ifname <ifname>] [[ssid <SSID to scan>] ...]\n\n"
           "  wifi show-password [ifname <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 <ifname>] [con-name <name>] [ssid <SSID>]\n"
-          "                     [band a|bg] [channel <channel>] [password <password>]\n"
+          "                     [band a|bg|6GHz] [channel <channel>] [password <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'."),
@@ -4810,44 +4834,15 @@ do_device_wifi_rescan(const NMCCommand *cmd, NmCli *nmc, int argc, const char *c
 }
 
 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");
 }