[gnome-software/flatpak-permissions: 3/4] updates page: show new permissions



commit 9838480dc1a04e014f7eaed023ec3978e5d0e4e7
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Dec 26 16:50:18 2018 -0500

    updates page: show new permissions
    
    Add a warning in the list if there are new permissions,
    and spell out the permissions in the update dialog.

 src/gs-app-row.c        |  7 +++++
 src/gs-update-dialog.c  | 80 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/gs-update-dialog.ui | 42 +++++++++++++++++++++-----
 3 files changed, 122 insertions(+), 7 deletions(-)
---
diff --git a/src/gs-app-row.c b/src/gs-app-row.c
index 9d0fba98..25d90f85 100644
--- a/src/gs-app-row.c
+++ b/src/gs-app-row.c
@@ -488,6 +488,13 @@ gs_app_row_refresh (GsAppRow *app_row)
        } else {
                gtk_widget_hide (priv->label_app_size);
        }
+
+       /* add warning */
+       if (gs_app_has_quirk (priv->app, GS_APP_QUIRK_NEW_PERMISSIONS)) {
+               gtk_label_set_text (GTK_LABEL (priv->label_warning),
+                                   _("Requires additional permissions"));
+               gtk_widget_show (priv->label_warning);
+       }
 }
 
 static void
diff --git a/src/gs-update-dialog.c b/src/gs-update-dialog.c
index 29a349b9..4bec35d2 100644
--- a/src/gs-update-dialog.c
+++ b/src/gs-update-dialog.c
@@ -64,6 +64,8 @@ struct _GsUpdateDialog
        GtkWidget       *scrolledwindow_details;
        GtkWidget       *spinner;
        GtkWidget       *stack;
+       GtkWidget       *permissions_section_title;
+       GtkWidget       *permissions_section_content;
 };
 
 G_DEFINE_TYPE (GsUpdateDialog, gs_update_dialog, GTK_TYPE_DIALOG)
@@ -96,6 +98,73 @@ back_entry_free (BackEntry *entry)
        g_slice_free (BackEntry, entry);
 }
 
+static struct {
+        GsAppPermissions permission;
+        const char *title;
+        const char *subtitle;
+} permission_display_data[] = {
+  { GS_APP_PERMISSIONS_NETWORK, N_("Network"), N_("Can communicate over the network") },
+  { GS_APP_PERMISSIONS_SYSTEM_BUS, N_("System Services"), N_("...") },
+  { GS_APP_PERMISSIONS_SESSION_BUS, N_("Session Services"), N_("...") },
+  { GS_APP_PERMISSIONS_DEVICES, N_("Devices"), N_("Can access system device files") },
+  { GS_APP_PERMISSIONS_HOME_FULL, N_("Home folder"), N_("Can view, edit and create files") },
+  { GS_APP_PERMISSIONS_HOME_READ, N_("Home folder"), N_("Can view files") },
+  { GS_APP_PERMISSIONS_FILESYSTEM_FULL, N_("File system"), N_("Can view, edit and create files") },
+  { GS_APP_PERMISSIONS_FILESYSTEM_READ, N_("File system"), N_("Can view files") },
+  { GS_APP_PERMISSIONS_DOWNLOADS_FULL, N_("Downloads folder"), N_("Can view, edit and create files") },
+  { GS_APP_PERMISSIONS_DOWNLOADS_READ, N_("Downloads folder"), N_("Can view files") },
+  { GS_APP_PERMISSIONS_SETTINGS, N_("Settings"), N_("Can view and change any settings") },
+  { GS_APP_PERMISSIONS_X11, N_("Legacy display system"), N_("Uses an old, insecure display system") },
+};
+
+static void
+populate_permissions_section (GsUpdateDialog *dialog, GsAppPermissions permissions)
+{
+       GList *children;
+
+       children = gtk_container_get_children (GTK_CONTAINER (dialog->permissions_section_content));
+       for (GList *l = children; l != NULL; l = l->next)
+               gtk_widget_destroy (GTK_WIDGET (l->data));
+       g_list_free (children);
+
+       for (gsize i = 0; i < G_N_ELEMENTS (permission_display_data); i++) {
+               GtkWidget *row, *image, *box, *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 ("dialog-warning-symbolic", GTK_ICON_SIZE_MENU);
+               if ((permission_display_data[i].permission & ~MEDIUM_PERMISSIONS) == 0)
+                       gtk_widget_set_opacity (image, 0);
+
+               gtk_widget_show (image);
+               gtk_container_add (GTK_CONTAINER (row), image);
+
+               box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+               gtk_widget_show (box);
+               gtk_container_add (GTK_CONTAINER (row), box);
+
+               label = gtk_label_new (_(permission_display_data[i].title));
+               gtk_label_set_xalign (GTK_LABEL (label), 0);
+               gtk_widget_show (label);
+               gtk_container_add (GTK_CONTAINER (box), label);
+
+               label = gtk_label_new (_(permission_display_data[i].subtitle));
+               gtk_label_set_xalign (GTK_LABEL (label), 0);
+               gtk_style_context_add_class (gtk_widget_get_style_context (label), "dim-label");
+               gtk_widget_show (label);
+               gtk_container_add (GTK_CONTAINER (box), label);
+
+               gtk_container_add (GTK_CONTAINER (dialog->permissions_section_content), row);
+       }
+}
+
 static void
 set_updates_description_ui (GsUpdateDialog *dialog, GsApp *app)
 {
@@ -140,6 +209,15 @@ set_updates_description_ui (GsUpdateDialog *dialog, GsApp *app)
 
        /* show the back button if needed */
        gtk_widget_set_visible (dialog->button_back, !g_queue_is_empty (dialog->back_entry_stack));
+
+       if (gs_app_has_quirk (app, GS_APP_QUIRK_NEW_PERMISSIONS)) {
+               gtk_widget_show (dialog->permissions_section_title);
+               gtk_widget_show (dialog->permissions_section_content);
+               populate_permissions_section (dialog, gs_app_get_permissions (app));
+       } else {
+               gtk_widget_hide (dialog->permissions_section_title);
+               gtk_widget_hide (dialog->permissions_section_content);
+       }
 }
 
 static void
@@ -758,6 +836,8 @@ gs_update_dialog_class_init (GsUpdateDialogClass *klass)
        gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, scrolledwindow_details);
        gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, spinner);
        gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, stack);
+       gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, permissions_section_title);
+       gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, permissions_section_content);
 }
 
 GtkWidget *
diff --git a/src/gs-update-dialog.ui b/src/gs-update-dialog.ui
index a9c57d1d..73bb8463 100644
--- a/src/gs-update-dialog.ui
+++ b/src/gs-update-dialog.ui
@@ -175,16 +175,44 @@
                     <property name="vscrollbar_policy">automatic</property>
                     <property name="shadow_type">none</property>
                     <child>
-                      <object class="GtkLabel" id="label_details">
+                      <object class="GtkBox">
                         <property name="visible">True</property>
-                        <property name="xalign">0</property>
-                        <property name="yalign">0</property>
-                        <property name="margin">6</property>
-                        <property name="label">New in kmod 14-1
+                        <property name="orientation">vertical</property>
+                        <property name="spacing">20</property>
+                        <child>
+                          <object class="GtkLabel" id="label_details">
+                            <property name="visible">True</property>
+                            <property name="xalign">0</property>
+                            <property name="yalign">0</property>
+                            <property name="margin">6</property>
+                            <property name="label">New in kmod 14-1
 * Moo
 * bar</property>
-                        <property name="wrap">True</property>
-                        <property name="selectable">True</property>
+                            <property name="wrap">True</property>
+                            <property name="selectable">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkLabel" id="permissions_section_title">
+                            <property name="visible">True</property>
+                            <property name="xalign">0</property>
+                            <property name="halign">start</property>
+                            <property name="margin">6</property>
+                            <property name="label" translatable="yes">New System Access</property>
+                            <attributes>
+                              <attribute name="weight" value="bold"/>
+                            </attributes>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkBox" id="permissions_section_content">
+                            <property name="visible">True</property>
+                            <property name="orientation">vertical</property>
+                            <property name="spacing">12</property>
+                            <property name="margin-start">18</property>
+                            <property name="margin-end">18</property>
+                          </object>
+                        </child>
                       </object>
                     </child>
                   </object>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]