[gnome-software/flatpak-permissions: 2/5] details: Show permissions
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/flatpak-permissions: 2/5] details: Show permissions
- Date: Wed, 26 Dec 2018 22:23:55 +0000 (UTC)
commit fb50b2bf23aef35f8a7d7b58cd92e885736df8a4
Author: Matthias Clasen <mclasen redhat com>
Date: Wed Dec 26 08:48:59 2018 -0500
details: Show permissions
Show information about system access of applications.
This is loosely based on mockups in
https://gitlab.gnome.org/GNOME/gnome-software/issues/69
src/gs-details-page.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++
src/gs-details-page.ui | 67 ++++++++++++++++++++++++++
src/gtk-style.css | 35 ++++++++++++++
3 files changed, 227 insertions(+)
---
diff --git a/src/gs-details-page.c b/src/gs-details-page.c
index 789960c4..50d0a0df 100644
--- a/src/gs-details-page.c
+++ b/src/gs-details-page.c
@@ -117,6 +117,8 @@ struct _GsDetailsPage
GtkWidget *label_details_updated_title;
GtkWidget *label_details_updated_value;
GtkWidget *label_details_version_value;
+ GtkWidget *label_details_permissions_title;
+ GtkWidget *button_details_permissions_value;
GtkWidget *label_failed;
GtkWidget *label_license_nonfree_details;
GtkWidget *label_licenses_intro;
@@ -151,6 +153,8 @@ struct _GsDetailsPage
GtkWidget *label_content_rating_none;
GtkWidget *button_details_rating_value;
GtkWidget *label_details_rating_title;
+ GtkWidget *popover_permissions;
+ GtkWidget *box_permissions_details;
};
G_DEFINE_TYPE (GsDetailsPage, gs_details_page, GS_TYPE_PAGE)
@@ -944,6 +948,78 @@ gs_details_page_refresh_buttons (GsDetailsPage *self)
}
}
+static struct {
+ GsAppPermissions permission;
+ const char *icon;
+ const char *label;
+} permission_display_data[] = {
+ { GS_APP_PERMISSIONS_NETWORK, "network-transmit-receive-symbolic", N_("Network Access") },
+ { GS_APP_PERMISSIONS_SYSTEM_BUS, "dialog-warning-symbolic", N_("System Services") },
+ { GS_APP_PERMISSIONS_SESSION_BUS, "dialog-warning-symbolic", N_("Session Services") },
+ { GS_APP_PERMISSIONS_DEVICES, "dialog-warning-symbolic", N_("Devices") },
+ { GS_APP_PERMISSIONS_HOME_FULL, "system-file-manager-symbolic", N_("Home directory") },
+ { GS_APP_PERMISSIONS_HOME_READ, "system-file-manager-symbolic", N_("Home directory, read-only") },
+ { GS_APP_PERMISSIONS_FILESYSTEM_FULL, "system-file-manager-symbolic", N_("System file access") },
+ { GS_APP_PERMISSIONS_FILESYSTEM_READ, "system-file-manager-symbolic", N_("System file access, read-only")
},
+ { GS_APP_PERMISSIONS_SETTINGS, "applications-system-symbolic", N_("Settings") },
+ { GS_APP_PERMISSIONS_X11, "dialog-warning-symbolic", N_("Legacy display system") },
+
+};
+
+static void
+populate_permission_details (GsDetailsPage *self, GsAppPermissions permissions)
+{
+ GList *children, *l;
+
+ children = gtk_container_get_children (GTK_CONTAINER (self->box_permissions_details));
+ for (l = children; l; l = l->next)
+ gtk_widget_destroy (GTK_WIDGET (l->data));
+ g_list_free (children);
+
+ if (permissions == GS_APP_PERMISSIONS_NONE) {
+ GtkWidget *label;
+ label = gtk_label_new (_("This application is fully sandboxed."));
+ gtk_label_set_max_width_chars (GTK_LABEL (label), 40);
+ gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+ gtk_widget_show (label);
+ gtk_container_add (GTK_CONTAINER (self->box_permissions_details), label);
+ }
+ else if (permissions == GS_APP_PERMISSIONS_UNKNOWN) {
+ GtkWidget *label;
+ label = gtk_label_new (_("Unable to determine which parts of the system "
+ "this application accesses. This is typical for "
+ "older applications."));
+ gtk_label_set_max_width_chars (GTK_LABEL (label), 40);
+ gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+ gtk_widget_show (label);
+ gtk_container_add (GTK_CONTAINER (self->box_permissions_details), label);
+ }
+ else {
+ gsize i;
+
+ for (i = 0; i < G_N_ELEMENTS (permission_display_data); i++) {
+ GtkWidget *row, *image, *label;
+
+ if ((permissions & permission_display_data[i].permission) == 0)
+ continue;
+
+ row = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_widget_show (row);
+ if ((permission_display_data[i].permission & ~MEDIUM_PERMISSIONS) != 0) {
+ gtk_style_context_add_class (gtk_widget_get_style_context (row),
"permission-row-warning");
+ }
+
+ image = gtk_image_new_from_icon_name (permission_display_data[i].icon,
GTK_ICON_SIZE_MENU);
+ gtk_widget_show (image);
+ label = gtk_label_new (_(permission_display_data[i].label));
+ gtk_widget_show (label);
+ gtk_container_add (GTK_CONTAINER (row), image);
+ gtk_container_add (GTK_CONTAINER (row), label);
+ gtk_container_add (GTK_CONTAINER (self->box_permissions_details), row);
+ }
+ }
+}
+
static void
gs_details_page_refresh_all (GsDetailsPage *self)
{
@@ -1152,6 +1228,42 @@ gs_details_page_refresh_all (GsDetailsPage *self)
break;
}
+ if ((kudos & GS_APP_KUDO_SANDBOXED) > 0)
+ {
+ GtkStyleContext *context = gtk_widget_get_style_context (self->button_details_permissions_value);
+ GsAppPermissions permissions = gs_app_get_permissions (self->app);
+
+ populate_permission_details (self, permissions);
+
+ gtk_style_context_remove_class (context, "details-permissions-unknown");
+ if ((permissions & ~LIMITED_PERMISSIONS) == 0)
+ {
+ gtk_button_set_label (GTK_BUTTON (self->button_details_permissions_value), _("Limited"));
+ gtk_style_context_add_class (context, "details-permissions-limited");
+ }
+ else if ((permissions & ~MEDIUM_PERMISSIONS) == 0)
+ {
+ gtk_button_set_label (GTK_BUTTON (self->button_details_permissions_value), _("Medium"));
+ gtk_style_context_add_class (context, "details-permissions-medium");
+ }
+ else
+ {
+ gtk_button_set_label (GTK_BUTTON (self->button_details_permissions_value), _("Warning"));
+ gtk_style_context_add_class (context, "details-permissions-warning");
+ }
+ }
+ else
+ {
+ GtkStyleContext *context = gtk_widget_get_style_context (self->button_details_permissions_value);
+
+ populate_permission_details (self, GS_APP_PERMISSIONS_UNKNOWN);
+ gtk_button_set_label (GTK_BUTTON (self->button_details_permissions_value), _("Unknown"));
+ gtk_style_context_add_class (context, "details-permissions-unknown");
+ gtk_style_context_remove_class (context, "details-permissions-limited");
+ gtk_style_context_remove_class (context, "details-permissions-medium");
+ gtk_style_context_remove_class (context, "details-permissions-warning");
+ }
+
/* are we trying to replace something in the baseos */
gtk_widget_set_visible (self->infobar_details_package_baseos,
gs_app_has_quirk (self->app, GS_APP_QUIRK_COMPULSORY) &&
@@ -2209,6 +2321,12 @@ gs_details_page_content_rating_button_cb (GtkWidget *widget, GsDetailsPage *self
gtk_widget_show (self->popover_content_rating);
}
+static void
+gs_details_page_permissions_button_cb (GtkWidget *widget, GsDetailsPage *self)
+{
+ gtk_widget_show (self->popover_permissions);
+}
+
static gboolean
gs_details_page_activate_link_cb (GtkLabel *label,
const gchar *uri,
@@ -2415,6 +2533,9 @@ gs_details_page_setup (GsPage *page,
g_signal_connect (self->button_details_rating_value, "clicked",
G_CALLBACK (gs_details_page_content_rating_button_cb),
self);
+ g_signal_connect (self->button_details_permissions_value, "clicked",
+ G_CALLBACK (gs_details_page_permissions_button_cb),
+ self);
g_signal_connect (self->label_details_updated_value, "activate-link",
G_CALLBACK (gs_details_page_history_cb),
self);
@@ -2543,6 +2664,8 @@ gs_details_page_class_init (GsDetailsPageClass *klass)
gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_details_updated_title);
gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_details_updated_value);
gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_details_version_value);
+ gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_details_permissions_title);
+ gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, button_details_permissions_value);
gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_failed);
gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, list_box_addons);
gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, box_reviews);
@@ -2577,6 +2700,8 @@ gs_details_page_class_init (GsDetailsPageClass *klass)
gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_content_rating_none);
gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, button_details_rating_value);
gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_details_rating_title);
+ gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, popover_permissions);
+ gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, box_permissions_details);
}
static void
diff --git a/src/gs-details-page.ui b/src/gs-details-page.ui
index 05033864..ddfaf51e 100644
--- a/src/gs-details-page.ui
+++ b/src/gs-details-page.ui
@@ -642,6 +642,44 @@
</packing>
</child>
+ <child>
+ <object class="GtkLabel" id="label_details_permissions_title">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">System Access</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_details_permissions_value">
+ <property name="visible">True</property>
+ <property name="use_underline">True</property>
+ <property name="label">Details</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="vexpand">False</property>
+ <property name="halign">start</property>
+ <style>
+ <class name="content-rating"/>
+ </style>
+ <accessibility>
+ <relation type="labelled-by" target="label_details_permissions_title"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">9</property>
+ </packing>
+ </child>
+
<child>
<object class="GtkLabel" id="label_details_updated_title">
<property name="visible">True</property>
@@ -1285,4 +1323,33 @@
</object>
</child>
</object>
+ <object class="GtkPopover" id="popover_permissions">
+ <property name="visible">False</property>
+ <property name="border_width">21</property>
+ <property name="relative_to">button_details_permissions_value</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">18</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="label" translatable="yes">System Access</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="box_permissions_details">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
</interface>
diff --git a/src/gtk-style.css b/src/gtk-style.css
index ef7168dd..35949eed 100644
--- a/src/gtk-style.css
+++ b/src/gtk-style.css
@@ -53,6 +53,14 @@
border-radius: 16px;
}
+.details-permissions-limited,
+.details-permissions-limited:backdrop,
+.details-permissions-medium,
+.details-permissions-medium:backdrop,
+.details-permissions-warning,
+.details-permissions-warning:backdrop,
+.details-permissions-unknown,
+.details-permissions-unknown:backdrop,
.details-license-free,
.details-license-nonfree,
.details-license-unknown,
@@ -70,6 +78,12 @@
color: #ffffff;
}
+.details-permissions-limited label,
+.details-permissions-limited:backdrop label,
+.details-permissions-limited:hover label,
+.details-permissions-warning label,
+.details-permissions-warning :backdrop label,
+.details-permissions-warning :hover label,
.details-license-free label,
.details-license-free:backdrop label,
.details-license-free:hover label,
@@ -79,6 +93,12 @@
color: #fff;
}
+.details-permissions-medium label,
+.details-permissions-medium:backdrop label,
+.details-permissions-medium:hover label,
+.details-permissions-unknown label,
+.details-permissions-unknown:backdrop label,
+.details-permissions-unknown:hover label,
.details-license-unknown label,
.details-license-unknown:backdrop label,
.details-license-unknown:hover label {
@@ -97,42 +117,57 @@
text-shadow: none;
}
+.details-permissions-limited,
.details-license-free {
background-color: #4e9a06;
border-color: #3e7905;
}
+.details-permissions-limited:hover,
.details-license-free:hover {
background-color: #5db807;
border-color: #4d9606;
}
+.details-permissions-limited:backdrop,
.details-license-free:backdrop {
border-color: #4e9a06;
}
+.details-permissions-warning,
.details-license-nonfree {
background-color: #ee2222;
border-color: #c20f0f;
}
+.details-permissions-warning:hover,
.details-license-nonfree:hover {
background-color: #f25959;
border-color: #ed1b1b;
}
+.details-permissions-warning:backdrop,
.details-license-nonfree:backdrop {
border-color: #ee2222;
}
+.details-permissions-medium,
+.details-permissions-unknown,
.details-license-unknown {
background-color: #dbdbdb;
border-color: #bbbbbb;
}
+.details-permissions-medium:hover,
+.details-permissions-unknown:hover,
.details-license-unknown:hover {
background-color: #eeeeee;
border-color: #d5d5d5;
}
+.details-permissions-medium:backdrop,
+.details-permissions-unknown:backdrop,
.details-license-unknown:backdrop {
border-color: #dbdbdb;
}
+.permission-row-warning {
+ color: #ee2222;
+}
.kudo-pill {
color: @theme_selected_fg_color;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]