From 6c723a7e431c13fe85191ae0be7d2eddce0c7733 Mon Sep 17 00:00:00 2001 From: Nikhil Mohite Date: Wed, 28 Oct 2020 12:32:22 +0530 Subject: [PATCH] Fixed an issue where connection to the server is on wait state if a different user is provided. Fixes #5953 --- docs/en_US/release_notes_4_28.rst | 1 + .../js/sqleditor/new_connection_dialog.js | 3 +- .../sqleditor/new_connection_dialog_model.js | 22 +- web/pgadmin/tools/datagrid/__init__.py | 2 +- .../tools/sqleditor/static/js/sqleditor.js | 192 ++++++++++-------- 5 files changed, 128 insertions(+), 92 deletions(-) diff --git a/docs/en_US/release_notes_4_28.rst b/docs/en_US/release_notes_4_28.rst index 8c86fddba..5b15e12a5 100644 --- a/docs/en_US/release_notes_4_28.rst +++ b/docs/en_US/release_notes_4_28.rst @@ -28,3 +28,4 @@ Bug fixes | `Issue #5911 `_ - Ensure that macros should be run on the older version of Safari and Chrome. | `Issue #5919 `_ - Added security related enhancements. | `Issue #5923 `_ - Fixed an issue where non-closeable tabs are getting closed. +| `Issue #5953 `_ - Fixed an issue where connection to the server is on wait state if a different user is provided. diff --git a/web/pgadmin/static/js/sqleditor/new_connection_dialog.js b/web/pgadmin/static/js/sqleditor/new_connection_dialog.js index 19bdf7da1..49992e9d2 100644 --- a/web/pgadmin/static/js/sqleditor/new_connection_dialog.js +++ b/web/pgadmin/static/js/sqleditor/new_connection_dialog.js @@ -131,7 +131,7 @@ let NewConnectionDialog = { self.showNewConnectionProgress[0] ).removeClass('d-none'); - self.newConnCollectionModel = newConnectionDialogModel(response, handler.url_params.sgid, handler.url_params.sid); + self.newConnCollectionModel = newConnectionDialogModel(response, handler.url_params.sgid, handler.url_params.sid, handler, self); let fields = Backform.generateViewSchema(null, self.newConnCollectionModel, 'create', null, null, true); let view = this.view = new Backform.Dialog({ @@ -240,6 +240,7 @@ let NewConnectionDialog = { 'role': newConnCollectionModel['role'], 'server_name': _.escape(response.server_name), 'database_name': _.escape(selected_database_name), + 'password': response.password, 'is_selected': false, }; handler.gridView.on_change_connection(connection_details, self); diff --git a/web/pgadmin/static/js/sqleditor/new_connection_dialog_model.js b/web/pgadmin/static/js/sqleditor/new_connection_dialog_model.js index 0bbda6051..4bfa9b958 100644 --- a/web/pgadmin/static/js/sqleditor/new_connection_dialog_model.js +++ b/web/pgadmin/static/js/sqleditor/new_connection_dialog_model.js @@ -15,7 +15,7 @@ import Backform from 'pgadmin.backform'; import url_for from 'sources/url_for'; import alertify from 'pgadmin.alertifyjs'; -export default function newConnectionDialogModel(response, sgid, sid) { +export default function newConnectionDialogModel(response, sgid, sid, handler, conn_self) { let server_name = ''; let database_name = ''; @@ -158,12 +158,13 @@ export default function newConnectionDialogModel(response, sgid, sid) { alertify.dialog('connectServer', function factory() { return { main: function( - title, message, server_id, submit_password=true + title, message, server_id, submit_password=true, connect_server=null, ) { this.set('title', title); this.message = message; this.server_id = server_id; this.submit_password = submit_password; + this.connect_server = connect_server; }, setup:function() { return { @@ -185,11 +186,11 @@ export default function newConnectionDialogModel(response, sgid, sid) { this.setContent(this.message); }, callback: function(closeEvent) { - + var loadingDiv = $('#show_filter_progress'); if (closeEvent.button.text == gettext('OK')) { if(this.submit_password) { var _url = url_for('sqleditor.connect_server', {'sid': this.server_id}); - var loadingDiv = $('#show_filter_progress'); + loadingDiv.removeClass('d-none'); $.ajax({ type: 'POST', @@ -218,13 +219,26 @@ export default function newConnectionDialogModel(response, sgid, sid) { alertify.connectServer().destroy(); alertify.connectServer('Connect to server', xhr.responseJSON.result, local_self.getValueFromDOM()); }); + } else { + if(Object.keys(this.connect_server).length > 0) { + this.connect_server['password'] = $('#password').val(); + this.connect_server['is_selected'] = false; + handler.gridView.on_change_connection(this.connect_server, conn_self, false); + loadingDiv = $('#fetching_data'); + loadingDiv.addClass('d-none'); + } else { + response.password = $('#password').val(); + loadingDiv.addClass('d-none'); + } } } else { local_self.model.attributes.database = null; local_self.model.attributes.user = null; local_self.model.attributes.role = null; Backform.Select2Control.prototype.onChange.apply(local_self, arguments); + loadingDiv.addClass('d-none'); alertify.connectServer().destroy(); + } closeEvent.close = true; }, diff --git a/web/pgadmin/tools/datagrid/__init__.py b/web/pgadmin/tools/datagrid/__init__.py index f7b836a9f..c87f3e22d 100644 --- a/web/pgadmin/tools/datagrid/__init__.py +++ b/web/pgadmin/tools/datagrid/__init__.py @@ -466,7 +466,7 @@ def update_query_tool_connection(trans_id, sgid, sid, did): new_trans_id = str(random.randint(1, 9999999)) kwargs = { 'user': data['user'], - 'role': data['role'], + 'role': data['role'] if 'role' in data else None, 'password': data['password'] if 'password' in data else None } diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js index 2bb9f3820..90aa36271 100644 --- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js +++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js @@ -2125,7 +2125,7 @@ define('tools.querytool', [ set_selected_option: function(selected_config) { this.connection_list.forEach(option =>{ - if(option['server'] == selected_config['server'] && option['database'] == selected_config['database']) { + if(option['server'] == selected_config['server'] && option['database'] == selected_config['database'] && option['user'] == selected_config['user'] && option['role'] == selected_config['role']) { selected_config['is_selected'] = true; } else { option['is_selected'] = false; @@ -2133,96 +2133,115 @@ define('tools.querytool', [ }); }, - on_change_connection: function(connection_details, ref) { + on_change_connection: function(connection_details, ref, add_new_connection=true) { if(!connection_details['is_selected']) { var self = this; - var loadingDiv = null; - var msgDiv = null; - if(ref){ - loadingDiv = $('#show_filter_progress'); - loadingDiv.removeClass('d-none'); - msgDiv = loadingDiv.find('.sql-editor-busy-text'); - msgDiv.text('Connecting to database...'); - } else{ - loadingDiv = $('#fetching_data'); - loadingDiv.removeClass('d-none'); - msgDiv = loadingDiv.find('.sql-editor-busy-text'); + if(add_new_connection) { + alertify.confirm(gettext('Change connection'), + gettext('By changing the connection you will lose all your unsaved data for the current connection.
Do you want to continue?'), + function() { + self.change_connection(connection_details, ref, true); + }, + function() { + var loadingDiv = $('#fetching_data'); + loadingDiv.addClass('d-none'); + alertify.newConnectionDialog().destroy(); + return true; + } + ).set('labels', { + ok: gettext('Yes'), + cancel: gettext('No'), + }); + } else { + self.change_connection(connection_details, ref, false); } - - alertify.confirm(gettext('Change connection'), - gettext('By changing the connection you will lose all your unsaved data for the current connection.
Do you want to continue?'), - function() { - self.set_selected_option(connection_details); - $.ajax({ - url: url_for('datagrid.update_query_tool_connection', { - 'trans_id': self.transId, - 'sgid': connection_details['server_group'], - 'sid': connection_details['server'], - 'did': connection_details['database'], - }), - method: 'POST', - contentType: 'application/json', - data: JSON.stringify(connection_details), - }) - .done(function(res) { - if(res.success) { - self.transId = res.data.tran_id; - self.handler.transId = res.data.tran_id; - self.handler.url_params = { - 'did': connection_details['database'], - 'is_query_tool': self.handler.url_params.is_query_tool, - 'server_type': self.handler.url_params.server_type, - 'sgid': connection_details['server_group'], - 'sid': connection_details['server'], - 'title': connection_details['title'], - }; - self.set_editor_title(_.unescape(self.handler.url_params.title)); - self.handler.setTitle(_.unescape(self.handler.url_params.title)); - let success_msg = connection_details['server_name'] + '/' + connection_details['database_name'] + '- Database connected'; - alertify.success(success_msg); - if(ref){ - let connection_data = { - 'server_group': self.handler.url_params.sgid, - 'server': connection_details['server'], - 'database': connection_details['database'], - 'user': connection_details['user'], - 'title': connection_details['title'], - 'role': connection_details['role'], - 'is_allow_new_connection': true, - 'database_name': connection_details['database_name'], - 'server_name': connection_details['server_name'], - 'is_selected': true, - }; - self.connection_list.unshift(connection_data); - self.render_connection(self.connection_list); - loadingDiv.addClass('d-none'); - alertify.newConnectionDialog().destroy(); - ref.close(); - } else { - loadingDiv.addClass('d-none'); - } - } - return true; - }) - .fail(function(xhr) { - if(xhr.status == 428) { - alertify.connectServer('Connect to server', xhr.responseJSON.result, connection_details['server'], false); - } else { - alertify.error(xhr.responseJSON['errormsg']); - } - }); - }, - function() { - loadingDiv.addClass('d-none'); - alertify.newConnectionDialog().destroy(); - return true; - } - ).set('labels', { - ok: gettext('Yes'), - cancel: gettext('No'), - }); } }, + + change_connection: function(connection_details, ref, add_new_connection) { + var self = this; + var loadingDiv = null; + var msgDiv = null; + if(ref){ + loadingDiv = $('#show_filter_progress'); + loadingDiv.removeClass('d-none'); + msgDiv = loadingDiv.find('.sql-editor-busy-text'); + msgDiv.text('Connecting to database...'); + } else{ + loadingDiv = $('#fetching_data'); + loadingDiv.removeClass('d-none'); + msgDiv = loadingDiv.find('.sql-editor-busy-text'); + } + self.set_selected_option(connection_details); + $.ajax({ + url: url_for('datagrid.update_query_tool_connection', { + 'trans_id': self.transId, + 'sgid': connection_details['server_group'], + 'sid': connection_details['server'], + 'did': connection_details['database'], + }), + method: 'POST', + contentType: 'application/json', + data: JSON.stringify(connection_details), + }) + .done(function(res) { + if(res.success) { + delete connection_details.password; + self.transId = res.data.tran_id; + self.handler.transId = res.data.tran_id; + self.handler.url_params = { + 'did': connection_details['database'], + 'is_query_tool': self.handler.url_params.is_query_tool, + 'server_type': self.handler.url_params.server_type, + 'sgid': connection_details['server_group'], + 'sid': connection_details['server'], + 'title': connection_details['title'], + }; + self.set_editor_title(_.unescape(self.handler.url_params.title)); + self.handler.setTitle(_.unescape(self.handler.url_params.title)); + let success_msg = connection_details['server_name'] + '/' + connection_details['database_name'] + '- Database connected'; + alertify.success(success_msg); + if(ref){ + let connection_data = { + 'server_group': self.handler.url_params.sgid, + 'server': connection_details['server'], + 'database': connection_details['database'], + 'user': connection_details['user'], + 'title': connection_details['title'], + 'role': connection_details['role'], + 'is_allow_new_connection': true, + 'database_name': connection_details['database_name'], + 'server_name': connection_details['server_name'], + 'is_selected': true, + }; + delete connection_data.password; + if(add_new_connection) { + self.connection_list.unshift(connection_data); + } + + self.render_connection(self.connection_list); + loadingDiv.addClass('d-none'); + alertify.newConnectionDialog().destroy(); + alertify.connectServer().destroy(); + } else { + loadingDiv.addClass('d-none'); + alertify.connectServer().destroy(); + } + } + return true; + }) + .fail(function(xhr) { + if(xhr.status == 428) { + var connection_info = connection_details; + if(ref) { + connection_info = {}; + } + alertify.connectServer('Connect to server', xhr.responseJSON.result, connection_details['server'], false, connection_info); + } else { + alertify.error(xhr.responseJSON['errormsg']); + } + }); + }, }); @@ -2566,6 +2585,7 @@ define('tools.querytool', [ 'server_name': _.unescape(server_data.data.label), 'is_selected': true, }; + delete connection_data.password; self.gridView.connection_list.unshift(connection_data); self.gridView.render_connection(self.gridView.connection_list); };