Home | History | Annotate | Download | only in patches
      1  19171   mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-addto.c gnome-panel-2.27.91/gnome-panel/panel-addto.c
      2  19171   mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-addto.c	2009-08-26 17:27:48.018970000 +0100
      3  19171   mattman +++ gnome-panel-2.27.91/gnome-panel/panel-addto.c	2009-08-26 17:33:56.113982000 +0100
      4  18706   mattman @@ -571,9 +571,10 @@ panel_addto_make_applet_model (PanelAddt
      5  12125      gman  						dialog, NULL);
      6  12125      gman  }
      7  12125      gman  
      8  12125      gman -static void panel_addto_make_application_list (GSList             **parent_list,
      9  12125      gman +static gint panel_addto_make_application_list (GSList             **parent_list,
     10  12125      gman  					       GMenuTreeDirectory  *directory,
     11  12125      gman  					       const char          *filename);
     12  12125      gman +static void panel_addto_dialog_free_item_info (PanelAddtoItemInfo *item_info);
     13  12125      gman  
     14  12125      gman  static void
     15  12125      gman  panel_addto_prepend_directory (GSList             **parent_list,
     16  18706   mattman @@ -581,6 +582,7 @@ panel_addto_prepend_directory (GSList   
     17  12125      gman  			       const char          *filename)
     18  12125      gman  {
     19  12125      gman  	PanelAddtoAppList *data;
     20  12125      gman +    gint entries_added = 0;
     21  12125      gman  
     22  12125      gman  	data = g_new0 (PanelAddtoAppList, 1);
     23  12125      gman  
     24  18706   mattman @@ -600,9 +602,16 @@ panel_addto_prepend_directory (GSList   
     25  12125      gman  	 * So the iid is built when we select the row.
     26  12125      gman  	 */
     27  12125      gman  
     28  12125      gman -	*parent_list = g_slist_prepend (*parent_list, data);
     29  12125      gman -			
     30  12125      gman -	panel_addto_make_application_list (&data->children, directory, filename);
     31  12125      gman +	entries_added = panel_addto_make_application_list (&data->children, directory, filename);
     32  12125      gman +	if (entries_added > 0) {
     33  12125      gman +		/*Only prepend if there are entries */
     34  12125      gman +		*parent_list = g_slist_prepend (*parent_list, data);
     35  12125      gman +	}
     36  12125      gman +	else {
     37  12125      gman +		/* Free data as not being appended */
     38  12125      gman +		panel_addto_dialog_free_item_info (&data->item_info);
     39  12125      gman +		g_free (data);
     40  12125      gman +	}
     41  12125      gman  }
     42  12125      gman  
     43  12125      gman  static void
     44  18706   mattman @@ -624,12 +633,13 @@ panel_addto_prepend_entry (GSList       
     45  12125      gman  	*parent_list = g_slist_prepend (*parent_list, data);
     46  12125      gman  }
     47  12125      gman  
     48  12125      gman -static void
     49  12125      gman +static gint
     50  12125      gman  panel_addto_prepend_alias (GSList         **parent_list,
     51  12125      gman  			   GMenuTreeAlias  *alias,
     52  12125      gman  			   const char      *filename)
     53  12125      gman  {
     54  12125      gman  	GMenuTreeItem *aliased_item;
     55  12125      gman +    gint entry = 0;
     56  12125      gman  
     57  12125      gman  	aliased_item = gmenu_tree_alias_get_item (alias);
     58  12125      gman  
     59  18706   mattman @@ -641,9 +651,14 @@ panel_addto_prepend_alias (GSList       
     60  12125      gman  		break;
     61  12125      gman  
     62  12125      gman  	case GMENU_TREE_ITEM_ENTRY:
     63  12125      gman -		panel_addto_prepend_entry (parent_list,
     64  12125      gman -					   GMENU_TREE_ENTRY (aliased_item),
     65  12125      gman -					   filename);
     66  14681   mattman +
     67  14681   mattman +        if (panel_lockdown_is_allowed_menu_entry
     68  14681   mattman +                                            (GMENU_TREE_ENTRY (aliased_item))) {
     69  14681   mattman +		    panel_addto_prepend_entry (parent_list,
     70  14681   mattman +					    GMENU_TREE_ENTRY (aliased_item),
     71  14681   mattman +					    filename);
     72  14681   mattman +            entry = 1;
     73  14681   mattman +        }
     74  12125      gman  		break;
     75  12125      gman  
     76  12125      gman  	default:
     77  18706   mattman @@ -651,15 +666,17 @@ panel_addto_prepend_alias (GSList       
     78  12125      gman  	}
     79  12125      gman  
     80  12125      gman  	gmenu_tree_item_unref (aliased_item);
     81  12125      gman +    return entry;
     82  12125      gman  }
     83  12125      gman  
     84  12125      gman -static void
     85  12125      gman +static gint
     86  12125      gman  panel_addto_make_application_list (GSList             **parent_list,
     87  12125      gman  				   GMenuTreeDirectory  *directory,
     88  12125      gman  				   const char          *filename)
     89  12125      gman  {
     90  12125      gman  	GSList *items;
     91  12125      gman  	GSList *l;
     92  12125      gman +    gint number_entries = 0;
     93  12125      gman  
     94  12125      gman  	items = gmenu_tree_directory_get_contents (directory);
     95  12125      gman  
     96  18706   mattman @@ -670,11 +687,15 @@ panel_addto_make_application_list (GSLis
     97  12125      gman  			break;
     98  12125      gman  
     99  12125      gman  		case GMENU_TREE_ITEM_ENTRY:
    100  12125      gman -			panel_addto_prepend_entry (parent_list, l->data, filename);
    101  14681   mattman +            if (panel_lockdown_is_allowed_menu_entry (l->data)) {
    102  14681   mattman +			    panel_addto_prepend_entry (parent_list, l->data, filename);
    103  14681   mattman +                number_entries = number_entries + 1;
    104  14681   mattman +            }
    105  12125      gman  			break;
    106  12125      gman  
    107  12125      gman  		case GMENU_TREE_ITEM_ALIAS:
    108  12125      gman -			panel_addto_prepend_alias (parent_list, l->data, filename);
    109  12125      gman +			number_entries = number_entries +
    110  12125      gman +                    panel_addto_prepend_alias (parent_list, l->data, filename);
    111  12125      gman  			break;
    112  12125      gman  
    113  12125      gman  		default:
    114  18706   mattman @@ -687,6 +708,8 @@ panel_addto_make_application_list (GSLis
    115  12125      gman  	g_slist_free (items);
    116  12125      gman  
    117  12125      gman  	*parent_list = g_slist_reverse (*parent_list);
    118  12125      gman +
    119  12125      gman +    return number_entries;
    120  12125      gman  }
    121  12125      gman  
    122  12125      gman  static void
    123  19171   mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-lockdown.h gnome-panel-2.27.91/gnome-panel/panel-lockdown.h
    124  19171   mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-lockdown.h	2009-08-26 17:27:47.990078000 +0100
    125  19171   mattman +++ gnome-panel-2.27.91/gnome-panel/panel-lockdown.h	2009-08-26 17:34:10.921311000 +0100
    126  15098   mattman @@ -25,8 +25,11 @@
    127  15098   mattman  #ifndef __PANEL_LOCKDOWN_H__
    128  15098   mattman  #define __PANEL_LOCKDOWN_H__
    129  15098   mattman  
    130  15098   mattman +#include <libgnome/gnome-desktop-item.h>
    131  15098   mattman  #include <glib.h>
    132  15098   mattman  #include <glib-object.h>
    133  15098   mattman +#include <gmenu-tree.h>
    134  15098   mattman +#include "launcher.h"
    135  15098   mattman  
    136  15098   mattman  G_BEGIN_DECLS
    137  15098   mattman  
    138  18706   mattman @@ -39,13 +42,56 @@ gboolean panel_lockdown_get_disable_lock
    139  15098   mattman  gboolean panel_lockdown_get_disable_log_out      (void);
    140  15098   mattman  gboolean panel_lockdown_get_disable_force_quit   (void);
    141  15098   mattman  
    142  15098   mattman +gboolean panel_lockdown_get_restrict_application_launching (void);
    143  15098   mattman +GSList  *panel_lockdown_get_allowed_applications (void);
    144  15098   mattman +
    145  15098   mattman  gboolean panel_lockdown_is_applet_disabled (const char *iid);
    146  15098   mattman +gboolean panel_lockdown_is_allowed_application (const gchar *app);
    147  15098   mattman  
    148  15098   mattman  void panel_lockdown_notify_add    (GCallback callback_func,
    149  15098   mattman                                     gpointer  user_data);
    150  15098   mattman  void panel_lockdown_notify_remove (GCallback callback_func,
    151  15098   mattman                                     gpointer  user_data);
    152  15098   mattman  
    153  15098   mattman +gchar *panel_lockdown_get_stripped_exec               (const gchar *full_exec);
    154  15098   mattman +gchar *panel_lockdown_get_exec_from_ditem             (GnomeDesktopItem *ditem);
    155  15098   mattman +gboolean panel_lockdown_ditem_in_allowed_applications (GnomeDesktopItem *ditem);
    156  15098   mattman +gboolean panel_lockdown_is_disabled_command_line      (const gchar *term_cmd);
    157  15098   mattman +
    158  15098   mattman +/**
    159  15098   mattman +  * Returns true if the ditem corresponds to an application whose use has been
    160  15098   mattman +  * disallowed by the administrator (tests whether restrictions are in place
    161  15098   mattman +  * and if the ditem matches the allowed applications list).
    162  15098   mattman +  */
    163  15098   mattman +gboolean panel_lockdown_is_forbidden_app              (GnomeDesktopItem *ditem);
    164  15098   mattman +/**
    165  15098   mattman +  * Returns true if the ditem corresponds to either an application whose use
    166  15098   mattman +  * has been disallowed by the administrator (same as previous function) or
    167  15098   mattman +  * a shell when command line use has been restricted.
    168  15098   mattman +  */
    169  15098   mattman +gboolean panel_lockdown_is_forbidden_ditem             (GnomeDesktopItem *ditem);
    170  15098   mattman +/**
    171  15098   mattman +  * Returns true if the command line corresponds to an application whose use
    172  15098   mattman +  * has been disallowed by the administrator.
    173  15098   mattman +  */
    174  15098   mattman +gboolean panel_lockdown_is_forbidden_command           (const gchar *command);
    175  15098   mattman +
    176  15098   mattman +/**
    177  15098   mattman +  * Returns true if the menu entry corresponds to an application whose use
    178  15098   mattman +  * has been allowed by the administrator.
    179  15098   mattman +  */
    180  15098   mattman +gboolean panel_lockdown_is_allowed_menu_entry          (GMenuTreeEntry *entry);
    181  15098   mattman +
    182  15098   mattman +/**
    183  15098   mattman +  * Returns true if the launcher application has been disallowed by the administrator.
    184  15098   mattman +  */
    185  15098   mattman +gboolean panel_lockdown_is_forbidden_launcher          (Launcher *launcher);
    186  15098   mattman +
    187  15098   mattman +/**
    188  15098   mattman +  * Returns true if the key_file application has been disallowed by the administrator.
    189  15098   mattman +  */
    190  15098   mattman +gboolean panel_lockdown_is_forbidden_key_file (GKeyFile *key_file);
    191  15098   mattman +
    192  15098   mattman  G_END_DECLS
    193  15098   mattman  
    194  15098   mattman  #endif /* __PANEL_LOCKDOWN_H__ */
    195  19171   mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-menu-items.h gnome-panel-2.27.91/gnome-panel/panel-menu-items.h
    196  19171   mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-menu-items.h	2009-08-26 17:27:47.989560000 +0100
    197  19171   mattman +++ gnome-panel-2.27.91/gnome-panel/panel-menu-items.h	2009-08-26 17:34:22.060144000 +0100
    198  18706   mattman @@ -90,6 +90,8 @@ void panel_desktop_menu_item_set_panel (
    199  15098   mattman  void panel_menu_items_append_lock_logout (GtkWidget *menu);
    200  15098   mattman  void panel_menu_item_activate_desktop_file (GtkWidget  *menuitem,
    201  15098   mattman  					    const char *path);
    202  15098   mattman +void panel_place_menu_item_recreate_menu (GtkWidget *widget);
    203  15098   mattman +void panel_desktop_menu_item_recreate_menu (PanelDesktopMenuItem *desktop_item);
    204  15098   mattman  
    205  15098   mattman  G_END_DECLS
    206  15098   mattman  
    207  19171   mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/Makefile.am gnome-panel-2.27.91/gnome-panel/Makefile.am
    208  19171   mattman --- gnome-panel-2.27.91.old/gnome-panel/Makefile.am	2009-08-26 17:27:47.958497000 +0100
    209  19171   mattman +++ gnome-panel-2.27.91/gnome-panel/Makefile.am	2009-08-26 17:34:33.698263000 +0100
    210  19171   mattman @@ -165,6 +165,8 @@ gnome_desktop_item_edit_SOURCES = \
    211  15098   mattman  	panel-ditem-editor.c	  \
    212  15098   mattman  	panel-marshal.c		  \
    213  15098   mattman  	panel-util.c		  \
    214  15098   mattman +	panel-lockdown.c	\
    215  15098   mattman +	panel-gconf.c		\
    216  15098   mattman  	xstuff.c
    217  15098   mattman  
    218  15098   mattman  gnome_desktop_item_edit_LDFLAGS = -export-dynamic
    219  19171   mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-action-button.c gnome-panel-2.27.91/gnome-panel/panel-action-button.c
    220  19171   mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-action-button.c	2009-08-26 17:27:47.940413000 +0100
    221  19171   mattman +++ gnome-panel-2.27.91/gnome-panel/panel-action-button.c	2009-08-26 17:40:26.368224000 +0100
    222  18706   mattman @@ -207,8 +207,11 @@ panel_action_shutdown_reboot_is_disabled
    223  15098   mattman  static void
    224  15098   mattman  panel_action_run_program (GtkWidget *widget)
    225  15098   mattman  {
    226  15098   mattman -	panel_run_dialog_present (gtk_widget_get_screen (widget),
    227  15098   mattman -				  gtk_get_current_event_time ());
    228  15098   mattman +    if (!panel_lockdown_get_restrict_application_launching () &&
    229  15098   mattman +        !panel_lockdown_get_disable_command_line ()) {
    230  15098   mattman +	    panel_run_dialog_present (gtk_widget_get_screen (widget),
    231  15098   mattman +				    gtk_get_current_event_time ());
    232  15098   mattman +    }
    233  15098   mattman  }
    234  15098   mattman  
    235  15098   mattman  /* Search For Files
    236  19171   mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-menu-bar.c gnome-panel-2.27.91/gnome-panel/panel-menu-bar.c
    237  19171   mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-menu-bar.c	2009-08-26 17:27:47.961196000 +0100
    238  19171   mattman +++ gnome-panel-2.27.91/gnome-panel/panel-menu-bar.c	2009-08-26 17:35:05.241962000 +0100
    239  18706   mattman @@ -132,6 +132,32 @@ panel_menu_bar_setup_tooltip (PanelMenuB
    240  15098   mattman  }
    241  15098   mattman  
    242  15098   mattman  static void
    243  15098   mattman +panel_menu_bar_parent_set (GtkWidget *widget,
    244  15098   mattman +                          GtkWidget *previous_parent);
    245  15098   mattman +
    246  15098   mattman +static void
    247  15098   mattman +panel_menubar_recreate_menus (PanelMenuBar *menubar)
    248  15098   mattman +{
    249  15098   mattman +       if (menubar->priv->applications_menu != NULL) {
    250  15098   mattman +               while (GTK_MENU_SHELL (menubar->priv->applications_menu)->children) {
    251  15098   mattman +                       gtk_widget_destroy (
    252  15098   mattman +                               GTK_MENU_SHELL (menubar->priv->applications_menu)->children->data);
    253  15098   mattman +               }
    254  15098   mattman +               menubar->priv->applications_menu =
    255  19383   mattman +                                       create_applications_menu ("applications.menu", NULL, TRUE);
    256  15098   mattman +               gtk_menu_item_set_submenu
    257  15098   mattman +                               (GTK_MENU_ITEM (menubar->priv->applications_item),
    258  15098   mattman +                               menubar->priv->applications_menu);
    259  15098   mattman +
    260  15098   mattman +               panel_place_menu_item_recreate_menu(menubar->priv->places_item);
    261  15098   mattman +               panel_desktop_menu_item_recreate_menu(
    262  15098   mattman +                                               (PanelDesktopMenuItem *)menubar->priv->desktop_item);
    263  15098   mattman +
    264  15098   mattman +               panel_menu_bar_parent_set ((GtkWidget *)menubar, NULL);
    265  15098   mattman +       }
    266  15098   mattman +}
    267  15098   mattman +
    268  15098   mattman +static void
    269  15098   mattman  panel_menu_bar_init (PanelMenuBar *menubar)
    270  15098   mattman  {
    271  15098   mattman  	GtkWidget *image;
    272  19171   mattman @@ -164,6 +190,8 @@ panel_menu_bar_init (PanelMenuBar *menub
    273  15098   mattman  			       menubar->priv->desktop_item);
    274  15098   mattman  
    275  15098   mattman  	panel_menu_bar_setup_tooltip (menubar);
    276  15098   mattman +    panel_lockdown_notify_add (G_CALLBACK (panel_menubar_recreate_menus),
    277  15098   mattman +                               menubar);
    278  15098   mattman  
    279  15098   mattman  	panel_menu_bar_update_text_gravity (menubar);
    280  15098   mattman  	g_signal_connect (menubar, "screen-changed",
    281  19171   mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/gnome-desktop-item-edit.c gnome-panel-2.27.91/gnome-panel/gnome-desktop-item-edit.c
    282  19171   mattman --- gnome-panel-2.27.91.old/gnome-panel/gnome-desktop-item-edit.c	2009-08-26 17:27:48.019780000 +0100
    283  19171   mattman +++ gnome-panel-2.27.91/gnome-panel/gnome-desktop-item-edit.c	2009-08-26 17:41:37.134321000 +0100
    284  18706   mattman @@ -21,7 +21,6 @@ GConfClient *panel_gconf_get_client (voi
    285  15098   mattman  #include "panel-config-global.h"
    286  15098   mattman  gboolean panel_global_config_get_tooltips_enabled (void) { return FALSE; }
    287  15098   mattman  #include "panel-lockdown.h"
    288  15098   mattman -gboolean panel_lockdown_get_disable_lock_screen (void) { return FALSE; }
    289  15098   mattman  
    290  15098   mattman  static int dialogs = 0;
    291  15098   mattman  static gboolean create_new = FALSE;
    292  18706   mattman @@ -107,6 +106,8 @@ main (int argc, char * argv[])
    293  15098   mattman  	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
    294  15098   mattman  	textdomain (GETTEXT_PACKAGE);
    295  15098   mattman  
    296  15098   mattman +    panel_lockdown_init ();
    297  15098   mattman +
    298  15098   mattman  	context = g_option_context_new (N_("- Edit .desktop files"));
    299  15098   mattman  	g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);
    300  15098   mattman  	g_option_context_add_main_entries (context, options, GETTEXT_PACKAGE);
    301  18706   mattman @@ -226,5 +227,7 @@ main (int argc, char * argv[])
    302  15098   mattman  
    303  15098   mattman  	g_object_unref (program);
    304  15098   mattman  
    305  15098   mattman +    panel_lockdown_finalize ();
    306  15098   mattman +
    307  15098   mattman          return 0;
    308  15098   mattman  }
    309  19171   mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-lockdown.c gnome-panel-2.27.91/gnome-panel/panel-lockdown.c
    310  19171   mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-lockdown.c	2009-08-26 17:27:47.989262000 +0100
    311  19171   mattman +++ gnome-panel-2.27.91/gnome-panel/panel-lockdown.c	2009-08-26 17:50:44.869236000 +0100
    312   8949     mattk @@ -28,13 +28,16 @@
    313   8947     mattk  
    314   7958  cm122549  #include <string.h>
    315   7958  cm122549  #include "panel-gconf.h"
    316  14682   mattman +#include <libpanel-util/panel-keyfile.h>
    317   7958  cm122549  
    318   7958  cm122549 -#define N_LISTENERS 6
    319   7958  cm122549 +#define N_LISTENERS 8
    320   7958  cm122549  
    321   7958  cm122549  #define PANEL_GLOBAL_LOCKDOWN_DIR    "/apps/panel/global"
    322   7958  cm122549  #define DESKTOP_GNOME_LOCKDOWN_DIR   "/desktop/gnome/lockdown"
    323   7958  cm122549  #define PANEL_GLOBAL_LOCKED_DOWN_KEY PANEL_GLOBAL_LOCKDOWN_DIR  "/locked_down"
    324   7958  cm122549  #define DISABLE_COMMAND_LINE_KEY     DESKTOP_GNOME_LOCKDOWN_DIR "/disable_command_line"
    325  10405   mattman +#define RESTRICT_APPLICATION_LAUNCHING_KEY     DESKTOP_GNOME_LOCKDOWN_DIR "/restrict_application_launching"
    326   7958  cm122549 +#define ALLOWED_APPLICATIONS_KEY     DESKTOP_GNOME_LOCKDOWN_DIR "/allowed_applications"
    327  19171   mattman  #define DISABLE_LOCK_SCREEN_KEY      DESKTOP_GNOME_LOCKDOWN_DIR  "/disable_lock_screen"
    328   7958  cm122549  #define DISABLE_LOG_OUT_KEY          PANEL_GLOBAL_LOCKDOWN_DIR  "/disable_log_out"
    329   7958  cm122549  #define DISABLE_FORCE_QUIT_KEY       PANEL_GLOBAL_LOCKDOWN_DIR  "/disable_force_quit"
    330  18706   mattman @@ -48,6 +51,9 @@ typedef struct {
    331   7958  cm122549          guint   disable_lock_screen : 1;
    332   7958  cm122549          guint   disable_log_out : 1;
    333   7958  cm122549          guint   disable_force_quit : 1;
    334   7958  cm122549 +        guint   restrict_application_launching : 1;
    335  15098   mattman +
    336  15098   mattman +        GSList *allowed_applications;
    337   7958  cm122549  
    338   7958  cm122549          GSList *disabled_applets;
    339   7958  cm122549  
    340  18706   mattman @@ -56,6 +62,12 @@ typedef struct {
    341   7958  cm122549          GSList *closures;
    342   7958  cm122549  } PanelLockdown;
    343   7958  cm122549  
    344   7958  cm122549 +static const gchar *command_line_execs[] = {
    345   7958  cm122549 +    "/usr/bin/gnome-terminal",
    346   7958  cm122549 +    "/usr/bin/xterm"
    347   7958  cm122549 +};
    348   7958  cm122549 +#define NUMBER_COMMAND_LINE_EXECS   2
    349   7958  cm122549 +
    350   7958  cm122549  static PanelLockdown panel_lockdown = { 0, };
    351   7958  cm122549  
    352   7958  cm122549  
    353  18706   mattman @@ -63,9 +75,17 @@ static inline void
    354   7958  cm122549  panel_lockdown_invoke_closures (PanelLockdown *lockdown)
    355   7958  cm122549  {
    356   7958  cm122549          GSList *l;
    357   8947     mattk +        GSList *copy = NULL;
    358   7958  cm122549  
    359   7958  cm122549 -        for (l = lockdown->closures; l; l = l->next)
    360  10405   mattman +		copy = g_slist_copy (lockdown->closures);
    361   8947     mattk +        for (l = copy; l != NULL; l = l->next) {
    362  10405   mattman +			if (g_slist_find (lockdown->closures, l->data)) {
    363  10405   mattman +				g_closure_ref (l->data);
    364   7958  cm122549                  g_closure_invoke (l->data, NULL, 0, NULL, NULL);
    365  10405   mattman +				g_closure_unref (l->data);
    366  10405   mattman +			}
    367  10405   mattman +		}
    368   8947     mattk +        g_slist_free (copy);
    369   7958  cm122549  }
    370   7958  cm122549  
    371   7958  cm122549  static void
    372  18706   mattman @@ -166,6 +186,50 @@ disabled_applets_notify (GConfClient   *
    373   7958  cm122549          panel_lockdown_invoke_closures (lockdown);
    374   7958  cm122549  }
    375   7958  cm122549  
    376   7958  cm122549 +static void
    377   7958  cm122549 +restrict_application_launching_notify (GConfClient   *client,
    378   7958  cm122549 +                                       guint          cnxn_id,
    379   7958  cm122549 +                                       GConfEntry    *entry,
    380   7958  cm122549 +                                       PanelLockdown *lockdown)
    381   7958  cm122549 +{
    382   8947     mattk +        if (!entry->value || entry->value->type != GCONF_VALUE_BOOL)
    383   8947     mattk +                return;
    384   7958  cm122549 +
    385   8947     mattk +        lockdown->restrict_application_launching =
    386   8947     mattk +                        gconf_value_get_bool (entry->value);
    387   7958  cm122549 +
    388   8947     mattk +        panel_lockdown_invoke_closures (lockdown);
    389   7958  cm122549 +}
    390   7958  cm122549 +
    391   7958  cm122549 +
    392   7958  cm122549 +static void
    393   7958  cm122549 +allowed_applications_notify (GConfClient   *client,
    394   7958  cm122549 +                             guint          cnxn_id,
    395   7958  cm122549 +                             GConfEntry    *entry,
    396   7958  cm122549 +                             PanelLockdown *lockdown)
    397   7958  cm122549 +{
    398   8947     mattk +        GSList *l;
    399   7958  cm122549 +
    400   8947     mattk +        if (!entry->value || entry->value->type != GCONF_VALUE_LIST ||
    401   8947     mattk +            gconf_value_get_list_type (entry->value) != GCONF_VALUE_STRING)
    402   8947     mattk +                return;
    403   7958  cm122549 +
    404   8947     mattk +        for (l = lockdown->allowed_applications; l; l = l->next)
    405   8947     mattk +                g_free (l->data);
    406   8947     mattk +        g_slist_free (lockdown->allowed_applications);
    407   8947     mattk +        lockdown->allowed_applications = NULL;
    408   7958  cm122549 +
    409   8947     mattk +        for (l = gconf_value_get_list (entry->value); l; l = l->next) {
    410   8947     mattk +                const char *iid = gconf_value_get_string (l->data);
    411   7958  cm122549 +
    412   8947     mattk +                lockdown->allowed_applications =
    413   7958  cm122549 +                g_slist_prepend (lockdown->allowed_applications,
    414   7958  cm122549 +                                 g_strdup (iid));
    415   8947     mattk +        }
    416   7958  cm122549 +
    417   8947     mattk +        panel_lockdown_invoke_closures (lockdown);
    418   7958  cm122549 +}
    419   7958  cm122549 +
    420   7958  cm122549  static gboolean
    421   7958  cm122549  panel_lockdown_load_bool (PanelLockdown         *lockdown,
    422   7958  cm122549                            GConfClient           *client,
    423  18706   mattman @@ -215,6 +279,28 @@ panel_lockdown_load_disabled_applets (Pa
    424   7958  cm122549          return retval;
    425   7958  cm122549  }
    426   7958  cm122549  
    427   7958  cm122549 +static GSList *
    428   7958  cm122549 +panel_lockdown_load_allowed_applications (PanelLockdown *lockdown,
    429   7958  cm122549 +                                          GConfClient   *client,
    430   7958  cm122549 +                                          int            listener)
    431   7958  cm122549 +{
    432   8947     mattk +        GSList *retval;
    433   7958  cm122549 +
    434   8947     mattk +        retval = gconf_client_get_list (client,
    435   8947     mattk +                                        ALLOWED_APPLICATIONS_KEY,
    436   8947     mattk +                                        GCONF_VALUE_STRING,
    437   8947     mattk +                                        NULL);
    438   7958  cm122549 +
    439   8947     mattk +        lockdown->listeners [listener] =
    440   8947     mattk +        gconf_client_notify_add (client,
    441   8947     mattk +                                 ALLOWED_APPLICATIONS_KEY,
    442   8947     mattk +                                 (GConfClientNotifyFunc) allowed_applications_notify,
    443   8947     mattk +                                 lockdown,
    444   8947     mattk +                                 NULL, NULL);
    445   7958  cm122549 +
    446   8947     mattk +        return retval;
    447   7958  cm122549 +}
    448   7958  cm122549 +
    449   7958  cm122549  void
    450   7958  cm122549  panel_lockdown_init (void)
    451   7958  cm122549  {
    452  18706   mattman @@ -273,6 +359,18 @@ panel_lockdown_init (void)
    453   7958  cm122549                                                        client,
    454   7958  cm122549                                                        i++);
    455   7958  cm122549  
    456   8947     mattk +        panel_lockdown.restrict_application_launching = 
    457   7958  cm122549 +                panel_lockdown_load_bool (&panel_lockdown,
    458   7958  cm122549 +                                          client,
    459   7958  cm122549 +                                          RESTRICT_APPLICATION_LAUNCHING_KEY,
    460   7958  cm122549 +                                          (GConfClientNotifyFunc) restrict_application_launching_notify,
    461   7958  cm122549 +                                          i++);
    462   7958  cm122549 +
    463   7958  cm122549 +        panel_lockdown.allowed_applications =
    464   7958  cm122549 +                panel_lockdown_load_allowed_applications (&panel_lockdown,
    465   7958  cm122549 +                                                          client,
    466   7958  cm122549 +                                                          i++);
    467   7958  cm122549 +
    468   7958  cm122549          g_assert (i == N_LISTENERS);
    469   7958  cm122549  
    470   7958  cm122549          panel_lockdown.initialized = TRUE;
    471  18706   mattman @@ -294,6 +392,13 @@ panel_lockdown_finalize (void)
    472   7958  cm122549          g_slist_free (panel_lockdown.disabled_applets);
    473   7958  cm122549          panel_lockdown.disabled_applets = NULL;
    474   8947     mattk  
    475   8947     mattk +        for (l = panel_lockdown.allowed_applications; l; l = l->next) {
    476   8947     mattk +                g_free (l->data);
    477   7958  cm122549 +        }
    478   8947     mattk +
    479   8947     mattk +        g_slist_free (panel_lockdown.allowed_applications);
    480   8947     mattk +        panel_lockdown.allowed_applications = NULL;
    481   8947     mattk +
    482   7958  cm122549          for (i = 0; i < N_LISTENERS; i++) {
    483   7958  cm122549                  if (panel_lockdown.listeners [i])
    484   7958  cm122549                          gconf_client_notify_remove (client,
    485  18706   mattman @@ -371,6 +476,36 @@ panel_lockdown_is_applet_disabled (const
    486   7958  cm122549          return FALSE;
    487   7958  cm122549  }
    488   7958  cm122549  
    489   7958  cm122549 +gboolean
    490   7958  cm122549 +panel_lockdown_get_restrict_application_launching (void)
    491   7958  cm122549 +{
    492   8947     mattk +        g_assert (panel_lockdown.initialized != FALSE);
    493   7958  cm122549 +
    494   8947     mattk +        return panel_lockdown.restrict_application_launching;
    495   7958  cm122549 +}
    496   7958  cm122549 +
    497   7958  cm122549 +GSList *
    498   7958  cm122549 +panel_lockdown_get_allowed_applications (void)
    499   7958  cm122549 +{
    500   8947     mattk +        g_assert (panel_lockdown.initialized == TRUE);
    501   7958  cm122549 +
    502   8947     mattk +        return panel_lockdown.allowed_applications;
    503   7958  cm122549 +}
    504   7958  cm122549 +
    505   7958  cm122549 +gboolean
    506   7958  cm122549 +panel_lockdown_is_allowed_application (const gchar *app)
    507   7958  cm122549 +{
    508   8947     mattk +        GSList *l;
    509   7958  cm122549 +
    510   8947     mattk +        g_assert (panel_lockdown.initialized != FALSE);
    511   7958  cm122549 +
    512   8947     mattk +        for (l = panel_lockdown.allowed_applications; l; l = l->next)
    513   8947     mattk +                if (!strcmp (l->data, app))
    514   8947     mattk +                        return TRUE;
    515   7958  cm122549 +
    516   8947     mattk +        return FALSE;
    517   7958  cm122549 +}
    518   7958  cm122549 +
    519   7958  cm122549  static GClosure *
    520   7958  cm122549  panel_lockdown_notify_find (GSList    *closures,
    521   7958  cm122549                              GCallback  callback_func,
    522  18706   mattman @@ -440,3 +575,161 @@ panel_lockdown_notify_remove (GCallback 
    523   7958  cm122549  
    524   7958  cm122549          g_closure_unref (closure);
    525  15098   mattman  }
    526   7958  cm122549 +
    527   7958  cm122549 +gchar *
    528   7958  cm122549 +panel_lockdown_get_stripped_exec (const gchar *full_exec)
    529   7958  cm122549 +{
    530   8947     mattk +        gchar *str1, *str2, *retval, *p;
    531   7958  cm122549 +
    532   8947     mattk +        str1 = g_strdup (full_exec);
    533   8947     mattk +        p = strtok (str1, " ");
    534   7958  cm122549 +
    535   8947     mattk +        if (p != NULL)
    536   8947     mattk +               str2 = g_strdup (p);
    537   8947     mattk +        else
    538   8947     mattk +                str2 = g_strdup (full_exec);
    539   7958  cm122549 +
    540   8947     mattk +        g_free (str1);
    541   7958  cm122549 +
    542   8947     mattk +        if (g_path_is_absolute (str2))
    543   8947     mattk +                retval = g_strdup (str2);
    544   8947     mattk +        else
    545   8947     mattk +                retval = g_strdup (g_find_program_in_path ((const gchar *)str2));
    546   8947     mattk +        g_free (str2);
    547   7958  cm122549 +
    548   8947     mattk +        return retval;
    549   7958  cm122549 +}
    550   7958  cm122549 +
    551   7958  cm122549 +gchar *
    552   7958  cm122549 +panel_lockdown_get_exec_from_ditem (GnomeDesktopItem *ditem)
    553   7958  cm122549 +{
    554   8947     mattk +        const char *full_exec;
    555   8947     mattk +        gchar *retval = NULL;
    556   7958  cm122549 +
    557   8947     mattk +        full_exec = gnome_desktop_item_get_string (ditem,
    558   8947     mattk +                                                   GNOME_DESKTOP_ITEM_EXEC);
    559   7958  cm122549 +
    560   8947     mattk +        if (full_exec != NULL)
    561   8947     mattk +                retval = panel_lockdown_get_stripped_exec (full_exec);
    562   7958  cm122549 +
    563   8947     mattk +        return retval;
    564   7958  cm122549 +}
    565   7958  cm122549 +
    566   7958  cm122549 +gboolean
    567   7958  cm122549 +panel_lockdown_ditem_in_allowed_applications (GnomeDesktopItem *ditem)
    568   7958  cm122549 +{
    569   8947     mattk +        gboolean retval = FALSE;
    570   8947     mattk +        gchar *stripped_exec;
    571   7958  cm122549 +
    572   8947     mattk +        stripped_exec = panel_lockdown_get_exec_from_ditem (ditem);
    573   7958  cm122549 +
    574   8947     mattk +        if (stripped_exec != NULL) {
    575   8947     mattk +                retval = panel_lockdown_is_allowed_application (stripped_exec);
    576   8947     mattk +                g_free (stripped_exec);
    577   8947     mattk +        }
    578   7958  cm122549 +
    579   8947     mattk +        return retval;
    580   7958  cm122549 +}
    581   7958  cm122549 +
    582   7958  cm122549 +gboolean
    583   7958  cm122549 +panel_lockdown_is_disabled_command_line (const gchar *term_cmd)
    584   7958  cm122549 +{
    585   8947     mattk +        int i = 0;
    586   8947     mattk +        gboolean retval = FALSE;
    587   7958  cm122549 +
    588   8947     mattk +        for (i=0; i<NUMBER_COMMAND_LINE_EXECS; i++) {
    589   8947     mattk +                if (!strcmp (command_line_execs [i], term_cmd)) {
    590   8947     mattk +                        retval = TRUE;
    591   8947     mattk +                        break;
    592   8947     mattk +                }
    593   7958  cm122549 +        }
    594   7958  cm122549 +
    595   8947     mattk +        return retval;
    596   7958  cm122549 +}
    597   7958  cm122549 +
    598   8947     mattk +gboolean
    599   8947     mattk +panel_lockdown_is_forbidden_app(GnomeDesktopItem *ditem) {
    600   8947     mattk +        g_return_val_if_fail (ditem != NULL, TRUE) ;
    601   8947     mattk +        return panel_lockdown_get_restrict_application_launching () &&
    602   8947     mattk +                !panel_lockdown_ditem_in_allowed_applications (ditem) ;
    603   7958  cm122549 +}
    604   7958  cm122549 +
    605   8947     mattk +gboolean
    606   8947     mattk +panel_lockdown_is_forbidden_ditem(GnomeDesktopItem *ditem)
    607   7958  cm122549 +{
    608   8947     mattk +        g_return_val_if_fail (ditem != NULL, TRUE) ;
    609   8947     mattk +        if (panel_lockdown_is_forbidden_app (ditem)) { return TRUE ; }
    610   8947     mattk +        if (panel_lockdown_get_disable_command_line ()) {
    611   8947     mattk +                char *stripped = panel_lockdown_get_exec_from_ditem (ditem) ;
    612   7958  cm122549 +
    613   8947     mattk +                if (stripped != NULL) {
    614   8947     mattk +                        gboolean retCode =
    615   8947     mattk +                                panel_lockdown_is_disabled_command_line (stripped) ;
    616   7958  cm122549 +
    617   8947     mattk +                        g_free (stripped) ;
    618   8947     mattk +                        return retCode ;
    619   8947     mattk +                }
    620   7958  cm122549 +        }
    621   8947     mattk +        return FALSE ;
    622   7958  cm122549 +}
    623   7958  cm122549 +
    624   8947     mattk +gboolean
    625   8947     mattk +panel_lockdown_is_forbidden_command (const char *command)
    626   7958  cm122549 +{
    627   8947     mattk +        g_return_val_if_fail (command != NULL, TRUE) ;
    628   8947     mattk +        return panel_lockdown_get_restrict_application_launching () &&
    629   8947     mattk +                !panel_lockdown_is_allowed_application (command) ;
    630   7958  cm122549 +}
    631   7958  cm122549 +
    632   8947     mattk +gboolean
    633   8947     mattk +panel_lockdown_is_allowed_menu_entry (GMenuTreeEntry *entry)
    634   8071     mattk +{
    635   8947     mattk +        const char *path;
    636   8947     mattk +        GnomeDesktopItem *item = NULL ;
    637   8071     mattk +
    638   8947     mattk +        if (!panel_lockdown_get_restrict_application_launching ())
    639   8947     mattk +                return TRUE;
    640   8071     mattk +
    641   8947     mattk +        path = gmenu_tree_entry_get_desktop_file_path (entry) ;
    642   8071     mattk +
    643   8947     mattk +        if (path != NULL) {
    644   8947     mattk +                item = gnome_desktop_item_new_from_file (path, 0, NULL) ;
    645   8947     mattk +                if (item != NULL) {
    646   8947     mattk +                        gboolean retCode = !panel_lockdown_is_forbidden_ditem (item) ;
    647   8071     mattk +
    648   8947     mattk +                        gnome_desktop_item_unref (item) ;
    649   8947     mattk +                        return retCode ;
    650   8947     mattk +                }
    651   8071     mattk +        }
    652   8947     mattk +        return TRUE ;
    653   8071     mattk +}
    654   7958  cm122549 +
    655   8947     mattk +gboolean
    656   8947     mattk +panel_lockdown_is_forbidden_launcher (Launcher *launcher)
    657   7958  cm122549 +{
    658   8949     mattk +	return (panel_lockdown_is_forbidden_key_file(launcher->key_file));
    659   7958  cm122549 +}
    660   8949     mattk +
    661   8949     mattk +gboolean
    662   8949     mattk +panel_lockdown_is_forbidden_key_file (GKeyFile *key_file)
    663   8949     mattk +{
    664   8949     mattk +	gchar *full_exec;		/* Executable including possible arguments */
    665   8949     mattk +	gchar *stripped_exec;	/* Executable with arguments stripped away */
    666   8949     mattk +	gboolean retval = FALSE;
    667   8949     mattk +
    668  15098   mattman +    /* If restrict_application_launching not set on return TRUE */
    669  15098   mattman +    if (!panel_lockdown_get_restrict_application_launching ()) {
    670  15113   mattman +        return retval;
    671  15098   mattman +    }
    672  15098   mattman +
    673   8949     mattk +	if (key_file != NULL)
    674   8949     mattk +	{
    675  14682   mattman +		full_exec = panel_key_file_get_string (key_file, "Exec");
    676   8949     mattk +        if (full_exec != NULL) {
    677   8949     mattk +        	stripped_exec = panel_lockdown_get_stripped_exec (full_exec);
    678  12125      gman +		retval = panel_lockdown_is_forbidden_command (stripped_exec);
    679  12125      gman +                g_free (stripped_exec);
    680   8949     mattk +		}
    681   8949     mattk +	}
    682   8949     mattk +	return retval;
    683  12125      gman +}
    684  19171   mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-menu-items.c gnome-panel-2.27.91/gnome-panel/panel-menu-items.c
    685  19171   mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-menu-items.c	2009-08-26 17:27:47.973492000 +0100
    686  19171   mattman +++ gnome-panel-2.27.91/gnome-panel/panel-menu-items.c	2009-08-26 17:36:15.979872000 +0100
    687  19171   mattman @@ -157,6 +157,21 @@ panel_menu_items_append_from_desktop (Gt
    688  17173   mattman  	char      *icon;
    689  17173   mattman  	char      *name;
    690  17173   mattman  	char      *comment;
    691  17173   mattman +	GnomeDesktopItem *ditem;
    692  17173   mattman + 
    693  17173   mattman +	/* If restricted application, then don't append */
    694  17173   mattman +	if (g_path_is_absolute (path))
    695  17173   mattman +		ditem = gnome_desktop_item_new_from_file (path, 0, NULL);
    696  17173   mattman +	else
    697  17173   mattman +		ditem = gnome_desktop_item_new_from_basename (path, 0, NULL);
    698  17173   mattman +	if (ditem != NULL && panel_lockdown_is_forbidden_ditem (ditem)) {
    699  17173   mattman +		gnome_desktop_item_unref (ditem);
    700  17173   mattman +		return;
    701  17173   mattman +	}
    702  17173   mattman +
    703  17173   mattman +	if (ditem != NULL) {
    704  17173   mattman +		gnome_desktop_item_unref (ditem);
    705  17173   mattman +	}
    706  17173   mattman  
    707  17173   mattman  	path_freeme = NULL;
    708  17173   mattman  
    709  19171   mattman @@ -1073,7 +1088,7 @@ panel_place_menu_item_create_menu (Panel
    710  17176   mattman  	return places_menu;
    711  17173   mattman  }
    712  17173   mattman  
    713  17173   mattman -static void
    714  17173   mattman +void
    715  17176   mattman  panel_place_menu_item_recreate_menu (GtkWidget *widget)
    716  17173   mattman  {
    717  17176   mattman  	PanelPlaceMenuItem *place_item;
    718  19171   mattman @@ -1181,7 +1196,7 @@ panel_desktop_menu_item_create_menu (Pan
    719  17173   mattman  	return desktop_menu;
    720  17173   mattman  }
    721  17173   mattman  
    722  17173   mattman -static void
    723  17173   mattman +void
    724  17173   mattman  panel_desktop_menu_item_recreate_menu (PanelDesktopMenuItem *desktop_item)
    725  17173   mattman  {
    726  17173   mattman  	if (desktop_item->priv->menu) {
    727  19171   mattman @@ -1548,8 +1563,11 @@ panel_menu_items_append_lock_logout (Gtk
    728  17173   mattman  		tooltip = NULL;
    729  17173   mattman  	}
    730  17173   mattman  
    731  17173   mattman -	item = panel_menu_items_create_action_item_full (PANEL_ACTION_LOGOUT,
    732  17173   mattman -							 label, tooltip);
    733  17173   mattman +    if (!panel_lockdown_get_disable_log_out ()) {
    734  17173   mattman +	    item = panel_menu_items_create_action_item_full (PANEL_ACTION_LOGOUT,
    735  17173   mattman +							    label, tooltip);
    736  17173   mattman +    }
    737  17173   mattman +
    738  17173   mattman  	g_free (label);
    739  17173   mattman  	g_free (tooltip);
    740  17173   mattman  
    741  19171   mattman @@ -1575,5 +1593,21 @@ void
    742  17173   mattman  panel_menu_item_activate_desktop_file (GtkWidget  *menuitem,
    743  17173   mattman  				       const char *path)
    744  17173   mattman  {
    745  17173   mattman +	GnomeDesktopItem *ditem;
    746  17173   mattman + 
    747  17173   mattman +	if (g_path_is_absolute (path))
    748  17173   mattman +		ditem = gnome_desktop_item_new_from_file (path, 0, NULL);
    749  17173   mattman +	else
    750  17173   mattman +		ditem = gnome_desktop_item_new_from_basename (path, 0, NULL);
    751  17173   mattman + 
    752  17173   mattman +	if (ditem != NULL && panel_lockdown_is_forbidden_ditem (ditem)) {
    753  17173   mattman +		gnome_desktop_item_unref (ditem);
    754  17173   mattman +		return;		/* Don't launch as it's a forbidden desktop file */
    755  17173   mattman +	}
    756  17173   mattman + 
    757  17173   mattman +	if (ditem != NULL) {
    758  17173   mattman +		gnome_desktop_item_unref (ditem);
    759  17173   mattman +	}
    760  17173   mattman +
    761  17173   mattman  	panel_launch_desktop_file (path, menuitem_to_screen (menuitem), NULL);
    762  17173   mattman  }
    763  19328   davelam /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/launcher.c gnome-panel-2.27.91/gnome-panel/launcher.c
    764  19328   davelam --- gnome-panel-2.27.91.old/gnome-panel/launcher.c	2009-08-26 17:27:47.942300000 +0100
    765  19328   davelam +++ gnome-panel-2.27.91/gnome-panel/launcher.c	2009-08-26 17:56:11.860620000 +0100
    766  19328   davelam @@ -105,6 +105,9 @@ launch_url (Launcher *launcher)
    767  19328   davelam  	g_return_if_fail (launcher != NULL);
    768  19328   davelam  	g_return_if_fail (launcher->key_file != NULL);
    769  19328   davelam  
    770  19328   davelam +    if (panel_lockdown_is_forbidden_launcher (launcher))
    771  19328   davelam +        return;
    772  19328   davelam +
    773  19328   davelam  	/* FIXME panel_ditem_launch() should be enough for this! */
    774  19328   davelam  	url = panel_key_file_get_string (launcher->key_file, "URL");
    775  19328   davelam  
    776  19328   davelam @@ -136,6 +139,9 @@ launcher_launch (Launcher  *launcher,
    777  19328   davelam  	g_return_if_fail (launcher != NULL);
    778  19328   davelam  	g_return_if_fail (launcher->key_file != NULL);
    779  19328   davelam  
    780  19328   davelam +    if (panel_lockdown_is_forbidden_launcher (launcher))
    781  19328   davelam +        return;
    782  19328   davelam +
    783  19328   davelam  	if (panel_global_config_get_enable_animations ())
    784  19328   davelam  		xstuff_zoom_animate (widget,
    785  19328   davelam  				     button_widget_get_pixbuf (BUTTON_WIDGET (widget)),
    786  19328   davelam @@ -410,6 +416,19 @@ drag_data_get_cb (GtkWidget        *widg
    787  19328   davelam  
    788  19328   davelam  }
    789  19328   davelam  
    790  19328   davelam +static void
    791  19328   davelam +panel_recheck_launcher (Launcher *launcher)
    792  19328   davelam +{
    793  19328   davelam +	if (!launcher || !launcher->button)
    794  19328   davelam +		return;
    795  19328   davelam +	
    796  19328   davelam +    if (panel_lockdown_is_forbidden_launcher (launcher)) {
    797  19328   davelam +        gtk_widget_hide (launcher->button);
    798  19328   davelam +    } else {
    799  19328   davelam +	    gtk_widget_show (launcher->button);
    800  19328   davelam +    }
    801  19328   davelam +}
    802  19328   davelam +
    803  19328   davelam  static Launcher *
    804  19328   davelam  create_launcher (const char *location)
    805  19328   davelam  {
    806  19328   davelam @@ -488,7 +507,11 @@ create_launcher (const char *location)
    807  19328   davelam  					      FALSE,
    808  19328   davelam  					      PANEL_ORIENTATION_TOP);
    809  19328   davelam  
    810  19328   davelam -	gtk_widget_show (launcher->button);
    811  19328   davelam +    if (panel_lockdown_is_forbidden_launcher (launcher)) {
    812  19328   davelam +        gtk_widget_hide (launcher->button);
    813  19328   davelam +    } else {
    814  19328   davelam +	    gtk_widget_show (launcher->button);
    815  19328   davelam +    }
    816  19328   davelam  
    817  19328   davelam  	/*gtk_drag_dest_set (GTK_WIDGET (launcher->button),
    818  19328   davelam  			   GTK_DEST_DEFAULT_ALL,
    819  19328   davelam @@ -515,6 +538,8 @@ create_launcher (const char *location)
    820  19328   davelam  					  G_CALLBACK (destroy_launcher),
    821  19328   davelam  					  launcher);
    822  19328   davelam  
    823  19328   davelam +	panel_lockdown_notify_add (G_CALLBACK (panel_recheck_launcher), launcher);
    824  19328   davelam +
    825  19328   davelam  	return launcher;
    826  19328   davelam  }
    827  19328   davelam  
    828  19328   davelam @@ -813,6 +838,12 @@ load_launcher_applet (const char       *
    829  19328   davelam  	/* setup button according to ditem */
    830  19328   davelam  	setup_button (launcher);
    831  19328   davelam  
    832  19328   davelam +    if (panel_lockdown_is_forbidden_launcher (launcher)) {
    833  19328   davelam +        gtk_widget_hide (launcher->button);
    834  19328   davelam +    } else {
    835  19328   davelam +	    gtk_widget_show (launcher->button);
    836  19328   davelam +    }
    837  19328   davelam +
    838  19328   davelam  	return launcher;
    839  19328   davelam  }
    840  19328   davelam  
    841  19328   davelam @@ -901,6 +932,10 @@ ask_about_launcher (const char  *file,
    842  19328   davelam  	if (file != NULL)
    843  19328   davelam  		panel_key_file_set_string (key_file, "Exec", file);
    844  19328   davelam  	panel_key_file_set_string (key_file, "Type", "Application");
    845  19328   davelam +
    846  19328   davelam +    if (panel_lockdown_is_forbidden_key_file (key_file))
    847  19328   davelam +        return; /* Application being dragged is forbidden so just return */
    848  19328   davelam +
    849  19328   davelam  	panel_ditem_editor_sync_display (PANEL_DITEM_EDITOR (dialog));
    850  19328   davelam  
    851  19328   davelam  	panel_ditem_register_save_uri_func (PANEL_DITEM_EDITOR (dialog),
    852  19328   davelam @@ -955,17 +990,19 @@ panel_launcher_create_from_info (PanelTo
    853  19328   davelam  	}
    854  19328   davelam  
    855  19328   davelam  	location = panel_make_unique_desktop_uri (NULL, exec_or_uri);
    856  19328   davelam -	if (panel_key_file_to_file (key_file, location, &error)) {
    857  19328   davelam -		panel_launcher_create (toplevel, position, location);
    858  19328   davelam -	} else {
    859  19328   davelam -		panel_error_dialog (GTK_WINDOW (toplevel),
    860  19328   davelam -				    gtk_window_get_screen (GTK_WINDOW (toplevel)),
    861  19328   davelam -				    "cannot_save_launcher", TRUE,
    862  19328   davelam -				    _("Could not save launcher"),
    863  19328   davelam -				    error->message);
    864  19328   davelam -		g_error_free (error);
    865  19328   davelam -	}
    866  19328   davelam  
    867  19328   davelam +    if (!panel_lockdown_is_forbidden_key_file (key_file)) {
    868  19328   davelam +	    if (panel_key_file_to_file (key_file, location, &error)) {
    869  19328   davelam +		    panel_launcher_create (toplevel, position, location);
    870  19328   davelam +	    } else {
    871  19328   davelam +		    panel_error_dialog (GTK_WINDOW (toplevel),
    872  19328   davelam +				        gtk_window_get_screen (GTK_WINDOW (toplevel)),
    873  19328   davelam +				        "cannot_save_launcher", TRUE,
    874  19328   davelam +				        _("Could not save launcher"),
    875  19328   davelam +				        error->message);
    876  19328   davelam +		    g_error_free (error);
    877  19328   davelam +	    }
    878  19328   davelam +    }
    879  19328   davelam  	g_key_file_free (key_file);
    880  19328   davelam  }
    881  19328   davelam  
    882  19328   davelam --- gnome-panel-2.27.92/gnome-panel/menu.c.ori	2009-09-09 10:13:23.778451017 +0100
    883  19328   davelam +++ gnome-panel-2.27.92/gnome-panel/menu.c	2009-09-09 10:21:41.371983238 +0100
    884  19328   davelam @@ -74,7 +74,8 @@
    885  17968   mattman  static GSList *image_menu_items = NULL;
    886  17968   mattman  
    887  17968   mattman  static GtkWidget *populate_menu_from_directory (GtkWidget          *menu,
    888  17968   mattman -						GMenuTreeDirectory *directory);
    889  17968   mattman +						GMenuTreeDirectory *directory,
    890  17968   mattman +                        gboolean           *is_hidden);
    891  17968   mattman  
    892  17968   mattman  static void panel_load_menu_image_deferred (GtkWidget   *image_menu_item,
    893  17968   mattman  					    GtkIconSize  icon_size,
    894  19328   davelam @@ -1272,7 +1273,8 @@
    895  17968   mattman  }
    896  17968   mattman  
    897  17968   mattman  static void
    898  17968   mattman -submenu_to_display (GtkWidget *menu)
    899  17968   mattman +submenu_to_display (GtkWidget *menu,
    900  17968   mattman +                    gboolean  *is_hidden)
    901  17968   mattman  {
    902  17968   mattman  	GMenuTree           *tree;
    903  17968   mattman  	GMenuTreeDirectory  *directory;
    904  19328   davelam @@ -1307,7 +1309,15 @@
    905  17968   mattman  	}
    906  17968   mattman  
    907  17968   mattman  	if (directory)
    908  17968   mattman -		populate_menu_from_directory (menu, directory);
    909  17968   mattman +        { /* It's possible that is_hidden is NULL if we end up here from the show
    910  17968   mattman +           signal, which could only happen for the top level menu. */
    911  17968   mattman +        gboolean local_is_hidden = FALSE;
    912  17968   mattman +
    913  17968   mattman +		populate_menu_from_directory (menu, directory, &local_is_hidden);
    914  17968   mattman +        if (is_hidden != NULL) {
    915  17968   mattman +            *is_hidden = local_is_hidden;
    916  17968   mattman +        }
    917  17968   mattman +    }
    918  17968   mattman  
    919  17968   mattman  	append_callback = g_object_get_data (G_OBJECT (menu),
    920  17968   mattman  					     "panel-menu-append-callback");
    921  19328   davelam @@ -1321,10 +1331,11 @@
    922  17968   mattman  submenu_to_display_in_idle (gpointer data)
    923  17968   mattman  {
    924  17968   mattman  	GtkWidget *menu = GTK_WIDGET (data);
    925  17968   mattman +    gboolean is_hidden = FALSE;
    926  17968   mattman  
    927  17968   mattman  	g_object_set_data (G_OBJECT (menu), "panel-menu-idle-id", NULL);
    928  17968   mattman  
    929  17968   mattman -	submenu_to_display (menu);
    930  17968   mattman +	submenu_to_display (menu, &is_hidden);
    931  17968   mattman  
    932  17968   mattman  	return FALSE;
    933  17968   mattman  }
    934  19328   davelam @@ -1419,19 +1430,25 @@
    935  17968   mattman  static void
    936  17968   mattman  create_submenu (GtkWidget          *menu,
    937  17968   mattman  		GMenuTreeDirectory *directory,
    938  17968   mattman -		GMenuTreeDirectory *alias_directory)
    939  17968   mattman +		GMenuTreeDirectory *alias_directory,
    940  19328   davelam +		gboolean           *is_hidden)
    941  17968   mattman  {
    942  17968   mattman  	GtkWidget *menuitem;
    943  17968   mattman  	GtkWidget *submenu;
    944  19328   davelam  	gboolean   force_categories_icon;
    945  17968   mattman  
    946  17968   mattman +	submenu = create_fake_menu (directory);
    947  19328   davelam +	if (panel_lockdown_get_restrict_application_launching ()) {
    948  19328   davelam +		submenu_to_display (submenu, is_hidden);
    949  19328   davelam +	} else {
    950  19328   davelam +		*is_hidden = FALSE;
    951  19328   davelam +	}
    952  17968   mattman +
    953  17968   mattman  	if (alias_directory)
    954  17968   mattman  		menuitem = create_submenu_entry (menu, alias_directory);
    955  17968   mattman  	else
    956  17968   mattman  		menuitem = create_submenu_entry (menu, directory);
    957  17968   mattman  	
    958  17968   mattman -	submenu = create_fake_menu (directory);
    959  17968   mattman -
    960  17968   mattman  	gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
    961  19328   davelam  
    962  19328   davelam  	/* Keep the infor that we force (or not) the icons to be visible */
    963  19328   davelam @@ -1440,15 +1457,21 @@
    964  19328   davelam  	g_object_set_data (G_OBJECT (submenu),
    965  19328   davelam  			   "panel-menu-force-icon-for-categories",
    966  19328   davelam  			   GINT_TO_POINTER (force_categories_icon));
    967  17968   mattman +
    968  19328   davelam +	if (*is_hidden) {
    969  19328   davelam +		gtk_widget_hide (menuitem);
    970  19328   davelam +	}
    971  17968   mattman  }
    972  17968   mattman  
    973  17968   mattman  static void 
    974  17968   mattman  create_header (GtkWidget       *menu,
    975  17968   mattman -	       GMenuTreeHeader *header)
    976  17968   mattman +	       GMenuTreeHeader *header,
    977  19328   davelam +	       gboolean *is_hidden)
    978  17968   mattman  {
    979  17968   mattman  	GMenuTreeDirectory *directory;
    980  17968   mattman  	GtkWidget          *menuitem;
    981  17968   mattman  
    982  19328   davelam +	*is_hidden = FALSE;
    983  17968   mattman  	directory = gmenu_tree_header_get_directory (header);
    984  17968   mattman  	menuitem = create_submenu_entry (menu, directory);
    985  17968   mattman  	gmenu_tree_item_unref (directory);
    986  19328   davelam @@ -1465,10 +1488,12 @@
    987  19171   mattman  static void
    988  19171   mattman  create_menuitem (GtkWidget          *menu,
    989  19171   mattman  		 GMenuTreeEntry     *entry,
    990  19171   mattman -		 GMenuTreeDirectory *alias_directory)
    991  19171   mattman +		 GMenuTreeDirectory *alias_directory,
    992  19171   mattman +                                    gboolean *is_hidden)
    993  19171   mattman  {
    994  19171   mattman  	GtkWidget  *menuitem;
    995  19171   mattman  	
    996  19171   mattman +        *is_hidden = FALSE;
    997  19171   mattman  	menuitem = panel_image_menu_item_new ();
    998  19171   mattman  
    999  19171   mattman  	g_object_set_data_full (G_OBJECT (menuitem),
   1000  19328   davelam @@ -1545,12 +1570,18 @@
   1001  17968   mattman  	g_signal_connect (menuitem, "activate",
   1002  17968   mattman  			  G_CALLBACK (activate_app_def), entry);
   1003  17968   mattman  
   1004  17968   mattman -	gtk_widget_show (menuitem);
   1005  17968   mattman +    if (entry != NULL && !panel_lockdown_is_allowed_menu_entry (entry)) {
   1006  17968   mattman +        gtk_widget_hide (menuitem);
   1007  17968   mattman +        *is_hidden = TRUE;
   1008  17968   mattman +    } else {
   1009  17968   mattman +	    gtk_widget_show (menuitem);
   1010  17968   mattman +    }
   1011  17968   mattman  }
   1012  17968   mattman  
   1013  17968   mattman  static void
   1014  17968   mattman  create_menuitem_from_alias (GtkWidget      *menu,
   1015  17968   mattman -			    GMenuTreeAlias *alias)
   1016  17968   mattman +			    GMenuTreeAlias *alias,
   1017  17968   mattman +                gboolean *is_hidden)
   1018  17968   mattman  {
   1019  17968   mattman  	GMenuTreeItem *aliased_item;
   1020  17968   mattman  
   1021  19328   davelam @@ -1560,13 +1591,15 @@
   1022  17968   mattman  	case GMENU_TREE_ITEM_DIRECTORY:
   1023  17968   mattman  		create_submenu (menu,
   1024  17968   mattman  				GMENU_TREE_DIRECTORY (aliased_item),
   1025  17968   mattman -				gmenu_tree_alias_get_directory (alias));
   1026  17968   mattman +				gmenu_tree_alias_get_directory (alias),
   1027  17968   mattman +                is_hidden);
   1028  17968   mattman  		break;
   1029  17968   mattman  
   1030  17968   mattman  	case GMENU_TREE_ITEM_ENTRY:
   1031  17968   mattman  		create_menuitem (menu,
   1032  17968   mattman  				 GMENU_TREE_ENTRY (aliased_item),
   1033  17968   mattman -				 gmenu_tree_alias_get_directory (alias));
   1034  17968   mattman +				 gmenu_tree_alias_get_directory (alias),
   1035  17968   mattman +                 is_hidden);
   1036  17968   mattman  		break;
   1037  17968   mattman  
   1038  17968   mattman  	default:
   1039  19328   davelam @@ -1673,18 +1706,21 @@
   1040  17968   mattman  
   1041  17968   mattman  static GtkWidget *
   1042  17968   mattman  populate_menu_from_directory (GtkWidget          *menu,
   1043  17968   mattman -			      GMenuTreeDirectory *directory)
   1044  17968   mattman +			      GMenuTreeDirectory *directory,
   1045  17968   mattman +                  gboolean *is_hidden)
   1046  17968   mattman  {	
   1047  17968   mattman  	GSList   *l;
   1048  17968   mattman  	GSList   *items;
   1049  17968   mattman  	gboolean  add_separator;
   1050  17968   mattman  
   1051  18614   mattman +    *is_hidden = TRUE;
   1052  17968   mattman  	add_separator = (GTK_MENU_SHELL (menu)->children != NULL);
   1053  17968   mattman  
   1054  17968   mattman  	items = gmenu_tree_directory_get_contents (directory);
   1055  17968   mattman  
   1056  17968   mattman  	for (l = items; l; l = l->next) {
   1057  17968   mattman  		GMenuTreeItem *item = l->data;
   1058  17968   mattman +        gboolean is_item_hidden = TRUE;
   1059  17968   mattman  
   1060  17968   mattman  		if (add_separator ||
   1061  17968   mattman  		    gmenu_tree_item_get_type (item) == GMENU_TREE_ITEM_SEPARATOR) {
   1062  19328   davelam @@ -1694,11 +1730,13 @@
   1063  17968   mattman  
   1064  17968   mattman  		switch (gmenu_tree_item_get_type (item)) {
   1065  17968   mattman  		case GMENU_TREE_ITEM_DIRECTORY:
   1066  17968   mattman -			create_submenu (menu, GMENU_TREE_DIRECTORY (item), NULL);
   1067  17968   mattman +			create_submenu (menu, GMENU_TREE_DIRECTORY (item), NULL,
   1068  17968   mattman +                            &is_item_hidden);
   1069  17968   mattman  			break;
   1070  17968   mattman  
   1071  17968   mattman  		case GMENU_TREE_ITEM_ENTRY:
   1072  17968   mattman -			create_menuitem (menu, GMENU_TREE_ENTRY (item), NULL);
   1073  17968   mattman +			create_menuitem (menu, GMENU_TREE_ENTRY (item), NULL,
   1074  17968   mattman +                             &is_item_hidden);
   1075  17968   mattman  			break;
   1076  17968   mattman  
   1077  17968   mattman  		case GMENU_TREE_ITEM_SEPARATOR :
   1078  19328   davelam @@ -1706,11 +1744,13 @@
   1079  17968   mattman  			break;
   1080  17968   mattman  
   1081  17968   mattman  		case GMENU_TREE_ITEM_ALIAS:
   1082  17968   mattman -			create_menuitem_from_alias (menu, GMENU_TREE_ALIAS (item));
   1083  17968   mattman +			create_menuitem_from_alias (menu, GMENU_TREE_ALIAS (item),
   1084  17968   mattman +                                        &is_item_hidden);
   1085  17968   mattman  			break;
   1086  17968   mattman  
   1087  17968   mattman  		case GMENU_TREE_ITEM_HEADER:
   1088  17968   mattman -			create_header (menu, GMENU_TREE_HEADER (item));
   1089  17968   mattman +			create_header (menu, GMENU_TREE_HEADER (item),
   1090  17968   mattman +                           &is_item_hidden);
   1091  17968   mattman  			break;
   1092  17968   mattman  
   1093  17968   mattman  		default:
   1094  19328   davelam @@ -1718,6 +1758,10 @@
   1095  17968   mattman  		}
   1096  17968   mattman  
   1097  17968   mattman  		gmenu_tree_item_unref (item);
   1098  17968   mattman +
   1099  17968   mattman +        if (!is_item_hidden) {
   1100  17968   mattman +            *is_hidden = FALSE;
   1101  17968   mattman +        }
   1102  17968   mattman  	}
   1103  17968   mattman  
   1104  17968   mattman  	g_slist_free (items);
   1105