Skip to content

Commit 56d5cab

Browse files
Ensure that reconnect dialogs are shown when restoring pgAdmin sessions for the Query Tool or View/Edit Data, if the server password was not saved. #8901
1 parent bec4784 commit 56d5cab

File tree

3 files changed

+62
-11
lines changed

3 files changed

+62
-11
lines changed

web/pgadmin/tools/sqleditor/__init__.py

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -204,23 +204,61 @@ def initialize_viewdata(trans_id, cmd_type, obj_type, sgid, sid, did, obj_id):
204204
else:
205205
_data = request.args or request.form
206206

207-
filter_sql = _data['filter_sql'] if 'filter_sql' in _data else None
207+
filter_sql = _data['sql_filter'] if 'sql_filter' in _data else None
208208
server_cursor = _data['server_cursor'] if\
209209
'server_cursor' in _data and (
210210
_data['server_cursor'] == 'true' or _data['server_cursor'] is True
211211
) else False
212+
dbname = _data['dbname'] if 'dbname' in _data else None
213+
214+
kwargs = {
215+
'user': _data['user'] if 'user' in _data else None,
216+
'role': _data['role'] if 'role' in _data else None,
217+
'password': _data['password'] if 'password' in _data else None
218+
}
219+
220+
server = Server.query.filter_by(id=sid).first()
221+
if kwargs.get('password', None) is None:
222+
kwargs['encpass'] = server.password
223+
else:
224+
kwargs['encpass'] = None
212225

213226
# Create asynchronous connection using random connection id.
214227
conn_id = str(secrets.choice(range(1, 9999999)))
215228
try:
216229
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
217230
# default_conn is same connection which is created when user connect to
218231
# database from tree
219-
default_conn = manager.connection(did=did)
220-
conn = manager.connection(did=did, conn_id=conn_id,
232+
conn = manager.connection(conn_id=conn_id,
221233
auto_reconnect=False,
222234
use_binary_placeholder=True,
223-
array_to_string=True)
235+
array_to_string=True,
236+
**({"database": dbname} if dbname is not None
237+
else {"did": did}
238+
))
239+
status, msg, is_ask_password, user, _, _ = _connect(
240+
conn,**kwargs)
241+
if not status:
242+
current_app.logger.error(msg)
243+
if is_ask_password:
244+
return make_json_response(
245+
success=0,
246+
status=428,
247+
result={
248+
"server_label": server.name,
249+
"username": user or server.username,
250+
"errmsg": msg,
251+
"prompt_password": True,
252+
"allow_save_password": True
253+
if ALLOW_SAVE_PASSWORD and
254+
session.get('allow_save_password', None)
255+
else False,
256+
}
257+
)
258+
else:
259+
return internal_server_error(
260+
errormsg=str(msg))
261+
default_conn = manager.connection(did=did)
224262
except (ConnectionLost, SSHTunnelConnectionLost):
225263
raise
226264
except Exception as e:

web/pgadmin/tools/sqleditor/static/js/components/QueryToolComponent.jsx

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
308308
if (toolContent?.modifiedExternally) {
309309
toolContent = await fmUtilsObj.warnFileReload(toolContent?.fileName, toolContent.data, '');
310310
}
311-
311+
312312
if(toolContent?.loadFile){
313313
eventBus.current.fireEvent(QUERY_TOOL_EVENTS.LOAD_FILE, toolContent.fileName, params?.storage);
314314
}else{
@@ -338,13 +338,15 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
338338
});
339339
}
340340
eventBus.current.fireEvent(QUERY_TOOL_EVENTS.SERVER_CURSOR, executeServerCursor);
341-
api.post(baseUrl, qtState.params.is_query_tool ? {
341+
let requestParams = {
342342
user: selectedConn.user,
343343
role: selectedConn.role,
344344
password: password,
345345
dbname: selectedConn.database_name
346-
} : {sql_filter: qtState.params.sql_filter,
347-
server_cursor: qtState.params.server_cursor})
346+
};
347+
api.post(baseUrl, qtState.params.is_query_tool ?
348+
{...requestParams} :
349+
{sql_filter: qtState.params.sql_filter, server_cursor: qtState.params.server_cursor, ...requestParams})
348350
.then(()=>{
349351
setQtStatePartial({
350352
connected: true,
@@ -391,7 +393,7 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
391393
connected: false,
392394
obtaining_conn: false,
393395
});
394-
eventBus.current.fireEvent(QUERY_TOOL_EVENTS.HANDLE_API_ERROR, error);
396+
eventBus.current.fireEvent(QUERY_TOOL_EVENTS.HANDLE_API_ERROR, error, ()=>{});
395397
}
396398
});
397399
};
@@ -511,6 +513,7 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
511513

512514

513515
const handleApiError = (error, handleParams)=>{
516+
let selectedConn = _.find(qtState.connection_list, (c)=>c.is_selected);
514517
if(error.response?.status == 503 && error.response.data?.info == 'CONNECTION_LOST') {
515518
// We will display re-connect dialog, no need to display error message again
516519
modal.confirm(
@@ -529,7 +532,6 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
529532
gettext('Cancel')
530533
);
531534
} else if(handleParams?.checkTransaction && error.response?.data.info == 'DATAGRID_TRANSACTION_REQUIRED') {
532-
let selectedConn = _.find(qtState.connection_list, (c)=>c.is_selected);
533535
initConnection(api, {
534536
'gid': selectedConn.sgid,
535537
'sid': selectedConn.sid,
@@ -542,6 +544,17 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
542544
});
543545
} else if(error.response?.status == 403 && error.response?.data.info == 'ACCESS_DENIED') {
544546
pgAdmin.Browser.notifier.error(error.response.data.errormsg);
547+
548+
}else if(error?.response?.status == 428) {
549+
connectServerModal(modal, error.response?.data?.result, async (passwordData)=>{
550+
551+
await connectServer(api, modal, selectedConn.sid, selectedConn.user, passwordData, async ()=>{
552+
initializeQueryTool();
553+
});
554+
555+
}, ()=>{
556+
/*This is intentional (SonarQube)*/
557+
});
545558
}else {
546559
let msg = parseApiError(error);
547560
eventBus.current.fireEvent(QUERY_TOOL_EVENTS.SET_MESSAGE, msg, true);

web/pgadmin/tools/sqleditor/static/js/show_view_data.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ function showFilterDialog(pgBrowser, item, queryToolMod, transId,
190190
let helpUrl = url_for('help.static', {'filename': 'viewdata_filter.html'});
191191

192192
let okCallback = function() {
193-
queryToolMod.launch(transId, gridUrl, false, queryToolTitle, {sql_filter: JSON.stringify(schema.sessData.filter_sql)});
193+
queryToolMod.launch(transId, gridUrl, false, queryToolTitle, {sql_filter: schema.sessData.filter_sql});
194194
};
195195

196196
pgBrowser.Events.trigger('pgadmin:utility:show', item,

0 commit comments

Comments
 (0)