diff --git a/src/gnome-utils/gnc-file.c b/src/gnome-utils/gnc-file.c index 49e74df964..a3a2388da1 100644 --- a/src/gnome-utils/gnc-file.c +++ b/src/gnome-utils/gnc-file.c @@ -34,6 +34,7 @@ #include "gnc-engine.h" #include "Account.h" #include "gnc-file.h" +#include "gnc-filepath-utils.h" #include "gnc-gui-query.h" #include "gnc-hooks.h" #include "gnc-keyring.h" @@ -398,6 +399,13 @@ show_session_error (QofBackendError io_error, gnc_error_dialog (parent, fmt, displayname); break; + case ERR_FILEIO_RESERVED_WRITE: + fmt = _("You attempted to save in\n%s\nor a subdirectory thereof. " + "This is not allowed as %s reserves that directory for internal use.\n\n" + "Please try again in a different directory."); + gnc_error_dialog (parent, fmt, gnc_dotgnucash_dir(), PACKAGE_NAME); + break; + case ERR_SQL_DB_TOO_OLD: fmt = _("This database is from an older version of GnuCash. " "Do you want to want to upgrade the database " @@ -1210,12 +1218,23 @@ gnc_file_do_save_as (const char* filename) newfile = norm_file; } - /* For file based uri's, remember the directory as the default. */ + /* Some extra steps for file based uri's only */ if (gnc_uri_is_file_protocol(protocol)) { + /* Remember the directory as the default. */ gchar *default_dir = g_path_get_dirname(path); gnc_set_default_directory (GCONF_DIR_OPEN_SAVE, default_dir); g_free(default_dir); + + /* Prevent user to store file in GnuCash' private configuration + * directory (~/.gnucash by default in linux, but can be overridden) + */ + DEBUG("User path: %s, dotgnucash_dir: %s", path, gnc_dotgnucash_dir()); + if (g_str_has_prefix(path, gnc_dotgnucash_dir())) + { + show_session_error (ERR_FILEIO_RESERVED_WRITE, newfile, GNC_FILE_DIALOG_SAVE); + return; + } } /* Check to see if the user specified the same file as the current diff --git a/src/libqof/qof/qofbackend.h b/src/libqof/qof/qofbackend.h index ea2c34c7a2..6b6e858370 100644 --- a/src/libqof/qof/qofbackend.h +++ b/src/libqof/qof/qofbackend.h @@ -96,6 +96,8 @@ typedef enum ERR_FILEIO_READ_ERROR, /**< Could not open the file for reading. */ ERR_FILEIO_NO_ENCODING, /**< file does not specify encoding */ ERR_FILEIO_FILE_EACCES, /**< No read access permission for the given file */ + ERR_FILEIO_RESERVED_WRITE, /**< User attempt to write to a directory reserved + for internal use by GnuCash */ /* network errors */ ERR_NETIO_SHORT_READ = 2000, /**< not enough bytes received */