31
31
#include <libnautilus-extension/nautilus-menu-provider.h>
32
32
#include <libnautilus-extension/nautilus-property-page-provider.h>
34
#include <libgnomevfs/gnome-vfs-utils.h>
35
34
#include "nautilus-share.h"
37
#include <eel/eel-vfs-extensions.h>
39
36
#include <glib/gi18n-lib.h>
41
#include <gtk/gtktable.h>
42
#include <gtk/gtkvbox.h>
43
#include <gtk/gtkhbox.h>
44
#include <gtk/gtklabel.h>
45
40
#include <gtk/gtk.h>
46
#include <gtk/gtkentry.h>
48
#include <glade/glade.h>
50
42
#include <string.h>
45
#include <sys/types.h>
53
47
#include <unistd.h>
54
48
#include <stdlib.h>
56
50
#include "shares.h"
59
#define NEED_ALWAYS_MASK (S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) /* all usershares need go+rx */
53
#define NEED_IF_GUESTOK_MASK (S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) /* need go+rx for guest enabled usershares */
60
54
#define NEED_IF_WRITABLE_MASK (S_IWGRP | S_IWOTH) /* writable usershares need go+w additionally*/
61
#define NEED_ALL_MASK (NEED_ALWAYS_MASK | NEED_IF_WRITABLE_MASK)
55
#define NEED_ALL_MASK (NEED_IF_GUESTOK_MASK | NEED_IF_WRITABLE_MASK)
63
57
static GObjectClass *parent_class;
322
316
} ConfirmPermissionsStatus;
324
318
static ConfirmPermissionsStatus
325
confirm_sharing_permissions (GtkWidget *widget, const char *path, gboolean is_shared, gboolean is_writable)
319
confirm_sharing_permissions (GtkWidget *widget, const char *path, gboolean is_shared, gboolean guest_ok, gboolean is_writable)
328
322
mode_t mode, new_mode, need_mask;
333
327
if (stat (path, &st) != 0)
334
328
return CONFIRM_NO_MODIFICATIONS; /* We'll just let "net usershare" give back an error if the file disappears */
337
new_mode = mode | NEED_ALWAYS_MASK;
330
new_mode = mode = st.st_mode;
333
new_mode |= NEED_IF_GUESTOK_MASK;
340
335
new_mode |= NEED_IF_WRITABLE_MASK;
389
384
if (is_shared && page->was_writable && !share_info.is_writable)
390
385
restore_write_permissions (page->path);
392
status = confirm_sharing_permissions (page->main, page->path, is_shared, share_info.is_writable);
387
status = confirm_sharing_permissions (page->main, page->path, is_shared, share_info.guest_ok, share_info.is_writable);
393
388
if (status == CONFIRM_CANCEL_OR_ERROR)
394
389
return FALSE; /* the user didn't want us to change his folder's permissions */
422
424
get_fullpath_from_fileinfo(NautilusFileInfo *fileinfo)
427
429
g_assert (fileinfo != NULL);
429
uri = nautilus_file_info_get_uri(fileinfo);
430
fullpath = gnome_vfs_get_local_path_from_uri(uri);
431
g_assert (fullpath != NULL); /* In the beginning we checked that this was a local URI */
431
file = nautilus_file_info_get_location(fileinfo);
432
fullpath = g_file_get_path(file);
433
g_assert (fullpath != NULL && g_file_is_native(file)); /* In the beginning we checked that this was a local URI */
434
g_object_unref(file);
434
436
return(fullpath);
673
682
share_info = NULL;
674
683
g_error_free (error);
677
page->xml = glade_xml_new(INTERFACES_DIR"/share-dialog.glade","vbox1",GETTEXT_PACKAGE);
678
page->main = glade_xml_get_widget(page->xml,"vbox1");
688
page->xml = gtk_builder_new ();
689
gtk_builder_set_translation_domain (page->xml, "nautilus-share");
690
g_assert (gtk_builder_add_from_file (page->xml,
691
INTERFACES_DIR"/share-dialog.ui", &error));
693
page->main = GTK_WIDGET (gtk_builder_get_object (page->xml, "vbox1"));
694
g_assert (page->main != NULL);
679
696
g_object_set_data_full (G_OBJECT (page->main),
682
699
free_property_page_cb);
684
page->checkbutton_share_folder = glade_xml_get_widget(page->xml,"checkbutton_share_folder");
685
page->hbox_share_comment = glade_xml_get_widget(page->xml,"hbox_share_comment");
686
page->hbox_share_name = glade_xml_get_widget(page->xml,"hbox_share_name");
687
page->checkbutton_share_rw_ro = glade_xml_get_widget(page->xml,"checkbutton_share_rw_ro");
688
page->checkbutton_share_guest_ok = glade_xml_get_widget(page->xml,"checkbutton_share_guest_ok");
689
page->entry_share_name = glade_xml_get_widget(page->xml,"entry_share_name");
690
page->entry_share_comment = glade_xml_get_widget(page->xml,"entry_share_comment");
691
page->label_status = glade_xml_get_widget(page->xml,"label_status");
692
page->button_cancel = glade_xml_get_widget(page->xml,"button_cancel");
693
page->button_apply = glade_xml_get_widget(page->xml,"button_apply");
701
page->checkbutton_share_folder = GTK_WIDGET (gtk_builder_get_object (page->xml,"checkbutton_share_folder"));
702
page->hbox_share_comment = GTK_WIDGET (gtk_builder_get_object (page->xml,"hbox_share_comment"));
703
page->hbox_share_name = GTK_WIDGET (gtk_builder_get_object (page->xml,"hbox_share_name"));
704
page->checkbutton_share_rw_ro = GTK_WIDGET (gtk_builder_get_object (page->xml,"checkbutton_share_rw_ro"));
705
page->checkbutton_share_guest_ok = GTK_WIDGET (gtk_builder_get_object (page->xml,"checkbutton_share_guest_ok"));
706
page->entry_share_name = GTK_WIDGET (gtk_builder_get_object (page->xml,"entry_share_name"));
707
page->entry_share_comment = GTK_WIDGET (gtk_builder_get_object (page->xml,"entry_share_comment"));
708
page->label_status = GTK_WIDGET (gtk_builder_get_object (page->xml,"label_status"));
709
page->button_cancel = GTK_WIDGET (gtk_builder_get_object (page->xml,"button_cancel"));
710
page->button_apply = GTK_WIDGET (gtk_builder_get_object (page->xml,"button_apply"));
695
712
/* Sanity check so that we don't screw up the Glade file */
696
713
g_assert (page->checkbutton_share_folder != NULL
1086
1107
g_assert (fileinfo != NULL);
1088
1109
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1110
gtk_window_set_title (GTK_WINDOW (window), _("Folder Sharing"));
1089
1111
page = create_property_page (fileinfo);
1090
1112
page->standalone_window = window;
1091
1113
g_signal_connect (page->button_cancel, "clicked",