Blame SOURCES/0005-network-complete-SAE-support.patch

44c0da
From 1289e8ea1dbeb91012c262fcb6f014ec73d4c690 Mon Sep 17 00:00:00 2001
44c0da
From: Jonathan Kang <jonathankang@gnome.org>
44c0da
Date: Wed, 9 Sep 2020 14:58:06 +0800
44c0da
Subject: [PATCH 5/8] network: complete SAE support
44c0da
44c0da
Added WirelessSecuritySAE class to fully implement SAE support.
44c0da
44c0da
Heavily modifid and based on the 3.28.2 version of the WPA PSK widget.
44c0da
44c0da
(cherry picked from commit 918838f567740172591ff1f2c32d8227c348be72)
44c0da
---
44c0da
 .../connection-editor/ce-page-security.c      |   8 +-
44c0da
 panels/network/wireless-security/meson.build  |   3 +
44c0da
 .../wireless-security.gresource.xml           |   1 +
44c0da
 .../wireless-security/wireless-security.h     |   1 +
44c0da
 panels/network/wireless-security/ws-sae.c     | 214 ++++++++++++++++++
44c0da
 panels/network/wireless-security/ws-sae.h     |  30 +++
44c0da
 panels/network/wireless-security/ws-sae.ui    | 117 ++++++++++
44c0da
 7 files changed, 370 insertions(+), 4 deletions(-)
44c0da
 create mode 100644 panels/network/wireless-security/ws-sae.c
44c0da
 create mode 100644 panels/network/wireless-security/ws-sae.h
44c0da
 create mode 100644 panels/network/wireless-security/ws-sae.ui
44c0da
44c0da
diff --git a/panels/network/connection-editor/ce-page-security.c b/panels/network/connection-editor/ce-page-security.c
44c0da
index 5104d7442..37b1e1286 100644
44c0da
--- a/panels/network/connection-editor/ce-page-security.c
44c0da
+++ b/panels/network/connection-editor/ce-page-security.c
44c0da
@@ -343,11 +343,11 @@ finish_setup (CEPageSecurity *page)
44c0da
 
44c0da
 #if NM_CHECK_VERSION(1,20,6)
44c0da
         if (nm_utils_security_valid (NMU_SEC_SAE, dev_caps, FALSE, is_adhoc, 0, 0, 0)) {
44c0da
-                WirelessSecurityWPAPSK *ws_wpa_psk;
44c0da
+                WirelessSecuritySAE *ws_sae;
44c0da
 
44c0da
-                ws_wpa_psk = ws_wpa_psk_new (connection, FALSE);
44c0da
-                if (ws_wpa_psk) {
44c0da
-                        add_security_item (page, WIRELESS_SECURITY (ws_wpa_psk), sec_model,
44c0da
+                ws_sae = ws_sae_new (connection, FALSE);
44c0da
+                if (ws_sae) {
44c0da
+                        add_security_item (page, WIRELESS_SECURITY (ws_sae), sec_model,
44c0da
                                            &iter, _("WPA3 Personal"), FALSE);
44c0da
                         if ((active < 0) && ((default_type == NMU_SEC_SAE)))
44c0da
                                 active = item;
44c0da
diff --git a/panels/network/wireless-security/meson.build b/panels/network/wireless-security/meson.build
44c0da
index 47def7a63..6036f56af 100644
44c0da
--- a/panels/network/wireless-security/meson.build
44c0da
+++ b/panels/network/wireless-security/meson.build
44c0da
@@ -14,6 +14,7 @@ nm_applet_headers = [
44c0da
   'wireless-security.h',
44c0da
   'ws-leap.h',
44c0da
   'ws-dynamic-wep.h',
44c0da
+  'ws-sae.h',
44c0da
   'ws-wep-key.h',
44c0da
   'ws-wpa-eap.h',
44c0da
   'ws-wpa-psk.h'
44c0da
@@ -31,6 +32,7 @@ nm_applet_sources = [
44c0da
   'wireless-security.c',
44c0da
   'ws-leap.c',
44c0da
   'ws-dynamic-wep.c',
44c0da
+  'ws-sae.c',
44c0da
   'ws-wep-key.c',
44c0da
   'ws-wpa-eap.c',
44c0da
   'ws-wpa-psk.c'
44c0da
@@ -47,6 +49,7 @@ nm_resource_data = [
44c0da
   'eap-method-ttls.ui',
44c0da
   'ws-dynamic-wep.ui',
44c0da
   'ws-leap.ui',
44c0da
+  'ws-sae.ui',
44c0da
   'ws-wep-key.ui',
44c0da
   'ws-wpa-eap.ui',
44c0da
   'ws-wpa-psk.ui'
44c0da
diff --git a/panels/network/wireless-security/wireless-security.gresource.xml b/panels/network/wireless-security/wireless-security.gresource.xml
44c0da
index a483d06a0..fa1a965ad 100644
44c0da
--- a/panels/network/wireless-security/wireless-security.gresource.xml
44c0da
+++ b/panels/network/wireless-security/wireless-security.gresource.xml
44c0da
@@ -9,6 +9,7 @@
44c0da
     <file preprocess="xml-stripblanks">eap-method-ttls.ui</file>
44c0da
     <file preprocess="xml-stripblanks">ws-dynamic-wep.ui</file>
44c0da
     <file preprocess="xml-stripblanks">ws-leap.ui</file>
44c0da
+    <file preprocess="xml-stripblanks">ws-sae.ui</file>
44c0da
     <file preprocess="xml-stripblanks">ws-wep-key.ui</file>
44c0da
     <file preprocess="xml-stripblanks">ws-wpa-eap.ui</file>
44c0da
     <file preprocess="xml-stripblanks">ws-wpa-psk.ui</file>
44c0da
diff --git a/panels/network/wireless-security/wireless-security.h b/panels/network/wireless-security/wireless-security.h
44c0da
index 975e750f6..c5508ad1b 100644
44c0da
--- a/panels/network/wireless-security/wireless-security.h
44c0da
+++ b/panels/network/wireless-security/wireless-security.h
44c0da
@@ -102,6 +102,7 @@ GType wireless_security_get_type (void);
44c0da
 #include "ws-wep-key.h"
44c0da
 #include "ws-wpa-psk.h"
44c0da
 #include "ws-leap.h"
44c0da
+#include "ws-sae.h"
44c0da
 #include "ws-wpa-eap.h"
44c0da
 #include "ws-dynamic-wep.h"
44c0da
 
44c0da
diff --git a/panels/network/wireless-security/ws-sae.c b/panels/network/wireless-security/ws-sae.c
44c0da
new file mode 100644
44c0da
index 000000000..96138d522
44c0da
--- /dev/null
44c0da
+++ b/panels/network/wireless-security/ws-sae.c
44c0da
@@ -0,0 +1,214 @@
44c0da
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
44c0da
+/* NetworkManager Applet -- allow user control over networking
44c0da
+ *
44c0da
+ * Dan Williams <dcbw@redhat.com>
44c0da
+ *
44c0da
+ * This program is free software; you can redistribute it and/or modify
44c0da
+ * it under the terms of the GNU General Public License as published by
44c0da
+ * the Free Software Foundation; either version 2 of the License, or
44c0da
+ * (at your option) any later version.
44c0da
+ *
44c0da
+ * This program is distributed in the hope that it will be useful,
44c0da
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
44c0da
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
44c0da
+ * GNU General Public License for more details.
44c0da
+ *
44c0da
+ * You should have received a copy of the GNU General Public License along
44c0da
+ * with this program; if not, write to the Free Software Foundation, Inc.,
44c0da
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
44c0da
+ *
44c0da
+ * Copyright 2007 - 2014 Red Hat, Inc.
44c0da
+ */
44c0da
+
44c0da
+#include "nm-default.h"
44c0da
+
44c0da
+#include <ctype.h>
44c0da
+#include <string.h>
44c0da
+
44c0da
+#include "wireless-security.h"
44c0da
+#include "helpers.h"
44c0da
+#include "nma-ui-utils.h"
44c0da
+#include "utils.h"
44c0da
+
44c0da
+#define WPA_PMK_LEN 32
44c0da
+
44c0da
+struct _WirelessSecuritySAE {
44c0da
+	WirelessSecurity parent;
44c0da
+
44c0da
+	gboolean editing_connection;
44c0da
+	const char *password_flags_name;
44c0da
+};
44c0da
+
44c0da
+static void
44c0da
+show_toggled_cb (GtkCheckButton *button, WirelessSecurity *sec)
44c0da
+{
44c0da
+	GtkWidget *widget;
44c0da
+	gboolean visible;
44c0da
+
44c0da
+	widget = GTK_WIDGET (gtk_builder_get_object (sec->builder, "sae_entry"));
44c0da
+	g_assert (widget);
44c0da
+
44c0da
+	visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
44c0da
+	gtk_entry_set_visibility (GTK_ENTRY (widget), visible);
44c0da
+}
44c0da
+
44c0da
+static gboolean
44c0da
+validate (WirelessSecurity *parent, GError **error)
44c0da
+{
44c0da
+	GtkWidget *entry;
44c0da
+	const char *key;
44c0da
+
44c0da
+	entry = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_entry"));
44c0da
+	g_assert (entry);
44c0da
+
44c0da
+	key = gtk_entry_get_text (GTK_ENTRY (entry));
44c0da
+	if (key == NULL || key[0] == '\0') {
44c0da
+		widget_set_error (entry);
44c0da
+		g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Wi-Fi password is missing."));
44c0da
+		return FALSE;
44c0da
+	}
44c0da
+	widget_unset_error (entry);
44c0da
+
44c0da
+	/* passphrase can be between 8 and 63 characters inclusive */
44c0da
+
44c0da
+	return TRUE;
44c0da
+}
44c0da
+
44c0da
+static void
44c0da
+add_to_size_group (WirelessSecurity *parent, GtkSizeGroup *group)
44c0da
+{
44c0da
+	GtkWidget *widget;
44c0da
+
44c0da
+	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_type_label"));
44c0da
+	gtk_size_group_add_widget (group, widget);
44c0da
+
44c0da
+	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_label"));
44c0da
+	gtk_size_group_add_widget (group, widget);
44c0da
+}
44c0da
+
44c0da
+static void
44c0da
+fill_connection (WirelessSecurity *parent, NMConnection *connection)
44c0da
+{
44c0da
+	WirelessSecuritySAE *sae = (WirelessSecuritySAE *) parent;
44c0da
+	GtkWidget *widget, *passwd_entry;
44c0da
+	const char *key;
44c0da
+	NMSettingWireless *s_wireless;
44c0da
+	NMSettingWirelessSecurity *s_wireless_sec;
44c0da
+	NMSettingSecretFlags secret_flags;
44c0da
+	const char *mode;
44c0da
+	gboolean is_adhoc = FALSE;
44c0da
+
44c0da
+	s_wireless = nm_connection_get_setting_wireless (connection);
44c0da
+	g_assert (s_wireless);
44c0da
+
44c0da
+	mode = nm_setting_wireless_get_mode (s_wireless);
44c0da
+	if (mode && !strcmp (mode, "adhoc"))
44c0da
+		is_adhoc = TRUE;
44c0da
+
44c0da
+	/* Blow away the old security setting by adding a clear one */
44c0da
+	s_wireless_sec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new ();
44c0da
+	nm_connection_add_setting (connection, (NMSetting *) s_wireless_sec);
44c0da
+
44c0da
+	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_entry"));
44c0da
+	passwd_entry = widget;
44c0da
+	key = gtk_entry_get_text (GTK_ENTRY (widget));
44c0da
+	g_object_set (s_wireless_sec, NM_SETTING_WIRELESS_SECURITY_PSK, key, NULL);
44c0da
+
44c0da
+	/* Save PSK_FLAGS to the connection */
44c0da
+	secret_flags = nma_utils_menu_to_secret_flags (passwd_entry);
44c0da
+	nm_setting_set_secret_flags (NM_SETTING (s_wireless_sec), NM_SETTING_WIRELESS_SECURITY_PSK,
44c0da
+	                             secret_flags, NULL);
44c0da
+
44c0da
+	/* Update secret flags and popup when editing the connection */
44c0da
+	if (sae->editing_connection)
44c0da
+		nma_utils_update_password_storage (passwd_entry, secret_flags,
44c0da
+		                                   NM_SETTING (s_wireless_sec), sae->password_flags_name);
44c0da
+
44c0da
+	wireless_security_clear_ciphers (connection);
44c0da
+	if (is_adhoc) {
44c0da
+		/* Ad-Hoc settings as specified by the supplicant */
44c0da
+		g_object_set (s_wireless_sec, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "sae", NULL);
44c0da
+		nm_setting_wireless_security_add_proto (s_wireless_sec, "rsn");
44c0da
+		nm_setting_wireless_security_add_pairwise (s_wireless_sec, "ccmp");
44c0da
+		nm_setting_wireless_security_add_group (s_wireless_sec, "ccmp");
44c0da
+	} else {
44c0da
+		g_object_set (s_wireless_sec, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "sae", NULL);
44c0da
+
44c0da
+		/* Just leave ciphers and protocol empty, the supplicant will
44c0da
+		 * figure that out magically based on the AP IEs and card capabilities.
44c0da
+		 */
44c0da
+	}
44c0da
+}
44c0da
+
44c0da
+static void
44c0da
+update_secrets (WirelessSecurity *parent, NMConnection *connection)
44c0da
+{
44c0da
+	helper_fill_secret_entry (connection,
44c0da
+	                          parent->builder,
44c0da
+	                          "sae_entry",
44c0da
+	                          NM_TYPE_SETTING_WIRELESS_SECURITY,
44c0da
+	                          (HelperSecretFunc) nm_setting_wireless_security_get_psk);
44c0da
+}
44c0da
+
44c0da
+WirelessSecuritySAE *
44c0da
+ws_sae_new (NMConnection *connection, gboolean secrets_only)
44c0da
+{
44c0da
+	WirelessSecurity *parent;
44c0da
+	WirelessSecuritySAE *sec;
44c0da
+	NMSetting *setting = NULL;
44c0da
+	GtkWidget *widget;
44c0da
+
44c0da
+	parent = wireless_security_init (sizeof (WirelessSecuritySAE),
44c0da
+	                                 validate,
44c0da
+	                                 add_to_size_group,
44c0da
+	                                 fill_connection,
44c0da
+	                                 update_secrets,
44c0da
+	                                 NULL,
44c0da
+	                                 "/org/gnome/ControlCenter/network/ws-sae.ui",
44c0da
+	                                 "sae_notebook",
44c0da
+	                                 "sae_entry");
44c0da
+	if (!parent)
44c0da
+		return NULL;
44c0da
+
44c0da
+	parent->adhoc_compatible = FALSE;
44c0da
+	sec = (WirelessSecuritySAE *) parent;
44c0da
+	sec->editing_connection = secrets_only ? FALSE : TRUE;
44c0da
+	sec->password_flags_name = NM_SETTING_WIRELESS_SECURITY_PSK;
44c0da
+
44c0da
+	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_entry"));
44c0da
+	g_assert (widget);
44c0da
+	g_signal_connect (G_OBJECT (widget), "changed",
44c0da
+	                  (GCallback) wireless_security_changed_cb,
44c0da
+	                  sec);
44c0da
+	gtk_entry_set_width_chars (GTK_ENTRY (widget), 28);
44c0da
+
44c0da
+	/* Create password-storage popup menu for password entry under entry's secondary icon */
44c0da
+	if (connection)
44c0da
+		setting = (NMSetting *) nm_connection_get_setting_wireless_security (connection);
44c0da
+	nma_utils_setup_password_storage (widget, 0, setting, sec->password_flags_name,
44c0da
+	                                  FALSE, secrets_only);
44c0da
+
44c0da
+	/* Fill secrets, if any */
44c0da
+	if (connection)
44c0da
+		update_secrets (WIRELESS_SECURITY (sec), connection);
44c0da
+
44c0da
+	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "show_checkbutton_wpa"));
44c0da
+	g_assert (widget);
44c0da
+	g_signal_connect (G_OBJECT (widget), "toggled",
44c0da
+	                  (GCallback) show_toggled_cb,
44c0da
+	                  sec);
44c0da
+
44c0da
+	/* Hide WPA/RSN for now since this can be autodetected by NM and the
44c0da
+	 * supplicant when connecting to the AP.
44c0da
+	 */
44c0da
+
44c0da
+	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_type_combo"));
44c0da
+	g_assert (widget);
44c0da
+	gtk_widget_hide (widget);
44c0da
+
44c0da
+	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_type_label"));
44c0da
+	g_assert (widget);
44c0da
+	gtk_widget_hide (widget);
44c0da
+
44c0da
+	return sec;
44c0da
+}
44c0da
diff --git a/panels/network/wireless-security/ws-sae.h b/panels/network/wireless-security/ws-sae.h
44c0da
new file mode 100644
44c0da
index 000000000..9a1262cd0
44c0da
--- /dev/null
44c0da
+++ b/panels/network/wireless-security/ws-sae.h
44c0da
@@ -0,0 +1,30 @@
44c0da
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
44c0da
+/* NetworkManager Applet -- allow user control over networking
44c0da
+ *
44c0da
+ * Dan Williams <dcbw@redhat.com>
44c0da
+ *
44c0da
+ * This program is free software; you can redistribute it and/or modify
44c0da
+ * it under the terms of the GNU General Public License as published by
44c0da
+ * the Free Software Foundation; either version 2 of the License, or
44c0da
+ * (at your option) any later version.
44c0da
+ *
44c0da
+ * This program is distributed in the hope that it will be useful,
44c0da
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
44c0da
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
44c0da
+ * GNU General Public License for more details.
44c0da
+ *
44c0da
+ * You should have received a copy of the GNU General Public License along
44c0da
+ * with this program; if not, write to the Free Software Foundation, Inc.,
44c0da
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
44c0da
+ *
44c0da
+ * Copyright 2007 - 2014 Red Hat, Inc.
44c0da
+ */
44c0da
+
44c0da
+#ifndef WS_SAE_H
44c0da
+#define WS_SAE_H
44c0da
+
44c0da
+typedef struct _WirelessSecuritySAE WirelessSecuritySAE;
44c0da
+
44c0da
+WirelessSecuritySAE * ws_sae_new (NMConnection *connection, gboolean secrets_only);
44c0da
+
44c0da
+#endif /* WS_SAE_H */
44c0da
diff --git a/panels/network/wireless-security/ws-sae.ui b/panels/network/wireless-security/ws-sae.ui
44c0da
new file mode 100644
44c0da
index 000000000..d523f16c8
44c0da
--- /dev/null
44c0da
+++ b/panels/network/wireless-security/ws-sae.ui
44c0da
@@ -0,0 +1,117 @@
44c0da
+
44c0da
+<interface>
44c0da
+  <requires lib="gtk+" version="3.4"/>
44c0da
+  <object class="GtkNotebook" id="sae_notebook">
44c0da
+    <property name="visible">True</property>
44c0da
+    <property name="can_focus">False</property>
44c0da
+    <property name="show_tabs">False</property>
44c0da
+    <property name="show_border">False</property>
44c0da
+    <child>
44c0da
+      <object class="GtkTable" id="sae_table">
44c0da
+        <property name="visible">True</property>
44c0da
+        <property name="can_focus">False</property>
44c0da
+        <property name="n_rows">3</property>
44c0da
+        <property name="n_columns">2</property>
44c0da
+        <property name="column_spacing">6</property>
44c0da
+        <property name="row_spacing">6</property>
44c0da
+        <child>
44c0da
+          <object class="GtkLabel" id="sae_label">
44c0da
+            <property name="visible">True</property>
44c0da
+            <property name="can_focus">False</property>
44c0da
+            <property name="xalign">1</property>
44c0da
+            <property name="label" translatable="yes">_Password</property>
44c0da
+            <property name="use_underline">True</property>
44c0da
+            <property name="mnemonic_widget">sae_entry</property>
44c0da
+          </object>
44c0da
+          <packing>
44c0da
+            <property name="x_options">GTK_FILL</property>
44c0da
+            <property name="y_options"/>
44c0da
+          </packing>
44c0da
+        </child>
44c0da
+        <child>
44c0da
+          <object class="GtkEntry" id="sae_entry">
44c0da
+            <property name="visible">True</property>
44c0da
+            <property name="can_focus">True</property>
44c0da
+            <property name="max_length">64</property>
44c0da
+            <property name="visibility">False</property>
44c0da
+            <property name="activates_default">True</property>
44c0da
+          </object>
44c0da
+          <packing>
44c0da
+            <property name="left_attach">1</property>
44c0da
+            <property name="right_attach">2</property>
44c0da
+            <property name="y_options"/>
44c0da
+          </packing>
44c0da
+        </child>
44c0da
+        <child>
44c0da
+          <object class="GtkLabel" id="sae_type_label">
44c0da
+            <property name="visible">True</property>
44c0da
+            <property name="can_focus">False</property>
44c0da
+            <property name="xalign">1</property>
44c0da
+            <property name="label" translatable="yes">_Type</property>
44c0da
+            <property name="use_underline">True</property>
44c0da
+            <property name="mnemonic_widget">sae_type_combo</property>
44c0da
+          </object>
44c0da
+          <packing>
44c0da
+            <property name="top_attach">2</property>
44c0da
+            <property name="bottom_attach">3</property>
44c0da
+            <property name="x_options">GTK_FILL</property>
44c0da
+            <property name="y_options"/>
44c0da
+          </packing>
44c0da
+        </child>
44c0da
+        <child>
44c0da
+          <object class="GtkLabel" id="label32">
44c0da
+            <property name="visible">True</property>
44c0da
+            <property name="can_focus">False</property>
44c0da
+            <property name="xalign">0</property>
44c0da
+          </object>
44c0da
+          <packing>
44c0da
+            <property name="top_attach">1</property>
44c0da
+            <property name="bottom_attach">2</property>
44c0da
+            <property name="x_options">GTK_FILL</property>
44c0da
+            <property name="y_options"/>
44c0da
+          </packing>
44c0da
+        </child>
44c0da
+        <child>
44c0da
+          <object class="GtkCheckButton" id="show_checkbutton_wpa">
44c0da
+            <property name="label" translatable="yes">Sho_w password</property>
44c0da
+            <property name="visible">True</property>
44c0da
+            <property name="can_focus">True</property>
44c0da
+            <property name="receives_default">False</property>
44c0da
+            <property name="use_underline">True</property>
44c0da
+            <property name="draw_indicator">True</property>
44c0da
+          </object>
44c0da
+          <packing>
44c0da
+            <property name="left_attach">1</property>
44c0da
+            <property name="right_attach">2</property>
44c0da
+            <property name="top_attach">1</property>
44c0da
+            <property name="bottom_attach">2</property>
44c0da
+            <property name="x_options">GTK_FILL</property>
44c0da
+            <property name="y_options"/>
44c0da
+          </packing>
44c0da
+        </child>
44c0da
+        <child>
44c0da
+          <object class="GtkComboBox" id="sae_type_combo">
44c0da
+            <property name="visible">True</property>
44c0da
+            <property name="can_focus">False</property>
44c0da
+          </object>
44c0da
+          <packing>
44c0da
+            <property name="left_attach">1</property>
44c0da
+            <property name="right_attach">2</property>
44c0da
+            <property name="top_attach">2</property>
44c0da
+            <property name="bottom_attach">3</property>
44c0da
+            <property name="y_options">GTK_FILL</property>
44c0da
+          </packing>
44c0da
+        </child>
44c0da
+      </object>
44c0da
+    </child>
44c0da
+    <child type="tab">
44c0da
+      <object class="GtkLabel" id="GtkLabel2">
44c0da
+        <property name="visible">True</property>
44c0da
+        <property name="can_focus">False</property>
44c0da
+      </object>
44c0da
+      <packing>
44c0da
+        <property name="tab_fill">False</property>
44c0da
+      </packing>
44c0da
+    </child>
44c0da
+  </object>
44c0da
+</interface>
44c0da
-- 
44c0da
2.34.1
44c0da