[gnome-control-center/wip/new-design] panels: firmware-security: new panel UX design implementation
- From: Kate Hsuan <khsuan src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center/wip/new-design] panels: firmware-security: new panel UX design implementation
- Date: Wed, 3 Aug 2022 05:04:46 +0000 (UTC)
commit 9ff281a71de1c4ddcf5d59649d2b4fdb4f1e882f
Author: Kate Hsuan <hpa redhat com>
Date: Tue Jul 26 17:20:50 2022 +0800
panels: firmware-security: new panel UX design implementation
The new UX implementation includes
1. Showing the security level using a number.
2. Showing descriptions of events and HSI checking items.
3. Change the style of the security level number.
4. Add the status icon and label for each HSI checking item.
Signed-off-by: Kate Hsuan <hpa redhat com>
.../cc-firmware-security-boot-dialog.c | 1 +
.../cc-firmware-security-boot-dialog.ui | 2 +-
.../cc-firmware-security-dialog.c | 153 +++++++++++++--------
.../cc-firmware-security-dialog.ui | 113 +++++++++++----
.../firmware-security/cc-firmware-security-panel.c | 76 ++++++----
.../cc-firmware-security-panel.ui | 29 ++--
.../firmware-security/cc-firmware-security-utils.c | 79 +++++++++++
.../firmware-security/cc-firmware-security-utils.h | 9 +-
panels/firmware-security/security-level.css | 66 ++++++++-
9 files changed, 404 insertions(+), 124 deletions(-)
---
diff --git a/panels/firmware-security/cc-firmware-security-boot-dialog.c
b/panels/firmware-security/cc-firmware-security-boot-dialog.c
index 0752026a4..bf8a0e755 100644
--- a/panels/firmware-security/cc-firmware-security-boot-dialog.c
+++ b/panels/firmware-security/cc-firmware-security-boot-dialog.c
@@ -70,6 +70,7 @@ cc_firmware_security_boot_dialog_new (SecureBootState secure_boot_state)
case SECURE_BOOT_STATE_ACTIVE:
/* TRANSLATORS: secure boot refers to the system firmware security mode */
gtk_label_set_text (GTK_LABEL(dialog->secure_boot_title), _("Secure Boot is Active"));
+ gtk_image_set_from_icon_name (GTK_IMAGE (dialog->secure_boot_icon), "channel-secure-symbolic");
gtk_widget_add_css_class (dialog->secure_boot_icon, "good");
status_description = g_strdup_printf ("%s",
/* TRANSLATORS: this is the first section of the decription */
diff --git a/panels/firmware-security/cc-firmware-security-boot-dialog.ui
b/panels/firmware-security/cc-firmware-security-boot-dialog.ui
index 1e46ccf28..8b8957e73 100644
--- a/panels/firmware-security/cc-firmware-security-boot-dialog.ui
+++ b/panels/firmware-security/cc-firmware-security-boot-dialog.ui
@@ -30,7 +30,7 @@
<property name="pixel-size">32</property>
<property name="halign">center</property>
<property name="valign">center</property>
- <property name="icon-name">system-reboot-symbolic</property>
+ <property name="icon-name">channel-insecure</property>
<style>
<class name="security-level-icon"/>
</style>
diff --git a/panels/firmware-security/cc-firmware-security-dialog.c
b/panels/firmware-security/cc-firmware-security-dialog.c
index 57d143adf..c9529bbb8 100644
--- a/panels/firmware-security/cc-firmware-security-dialog.c
+++ b/panels/firmware-security/cc-firmware-security-dialog.c
@@ -32,7 +32,16 @@ struct _CcFirmwareSecurityDialog
{
AdwWindow parent;
- GtkWidget *firmware_security_dialog_icon;
+ GtkWidget *dialog_hsi_circle_box;
+ GtkWidget *dialog_hsi_circle_number;
+
+ GtkWidget *hsi1_icon;
+ GtkWidget *hsi2_icon;
+ GtkWidget *hsi3_icon;
+ GtkWidget *hsi1_title;
+ GtkWidget *hsi2_title;
+ GtkWidget *hsi3_title;
+
GtkWidget *firmware_security_dialog_title_label;
GtkWidget *firmware_security_dialog_body_label;
GtkWidget *firmware_security_dialog_min_row;
@@ -59,17 +68,58 @@ G_DEFINE_TYPE (CcFirmwareSecurityDialog, cc_firmware_security_dialog, ADW_TYPE_W
static void
set_dialog_item_layer1 (CcFirmwareSecurityDialog *self,
- const gchar *icon_name,
- const gchar *style,
+ const int hsi_number,
const gchar *title,
const gchar *body)
{
g_autofree gchar *str = NULL;
+ g_autofree gchar *hsi_str = NULL;
/* TRANSLATORS: HSI stands for Host Security ID and device refers to the computer as a whole */
str = g_strdup_printf (_("Device conforms to HSI level %d"), self->hsi_number);
- gtk_image_set_from_icon_name (GTK_IMAGE (self->firmware_security_dialog_icon), icon_name);
- gtk_widget_add_css_class (self->firmware_security_dialog_icon, style);
+ hsi_str = g_strdup_printf ("%u", self->hsi_number);
+
+ gtk_label_set_label (GTK_LABEL (self->dialog_hsi_circle_number), hsi_str);
+
+ gtk_image_set_from_icon_name (GTK_IMAGE (self->hsi1_icon), hsi_number >= 1 ? "emblem-ok" : "process-stop");
+ gtk_label_set_text (GTK_LABEL (self->hsi1_title), hsi_number >= 1 ? _("Passed") : _("Failed"));
+ gtk_image_set_from_icon_name (GTK_IMAGE (self->hsi2_icon), hsi_number >= 2 ? "emblem-ok" : "process-stop");
+ gtk_label_set_text (GTK_LABEL (self->hsi2_title), hsi_number >= 2 ? _("Passed") : _("Failed"));
+ gtk_image_set_from_icon_name (GTK_IMAGE (self->hsi3_icon), hsi_number >= 3 ? "emblem-ok" : "process-stop");
+ gtk_label_set_text (GTK_LABEL (self->hsi3_title), hsi_number >= 3 ? _("Passed") : _("Failed"));
+
+ gtk_widget_add_css_class (self->firmware_security_dialog_min_row, hsi_number >= 1 ? "success-hsi-icon" :
"error-hsi-icon");
+ gtk_widget_add_css_class (self->firmware_security_dialog_min_row, hsi_number >= 1 ? "success-title" :
"error-title");
+ gtk_widget_add_css_class (self->firmware_security_dialog_basic_row, hsi_number >= 2 ? "success-hsi-icon" :
"error-hsi-icon");
+ gtk_widget_add_css_class (self->firmware_security_dialog_basic_row, hsi_number >= 2 ? "success-title" :
"error-title");
+ gtk_widget_add_css_class (self->firmware_security_dialog_extend_row, hsi_number >= 3 ? "success-hsi-icon"
: "error-hsi-icon");
+ gtk_widget_add_css_class (self->firmware_security_dialog_extend_row, hsi_number >= 3 ? "success-title" :
"error-title");
+
+ switch (hsi_number)
+ {
+ case 0:
+ gtk_widget_add_css_class (self->dialog_hsi_circle_box, "level0");
+ gtk_widget_add_css_class (self->dialog_hsi_circle_number, "hsi0");
+
+
+ break;
+ case 1:
+ gtk_widget_add_css_class (self->dialog_hsi_circle_box, "level1");
+ gtk_widget_add_css_class (self->dialog_hsi_circle_number, "hsi1");
+
+ break;
+ case 2:
+ gtk_widget_add_css_class (self->dialog_hsi_circle_box, "level2");
+ gtk_widget_add_css_class (self->dialog_hsi_circle_number, "hsi2");
+
+ break;
+ case 3:
+ case 4:
+ gtk_widget_add_css_class (self->dialog_hsi_circle_box, "level3");
+ gtk_widget_add_css_class (self->dialog_hsi_circle_number, "hsi3");
+ break;
+ }
+
gtk_label_set_text (GTK_LABEL (self->firmware_security_dialog_title_label), title);
gtk_label_set_text (GTK_LABEL (self->firmware_security_dialog_body_label), body);
gtk_label_set_text (GTK_LABEL (self->firmware_security_dialog_hsi_label), str);
@@ -78,72 +128,39 @@ set_dialog_item_layer1 (CcFirmwareSecurityDialog *self,
static void
update_dialog (CcFirmwareSecurityDialog *self)
{
- adw_action_row_set_icon_name (ADW_ACTION_ROW (self->firmware_security_dialog_min_row),
"dialog-error-symbolic");
- adw_action_row_set_icon_name (ADW_ACTION_ROW (self->firmware_security_dialog_basic_row),
"dialog-error-symbolic");
- adw_action_row_set_icon_name (ADW_ACTION_ROW (self->firmware_security_dialog_extend_row),
"dialog-error-symbolic");
-
- if (self->hsi_number < 1)
- gtk_widget_add_css_class (self->firmware_security_dialog_min_row, "gray-icon");
- if (self->hsi_number < 2)
- gtk_widget_add_css_class (self->firmware_security_dialog_basic_row, "gray-icon");
- if (self->hsi_number < 3)
- gtk_widget_add_css_class (self->firmware_security_dialog_extend_row, "gray-icon");
-
switch (self->hsi_number)
{
case 0:
set_dialog_item_layer1 (self,
- "dialog-warning-symbolic",
- "error",
- _("No Protection"),
+ 0,
+ _("Security Level 0"),
_("This device has no protection against hardware security issues. This could "
"be because of a hardware or firmware configuration issue. It is "
"recommended to contact your IT support provider."));
break;
case 1:
- adw_action_row_set_icon_name (ADW_ACTION_ROW (self->firmware_security_dialog_min_row),
- "emblem-default-symbolic");
- gtk_widget_add_css_class (self->firmware_security_dialog_min_row, "success-icon");
set_dialog_item_layer1 (self,
- "security-low-symbolic",
- "neutral",
- _("Minimal Protection"),
+ 1,
+ _("Security Level 1"),
_("This device has minimal protection against hardware security issues. This "
"is the lowest device security level and only provides protection against "
"simple security threats."));
break;
case 2:
- adw_action_row_set_icon_name (ADW_ACTION_ROW (self->firmware_security_dialog_min_row),
- "emblem-default-symbolic");
- adw_action_row_set_icon_name (ADW_ACTION_ROW (self->firmware_security_dialog_basic_row),
- "emblem-default-symbolic");
- gtk_widget_add_css_class (self->firmware_security_dialog_min_row, "success-icon");
- gtk_widget_add_css_class (self->firmware_security_dialog_basic_row, "success-icon");
set_dialog_item_layer1 (self,
- "security-medium-symbolic",
- "warning",
- _("Basic Protection"),
+ 2,
+ _("Security Level 2"),
_("This device has basic protection against hardware security issues. This "
"provides protection against some common security threats."));
break;
case 3:
case 4:
- adw_action_row_set_icon_name (ADW_ACTION_ROW (self->firmware_security_dialog_min_row),
- "emblem-default-symbolic");
- adw_action_row_set_icon_name (ADW_ACTION_ROW (self->firmware_security_dialog_basic_row),
- "emblem-default-symbolic");
- adw_action_row_set_icon_name (ADW_ACTION_ROW (self->firmware_security_dialog_extend_row),
- "emblem-default-symbolic");
- gtk_widget_add_css_class (self->firmware_security_dialog_min_row, "success-icon");
- gtk_widget_add_css_class (self->firmware_security_dialog_basic_row, "success-icon");
- gtk_widget_add_css_class (self->firmware_security_dialog_extend_row, "success-icon");
set_dialog_item_layer1 (self,
- "security-high-symbolic",
- "good",
- _("Extended Protection"),
+ 3,
+ _("Security Level 3"),
_("This device has extended protection against hardware security issues. This "
"is the highest device security level and provides protection against "
"advanced security threats."));
@@ -151,8 +168,7 @@ update_dialog (CcFirmwareSecurityDialog *self)
default:
set_dialog_item_layer1 (self,
- "dialog-warning-symbolic",
- "error",
+ 0,
_("Error: unable to determine HSI level."),
_("Error: unable to determine Incorrect HSI level."));
}
@@ -209,11 +225,29 @@ hsi_create_pg_row (const gchar *icon_name,
FwupdSecurityAttr *attr)
{
GtkWidget *row;
+ GtkWidget *status_icon;
+ GtkWidget *status_label;
+ const gchar *result_str = NULL;
row = adw_expander_row_new ();
- adw_expander_row_set_icon_name (ADW_EXPANDER_ROW (row), icon_name);
adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), attr->title);
+ result_str = fwupd_security_attr_result_to_string(attr->result);
+ if (result_str)
+ {
+ status_label = gtk_label_new (result_str);
+ if (firmware_security_attr_has_flag (attr, FWUPD_SECURITY_ATTR_FLAG_SUCCESS))
+ status_icon = gtk_image_new_from_icon_name ("emblem-ok");
+ else
+ status_icon = gtk_image_new_from_icon_name ("process-stop");
+
+ adw_expander_row_add_action (ADW_EXPANDER_ROW (row), status_label);
+ adw_expander_row_add_action (ADW_EXPANDER_ROW (row), status_icon);
+
+ gtk_widget_add_css_class (status_icon, "icon");
+ gtk_widget_add_css_class (status_label, "hsi_label");
+ }
+
if (attr->description != NULL)
{
GtkWidget *subrow = adw_action_row_new ();
@@ -267,13 +301,15 @@ update_hsi_listbox (CcFirmwareSecurityDialog *self,
continue;
if (firmware_security_attr_has_flag (attr, FWUPD_SECURITY_ATTR_FLAG_SUCCESS))
{
- pg_row = hsi_create_pg_row ("emblem-default-symbolic", "color_green", attr);
+ pg_row = hsi_create_pg_row ("emblem-ok", "color_green", attr);
gtk_widget_add_css_class (pg_row, "success-icon");
+ gtk_widget_add_css_class (pg_row, "success-title");
}
else
{
- pg_row = hsi_create_pg_row ("dialog-error-symbolic", "color_dim", attr);
+ pg_row = hsi_create_pg_row ("process-stop", "color_dim", attr);
gtk_widget_add_css_class (pg_row, "error-icon");
+ gtk_widget_add_css_class (pg_row, "error-title");
}
adw_preferences_group_add (ADW_PREFERENCES_GROUP (hsi_pg), GTK_WIDGET (pg_row));
}
@@ -297,17 +333,17 @@ on_hsi_clicked_cb (GtkWidget *widget,
if (widget == self->firmware_security_dialog_min_row)
{
- adw_window_title_set_title (self->second_page_title, _("Minimal Security Protections"));
+ adw_window_title_set_title (self->second_page_title, _("Security Level 1"));
gtk_widget_set_visible (self->firmware_security_dialog_hsi1_pg, TRUE);
}
else if (widget == self->firmware_security_dialog_basic_row)
{
- adw_window_title_set_title (self->second_page_title, _("Basic Security Protections"));
+ adw_window_title_set_title (self->second_page_title, _("Security Level 2"));
gtk_widget_set_visible (self->firmware_security_dialog_hsi2_pg, TRUE);
}
else if (widget == self->firmware_security_dialog_extend_row)
{
- adw_window_title_set_title (self->second_page_title, _("Extended Security Protections"));
+ adw_window_title_set_title (self->second_page_title, _("Security Level 3"));
gtk_widget_set_visible (self->firmware_security_dialog_hsi3_pg, TRUE);
}
}
@@ -332,7 +368,14 @@ cc_firmware_security_dialog_class_init (CcFirmwareSecurityDialogClass *klass)
gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/control-center/firmware-security/cc-firmware-security-dialog.ui");
- gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog,
firmware_security_dialog_icon);
+ gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, dialog_hsi_circle_box);
+ gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, dialog_hsi_circle_number);
+ gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, hsi1_icon);
+ gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, hsi2_icon);
+ gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, hsi3_icon);
+ gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, hsi1_title);
+ gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, hsi2_title);
+ gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, hsi3_title);
gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog,
firmware_security_dialog_title_label);
gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog,
firmware_security_dialog_body_label);
gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog,
firmware_security_dialog_hsi_label);
diff --git a/panels/firmware-security/cc-firmware-security-dialog.ui
b/panels/firmware-security/cc-firmware-security-dialog.ui
index edf3317fb..18ee03aaf 100644
--- a/panels/firmware-security/cc-firmware-security-dialog.ui
+++ b/panels/firmware-security/cc-firmware-security-dialog.ui
@@ -12,7 +12,6 @@
<property name="child">
<object class="GtkBox">
<property name="orientation">vertical</property>
-
<child>
<object class="GtkHeaderBar">
<property name="valign">start</property>
@@ -24,30 +23,35 @@
</property>
</object>
</child>
-
<child>
<object class="AdwPreferencesPage">
<property name="vexpand">True</property>
-
<child>
<object class="AdwPreferencesGroup">
<child>
- <object class="GtkImage" id="firmware_security_dialog_icon">
- <property name="margin-start">16</property>
- <property name="margin-end">16</property>
- <property name="margin-top">16</property>
- <property name="pixel-size">32</property>
+ <object class="GtkBox" id="dialog_hsi_circle_box">
+ <property name="orientation">vertical</property>
<property name="halign">center</property>
<property name="valign">center</property>
- <property name="icon-name">security-high-symbolic</property>
+ <child>
+ <object class="GtkLabel" id="dialog_hsi_circle_number">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="justify">center</property>
+ <property name="label">9</property>
+ <style>
+ <class name="hsi-level-font" />
+ </style>
+ </object>
+ </child>
<style>
- <class name="security-level-icon"/>
+ <class name="hsi-level-box" />
</style>
</object>
</child>
</object>
</child>
-
<child>
<object class="AdwPreferencesGroup">
<child>
@@ -59,7 +63,6 @@
</child>
</object>
</child>
-
<child>
<object class="AdwPreferencesGroup">
<child>
@@ -70,16 +73,36 @@
</child>
</object>
</child>
-
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="AdwActionRow" id="firmware_security_dialog_min_row">
<property name="use-underline">True</property>
<property name="activatable">True</property>
- <property name="title" translatable="yes">Minimal Protection</property>
- <property name="icon-name">emblem-default-symbolic</property>
+ <property name="title" translatable="yes">Level 1</property>
<signal name="activated" handler="on_hsi_clicked_cb" swapped="no" />
+ <child>
+ <object class="GtkImage" id="hsi1_icon">
+ <property name="icon-name">process-stop</property>
+ <style>
+ <class name="hsi_icon" />
+ <class name="error-hsi-icon" />
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="hsi1_title">
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="justify">left</property>
+ <property name="label">Failed</property>
+ <style>
+ <class name="hsi_label" />
+ <class name="error-title" />
+ </style>
+ </object>
+ </child>
<child>
<object class="GtkImage">
<property name="icon-name">go-next-symbolic</property>
@@ -91,9 +114,30 @@
<object class="AdwActionRow" id="firmware_security_dialog_basic_row">
<property name="use-underline">True</property>
<property name="activatable">True</property>
- <property name="title" translatable="yes">Basic Protection</property>
- <property name="icon-name">emblem-default-symbolic</property>
+ <property name="title" translatable="yes">Level 2</property>
<signal name="activated" handler="on_hsi_clicked_cb" swapped="no" />
+ <child>
+ <object class="GtkImage" id="hsi2_icon">
+ <property name="icon-name">process-stop</property>
+ <style>
+ <class name="hsi_icon" />
+ <class name="error-hsi-icon" />
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="hsi2_title">
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="justify">left</property>
+ <property name="label">Failed</property>
+ <style>
+ <class name="hsi_label" />
+ <class name="error-title" />
+ </style>
+ </object>
+ </child>
<child>
<object class="GtkImage">
<property name="icon-name">go-next-symbolic</property>
@@ -105,9 +149,30 @@
<object class="AdwActionRow" id="firmware_security_dialog_extend_row">
<property name="use-underline">True</property>
<property name="activatable">True</property>
- <property name="title" translatable="yes">Extended Protection</property>
- <property name="icon-name">emblem-default-symbolic</property>
+ <property name="title" translatable="yes">Level 3</property>
<signal name="activated" handler="on_hsi_clicked_cb" swapped="no" />
+ <child>
+ <object class="GtkImage" id="hsi3_icon">
+ <property name="icon-name">process-stop</property>
+ <style>
+ <class name="hsi_icon" />
+ <class name="error-hsi-icon" />
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="hsi3_title">
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="justify">left</property>
+ <property name="label">Failed</property>
+ <style>
+ <class name="hsi_label" />
+ <class name="error-title" />
+ </style>
+ </object>
+ </child>
<child>
<object class="GtkImage">
<property name="icon-name">go-next-symbolic</property>
@@ -117,7 +182,6 @@
</child>
</object>
</child>
-
<child>
<object class="AdwPreferencesGroup">
<child>
@@ -130,21 +194,17 @@
</child>
</object>
</child>
-
</object>
</child>
-
</object>
</property>
</object>
</child>
-
<child>
<object class="AdwLeafletPage">
<property name="child">
<object class="GtkBox">
<property name="orientation">vertical</property>
-
<child>
<object class="GtkHeaderBar">
<property name="valign">start</property>
@@ -165,7 +225,6 @@
</child>
</object>
</child>
-
<child>
<object class="AdwPreferencesPage">
<child>
@@ -185,13 +244,11 @@
</child>
</object>
</child>
-
</object>
</property>
</object>
</child>
-
</object>
</child>
</template>
-</interface>
+</interface>
\ No newline at end of file
diff --git a/panels/firmware-security/cc-firmware-security-panel.c
b/panels/firmware-security/cc-firmware-security-panel.c
index 0a3db4002..81fd86968 100644
--- a/panels/firmware-security/cc-firmware-security-panel.c
+++ b/panels/firmware-security/cc-firmware-security-panel.c
@@ -41,7 +41,10 @@ struct _CcfirmwareSecurityPanel
/* HSI button */
GtkWidget *hsi_grid;
- GtkWidget *hsi_icon;
+
+ GtkWidget *hsi_circle_box;
+ GtkWidget *hsi_circle_number;
+
GtkWidget *hsi_label;
GtkWidget *hsi_description;
@@ -177,13 +180,13 @@ parse_event_variant_iter (CcfirmwareSecurityPanel *self,
row = adw_expander_row_new ();
if (attr->flags & FWUPD_SECURITY_ATTR_FLAG_SUCCESS)
{
- adw_expander_row_set_icon_name (ADW_EXPANDER_ROW (row), "emblem-default-symbolic");
+ adw_expander_row_set_icon_name (ADW_EXPANDER_ROW (row), "emblem-ok");
gtk_widget_add_css_class (row, "success-icon");
}
else
{
- adw_expander_row_set_icon_name (ADW_EXPANDER_ROW (row), "dialog-warning-symbolic");
- gtk_widget_add_css_class (row, "warning-icon");
+ adw_expander_row_set_icon_name (ADW_EXPANDER_ROW (row), "process-stop");
+ gtk_widget_add_css_class (row, "error-icon");
}
if (attr->description != NULL)
@@ -423,13 +426,36 @@ on_secure_boot_button_clicked_cb (GtkWidget *widget,
static void
set_hsi_button_view_contain (CcfirmwareSecurityPanel *self,
- const gchar *icon_name,
- const gchar *style,
+ const int hsi_number,
+
gchar *title,
const gchar *description)
{
- gtk_image_set_from_icon_name (GTK_IMAGE (self->hsi_icon), icon_name);
- gtk_widget_add_css_class (self->hsi_icon, style);
+ switch (hsi_number)
+ {
+ case 0:
+ gtk_label_set_label (GTK_LABEL (self->hsi_circle_number), "0");
+ gtk_widget_add_css_class (self->hsi_circle_box, "level0");
+ gtk_widget_add_css_class (self->hsi_circle_number, "hsi0");
+ break;
+ case 1:
+ gtk_label_set_label (GTK_LABEL (self->hsi_circle_number), "1");
+ gtk_widget_add_css_class (self->hsi_circle_box, "level1");
+ gtk_widget_add_css_class (self->hsi_circle_number, "hsi1");
+ break;
+ case 2:
+ gtk_label_set_label (GTK_LABEL (self->hsi_circle_number), "2");
+ gtk_widget_add_css_class (self->hsi_circle_box, "level2");
+ gtk_widget_add_css_class (self->hsi_circle_number, "hsi2");
+ break;
+ case 3:
+ case 4:
+ gtk_label_set_label (GTK_LABEL (self->hsi_circle_number), "3");
+ gtk_widget_add_css_class (self->hsi_circle_box, "level3");
+ gtk_widget_add_css_class (self->hsi_circle_number, "hsi3");
+ break;
+ }
+
gtk_label_set_text (GTK_LABEL (self->hsi_label), title);
gtk_label_set_text (GTK_LABEL (self->hsi_description), description);
}
@@ -440,36 +466,37 @@ set_hsi_button_view (CcfirmwareSecurityPanel *self)
switch (self->hsi_number)
{
case 0:
- set_hsi_button_view_contain (self, "dialog-warning-symbolic",
- "error",
+ set_hsi_button_view_contain (self,
+ self->hsi_number,
/* TRANSLATORS: in reference to firmware protection: 0/4 stars */
- _("No Protection"),
- _("Highly exposed to security threats."));
+ _("Security Level 0"),
+ _("Exposed to serious security threats."));
break;
case 1:
- set_hsi_button_view_contain (self, "security-low-symbolic",
- "neutral",
+ set_hsi_button_view_contain (self,
+ self->hsi_number,
/* TRANSLATORS: in reference to firmware protection: 1/4 stars */
- _("Minimal Protection"),
+ _("Security Level 1"),
_("Limited protection against simple security threats."));
break;
case 2:
- set_hsi_button_view_contain (self, "security-medium-symbolic",
- "warning",
+ set_hsi_button_view_contain (self,
+ self->hsi_number,
/* TRANSLATORS: in reference to firmware protection: 2/4 stars */
- _("Basic Protection"),
+ _("Security Level 2"),
_("Protected against common security threats."));
break;
case 3:
- set_hsi_button_view_contain (self, "security-high-symbolic",
- "good",
+ set_hsi_button_view_contain (self,
+ self->hsi_number,
/* TRANSLATORS: in reference to firmware protection: 3/4 stars */
- _("Extended Protection"),
+ _("Security Level 3"),
_("Protected against a wide range of security threats."));
break;
case 4:
- set_hsi_button_view_contain (self, "security-high-symbolic",
- "good",
+ set_hsi_button_view_contain (self,
+ /* Based on current HSI definition, the max HSI value would be 3. */
+ 3,
/* TRANSLATORS: in reference to firmware protection: 4/4 stars */
_("Comprehensive Protection"),
_("Protected against a wide range of security threats."));
@@ -617,7 +644,8 @@ cc_firmware_security_panel_class_init (CcfirmwareSecurityPanelClass *klass)
gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, firmware_security_log_stack);
gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, hsi_button);
gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, hsi_description);
- gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, hsi_icon);
+ gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, hsi_circle_box);
+ gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, hsi_circle_number);
gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, hsi_label);
gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, secure_boot_button);
gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, secure_boot_description);
diff --git a/panels/firmware-security/cc-firmware-security-panel.ui
b/panels/firmware-security/cc-firmware-security-panel.ui
index 359e39477..46b407103 100644
--- a/panels/firmware-security/cc-firmware-security-panel.ui
+++ b/panels/firmware-security/cc-firmware-security-panel.ui
@@ -6,7 +6,6 @@
<child>
<object class="AdwPreferencesGroup">
-
<child>
<object class="GtkBox" id="firmware_security_hbox">
<property name="spacing">24</property>
@@ -15,6 +14,7 @@
<object class="GtkButton" id="hsi_button">
<property name="receives-default">True</property>
<property name="sensitive">True</property>
+ <property name="vexpand-set">True</property>
<signal name="clicked" handler="on_hsi_button_clicked_cb" swapped="no" />
<style>
<class name="card" />
@@ -30,14 +30,25 @@
<property name="margin-bottom">24</property>
<property name="spacing">6</property>
<child>
- <object class="GtkImage" id="hsi_icon">
+ <object class="GtkBox" id="hsi_circle_box">
+ <property name="orientation">vertical</property>
<property name="halign">center</property>
<property name="valign">center</property>
- <property name="icon-name">security-low-symbolic</property>
- <property name="pixel-size">32</property>
<property name="margin-bottom">6</property>
+ <child>
+ <object class="GtkLabel" id="hsi_circle_number">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="justify">center</property>
+ <property name="label">9</property>
+ <style>
+ <class name="hsi-level-font" />
+ </style>
+ </object>
+ </child>
<style>
- <class name="security-level-icon"/>
+ <class name="hsi-level-box" />
</style>
</object>
</child>
@@ -87,10 +98,10 @@
<property name="pixel-size">32</property>
<property name="halign">center</property>
<property name="valign">center</property>
- <property name="icon-name">system-reboot-symbolic</property>
+ <property name="icon-name">channel-insecure</property>
<property name="margin-bottom">6</property>
<style>
- <class name="security-level-icon"/>
+ <class name="security-level-icon" />
</style>
</object>
</child>
@@ -155,10 +166,10 @@
</child>
</object>
</child>
+
</object>
</child>
-
</object>
</child>
</template>
-</interface>
+</interface>
\ No newline at end of file
diff --git a/panels/firmware-security/cc-firmware-security-utils.c
b/panels/firmware-security/cc-firmware-security-utils.c
index 4b65b9e92..224567b19 100644
--- a/panels/firmware-security/cc-firmware-security-utils.c
+++ b/panels/firmware-security/cc-firmware-security-utils.c
@@ -228,6 +228,83 @@ fu_security_attr_get_title_fallback (const gchar *appstream_id)
return NULL;
}
+const gchar *
+fwupd_security_attr_result_to_string (FwupdSecurityAttrResult result)
+{
+ if (result == FWUPD_SECURITY_ATTR_RESULT_VALID)
+ {
+ /* TRANSLATORS: if the stauts is valid. For example security check is valid and key is valid. */
+ return _("Valid");
+ }
+ if (result == FWUPD_SECURITY_ATTR_RESULT_NOT_VALID)
+ {
+ /* TRANSLATORS: if the status or key is not valid. */
+ return _("Not Valid");
+ }
+ if (result == FWUPD_SECURITY_ATTR_RESULT_ENABLED)
+ {
+ /* TRANSLATORS: if the function is enabled through BIOS or OS settings. */
+ return _("Enabled");
+ }
+ if (result == FWUPD_SECURITY_ATTR_RESULT_NOT_ENABLED)
+ {
+ /* TRANSLATORS: if the function is not enabled through BIOS or OS settings. */
+ return _("Not Enabled");
+ }
+ if (result == FWUPD_SECURITY_ATTR_RESULT_LOCKED)
+ {
+ /* TRANSLATORS: the memory space or system mode is locked to prevent from malicious modification. */
+ return _("Locked");
+ }
+ if (result == FWUPD_SECURITY_ATTR_RESULT_NOT_LOCKED)
+ {
+ /* TRANSLATORS: the memory space or system mode is not locked. */
+ return _("Not Locked");
+ }
+ if (result == FWUPD_SECURITY_ATTR_RESULT_ENCRYPTED)
+ {
+ /* TRANSLATORS: The data is encrypted to prevent from malicious reading. */
+ return _("Encrypted");
+ }
+ if (result == FWUPD_SECURITY_ATTR_RESULT_NOT_ENCRYPTED)
+ {
+ /* TRANSLATORS: the data in memory is plane text. */
+ return _("Not Encrypted");
+ }
+ if (result == FWUPD_SECURITY_ATTR_RESULT_TAINTED)
+ {
+ /* TRANSLATORS: Linux kernel is tainted by third party kernel module. */
+ return _("Tainted");
+ }
+ if (result == FWUPD_SECURITY_ATTR_RESULT_NOT_TAINTED)
+ {
+ /* TRANSLATORS: All the loaded kernel module are licensed. */
+ return _("Not Tainted");
+ }
+ if (result == FWUPD_SECURITY_ATTR_RESULT_FOUND)
+ {
+ /* TRANSLATORS: the feature can be detected. */
+ return _("Found");
+ }
+ if (result == FWUPD_SECURITY_ATTR_RESULT_NOT_FOUND)
+ {
+ /* TRANSLATORS: the feature can't be detected. */
+ return _("Not Found");
+ }
+ if (result == FWUPD_SECURITY_ATTR_RESULT_SUPPORTED)
+ {
+ /* TRANSLATORS: the function is supported by hardware. */
+ return _("Supported");
+ }
+ if (result == FWUPD_SECURITY_ATTR_RESULT_NOT_SUPPORTED)
+ {
+ /* TRANSLATORS: the function isn't supported by hardware. */
+ return _("Not Supported");
+ }
+ return NULL;
+}
+
+
/* ->summary and ->description are translated */
FwupdSecurityAttr *
fu_security_attr_new_from_variant (GVariantIter *iter)
@@ -244,6 +321,8 @@ fu_security_attr_new_from_variant (GVariantIter *iter)
attr->flags = g_variant_get_uint64(value);
else if (g_strcmp0 (key, "HsiLevel") == 0)
attr->hsi_level = g_variant_get_uint32 (value);
+ else if (g_strcmp0 (key, "HsiResult") == 0)
+ attr->result = g_variant_get_uint32 (value);
else if (g_strcmp0 (key, "Created") == 0)
attr->timestamp = g_variant_get_uint64 (value);
else if (g_strcmp0 (key, "Description") == 0)
diff --git a/panels/firmware-security/cc-firmware-security-utils.h
b/panels/firmware-security/cc-firmware-security-utils.h
index ef844c001..6c895da87 100644
--- a/panels/firmware-security/cc-firmware-security-utils.h
+++ b/panels/firmware-security/cc-firmware-security-utils.h
@@ -123,9 +123,10 @@ void fu_security_attr_free (FwupdSecurityAttr *attr);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FwupdSecurityAttr, fu_security_attr_free)
-gboolean firmware_security_attr_has_flag (FwupdSecurityAttr *attr,
- FwupdSecurityAttrFlags flag);
-void load_custom_css (const char *path);
-
+gboolean firmware_security_attr_has_flag (FwupdSecurityAttr *attr,
+ FwupdSecurityAttrFlags flag);
+void load_custom_css (const char *path);
+const gchar *fwupd_security_attr_result_to_string (FwupdSecurityAttrResult result);
+gboolean fwupd_get_result_status (FwupdSecurityAttrResult result);
G_END_DECLS
diff --git a/panels/firmware-security/security-level.css b/panels/firmware-security/security-level.css
index 33be08778..282412d98 100644
--- a/panels/firmware-security/security-level.css
+++ b/panels/firmware-security/security-level.css
@@ -1,3 +1,47 @@
+.hsi-level-box {
+ border-radius: 9999px;
+ min-width: 64px;
+ min-height: 64px;
+
+}
+
+.hsi-level-box.level0 {
+ background-color: alpha(@error_color, .25);
+}
+
+.hsi-level-box.level1 {
+ background-color: alpha(@light_4, .25);
+}
+
+.hsi-level-box.level2 {
+ background-color: alpha(@warning_color, .25);
+}
+
+.hsi-level-box.level3 {
+ background-color: alpha(@success_color, .25);
+}
+
+.hsi-level-font {
+ font-size: 32px;
+ font-weight: 800;
+}
+
+.hsi-level-font.hsi0 {
+ color: @error_color;
+}
+
+.hsi-level-font.hsi1 {
+ color: @light_4;
+}
+
+.hsi-level-font.hsi2 {
+ color: @warning_color;
+}
+
+.hsi-level-font.hsi3 {
+ color: @success_color;
+}
+
.security-level-icon {
border-radius: 9999px;
min-width: 64px;
@@ -32,18 +76,34 @@
color: @light_4f;
}
-row.success-icon image {
+row.success-icon image.icon {
color: @success_color;
}
-row.warning-icon image {
+row.warning-icon image.icon {
color: @warning_color;
}
-row.error-icon image {
+row.error-icon image.icon {
color: @error_color;
}
row.gray-icon image {
color: @light_4;
}
+
+row.success-hsi-icon image.hsi_icon {
+ color: @success_color;
+}
+
+row.error-hsi-icon image.hsi_icon {
+ color: @error_color;
+}
+
+row.success-title label.hsi_label {
+ color: @success_color;
+}
+
+row.error-title label.hsi_label {
+ color: @error_color;
+}
\ No newline at end of file
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]