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

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