diff --git a/web/pgadmin/misc/file_manager/static/js/utility.js b/web/pgadmin/misc/file_manager/static/js/utility.js index 1e7f69005..eb0f9f695 100644 --- a/web/pgadmin/misc/file_manager/static/js/utility.js +++ b/web/pgadmin/misc/file_manager/static/js/utility.js @@ -1985,7 +1985,7 @@ define([ let response = getFileFormat(this.config.options.allowed_file_types); let lastSelectedFormat = response.responseJSON.info; - if (_.isUndefined(lastSelectedFormat)) + if (_.isUndefined(lastSelectedFormat) || allowed_types.indexOf(lastSelectedFormat) < 0) set_type = allowed_types[0]; else set_type = lastSelectedFormat; diff --git a/web/pgadmin/tools/import_export_servers/__init__.py b/web/pgadmin/tools/import_export_servers/__init__.py index cf562d0c9..fec36c7ec 100644 --- a/web/pgadmin/tools/import_export_servers/__init__.py +++ b/web/pgadmin/tools/import_export_servers/__init__.py @@ -24,6 +24,8 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error from pgadmin.model import ServerGroup, Server from pgadmin.utils import clear_database_servers, dump_database_servers,\ load_database_servers, validate_json_data +from urllib.parse import unquote +from pgadmin.utils.paths import get_storage_directory MODULE_NAME = 'import_export_servers' @@ -130,9 +132,20 @@ def load_servers(): if 'filename' in data: filename = data['filename'] - if filename is not None and os.path.exists(filename): + file_path = unquote(filename) + + # retrieve storage directory path + storage_manager_path = get_storage_directory() + if storage_manager_path: + # generate full path of file + file_path = os.path.join( + storage_manager_path, + file_path.lstrip('/').lstrip('\\') + ) + + if file_path is not None and os.path.exists(file_path): try: - with open(filename, 'r') as j: + with open(file_path, 'r') as j: data = json.loads(j.read()) # Validate the json file and data diff --git a/web/pgadmin/utils/__init__.py b/web/pgadmin/utils/__init__.py index 5f5eff9a4..f5708f6ea 100644 --- a/web/pgadmin/utils/__init__.py +++ b/web/pgadmin/utils/__init__.py @@ -22,8 +22,8 @@ from threading import Lock from .paths import get_storage_directory from .preferences import Preferences from pgadmin.utils.constants import UTILITIES_ARRAY, USER_NOT_FOUND -from pgadmin.model import db, User, Version, ServerGroup, Server, \ - SCHEMA_VERSION as CURRENT_SCHEMA_VERSION +from pgadmin.model import db, User, ServerGroup, Server +from urllib.parse import unquote ADD_SERVERS_MSG = "Added %d Server Group(s) and %d Server(s)." @@ -450,20 +450,36 @@ def dump_database_servers(output_file, selected_servers, object_dict["Servers"] = server_dict - f = None - try: - f = open(output_file, "w") - except Exception as e: - return _handle_error("Error opening output file %s: [%d] %s" % - (output_file, e.errno, e.strerror), from_setup) + # retrieve storage directory path + storage_manager_path = get_storage_directory() - try: - f.write(json.dumps(object_dict, indent=4)) - except Exception as e: - return _handle_error("Error writing output file %s: [%d] %s" % - (output_file, e.errno, e.strerror), from_setup) + # generate full path of file + file_path = unquote(output_file) - f.close() + from pgadmin.misc.file_manager import Filemanager + try: + Filemanager.check_access_permission(storage_manager_path, file_path) + except Exception as e: + return _handle_error(str(e), from_setup) + + if storage_manager_path is not None: + file_path = os.path.join( + storage_manager_path, + file_path.lstrip('/').lstrip('\\') + ) + + # write to file + file_content = json.dumps(object_dict, indent=4) + error_str = gettext("Error: {0}") + try: + with open(file_path, 'w') as output_file: + output_file.write(file_content) + except IOError as e: + err_msg = error_str.format(e.strerror) + return _handle_error(err_msg, from_setup) + except Exception as e: + err_msg = error_str.format(e.strerror) + return _handle_error(err_msg, from_setup) msg = "Configuration for %s servers dumped to %s." % \ (servers_dumped, output_file) @@ -541,15 +557,26 @@ def load_database_servers(input_file, selected_servers, load_user=current_user, from_setup=False): """Load server groups and servers. """ + # retrieve storage directory path + storage_manager_path = get_storage_directory() + # generate full path of file + file_path = unquote(input_file) + if storage_manager_path: + # generate full path of file + file_path = os.path.join( + storage_manager_path, + file_path.lstrip('/').lstrip('\\') + ) + try: - with open(input_file) as f: + with open(file_path) as f: data = json.load(f) except json.decoder.JSONDecodeError as e: return _handle_error("Error parsing input file %s: %s" % - (input_file, e), from_setup) + (file_path, e), from_setup) except Exception as e: return _handle_error("Error reading input file %s: [%d] %s" % - (input_file, e.errno, e.strerror), from_setup) + (file_path, e.errno, e.strerror), from_setup) f.close()