Skip to content

Commit

Permalink
SaveActions: Set file permissions of backup copies to 0600
Browse files Browse the repository at this point in the history
As discussed in SF bug #125, it might be dangerous to store backup
copies in a publicly accessable directory like /tmp with default
permissions, especially on multi-user systems.
So set the file permissions on non-Windows systems to 0600 by default.
Also improve the documentation of the save Actions plugin to reflect this
change.
  • Loading branch information
eht16 committed Jan 31, 2015
1 parent d33a23c commit 7229aa9
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
19 changes: 17 additions & 2 deletions doc/geany.txt
Expand Up @@ -5176,8 +5176,23 @@ you can configure the automatically added extension in the configure dialog
in Geany's plugin manager.

After the plugin was loaded in Geany's plugin manager, every file is
copied into the configured backup directory when the file is saved in Geany.

copied into the configured backup directory *after* the file has been saved
in Geany.

The created backup copy file permissions are set to read-write only for
the user. This should help to not create world-readable files on possibly
unsecure destination directories like /tmp (especially useful
on multi-user systems).
This applies only to non-Windows systems. On Windows, no explicit file
permissions are set.


Additionally, you can define how many levels of the original file's
directory structure should be replicated in the backup copy path.
For example, setting the option
*Directory levels to include in the backup destination* to *2*
cause the plugin to create the last two components of the original
file's path in the backup copy path and place the new file there.


Contributing to this document
Expand Down
14 changes: 14 additions & 0 deletions plugins/saveactions.c
Expand Up @@ -27,6 +27,8 @@
#include "geanyplugin.h"
#include "gtkcompat.h"

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <glib/gstdio.h>
Expand Down Expand Up @@ -195,6 +197,7 @@ static void backupcopy_document_save_cb(GObject *obj, GeanyDocument *doc, gpoint
gchar *dir_parts_src;
gchar *stamp;
gchar buf[512];
gint fd_dst = -1;

if (! enable_backupcopy)
return;
Expand All @@ -220,14 +223,23 @@ static void backupcopy_document_save_cb(GObject *obj, GeanyDocument *doc, gpoint
g_free(basename_src);
g_free(dir_parts_src);

#ifdef G_OS_WIN32
if ((dst = g_fopen(locale_filename_dst, "wb")) == NULL)
#else
/* Use g_open() on non-Windows to set file permissions to 600 atomically.
* On Windows, seting file permissions would require specific Windows API. */
fd_dst = g_open(locale_filename_dst, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR);
if (fd_dst == -1 || (dst = fdopen(fd_dst, "w")) == NULL)
#endif
{
ui_set_statusbar(FALSE, _("Backup Copy: File could not be saved (%s)."),
g_strerror(errno));
g_free(locale_filename_src);
g_free(locale_filename_dst);
g_free(stamp);
fclose(src);
if (fd_dst != -1)
close(fd_dst);
return;
}

Expand All @@ -238,6 +250,8 @@ static void backupcopy_document_save_cb(GObject *obj, GeanyDocument *doc, gpoint

fclose(src);
fclose(dst);
if (fd_dst != -1)
close(fd_dst);
g_free(locale_filename_src);
g_free(locale_filename_dst);
g_free(stamp);
Expand Down

0 comments on commit 7229aa9

Please sign in to comment.