diff --git a/docs/en_US/developer_tools.rst b/docs/en_US/developer_tools.rst index 1ff442cc..bb67e33a 100644 --- a/docs/en_US/developer_tools.rst +++ b/docs/en_US/developer_tools.rst @@ -16,3 +16,4 @@ PL/SQL code. editgrid schema_diff erd_tool + psql_tool diff --git a/docs/en_US/images/psql_tool.png b/docs/en_US/images/psql_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f88ba5a573aa60bf7e08b8a38526dc73e8fcd5 GIT binary patch literal 23736 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

?poBJSv;AZ0Y8 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

EU&I*x@eOEab;Rk3Sy7#DhTKtM_z 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

*@UID>bGt&h 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 literal 0 HcmV?d00001 diff --git a/docs/en_US/psql_tool.rst b/docs/en_US/psql_tool.rst new file mode 100644 index 00000000..8791648a --- /dev/null +++ b/docs/en_US/psql_tool.rst @@ -0,0 +1,23 @@ +.. _psql_tool: + +****************** +`PSQL Tool`:index: +****************** + +PSQL tool allows user to connect to PostgreSQL server using psql terminal. + +* Open PSQL Tool from Tools menu or context menu PSQL Tool from tree view. + +.. image:: images/psql_tool_menu.png + :alt: PSQL tool menu + :align: center + +* execute all type of commands. + +.. image:: images/psql_tool.png + :alt: PSQL tool window + :align: center + +You can open multiple instance of the PSQL tool in individual tabs simultaneously. +To close the PSQL tool, click the *X* in the upper-right hand corner of the tab bar. + diff --git a/requirements.txt b/requirements.txt index edd7000b..8227a4c0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,6 @@ # ############################################################################### -cheroot==8.* Flask==1.* Flask-Gravatar==0.* Flask-Login==0.* @@ -36,3 +35,5 @@ sshtunnel==0.* ldap3==2.* Flask-BabelEx==0.* gssapi==1.6.* +flask-socketio>=5.0.1 +eventlet==0.30.2 diff --git a/web/config.py b/web/config.py index 2643ef19..002a9951 100644 --- a/web/config.py +++ b/web/config.py @@ -156,8 +156,8 @@ X_FRAME_OPTIONS = "SAMEORIGIN" # such as JavaScript, CSS, or pretty much anything that the browser loads. # see https://content-security-policy.com/#source_list for more info # e.g. "default-src https: data: 'unsafe-inline' 'unsafe-eval';" -CONTENT_SECURITY_POLICY = "default-src http: data: blob: 'unsafe-inline' " \ - "'unsafe-eval';" +CONTENT_SECURITY_POLICY = "default-src ws: http: data: blob: 'unsafe-inline'" \ + " 'unsafe-eval';" # STRICT_TRANSPORT_SECURITY_ENABLED when set to True will set the # Strict-Transport-Security header @@ -636,6 +636,19 @@ KRB_AUTO_CREATE_USER = True KERBEROS_CCACHE_DIR = os.path.join(DATA_DIR, 'krbccache') +# PSQL tool settings +# This will enable PSQL tool in pgAdmin. So user can execute the commands using +# PSQL terminal in pgAdmin. +ENABLE_PSQL = True + +# ALLOW_PSQL_SHELL_COMMAND = True will disable the execution of os level +# commands using meta command \! from PSQL terminal. +# As PSQL allow user to execute the os level commands from the PSQL terminal +# user can execute any system level command as per the system login user +# privileges. Default this setting is set to False but if it set to True +# User will able to execute the system level commands through PSQL terminal in +# pgAdmin. +ALLOW_PSQL_SHELL_COMMANDS = False ########################################################################## # Local config settings diff --git a/web/package.json b/web/package.json index 8ed32df9..19110fda 100644 --- a/web/package.json +++ b/web/package.json @@ -117,13 +117,18 @@ "shim-loader": "^1.0.1", "slickgrid": "git+https://github.com/6pac/SlickGrid.git#2.3.16", "snapsvg-cjs": "^0.0.6", + "socket.io-client": "^4.0.0", "split.js": "^1.5.10", "tablesorter": "^2.31.2", "tempusdominus-bootstrap-4": "^5.1.2", "tempusdominus-core": "^5.0.3", "underscore": "^1.13.1", "webcabin-docker": "git+https://github.com/EnterpriseDB/wcDocker/#c4a3398b89588408dc705895675bce7bd7660d36", - "wkx": "^0.5.0" + "wkx": "^0.5.0", + "xterm": "^4.11.0", + "xterm-addon-fit": "^0.5.0", + "xterm-addon-search": "^0.8.0", + "xterm-addon-web-links": "^0.4.0" }, "scripts": { "linter": "yarn eslint --no-eslintrc -c .eslintrc.js --ext .js --ext .jsx .", diff --git a/web/pgAdmin4.py b/web/pgAdmin4.py index d2bd1af6..dc1924cb 100644 --- a/web/pgAdmin4.py +++ b/web/pgAdmin4.py @@ -13,7 +13,7 @@ to start a web server.""" import sys -from cheroot.wsgi import Server as CherootServer + if sys.version_info < (3, 4): raise RuntimeError('This application must be run under Python 3.4 ' @@ -37,7 +37,7 @@ else: builtins.SERVER_MODE = None import config -from pgadmin import create_app +from pgadmin import create_app, socketio from pgadmin.utils import u_encode, fs_encoding, file_quote from pgadmin.utils.constants import INTERNAL # Get the config database schema version. We store this in pgadmin.model @@ -97,6 +97,8 @@ if not os.path.isfile(config.SQLITE_PATH): ########################################################################## app = create_app() app.debug = False +app.config['sessions'] = dict() + if config.SERVER_MODE: app.wsgi_app = ReverseProxied(app.wsgi_app) @@ -206,17 +208,16 @@ def main(): else: # Can use cheroot instead of flask dev server when not in debug # 10 is default thread count in CherootServer - num_threads = 10 if config.THREADED_MODE else 1 - prod_server = CherootServer( - (config.DEFAULT_SERVER, config.EFFECTIVE_SERVER_PORT), - wsgi_app=app, - numthreads=num_threads, - server_name=config.APP_NAME) + # num_threads = 10 if config.THREADED_MODE else 1 try: - print("Using production server...") - prod_server.start() + socketio.run( + app, + host=config.DEFAULT_SERVER, + port=config.EFFECTIVE_SERVER_PORT, + ) except KeyboardInterrupt: - prod_server.stop() + print("CLOSE SERVER") + socketio.stop() except IOError: app.logger.error("Error starting the app server: %s", sys.exc_info()) diff --git a/web/pgadmin/__init__.py b/web/pgadmin/__init__.py index a7333537..fad91082 100644 --- a/web/pgadmin/__init__.py +++ b/web/pgadmin/__init__.py @@ -19,6 +19,7 @@ from collections import defaultdict from importlib import import_module from flask import Flask, abort, request, current_app, session, url_for +from flask_socketio import SocketIO from werkzeug.exceptions import HTTPException from flask_babelex import Babel, gettext from flask_babelex import gettext as _ @@ -52,10 +53,15 @@ import mimetypes mimetypes.add_type('application/javascript', '.js') mimetypes.add_type('text/css', '.css') + winreg = None if os.name == 'nt': import winreg +socketio = SocketIO(manage_session=False, async_mode='eventlet', + logger=False, engineio_logger=False, debug=False, + ping_interval=25, ping_timeout=120) + class PgAdmin(Flask): def __init__(self, *args, **kwargs): @@ -811,4 +817,5 @@ def create_app(app_name=None): ########################################################################## # All done! ########################################################################## + socketio.init_app(app) return app diff --git a/web/pgadmin/browser/register_browser_preferences.py b/web/pgadmin/browser/register_browser_preferences.py index 235db027..d835ca82 100644 --- a/web/pgadmin/browser/register_browser_preferences.py +++ b/web/pgadmin/browser/register_browser_preferences.py @@ -10,6 +10,7 @@ from flask_babelex import gettext from pgadmin.utils.constants import PREF_LABEL_DISPLAY,\ PREF_LABEL_KEYBOARD_SHORTCUTS, PREF_LABEL_TABS_SETTINGS, \ PREF_LABEL_OPTIONS +from flask_security import current_user import config LOCK_LAYOUT_LEVEL = { @@ -511,10 +512,12 @@ def register_browser_preferences(self): options=[{'label': gettext('Query Tool'), 'value': 'qt'}, {'label': gettext('Debugger'), 'value': 'debugger'}, {'label': gettext('Schema Diff'), 'value': 'schema_diff'}, - {'label': gettext('ERD Tool'), 'value': 'erd_tool'}], - help_str=gettext('Select Query Tool, Debugger, or Schema Diff from ' - 'the drop-down to set open in new browser tab for ' - 'that particular module.'), + {'label': gettext('ERD Tool'), 'value': 'erd_tool'}, + {'label': gettext('PSQL Tool'), 'value': 'psql_tool'}], + help_str=gettext('Select Query Tool, Debugger, Schema Diff, ERD Tool ' + 'or PSQL Tool from the drop-down to set ' + 'open in new browser tab for that particular module.' + ), select2={ 'multiple': True, 'allowClear': False, 'tags': True, 'first_empty': False, @@ -523,3 +526,16 @@ def register_browser_preferences(self): 'placeholder': gettext('Select open new tab...') } ) + + self.psql_tab_title = self.preference.register( + 'tab_settings', 'psql_tab_title_placeholder', + gettext("PSQL tool tab title"), + 'text', '%DATABASE%/%USERNAME%@%SERVER%', + category_label=PREF_LABEL_DISPLAY, + help_str=gettext( + 'Supported placeholders are %DATABASE%, %USERNAME%, and %SERVER%. ' + 'Users can provide any string with or without placeholders of' + ' their choice. The blank title will be revert back to the' + ' default title with placeholders.' + ) + ) diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py b/web/pgadmin/browser/server_groups/servers/__init__.py index f4165c32..fb7ff12c 100644 --- a/web/pgadmin/browser/server_groups/servers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/__init__.py @@ -34,6 +34,7 @@ from pgadmin.utils.constants import UNAUTH_REQ, MIMETYPE_APP_JS, \ SERVER_CONNECTION_CLOSED from sqlalchemy import or_ from pgadmin.utils.preferences import Preferences +from .... import socketio as sio def has_any(data, keys): @@ -1499,6 +1500,13 @@ class ServerNode(PGChildNodeView): # Release Connection manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid) + # Check if any psql terminal is running for the current disconnecting + # server. If any terminate the psql tool connection. + if 'sid_soid_mapping' in current_app.config and str(sid) in \ + current_app.config['sid_soid_mapping']: + if str(sid) in current_app.config['sid_soid_mapping']: + for i in current_app.config['sid_soid_mapping'][str(sid)]: + sio.emit('disconnect-psql', namespace='/pty', to=i) status = manager.release() diff --git a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js index 01ab89c5..eb20cac5 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js +++ b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js @@ -122,6 +122,9 @@ define('pgadmin.node.database', [ is_connected: function(node) { return (node && node.connected == true && node.canDisconn == true); }, + is_psql_enabled: function(node) { + return (node && node.connected == true) && pgAdmin['enable_psql']; + }, is_conn_allow: function(node) { return (node && node.allowConn == true); }, diff --git a/web/pgadmin/browser/server_groups/servers/static/js/server.js b/web/pgadmin/browser/server_groups/servers/static/js/server.js index 45dea090..ffd715f8 100644 --- a/web/pgadmin/browser/server_groups/servers/static/js/server.js +++ b/web/pgadmin/browser/server_groups/servers/static/js/server.js @@ -101,7 +101,8 @@ define('pgadmin.node.server', [ icon: 'fa fa-unlink', enable : 'is_connected',data: { data_disabled: gettext('Database is already disconnected.'), }, - },{ + }, + { name: 'reload_configuration', node: 'server', module: this, applies: ['tools', 'context'], callback: 'reload_configuration', category: 'reload', priority: 6, label: gettext('Reload Configuration'), @@ -728,6 +729,14 @@ define('pgadmin.node.server', [ return false; }, + /* Open psql tool for server*/ + server_psql_tool: function(args) { + var input = args || {}, + t = pgBrowser.tree, + i = input.item || t.selected(), + d = i && i.length == 1 ? t.itemData(i) : undefined; + pgBrowser.psql.psql_tool(d, i, true); + } }, model: pgAdmin.Browser.Node.Model.extend({ defaults: { diff --git a/web/pgadmin/browser/static/js/collection.js b/web/pgadmin/browser/static/js/collection.js index 3823ef35..e763aa11 100644 --- a/web/pgadmin/browser/static/js/collection.js +++ b/web/pgadmin/browser/static/js/collection.js @@ -64,6 +64,14 @@ define([ priority: 997, label: gettext('Search Objects...'), icon: 'fa fa-search', }]); + + // show psql tool same as query tool. + pgAdmin.Browser.add_menus([{ + name: 'show_psql_tool', node: this.type, module: this, + applies: ['context'], callback: 'show_psql_tool', + priority: 998, label: gettext('PSQL Tool (Beta)'), + icon: 'fas fa-terminal', + }]); } } }, @@ -498,6 +506,13 @@ define([ pgAdmin.SearchObjects.show_search_objects('', pgAdmin.Browser.tree.selected()); } }, + show_psql_tool: function(args) { + var input = args || {}, + t = pgBrowser.tree, + i = input.item || t.selected(), + d = i && i.length == 1 ? t.itemData(i) : undefined; + pgBrowser.psql.psql_tool(d, i, true); + }, }); return pgBrowser.Collection; diff --git a/web/pgadmin/browser/static/js/node.js b/web/pgadmin/browser/static/js/node.js index 1c5af3f5..23585dbe 100644 --- a/web/pgadmin/browser/static/js/node.js +++ b/web/pgadmin/browser/static/js/node.js @@ -209,6 +209,14 @@ define('pgadmin.browser.node', [ priority: 997, label: gettext('Search Objects...'), icon: 'fa fa-search', enable: enable, }]); + + // show psql tool same as query tool. + pgAdmin.Browser.add_menus([{ + name: 'show_psql_tool', node: this.type, module: this, + applies: ['context'], callback: 'show_psql_tool', + priority: 998, label: gettext('PSQL Tool (Beta)'), + icon: 'fas fa-terminal', + }]); } // This will add options of scripts eg:'CREATE Script' @@ -902,6 +910,15 @@ define('pgadmin.browser.node', [ pgAdmin.DataGrid.show_query_tool('', i); }, + // Callback to render psql tool. + show_psql_tool: function(args) { + var input = args || {}, + t = pgBrowser.tree, + i = input.item || t.selected(), + d = i && i.length == 1 ? t.itemData(i) : undefined; + pgBrowser.psql.psql_tool(d, i, true); + }, + // Logic to change the server background colour // There is no way of applying CSS to parent element so we have to // do it via JS code only diff --git a/web/pgadmin/browser/static/js/panel.js b/web/pgadmin/browser/static/js/panel.js index c9e64132..3068aabe 100644 --- a/web/pgadmin/browser/static/js/panel.js +++ b/web/pgadmin/browser/static/js/panel.js @@ -122,10 +122,30 @@ define( myPanel.on(ev, that.handleVisibility.bind(myPanel, ev)); }); } + + // Listen on detach panel event + myPanel.on(wcDocker.EVENT.DETACHED, function(obj) { + that.setCodeMirrorHeight(obj); + }); }, }); } }, + setCodeMirrorHeight: function() { + // Fix for mac os code-mirror showing black screen. + var txtArea = $('.pg-panel-content .sql_textarea > textarea').first(); + txtArea.css('z-index', -1); + var $tabContent = $('.pg-panel-content > .sql_textarea').first(); + var $sqlPane = $tabContent.find('.CodeMirror > div > textarea'); + for(let i=0; i<$sqlPane.length; i++) {$($sqlPane[i]).css('z-index', -1);} + + $tabContent = $('.pg-panel-content > .sql_textarea').first(); + $sqlPane = $tabContent.find('.pg-panel-content'); + $sqlPane.find('.CodeMirror').css( + 'cssText', + 'height: ' + ($tabContent.height()) + 'px !important;' + ); + }, eventFunc: function(eventName) { var name = $(this).data('pgAdminName'); diff --git a/web/pgadmin/browser/static/js/toolbar.js b/web/pgadmin/browser/static/js/toolbar.js index 09baaf22..90d2d007 100644 --- a/web/pgadmin/browser/static/js/toolbar.js +++ b/web/pgadmin/browser/static/js/toolbar.js @@ -56,6 +56,15 @@ let _defaultToolBarButtons = [ toggleClass: '', parentClass: 'pg-toolbar-btn btn-primary-icon', enabled: false, + },{ + label: gettext('PSQL Tool'), + ariaLabel: gettext('PSQL Tool'), + btnClass: 'fas fa-terminal', + text: '', + toggled: false, + toggleClass: '', + parentClass: 'pg-toolbar-btn btn-primary-icon pg-toolbar-psql', + enabled: false, }, ]; @@ -105,6 +114,13 @@ export function initializeToolbar(panel, wcDocker) { pgAdmin.DataGrid.show_filtered_row({mnuid: 4}, pgAdmin.Browser.tree.selected()); else if ('name' in data && data.name === gettext('Search objects')) pgAdmin.SearchObjects.show_search_objects('', pgAdmin.Browser.tree.selected()); + else if ('name' in data && data.name === gettext('PSQL Tool')){ + var input = {}, + t = pgAdmin.Browser.tree, + i = input.item || t.selected(), + d = i && i.length == 1 ? t.itemData(i) : undefined; + pgAdmin.Browser.psql.psql_tool(d, i, true); + } }); } diff --git a/web/pgadmin/browser/static/scss/_browser.scss b/web/pgadmin/browser/static/scss/_browser.scss index 0d157384..ae72f0e6 100644 --- a/web/pgadmin/browser/static/scss/_browser.scss +++ b/web/pgadmin/browser/static/scss/_browser.scss @@ -53,3 +53,9 @@ samp, border-width: 1px; font-size: 1.15em; } + +.pg-toolbar-psql { + padding-top: 0em; + font-size: inherit; + align-items: center; +} diff --git a/web/pgadmin/browser/templates/browser/js/utils.js b/web/pgadmin/browser/templates/browser/js/utils.js index 8597df48..b0a317a5 100644 --- a/web/pgadmin/browser/templates/browser/js/utils.js +++ b/web/pgadmin/browser/templates/browser/js/utils.js @@ -52,6 +52,10 @@ define('pgadmin.browser.utils', pgAdmin['user_inactivity_timeout'] = {{ current_app.config.get('USER_INACTIVITY_TIMEOUT') }}; pgAdmin['override_user_inactivity_timeout'] = '{{ current_app.config.get('OVERRIDE_USER_INACTIVITY_TIMEOUT') }}' == 'True'; + /* GET PSQL Tool related config */ + pgAdmin['enable_psql'] = '{{ current_app.config.get('ENABLE_PSQL') }}' == 'True'; + pgAdmin['allow_psql_shell_commands'] = '{{ current_app.config.get('ALLOW_PSQL_SHELL_COMMANDS') }}' == 'True'; + // Define list of nodes on which Query tool option doesn't appears var unsupported_nodes = pgAdmin.unsupported_nodes = [ 'server_group', 'server', 'coll-tablespace', 'tablespace', diff --git a/web/pgadmin/static/bundle/browser.js b/web/pgadmin/static/bundle/browser.js index 14140a2f..0b3ad81b 100644 --- a/web/pgadmin/static/bundle/browser.js +++ b/web/pgadmin/static/bundle/browser.js @@ -11,6 +11,7 @@ define('bundled_browser',[ 'pgadmin.browser', 'sources/browser/index', 'top/tools/erd/static/js/index', + 'top/tools/psql/static/js/index', ], function(pgBrowser) { pgBrowser.init(); }); diff --git a/web/pgadmin/static/css/style.css b/web/pgadmin/static/css/style.css index c2a776c8..5b4a9f2d 100644 --- a/web/pgadmin/static/css/style.css +++ b/web/pgadmin/static/css/style.css @@ -21,3 +21,5 @@ @import '../vendor/backgrid/backgrid.css'; @import '../vendor/backgrid/backgrid-select-all.css'; + +@import 'node_modules/xterm/css/xterm.css'; diff --git a/web/pgadmin/tools/datagrid/static/js/datagrid_panel_title.js b/web/pgadmin/tools/datagrid/static/js/datagrid_panel_title.js index 1348cc45..42efc04d 100644 --- a/web/pgadmin/tools/datagrid/static/js/datagrid_panel_title.js +++ b/web/pgadmin/tools/datagrid/static/js/datagrid_panel_title.js @@ -100,6 +100,10 @@ export function generateTitle(title_placeholder, title_data) { title_placeholder = title_placeholder.replace(new RegExp('%ARGS%'), _.unescape(title_data.args)); title_placeholder = title_placeholder.replace(new RegExp('%SCHEMA%'), _.unescape(title_data.schema)); title_placeholder = title_placeholder.replace(new RegExp('%DATABASE%'), _.unescape(title_data.database)); + } else if(title_data.type == 'psql_tool') { + title_placeholder = title_placeholder.replace(new RegExp('%DATABASE%'), _.unescape(title_data.database)); + title_placeholder = title_placeholder.replace(new RegExp('%USERNAME%'), _.unescape(title_data.username)); + title_placeholder = title_placeholder.replace(new RegExp('%SERVER%'), _.unescape(title_data.server)); } return _.escape(title_placeholder); diff --git a/web/pgadmin/tools/psql/__init__.py b/web/pgadmin/tools/psql/__init__.py new file mode 100644 index 00000000..e36f561f --- /dev/null +++ b/web/pgadmin/tools/psql/__init__.py @@ -0,0 +1,602 @@ +#!/usr/bin/env python3 +import fcntl +import os +import pty +import re +import select +import struct +import termios +import config +import eventlet.green.subprocess as subprocess + +from config import PG_DEFAULT_DRIVER +from flask import Response, url_for, request +from flask import render_template, copy_current_request_context, \ + current_app as app +from flask_babelex import gettext +from flask_security import login_required, current_user +from pgadmin.browser.utils import underscore_unescape +from pgadmin.utils import PgAdminModule +from pgadmin.utils.constants import MIMETYPE_APP_JS +from pgadmin.utils.driver import get_driver +from ... import socketio as sio +from pgadmin.utils import get_complete_file_path + + +session_input = dict() +session_input_cursor = dict() +session_last_cmd = dict() +pdata = dict() +cdata = dict() + + +class PSQLModule(PgAdminModule): + """ + class PSQLModule(PgAdminModule) + A module class for PSQL derived from PgAdminModule. + """ + + LABEL = gettext("PSQL") + + def get_own_menuitems(self): + return {} + + def get_own_javascripts(self): + return [{ + 'name': 'pgadmin.psql', + 'path': url_for('psql.index') + "psql", + 'when': None + }] + + def get_panels(self): + return [] + + def get_exposed_url_endpoints(self): + """ + Returns: + list: URL endpoints for PSQL module + """ + return [ + 'psql.panel' + ] + + +blueprint = PSQLModule('psql', __name__, static_url_path='/static') + + +@blueprint.route("/psql.js") +@login_required +def script(): + """render the required javascript""" + return Response( + response=render_template("psql/js/psql.js", _=gettext), + status=200, + mimetype=MIMETYPE_APP_JS + ) + + +@blueprint.route('/panel/', + methods=["POST"], + endpoint="panel") +@login_required +def panel(trans_id): + """ + Return panel template for PSQL tools. + :param trans_id: + """ + params = { + 'trans_id': trans_id, + 'title': request.form['title'] + } + if 'sid_soid_mapping' not in app.config: + app.config['sid_soid_mapping'] = dict() + if request.args: + params.update({k: v for k, v in request.args.items()}) + + return render_template('editor_template.html', + sid=params['sid'], + db=params['db'] if params['db'] else 'postgres', + server_type=params['server_type'], + is_enable=config.ENABLE_PSQL, + title=underscore_unescape(params['title']), + theme=params['theme'] + ) + + +def set_term_size(fd, row, col, xpix=0, ypix=0): + """ + Set the terminal size as per UI xterm size. + :param fd: + :param row: + :param col: + :param xpix: + :param ypix: + """ + term_size = struct.pack('HHHH', row, col, xpix, ypix) + fcntl.ioctl(fd, termios.TIOCSWINSZ, term_size) + + +@sio.on('connect', namespace='/pty') +def connect(): + """ + Connect to the server through socket. + :return: + :rtype: + """ + if config.ENABLE_PSQL: + sio.emit('connected', {'sid': request.sid}, namespace='/pty', + to=request.sid) + + if request.sid in session_last_cmd: + session_last_cmd[request.sid]['is_new_connection'] = False + else: + session_last_cmd[request.sid] = {'cmd': '', 'arrow_up': False, + 'invalid_cmd': False, + 'is_new_connection': False} + else: + sio.emit('conn_not_allow', {'sid': request.sid}, namespace='/pty', + to=request.sid) + + +@sio.on('start_process', namespace='/pty') +def start_process(data): + """ + Start the pty terminal and execute psql command and emit results to user. + :param data: + :return: + """ + + @copy_current_request_context + def read_and_forward_pty_output(sid, data): + max_read_bytes = 1024 * 20 + # Create the pty terminal process, parent and fd are file descriptors + # for parent and child. + parent, fd = pty.openpty() + p = None + if parent is not None: + # Child process + p = subprocess.Popen(connection_data, + preexec_fn=os.setsid, + stdin=fd, + stdout=fd, + stderr=fd, + universal_newlines=True + ) + + app.config['sessions'][request.sid] = parent + pdata[request.sid] = p + cdata[request.sid] = fd + else: + app.config['sessions'][request.sid] = parent + cdata[request.sid] = fd + set_term_size(fd, 50, 50) + + while p and p.poll() is None: + if request.sid in app.config['sessions']: + # This code is added to make this unit testable. + if "is_test" not in data: + sio.sleep(0.01) + else: + data['count'] += 1 + if data['count'] == 5: + break + + timeout = 0 + # module provides access to platform-specific I/O + # monitoring functions + (data_ready, _, _) = select.select([parent, fd], [], [], + timeout) + + if parent in data_ready: + # Read the output from parent fd (terminal). + output = os.read(parent, max_read_bytes) + emit_output = True + + if sid in session_last_cmd and session_last_cmd[sid][ + 'arrow_up'] and not session_last_cmd[request.sid][ + 'arrow_left_right']: + session_last_cmd[sid]['cmd'] = output.decode() + session_input_cursor[request.sid] = len( + session_last_cmd[sid]['cmd']) + session_last_cmd[sid]['arrow_up'] = True + + if sid in session_last_cmd: + # If command is invalid then emit error to user. + if session_last_cmd[sid]['invalid_cmd']: + emit_output = False + sio.emit( + 'pty-output', + { + 'result': gettext( + "ERROR: Shell commands are disabled " + "in psql for security\r\n"), + 'error': True + }, + namespace='/pty', room=sid) + # If command is valid then emit output to user. + if emit_output: + sio.emit('pty-output', + {'result': output.decode(), + 'error': False}, + namespace='/pty', room=sid) + else: + session_last_cmd[request.sid]['invalid_cmd'] = False + + # Check user is authenticated and PSQL is enabled in config. + if current_user.is_authenticated and config.ENABLE_PSQL: + connection_data = [] + try: + db = '' + if data['db']: + db = data['db'].replace('\\', "\\\\") + + conn, manager = _get_connection(int(data['sid']), data) + psql_utility = manager.utility('sql') + connection_data = get_connection_str(psql_utility, db, + manager) + except Exception as e: + # If any error raised during the start the PSQL emit error to UI. + # request.sid: This sid is socket id. + sio.emit( + 'conn_error', + { + 'error': 'Error while running psql command: {0}'.format(e), + }, namespace='/pty', room=request.sid) + + try: + if str(data['sid']) not in app.config['sid_soid_mapping']: + # request.sid: refer request.sid as socket id. + app.config['sid_soid_mapping'][str(data['sid'])] = list() + app.config['sid_soid_mapping'][str(data['sid'])].append( + request.sid) + else: + app.config['sid_soid_mapping'][str(data['sid'])].append( + request.sid) + + sio.start_background_task(read_and_forward_pty_output, + request.sid, data) + except Exception as e: + sio.emit( + 'conn_error', + { + 'error': 'Error while running psql command: {0}'.format(e), + }, namespace='/pty', room=request.sid) + else: + # Show error if user is not authenticated. + sio.emit('conn_not_allow', {'sid': request.sid}, namespace='/pty', + to=request.sid) + + +def _get_connection(sid, data): + """ + Get the connection object of ERD. + :param sid: + :param did: + :param trans_id: + :return: + """ + manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid) + try: + conn = manager.connection() + # This is added for unit test only, no use in normal execution. + if 'pwd' in data: + kwargs = {'password': data['pwd'], "user": data['user']} + status, msg = conn.connect(**kwargs) + else: + status, msg = conn.connect() + if not status: + app.logger.error(msg) + sio.emit(sio.emit( + 'conn_error', + { + 'error': 'Error while running psql command: {0}' + ''.format('Server connection not present.'), + }, namespace='/pty', room=request.sid)) + raise Exception('Server is not connected.') + + return conn, manager + except Exception as e: + app.logger.error(e) + raise + + +def get_connection_str(psql_utility, db, manager): + """ + Get connection string(through connection dsn) + :param psql_utility: PostgreSQL binary path. + :param db: database name to connect specific db. + :return: connection attribute list for PSQL connection. + """ + conn_attr = get_conn_str(manager, db) + conn_attr_list = list() + conn_attr_list.append(psql_utility) + conn_attr_list.append(conn_attr) + return conn_attr_list + + +def get_conn_str(manager, db): + """ + Get connection attributes for psql connection. + :param manager: + :param db: + :return: + """ + pwd = manager.extract_password() + conn_attr =\ + "host={0} port={1} dbname={2} user={3} sslmode={4} " \ + "sslcompression={5} password={6} " \ + "".format( + manager.local_bind_host if manager.use_ssh_tunnel else + manager.host, + manager.local_bind_port if manager.use_ssh_tunnel else + manager.port, + db if db != '' else 'postgres', + manager.user if manager.user else 'postgres', + manager.ssl_mode, + True if manager.sslcompression else False, + pwd + ) + + if manager.hostaddr: + conn_attr = " {0} hostaddr={1}".format(conn_attr, manager.hostaddr) + + if manager.passfile: + conn_attr = " {0} passfile={1}".format(conn_attr, + get_complete_file_path( + manager.passfile)) + + if get_complete_file_path(manager.sslcert): + conn_attr = " {0} sslcert={1}".format( + conn_attr, get_complete_file_path(manager.sslcert)) + + if get_complete_file_path(manager.sslkey): + conn_attr = " {0} sslkey={1}".format( + conn_attr, get_complete_file_path(manager.sslkey)) + + if get_complete_file_path(manager.sslrootcert): + conn_attr = " {0} sslrootcert={1}".format( + conn_attr, get_complete_file_path(manager.sslrootcert)) + + if get_complete_file_path(manager.sslcrl): + conn_attr = " {0} sslcrl={1}".format( + conn_attr, get_complete_file_path(manager.sslcrl)) + + if manager.service: + conn_attr = " {0} service={1}".format( + conn_attr, get_complete_file_path(manager.service)) + + return conn_attr + + +@sio.on('socket_input', namespace='/pty') +def socket_input(data): + """ + This get the user input through socket. + :param data: User input from socket. + """ + try: + # request.sid: refer request.sid as socket id. + # Check PSQL enabled setting from config. + enable_psql = True if config.ENABLE_PSQL else False + + if request.sid in app.config['sessions']: + if data['key_name'] == 'Enter' and enable_psql: + # If user get previous executed command from history then set + # current command as previous executed command. + if session_last_cmd[request.sid]['cmd'] \ + and session_last_cmd[request.sid]['arrow_up']: + user_input = str( + session_last_cmd[request.sid]['cmd']).strip() + session_last_cmd[request.sid]['arrow_up'] = False + session_last_cmd[request.sid]['cmd'] = '' + else: + if request.sid not in session_input: + session_input[request.sid] = data['input'] + user_input = str(session_input[request.sid]).strip() + else: + user_input = str(session_input[request.sid]).strip() + session_input_cursor[request.sid] = 0 + + # If ALLOW_PSQL_SHELL_COMMANDS is False then user can't execute + # \! meta command to run shell commands through PSQL terminal. + # Check before executing the user entered command does not + # contains \! in input. + is_new_connection = session_last_cmd[request.sid][ + 'is_new_connection'] + if user_input.startswith('\\!') and \ + re.match("^\\\!$", user_input) and \ + len(user_input) == 2 and \ + not config.ALLOW_PSQL_SHELL_COMMANDS \ + and not is_new_connection: + + session_last_cmd[request.sid]['invalid_cmd'] = True + + for i in range(len(session_input[request.sid])): + os.write(app.config['sessions'][request.sid], + '\b \b'.encode()) + + os.write(app.config['sessions'][request.sid], + '\n'.encode()) + session_input[request.sid] = '' + elif re.search("\\\!", user_input) and \ + not config.ALLOW_PSQL_SHELL_COMMANDS and \ + not session_last_cmd[request.sid]['is_new_connection']: + stop_execution = True + # Check \! is passed as string or not. + double_quote_strs = re.findall('"([^"]*)"', user_input) + + if double_quote_strs: + for sub_str in double_quote_strs: + if re.search("\\\!", sub_str): + stop_execution = False + # break + + if stop_execution: + session_last_cmd[request.sid]['invalid_cmd'] = True + # Remove already added command from terminal. + for i in range(len(user_input)): + os.write(app.config['sessions'][request.sid], + '\b \b'.encode()) + # Add Enter event to execute the command. + os.write(app.config['sessions'][request.sid], + '\n'.encode()) + else: + session_last_cmd[request.sid]['invalid_cmd'] = False + os.write(app.config['sessions'][request.sid], + '\n'.encode()) + elif user_input == '\q' or user_input == 'q\\q': + # If user enter \q to terminate the PSQL, emit the msg to + # notify user connection is terminated. + sio.emit('pty-output', + { + 'result': gettext( + 'Connection terminated, To create new ' + 'connection please open another psql' + ' tool.'), + 'error': True}, + namespace='/pty', room=request.sid) + os.write(app.config['sessions'][request.sid], + '\n'.encode()) + + else: + os.write(app.config['sessions'][request.sid], + data['input'].encode()) + session_input[request.sid] = '' + session_last_cmd[request.sid]['is_new_connection'] = False + else: + if data['key_name'] == 'ArrowLeft': + session_last_cmd[request.sid]['arrow_left_right'] = True + if session_input_cursor[request.sid] > 0: + session_input_cursor[request.sid] -= 1 + + elif data['key_name'] == 'ArrowRight': + session_last_cmd[request.sid]['arrow_left_right'] = True + if session_input_cursor[request.sid] < len( + session_input[request.sid]): + session_input_cursor[request.sid] += 1 + + elif data['key_name'] == 'ArrowUp': + session_last_cmd[request.sid]['arrow_up'] = True + session_last_cmd[request.sid]['arrow_left_right'] = False + session_input[request.sid] = session_last_cmd[request.sid][ + 'cmd'] + session_input_cursor[request.sid] = len( + session_last_cmd[request.sid]['cmd']) + + elif request.sid in session_input and data[ + 'key_name'] == 'Backspace' and ( + len(session_input[request.sid]) or len( + session_last_cmd[request.sid])): + + session_last_cmd[request.sid]['arrow_left_right'] = True + + if session_last_cmd[request.sid]['cmd']: + session_input[request.sid] = \ + session_last_cmd[request.sid]['cmd'] + + user_input = list(session_input[request.sid]) + + if session_input_cursor[request.sid] == 1: + index = 0 + session_input_cursor[request.sid] -= 1 + else: + if session_input_cursor[request.sid] > 0: + index = (session_input_cursor[request.sid]) - 1 + session_input_cursor[request.sid] -= 1 + else: + index = session_input_cursor[request.sid] + session_input_cursor[request.sid] = 0 + + if len(user_input): + del user_input[index] + session_input[request.sid] = "".join(user_input) + + if len(session_input[request.sid]) == 0: + session_input_cursor[request.sid] = 0 + session_last_cmd[request.sid]['cmd'] = '' + elif request.sid in session_input: + if session_last_cmd[request.sid]['cmd'] and session_input[ + request.sid] == '': + session_input[request.sid] = \ + session_last_cmd[request.sid]['cmd'] + session_input_cursor[request.sid] = len( + session_input[request.sid]) + else: + session_last_cmd[request.sid]['arrow_up'] = False + session_last_cmd[request.sid]['cmd'] = '' + user_input = list(session_input[request.sid]) + user_input.insert(session_input_cursor[request.sid], + data['input']) + session_input[request.sid] = ''.join(user_input) + session_input_cursor[request.sid] += 1 + session_last_cmd[request.sid]['arrow_left_right'] = False + else: + session_input_cursor[request.sid] = 0 + session_input[request.sid] = data['input'] + session_input_cursor[request.sid] += 1 + + # Write user input to terminal parent fd. + os.write(app.config['sessions'][request.sid], + data['input'].encode()) + except Exception as e: + # Delete socket id from sessions. + # request.sid: refer request.sid as socket id. + sio.emit('pty-output', + { + 'result': gettext('Invalid session.\r\n'), + 'error': True + }, + namespace='/pty', room=request.sid) + del app.config['sessions'][request.sid] + + +@sio.on('resize', namespace='/pty') +def resize(data): + """ + Resize the pty terminal as per the UI terminal. + :param data: UI terminal rows and cols data + """ + # request.sid: refer request.sid as socket id. + if request.sid in app.config['sessions']: + set_term_size(app.config['sessions'][request.sid], data['rows'], + data['cols']) + + +@sio.on('disconnect', namespace='/pty') +def disconnect(): + """ + Disconnect the socket and terminate the process + """ + # request.sid: refer request.sid as socket id. + if request.sid in pdata: + # On disconnect socket manually exit the psql terminal and close the + # parend and child fd then kill the subprocess. + disconnect_socket() + + +@sio.on('server-disconnect', namespace='/pty') +def server_disconnect(data): + """ + Disconnect the socket and terminate the process after user disconnect + the server. we can't use disconnect event name as it is reserved for socket + internal use. + """ + # request.sid: refer request.sid as socket id. + if request.sid in pdata and request.sid in app.config['sid_soid_mapping'][ + data['sid']]: + # On disconnect socket manually exit the psql terminal and close the + # parend and child fd then kill the subprocess. + app.config['sid_soid_mapping'][data['sid']] = [soid for soid in + app.config[ + 'sid_soid_mapping'][ + data['sid']] if + soid != request.sid] + disconnect_socket() + + +def disconnect_socket(): + os.write(app.config['sessions'][request.sid], '\q\n'.encode()) + sio.sleep(1) + os.close(app.config['sessions'][request.sid]) + os.close(cdata[request.sid]) + del app.config['sessions'][request.sid] diff --git a/web/pgadmin/tools/psql/static/js/index.js b/web/pgadmin/tools/psql/static/js/index.js new file mode 100644 index 00000000..4d88ba04 --- /dev/null +++ b/web/pgadmin/tools/psql/static/js/index.js @@ -0,0 +1,23 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2021, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import gettext from 'sources/gettext'; +import url_for from 'sources/url_for'; +import $ from 'jquery'; +import _ from 'underscore'; +import pgAdmin from 'sources/pgadmin'; +import pgBrowser from 'top/browser/static/js/browser'; +import * as csrfToken from 'sources/csrf'; +import {initialize} from './psql_module'; + +let pgBrowserOut = initialize(gettext, url_for, $, _, pgAdmin, csrfToken, pgBrowser); + +module.exports = { + pgBrowser: pgBrowserOut, +}; diff --git a/web/pgadmin/tools/psql/static/js/psql_module.js b/web/pgadmin/tools/psql/static/js/psql_module.js new file mode 100644 index 00000000..2610a60f --- /dev/null +++ b/web/pgadmin/tools/psql/static/js/psql_module.js @@ -0,0 +1,419 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2021, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// +import { Terminal } from 'xterm'; +import { FitAddon } from 'xterm-addon-fit'; +import { WebLinksAddon } from 'xterm-addon-web-links'; +import { SearchAddon } from 'xterm-addon-search'; +import { io } from 'socketio'; +import Alertify from 'pgadmin.alertifyjs'; +import {enable} from 'pgadmin.browser.toolbar'; +import clipboard from 'sources/selection/clipboard'; +import 'wcdocker'; +import {getRandomInt} from 'sources/utils'; + +import {getTreeNodeHierarchyFromIdentifier} from 'sources/tree/pgadmin_tree_node'; +import {generateTitle} from 'tools/datagrid/static/js/datagrid_panel_title'; + + +export function setPanelTitle(psqlToolPanel, panelTitle) { + psqlToolPanel.title(''+panelTitle+''); +} + +var wcDocker = window.wcDocker; + +export function initialize(gettext, url_for, $, _, pgAdmin, csrfToken, Browser) { + var pgBrowser = Browser; + var terminal = Terminal; + var parentData = null; + /* Return back, this has been called more than once */ + if (pgBrowser.psql) + return pgBrowser.psql; + + + // Create an Object Restore of pgBrowser class + pgBrowser.psql = { + init: function() { + this.initialized = true; + csrfToken.setPGCSRFToken(pgAdmin.csrf_token_header, pgAdmin.csrf_token); + // Define the nodes on which the menus to be appear + var menus = [{ + name: 'psql', + module: this, + applies: ['tools'], + callback: 'psql_tool', + priority: 1, + label: gettext('PSQL Tool (Beta)'), + enable: this.psqlToolEnabled, + }]; + + this.enable_psql_tool = pgAdmin['enable_psql']; + if(pgAdmin['enable_psql']) { + pgBrowser.add_menus(menus); + } + + // Creating a new pgBrowser frame to show the data. + var psqlFrameType = new pgBrowser.Frame({ + name: 'frm_psqltool', + showTitle: true, + isCloseable: true, + isPrivate: true, + url: 'about:blank', + }); + + var self = this; + /* Cache may take time to load for the first time + * Keep trying till available + */ + let cacheIntervalId = setInterval(function() { + if(pgBrowser.preference_version() > 0) { + self.preferences = pgBrowser.get_preferences_for_module('psql'); + clearInterval(cacheIntervalId); + } + },0); + + pgBrowser.onPreferencesChange('psql', function() { + self.preferences = pgBrowser.get_preferences_for_module('psql'); + }); + + // Load the newly created frame + psqlFrameType.load(pgBrowser.docker); + return this; + }, + /* Enable/disable PSQL tool menu in tools based + * on node selected. if selected node is present + * in unsupported_nodes, menu will be disabled + * otherwise enabled. + */ + psqlToolEnabled: function(obj) { + + var isEnabled = (() => { + if (!_.isUndefined(obj) && !_.isNull(obj)) { + if (_.indexOf(pgAdmin.unsupported_nodes, obj._type) == -1) { + if (obj._type == 'database' && obj.allowConn) { + return true; + } else if (obj._type != 'database') { + return true; + } else { + return false; + } + } else { + return false; + } + } else { + return false; + } + })(); + + enable(gettext('PSQL Tool'), isEnabled); + return isEnabled; + }, + retrieveAncestorOfTypeServer: function(item) { + let serverInformation = null; + // let aciTreeItem = item || pgBrowser.treeMenu.selected(); + let treeNode = pgBrowser.treeMenu.findNodeByDomElement(item); + + if (treeNode) { + let nodeData; + let databaseNode = treeNode.ancestorNode( + (node) => { + nodeData = node.getData(); + return (nodeData._type === 'database'); + } + ); + let isServerNode = (node) => { + nodeData = node.getData(); + return nodeData._type === 'server'; + }; + + if (databaseNode !== null) { + if (nodeData._label.indexOf('=') >= 0) { + this.alertify.alert( + gettext(this.errorAlertTitle), + gettext( + 'Databases with = symbols in the name cannot be backed up or restored using this utility.' + ) + ); + } else { + if (databaseNode.anyParent(isServerNode)) + serverInformation = nodeData; + } + } else { + if (treeNode.anyFamilyMember(isServerNode)) + serverInformation = nodeData; + } + } + + if (serverInformation === null) { + this.alertify.alert( + gettext(this.errorAlertTitle), + gettext('Please select server or child node from the browser tree.') + ); + } + return serverInformation; + }, + psql_tool: function(data, aciTreeIdentifier, gen=false) { + const module = 'paths'; + let preference_name = 'pg_bin_dir'; + let msg = gettext('Please configure the PostgreSQL Binary Path in the Preferences dialog.'); + const serverInformation = this.retrieveAncestorOfTypeServer(aciTreeIdentifier); + + if ((serverInformation.type && serverInformation.type === 'ppas') || + serverInformation.server_type === 'ppas') { + preference_name = 'ppas_bin_dir'; + msg = gettext('Please configure the EDB Advanced Server Binary Path in the Preferences dialog.'); + } + const preference = pgBrowser.get_preference(module, preference_name); + if (preference) { + if (!preference.value) { + Alertify.alert(gettext('Configuration required'), msg); + return false; + } + } else { + Alertify.alert( + gettext(this.errorAlertTitle), + gettext('Failed to load preference %s of module %s', preference_name, module) + ); + return false; + } + const node = pgBrowser.treeMenu.findNodeByDomElement(aciTreeIdentifier); + if (node === undefined || !node.getData()) { + Alertify.alert( + gettext('PSQL Error'), + gettext('No object selected.') + ); + return; + } + + parentData = getTreeNodeHierarchyFromIdentifier.call( + pgBrowser, + aciTreeIdentifier + ); + + if(_.isUndefined(parentData.server)) { + Alertify.alert( + gettext('PSQL Error'), + gettext('Please select a server/database object.') + ); + return; + } + + const transId = getRandomInt(1, 9999999); + + var panelTitle = ''; + // Set psql tab title as per prefrences setting. + var title_data = { + 'database': parentData.database ? parentData.database.label : 'postgres' , + 'username': parentData.server.user_name, + 'server': parentData.server.label, + 'type': 'psql_tool', + }; + var tab_title_placeholder = pgBrowser.get_preferences_for_module('browser').psql_tab_title_placeholder; + panelTitle = generateTitle(tab_title_placeholder, title_data); + + const [panelUrl, panelCloseUrl] = this.getPanelUrls(transId, panelTitle, parentData, gen); + + let psqlToolForm = ` +
+ + +
+ + `; + var open_new_tab = pgBrowser.get_preferences_for_module('browser').new_browser_tab_open; + if (open_new_tab && open_new_tab.includes('psql_tool')) { + var newWin = window.open('', '_blank'); + newWin.document.write(psqlToolForm); + newWin.document.title = panelTitle; + } else { + /* On successfully initialization find the properties panel, + * create new panel and add it to the dashboard panel. + */ + var propertiesPanel = pgBrowser.docker.findPanels('properties'); + var psqlToolPanel = pgBrowser.docker.addPanel('frm_psqltool', wcDocker.DOCK.STACKED, propertiesPanel[0]); + + // Set panel title and icon + setPanelTitle(psqlToolPanel, panelTitle); + psqlToolPanel.icon('fas fa-terminal psql-tab-style'); + psqlToolPanel.focus(); + + var openPSQLToolURL = function(j) { + // add spinner element + let $spinner_el = + $(`
+
+
+
+
+
+
`).appendTo($(j).data('embeddedFrame').$container); + + let init_poller_id = setInterval(function() { + var frameInitialized = $(j).data('frameInitialized'); + if (frameInitialized) { + clearInterval(init_poller_id); + var frame = $(j).data('embeddedFrame'); + if (frame) { + frame.onLoaded(()=>{ + $spinner_el.remove(); + }); + frame.openHTML(psqlToolForm); + } + } + }, 100); + }; + + openPSQLToolURL(psqlToolPanel); + + } + + }, + getPanelUrls: function(transId, panelTitle, parentData) { + let openUrl = url_for('psql.panel', { + trans_id: transId, + }); + const misc_preferences = pgBrowser.get_preferences_for_module('misc'); + var theme = misc_preferences.theme; + + openUrl += `?sgid=${parentData.server_group._id}` + +`&sid=${parentData.server._id}` + +`&server_type=${parentData.server.server_type}` + + `&theme=${theme}`; + + if(parentData.database && parentData.database._id) { + let db_label = parentData.database._label.replace('\\', '\\\\'); + openUrl += `&db=${_.escape(db_label)}`; + } else { + openUrl += `&db=${''}`; + } + + let closeUrl = url_for('psql.close', { + trans_id: transId, + }); + return [openUrl, closeUrl]; + }, + psql_terminal: function() { + // theme colors + var term = new terminal({ + cursorBlink: true, + macOptionIsMeta: true, + scrollback: 10000, + }); + + return term; + }, + psql_Addon: function(term) { + const fitAddon = this.psql_fit_screen(); + term.loadAddon(fitAddon); + + const webLinksAddon = this.psql_web_link(); + term.loadAddon(webLinksAddon); + + const searchAddon = this.psql_search(); + term.loadAddon(searchAddon); + + fitAddon.fit(); + term.resize(15, 50); + fitAddon.fit(); + return fitAddon; + }, + psql_fit_screen: function() { + return new FitAddon(); + }, + psql_web_link: function() { + return new WebLinksAddon(); + }, + psql_search: function() { + return new SearchAddon(); + }, + psql_socket: function() { + return io('/pty', {pingTimeout: 120000, pingInterval: 25000}); + }, + psql_socket_io: function(socket, is_enable, sid, db, server_type, fitAddon, term) { + // Listen all the socket events emit from server. + socket.on('pty-output', function(data){ + if(data.error) { + term.write('\r\n'); + } + term.write(data.result); + if(data.error) { + term.write('\r\n'); + } + }); + // Connect socket + socket.on('connect', () => { + if(is_enable == 'True'){ + socket.emit('start_process', {'sid': sid, 'db': db, 'stype': server_type }); + } + fitAddon.fit(); + socket.emit('resize', {'cols': term.cols, 'rows': term.rows}); + }); + + socket.on('conn_error', (response) => { + term.write(response.error); + fitAddon.fit(); + socket.emit('resize', {'cols': term.cols, 'rows': term.rows}); + }); + + socket.on('conn_not_allow', () => { + term.write('PSQL connection not allowed'); + fitAddon.fit(); + socket.emit('resize', {'cols': term.cols, 'rows': term.rows}); + }); + + socket.on('disconnect-psql', () => { + socket.emit('server-disconnect', {'sid': sid}); + term.write('\r\nServer disconnected, Connection terminated, To create new connection please open another psql tool.'); + }); + }, + psql_terminal_io: function(term, socket) { + // Listen key press event from terminal and emit socket event. + let selected_text = ''; + term.attachCustomKeyEventHandler(e => { + e.stopPropagation(); + if(e.type=='keydown' && e.metaKey &&(e.key == 'v' || e.key == 'V')) { + if(selected_text != '') { + if (selected_text.length > 0) { + socket.emit('socket_input', {'input': selected_text, 'key_name': e.code}); + selected_text = ''; + } + } else { + navigator.clipboard.readText().then( clipText => { + selected_text = clipText; + if (selected_text.length > 0) { + socket.emit('socket_input', {'input': selected_text, 'key_name': e.code}); + selected_text = ''; + } + }); + } + }else if(e.type=='keydown' && e.metaKey && (e.key == 'c' || e.key == 'C')) { + if (term.hasSelection()) { + selected_text = term.getSelection(); + } else { + selected_text = clipboard.readText(); + } + } + return true; + }); + + term.onKey(function (ev) { + if (pgAdmin['allow_psql_shell_commands']) { + socket.emit('socket_input', {'input': ev.key, 'key_name': ev.domEvent.code}); + } else { + socket.emit('socket_input', {'input': ev.key, 'key_name': ev.domEvent.code}); + } + }); + } + }; + + return pgBrowser.psql; +} + diff --git a/web/pgadmin/tools/psql/templates/editor_template.html b/web/pgadmin/tools/psql/templates/editor_template.html new file mode 100644 index 00000000..86812c79 --- /dev/null +++ b/web/pgadmin/tools/psql/templates/editor_template.html @@ -0,0 +1,83 @@ +{% extends "base.html" %} +{% block title %}{{title}}{% endblock %} + +{% block css_link %} + +{% endblock %} +{% block body %} + +
+{% endblock %} + + +{% block init_script %} +require( + ['sources/generated/psql_tool'], + function(pgBrowser) { + + var theme_colors = { + 'standard': { + background: '#FFF', + foreground: '#000', + cursor: '#000', + cursorAccent: '#000', + selection: '#DDD', + }, + 'dark': { + background: '#212121', + foreground: '#d4d4d4', + cursor: '#d4d4d4', + cursorAccent: '#d4d4d4', + selection: '#323e43', + }, + 'high_contrast': { + background: '#010b15', + foreground: '#fff', + cursor: '#fff', + cursorAccent: '#fff', + selection: '#84d6ff', + } + } + + const term = self.pgAdmin.Browser.psql.psql_terminal(); + + const fitAddon = self.pgAdmin.Browser.psql.psql_Addon(term); + + term.setOption('theme', theme_colors['{{theme}}']); + + term.open(document.getElementById('psql-terminal')); + + const socket = self.pgAdmin.Browser.psql.psql_socket(); + self.pgAdmin.Browser.psql.psql_socket_io(socket, '{{is_enable}}', '{{sid}}', '{{db}}', '{{server_type}}', fitAddon, term); + self.pgAdmin.Browser.psql.psql_terminal_io(term, socket); + + + function fitToscreen(){ + fitAddon.fit() + socket.emit("resize", {"cols": term.cols, "rows": term.rows}) + } + + function debounce(func, wait_ms) { + let timeout + return function(...args) { + const context = this + clearTimeout(timeout) + timeout = setTimeout(() => func.apply(context, args), wait_ms) + } + } + + const wait_ms = 50;; + window.onresize = debounce(fitToscreen, wait_ms) + }); +{% endblock %} + + diff --git a/web/pgadmin/tools/psql/tests/__init__.py b/web/pgadmin/tools/psql/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/web/pgadmin/tools/psql/tests/psql_test_data.json b/web/pgadmin/tools/psql/tests/psql_test_data.json new file mode 100644 index 00000000..4148c75b --- /dev/null +++ b/web/pgadmin/tools/psql/tests/psql_test_data.json @@ -0,0 +1,184 @@ +{ + "psql_user_input": [ + { + "name": "Enter Select 1;", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "select 1;", + "mock_data": { + + }, + "expected_data": { + } + }, + { + "name": "Enter Backspace", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "select 1;", + "is_backspace": true, + "mock_data": { + + }, + "expected_data": { + } + },{ + "name": "Enter Backspace", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "select 1;", + "is_backspace": true, + "move_cursor_up": true, + "mock_data": { + + }, + "expected_data": { + } + }, + { + "name": "Enter ArrowUp", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "select 1;", + "is_arrowUp": true, + "mock_data": { + + }, + "expected_data": { + } + }, + { + "name": "Enter ArrowUp", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "select 1;", + "is_arrowUp": true, + "is_history": true, + "mock_data": { + + }, + "expected_data": { + } + }, + { + "name": "Enter ArrowLeft", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "select 1;", + "is_arrowLeft": true, + "mock_data": { + + }, + "expected_data": { + } + }, + { + "name": "Enter ArrowRight", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "select 1;", + "is_arrowRight": true, + "mock_data": { + + }, + "expected_data": { + } + },{ + "name": "Read previous executed command", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "select 1;", + "is_arrowRight": true, + "move_cursor_right": true, + "mock_data": { + + }, + "expected_data": { + } + }, + { + "name": "Meta command \\! not allowed", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "\\!", + "mock_data": { + + }, + "expected_data": { + } + }, + { + "name": "Meta command \\! with other cmd not allowed", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "\\! ls", + "mock_data": { + + }, + "expected_data": { + } + }, + { + "name": "Valid commands", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "select \"\\!\"", + "mock_data": { + + }, + "expected_data": { + } + },{ + "name": "First command as enter", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "", + "mock_data": { + + }, + "expected_data": { + } + }, + { + "name": "Exist psql terminal by using \\q", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "\\q", + "mock_data": { + + }, + "expected_data": { + } + } + ], + "resize_terminal": [ + { + "name": "Resize psql terminal as per UI.", + "is_positive_test": true, + "mocking_required": false, + "input_data": { + "cols": 141, + "rows": 39 + }, + "mock_data": { + + }, + "expected_data": { + } + } + ], + "backend_task": [ + { + "name": "Backend Task", + "is_positive_test": true, + "mocking_required": false, + "input_cmd": "Select 1;", + "is_backend_task": true, + "mock_data": { + "is_test": true + }, + "expected_data": { + } + } + ] +} diff --git a/web/pgadmin/tools/psql/tests/test_backend_task.py b/web/pgadmin/tools/psql/tests/test_backend_task.py new file mode 100644 index 00000000..a4f14ee4 --- /dev/null +++ b/web/pgadmin/tools/psql/tests/test_backend_task.py @@ -0,0 +1,87 @@ +import uuid +import config +from pgadmin.utils.route import BaseTestGenerator +from regression.python_test_utils import test_utils as utils +from regression import parent_node_dict +from regression.test_setup import config_data +from pgadmin.utils import server_utils as server_utils +from pgAdmin4 import app +from . import utils as psql_utils +from .... import socketio + + +class PSQLBackend(BaseTestGenerator): + scenarios = utils.generate_scenarios('backend_task', + psql_utils.test_cases) + + def setUp(self): + self.db_name = "psqltestdb_{0}".format(str(uuid.uuid4())[1:8]) + database_info = parent_node_dict["database"][-1] + self.did = database_info["db_id"] + self.sid = parent_node_dict["server"][-1]["server_id"] + self.sgid = config_data["server_group"] + config.ENABLE_PSQL = True + self.server_con = server_utils.connect_server(self, self.sid) + + def runTest(self): + # Fetch flask client to access current user and other cookies. + flask_client = app.test_client() + flask_client.get('/') + self.test_client = socketio.test_client(app, namespace='/pty', + flask_test_client=flask_client) + self.assertTrue(self.test_client.is_connected('/pty')) + received = self.test_client.get_received('/pty') + + assert received[0]['name'] == 'connected' + assert received[0]['args'][0]['sid'] != '' + + data = { + 'sid': self.sid, + 'db': 'postgres', + 'pwd': self.server['db_password'], + 'user': self.server['username'], + 'is_test': True, + 'count': 0 + } + + self.test_client.emit('start_process', data, namespace='/pty') + self.test_client.get_received('/pty') + + for p in self.server['db_password']: + input_data = { + 'input': p, + 'key_name': 'Key{0}'.format(p) + } + self.test_client.emit('socket_input', input_data, namespace='/pty') + self.test_client.get_received('/pty') + + input_data = { + 'input': '\\n', + 'key_name': 'Enter' + } + self.test_client.emit('socket_input', input_data, namespace='/pty') + self.test_client.get_received('/pty') + + for ip in self.input_cmd: + input_data = { + 'input': ip, + 'key_name': 'Key{0}'.format(ip) + } + self.test_client.emit('socket_input', input_data, namespace='/pty') + self.test_client.get_received('/pty') + + input_data = { + 'input': '\\n', + 'key_name': 'Enter' + } + self.test_client.emit('socket_input', input_data, namespace='/pty') + self.test_client.get_received('/pty') + self.test_client.disconnect(namespace='/pty') + + def tearDown(self): + connection = utils.get_db_connection(self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port']) + utils.drop_database(connection, self.db_name) diff --git a/web/pgadmin/tools/psql/tests/test_panel.py b/web/pgadmin/tools/psql/tests/test_panel.py new file mode 100644 index 00000000..6f93c8c2 --- /dev/null +++ b/web/pgadmin/tools/psql/tests/test_panel.py @@ -0,0 +1,36 @@ +import uuid +import random +from pgadmin.utils.route import BaseTestGenerator +from regression.python_test_utils import test_utils as utils +from regression import parent_node_dict +from regression.test_setup import config_data + + +class PSQLPanel(BaseTestGenerator): + + def setUp(self): + self.db_name = "psqltestdb_{0}".format(str(uuid.uuid4())[1:8]) + self.sid = parent_node_dict["server"][-1]["server_id"] + self.did = utils.create_database(self.server, self.db_name) + self.sgid = config_data["server_group"] + self.theme = 'standard' + + def runTest(self): + trans_id = random.randint(1, 9999999) + url = '/psql/panel/{trans_id}?sgid={sgid}&sid={sid}&server_type=pg' \ + '&db={db_name}&theme={theme}'.\ + format(trans_id=trans_id, sgid=self.sgid, sid=self.sid, + db_name=self.db_name, theme=self.theme) + + response = self.tester.post( + url, data={"title": "panel_title"}, + content_type="application/x-www-form-urlencoded") + self.assertEqual(response.status_code, 200) + + def tearDown(self): + connection = utils.get_db_connection(self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port']) + utils.drop_database(connection, self.db_name) diff --git a/web/pgadmin/tools/psql/tests/test_psql_disabled.py b/web/pgadmin/tools/psql/tests/test_psql_disabled.py new file mode 100644 index 00000000..7dc52498 --- /dev/null +++ b/web/pgadmin/tools/psql/tests/test_psql_disabled.py @@ -0,0 +1,34 @@ +import uuid +import config +from pgadmin.utils.route import BaseTestGenerator +from regression.python_test_utils import test_utils as utils +from regression import parent_node_dict +from regression.test_setup import config_data +from pgAdmin4 import app +from .... import socketio + + +class PSQLSocketDisabled(BaseTestGenerator): + def setUp(self): + self.db_name = "psqltestdb_{0}".format(str(uuid.uuid4())[1:8]) + self.sid = parent_node_dict["server"][-1]["server_id"] + self.did = utils.create_database(self.server, self.db_name) + self.sgid = config_data["server_group"] + config.ENABLE_PSQL = False + + def runTest(self): + self.test_client = socketio.test_client(app, namespace='/pty') + self.assertTrue(self.test_client.is_connected('/pty')) + received = self.test_client.get_received('/pty') + + assert received[0]['name'] == 'conn_not_allow' + self.test_client.disconnect(namespace='/pty') + self.assertFalse(self.test_client.is_connected('/pty')) + + def tearDown(self): + connection = utils.get_db_connection(self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port']) + utils.drop_database(connection, self.db_name) diff --git a/web/pgadmin/tools/psql/tests/test_psql_input.py b/web/pgadmin/tools/psql/tests/test_psql_input.py new file mode 100644 index 00000000..6f6eabe7 --- /dev/null +++ b/web/pgadmin/tools/psql/tests/test_psql_input.py @@ -0,0 +1,148 @@ +import uuid +import config +from pgadmin.utils.route import BaseTestGenerator +from regression.python_test_utils import test_utils as utils +from regression import parent_node_dict +from regression.test_setup import config_data +from pgadmin.utils import server_utils as server_utils +from pgAdmin4 import app +from . import utils as psql_utils +from .... import socketio + + +class PSQLInput(BaseTestGenerator): + scenarios = utils.generate_scenarios('psql_user_input', + psql_utils.test_cases) + + def setUp(self): + self.db_name = "psqltestdb_{0}".format(str(uuid.uuid4())[1:8]) + database_info = parent_node_dict["database"][-1] + self.did = database_info["db_id"] + self.sid = parent_node_dict["server"][-1]["server_id"] + self.sgid = config_data["server_group"] + config.ENABLE_PSQL = True + self.server_con = server_utils.connect_server(self, self.sid) + + def runTest(self): + # Fetch flask client to access current user and other cookies. + flask_client = app.test_client() + flask_client.get('/') + self.test_client = socketio.test_client(app, namespace='/pty', + flask_test_client=flask_client) + self.assertTrue(self.test_client.is_connected('/pty')) + received = self.test_client.get_received('/pty') + + assert received[0]['name'] == 'connected' + assert received[0]['args'][0]['sid'] != '' + + data = { + 'sid': self.sid, + 'db': 'postgres', + 'pwd': self.server['db_password'], + 'user': self.server['username'] + } + + self.test_client.emit('start_process', data, namespace='/pty') + self.test_client.get_received('/pty') + + input_data = { + 'input': '\\n', + 'key_name': 'Enter' + } + self.test_client.emit('socket_input', input_data, namespace='/pty') + self.test_client.get_received('/pty') + + for ip in self.input_cmd: + input_data = { + 'input': ip, + 'key_name': 'Key{0}'.format(ip) + } + self.test_client.emit('socket_input', input_data, namespace='/pty') + self.test_client.get_received('/pty') + + if hasattr(self, 'is_backspace') and self.is_backspace: + if hasattr(self, 'move_cursor_up') and self.move_cursor_up: + input_data = { + 'input': '', + 'key_name': 'ArrowUp' + } + self.test_client.emit('socket_input', input_data, + namespace='/pty') + + for ip in self.input_cmd: + input_data = { + 'input': ip, + 'key_name': 'Backspace' + } + self.test_client.emit('socket_input', input_data, + namespace='/pty') + self.test_client.get_received('/pty') + + if hasattr(self, 'is_arrowUp') and self.is_arrowUp: + if hasattr(self, 'is_history') and self.is_history: + for ip in self.input_cmd: + input_data = { + 'input': ip, + 'key_name': 'Key{0}'.format(ip) + } + self.test_client.emit('socket_input', input_data, + namespace='/pty') + self.test_client.get_received('/pty') + + input_data = { + 'input': '', + 'key_name': 'ArrowUp' + } + self.test_client.emit('socket_input', input_data, + namespace='/pty') + self.test_client.get_received('/pty') + + if hasattr(self, 'is_arrowLeft') and self.is_arrowLeft: + for ip in self.input_cmd: + input_data = { + 'input': ip, + 'key_name': 'ArrowLeft' + } + self.test_client.emit('socket_input', input_data, + namespace='/pty') + self.test_client.get_received('/pty') + + if hasattr(self, 'is_arrowRight') and self.is_arrowRight: + for ip in self.input_cmd: + input_data = { + 'input': ip, + 'key_name': 'ArrowRight' + } + self.test_client.emit('socket_input', input_data, + namespace='/pty') + self.test_client.get_received('/pty') + + if hasattr(self, 'move_cursor_right') and self.is_arrowRight: + for i in range(2): + input_data = { + 'input': '', + 'key_name': 'ArrowLeft' + } + self.test_client.emit('socket_input', input_data, + namespace='/pty') + input_data = { + 'input': '', + 'key_name': 'ArrowRight' + } + self.test_client.emit('socket_input', input_data, + namespace='/pty') + + input_data = { + 'input': '\\n', + 'key_name': 'Enter' + } + self.test_client.emit('socket_input', input_data, namespace='/pty') + self.test_client.get_received('/pty') + + def tearDown(self): + connection = utils.get_db_connection(self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port']) + utils.drop_database(connection, self.db_name) diff --git a/web/pgadmin/tools/psql/tests/test_resize_terminal.py b/web/pgadmin/tools/psql/tests/test_resize_terminal.py new file mode 100644 index 00000000..d305c2d0 --- /dev/null +++ b/web/pgadmin/tools/psql/tests/test_resize_terminal.py @@ -0,0 +1,58 @@ +import uuid +import config +from pgadmin.utils.route import BaseTestGenerator +from regression.python_test_utils import test_utils as utils +from regression import parent_node_dict +from regression.test_setup import config_data +from pgadmin.utils import server_utils as server_utils +from pgAdmin4 import app +from . import utils as psql_utils +from .... import socketio + + +class PSQLResizeTerminal(BaseTestGenerator): + scenarios = utils.generate_scenarios('resize_terminal', + psql_utils.test_cases) + + def setUp(self): + self.db_name = "psqltestdb_{0}".format(str(uuid.uuid4())[1:8]) + database_info = parent_node_dict["database"][-1] + self.did = database_info["db_id"] + self.sid = parent_node_dict["server"][-1]["server_id"] + self.sgid = config_data["server_group"] + config.ENABLE_PSQL = True + self.server_con = server_utils.connect_server(self, self.sid) + + def runTest(self): + # Fetch flask client to access current user and other cookies. + flask_client = app.test_client() + flask_client.get('/') + self.test_client = socketio.test_client(app, namespace='/pty', + flask_test_client=flask_client) + self.assertTrue(self.test_client.is_connected('/pty')) + received = self.test_client.get_received('/pty') + + assert received[0]['name'] == 'connected' + assert received[0]['args'][0]['sid'] != '' + + data = { + 'sid': self.sid, + 'db': 'postgres', + 'pwd': self.server['db_password'], + 'user': self.server['username'] + } + + self.test_client.emit('start_process', data, namespace='/pty') + self.test_client.get_received('/pty') + + self.test_client.emit('resize', self.input_data, namespace='/pty') + + self.test_client.disconnect(namespace='/pty') + + def tearDown(self): + connection = utils.get_db_connection(self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port']) + utils.drop_database(connection, self.db_name) diff --git a/web/pgadmin/tools/psql/tests/test_socket_connect.py b/web/pgadmin/tools/psql/tests/test_socket_connect.py new file mode 100644 index 00000000..3791525a --- /dev/null +++ b/web/pgadmin/tools/psql/tests/test_socket_connect.py @@ -0,0 +1,35 @@ +import uuid +import config +from pgadmin.utils.route import BaseTestGenerator +from regression.python_test_utils import test_utils as utils +from regression import parent_node_dict +from regression.test_setup import config_data +from pgAdmin4 import app +from .... import socketio + + +class PSQLSocketConnect(BaseTestGenerator): + def setUp(self): + self.db_name = "psqltestdb_{0}".format(str(uuid.uuid4())[1:8]) + self.sid = parent_node_dict["server"][-1]["server_id"] + self.did = utils.create_database(self.server, self.db_name) + self.sgid = config_data["server_group"] + config.ENABLE_PSQL = True + + def runTest(self): + self.test_client = socketio.test_client(app, namespace='/pty') + self.assertTrue(self.test_client.is_connected('/pty')) + received = self.test_client.get_received('/pty') + + assert received[0]['name'] == 'connected' + assert received[0]['args'][0]['sid'] != '' + self.test_client.disconnect(namespace='/pty') + self.assertFalse(self.test_client.is_connected('/pty')) + + def tearDown(self): + connection = utils.get_db_connection(self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port']) + utils.drop_database(connection, self.db_name) diff --git a/web/pgadmin/tools/psql/tests/test_socket_disconnect.py b/web/pgadmin/tools/psql/tests/test_socket_disconnect.py new file mode 100644 index 00000000..0619eb30 --- /dev/null +++ b/web/pgadmin/tools/psql/tests/test_socket_disconnect.py @@ -0,0 +1,52 @@ +import uuid +import config +from pgadmin.utils.route import BaseTestGenerator +from regression.python_test_utils import test_utils as utils +from regression import parent_node_dict +from regression.test_setup import config_data +from pgAdmin4 import app +from .... import socketio + + +class PSQLSocketDisconnect(BaseTestGenerator): + def setUp(self): + self.db_name = "psqltestdb_{0}".format(str(uuid.uuid4())[1:8]) + self.sid = parent_node_dict["server"][-1]["server_id"] + self.did = utils.create_database(self.server, self.db_name) + self.sgid = config_data["server_group"] + config.ENABLE_PSQL = True + + def runTest(self): + # Fetch flask client to access current user and other cookies. + flask_test_client = app.test_client() + flask_test_client.get('/') + + self.test_client = socketio.test_client( + app, + flask_test_client=flask_test_client, + namespace='/pty') + self.assertTrue(self.test_client.is_connected('/pty')) + received = self.test_client.get_received('/pty') + + assert received[0]['name'] == 'connected' + assert received[0]['args'][0]['sid'] != '' + + data = { + 'sid': self.sid, + 'db': 'postgres', + 'pwd': self.server['db_password'], + 'user': self.server['username'] + } + + self.test_client.emit('start_process', data, namespace='/pty') + self.test_client.get_received('/pty') + + self.test_client.disconnect(namespace='/pty') + + def tearDown(self): + connection = utils.get_db_connection(self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port']) + utils.drop_database(connection, self.db_name) diff --git a/web/pgadmin/tools/psql/tests/test_start_process.py b/web/pgadmin/tools/psql/tests/test_start_process.py new file mode 100644 index 00000000..1245de3f --- /dev/null +++ b/web/pgadmin/tools/psql/tests/test_start_process.py @@ -0,0 +1,57 @@ +import uuid +import config +from pgadmin.utils.route import BaseTestGenerator +from regression.python_test_utils import test_utils as utils +from regression import parent_node_dict +from regression.test_setup import config_data +from pgadmin.utils import server_utils as server_utils +from pgAdmin4 import app +from .... import socketio + + +class PSQLStartProcess(BaseTestGenerator): + def setUp(self): + self.db_name = "psqltestdb_{0}".format(str(uuid.uuid4())[1:8]) + database_info = parent_node_dict["database"][-1] + self.did = database_info["db_id"] + self.sid = parent_node_dict["server"][-1]["server_id"] + self.sgid = config_data["server_group"] + config.ENABLE_PSQL = True + + self.server_con = server_utils.connect_server(self, self.sid) + + def runTest(self): + # Fetch flask client to access current user and other cookies. + flask_client = app.test_client() + flask_client.get('/') + self.test_client = socketio.test_client(app, namespace='/pty', + flask_test_client=flask_client) + self.assertTrue(self.test_client.is_connected('/pty')) + received = self.test_client.get_received('/pty') + + assert received[0]['name'] == 'connected' + assert received[0]['args'][0]['sid'] != '' + + import random + trans_id = random.randint(1, 9999999) + + data = { + 'sid': self.sid, + 'db': 'postgres', + 'pwd': self.server['db_password'], + 'user': self.server['username'] + } + + self.test_client.emit('start_process', data, namespace='/pty') + self.test_client.get_received('/pty') + + self.test_client.disconnect(namespace='/pty') + self.assertFalse(self.test_client.is_connected('/pty')) + + def tearDown(self): + connection = utils.get_db_connection(self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port']) + utils.drop_database(connection, self.db_name) diff --git a/web/pgadmin/tools/psql/tests/test_start_process_fail.py b/web/pgadmin/tools/psql/tests/test_start_process_fail.py new file mode 100644 index 00000000..0acc7be2 --- /dev/null +++ b/web/pgadmin/tools/psql/tests/test_start_process_fail.py @@ -0,0 +1,48 @@ +import uuid +import config +from pgadmin.utils.route import BaseTestGenerator +from regression.python_test_utils import test_utils as utils +from regression import parent_node_dict +from regression.test_setup import config_data +from pgAdmin4 import app +from .... import socketio + + +class PSQLStartProcessFail(BaseTestGenerator): + def setUp(self): + self.db_name = "psqltestdb_{0}".format(str(uuid.uuid4())[1:8]) + self.sid = parent_node_dict["server"][-1]["server_id"] + self.did = utils.create_database(self.server, self.db_name) + self.sgid = config_data["server_group"] + config.ENABLE_PSQL = True + + def runTest(self): + self.test_client = socketio.test_client(app, namespace='/pty') + self.assertTrue(self.test_client.is_connected('/pty')) + received = self.test_client.get_received('/pty') + + assert received[0]['name'] == 'connected' + assert received[0]['args'][0]['sid'] != '' + + data = { + 'sid': self.sid, + 'db': 'postgres', + 'pwd': self.server['db_password'], + 'user': self.server['username'] + } + config.ENABLE_PSQL = False + self.test_client.emit('start_process', data, namespace='/pty') + received = self.test_client.get_received('/pty') + + assert received[0]['name'] == 'conn_not_allow' + + self.test_client.disconnect(namespace='/pty') + self.assertFalse(self.test_client.is_connected('/pty')) + + def tearDown(self): + connection = utils.get_db_connection(self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port']) + utils.drop_database(connection, self.db_name) diff --git a/web/pgadmin/tools/psql/tests/utils.py b/web/pgadmin/tools/psql/tests/utils.py new file mode 100644 index 00000000..85bd5373 --- /dev/null +++ b/web/pgadmin/tools/psql/tests/utils.py @@ -0,0 +1,6 @@ +import os +import json + +CURRENT_PATH = os.path.dirname(os.path.realpath(__file__)) +with open(CURRENT_PATH + "/psql_test_data.json") as data_file: + test_cases = json.load(data_file) diff --git a/web/pgadmin/tools/sqleditor/static/scss/_sqleditor.scss b/web/pgadmin/tools/sqleditor/static/scss/_sqleditor.scss index 0bb40802..a58eb7e9 100644 --- a/web/pgadmin/tools/sqleditor/static/scss/_sqleditor.scss +++ b/web/pgadmin/tools/sqleditor/static/scss/_sqleditor.scss @@ -374,3 +374,20 @@ div.strikeout:after { /* Setting it to hardcoded white as the SVG generated is having white bg * Need to check what can be done. */ + +/* Css for psql */ +.psql_terminal .terminal { + padding-top: 1%; + padding-left: 0.5%; + height: 100%; +} + +.psql-icon-style { + font-size: inherit; + padding-left: 0em; +} + +.psql-tab-style { + font-size: small; + padding-left: 0em; +} diff --git a/web/pgadmin/utils/csrf.py b/web/pgadmin/utils/csrf.py index 23abfffa..71ae82ea 100644 --- a/web/pgadmin/utils/csrf.py +++ b/web/pgadmin/utils/csrf.py @@ -38,6 +38,7 @@ class _PGCSRFProtect(CSRFProtect): 'pgadmin.tools.schema_diff.ddl_compare', 'pgadmin.authenticate.login', 'pgadmin.tools.erd.panel', + 'pgadmin.tools.psql.panel', ] for exempt in exempt_views: diff --git a/web/pgadmin/utils/driver/psycopg2/server_manager.py b/web/pgadmin/utils/driver/psycopg2/server_manager.py index 2a951b6e..3be5d833 100644 --- a/web/pgadmin/utils/driver/psycopg2/server_manager.py +++ b/web/pgadmin/utils/driver/psycopg2/server_manager.py @@ -527,6 +527,15 @@ WHERE db.oid = {0}""".format(did)) return None + def extract_password(self): + if self.password: + crypt_key_present, crypt_key = get_crypt_key() + if not crypt_key_present: + return False, crypt_key + + password = decrypt(self.password, crypt_key).decode() + return password + def export_password_env(self, env): if self.password: crypt_key_present, crypt_key = get_crypt_key() diff --git a/web/pgadmin/utils/preferences.py b/web/pgadmin/utils/preferences.py index 15ceeb1a..e9efe479 100644 --- a/web/pgadmin/utils/preferences.py +++ b/web/pgadmin/utils/preferences.py @@ -72,6 +72,7 @@ class _Preference(object): self.select2 = kwargs.get('select2', None) self.fields = kwargs.get('fields', None) self.allow_blanks = kwargs.get('allow_blanks', None) + self.disabled = kwargs.get('disabled', False) # Look into the configuration table to find out the id of the specific # preference. @@ -252,6 +253,7 @@ class _Preference(object): 'select2': self.select2, 'value': self.get(), 'fields': self.fields, + 'disabled': self.disabled, } return res @@ -414,6 +416,7 @@ class Preferences(object): :param fields: field schema (if preference has more than one field to take input from user e.g. keyboardshortcut preference) :param allow_blanks: Flag specify whether to allow blank value. + :param disabled: Flag specify whether to disable the setting or not. """ min_val = kwargs.get('min_val', None) max_val = kwargs.get('max_val', None) @@ -423,6 +426,7 @@ class Preferences(object): select2 = kwargs.get('select2', None) fields = kwargs.get('fields', None) allow_blanks = kwargs.get('allow_blanks', None) + disabled = kwargs.get('disabled', False) cat = self.__category(category, category_label) if name in cat['preferences']: @@ -439,7 +443,8 @@ class Preferences(object): (cat['preferences'])[name] = res = _Preference( cat['id'], name, label, _type, default, help_str=help_str, min_val=min_val, max_val=max_val, options=options, - select2=select2, fields=fields, allow_blanks=allow_blanks + select2=select2, fields=fields, allow_blanks=allow_blanks, + disabled=disabled ) return res diff --git a/web/webpack.config.js b/web/webpack.config.js index 779f2faa..f631178b 100644 --- a/web/webpack.config.js +++ b/web/webpack.config.js @@ -355,6 +355,7 @@ module.exports = [{ debugger_direct: './pgadmin/tools/debugger/static/js/direct.js', schema_diff: './pgadmin/tools/schema_diff/static/js/schema_diff_hook.js', erd_tool: './pgadmin/tools/erd/static/js/erd_tool_hook.js', + psql_tool: './pgadmin/tools/psql/static/js/index.js', file_utils: './pgadmin/misc/file_manager/static/js/utility.js', 'pgadmin.style': pgadminCssStyles, pgadmin: pgadminScssStyles, @@ -493,7 +494,7 @@ module.exports = [{ ], }, }, - }, { + },{ test: require.resolve('./node_modules/acitree/js/jquery.aciTree.min'), use: { loader: 'imports-loader', @@ -532,6 +533,7 @@ module.exports = [{ 'pure|pgadmin.tools.storage_manager', 'pure|pgadmin.tools.search_objects', 'pure|pgadmin.tools.erd_module', + 'pure|pgadmin.tools.psql_module', ], }, }, diff --git a/web/webpack.shim.js b/web/webpack.shim.js index 074b2580..e0b28091 100644 --- a/web/webpack.shim.js +++ b/web/webpack.shim.js @@ -159,6 +159,15 @@ var webpackShimConfig = { 'jquery.acisortable': path.join(__dirname, './node_modules/acitree/js/jquery.aciSortable.min'), 'jquery.acifragment': path.join(__dirname, './node_modules/acitree/js/jquery.aciFragment.min'), + //xterm + 'xterm': path.join(__dirname, './node_modules/xterm/lib/xterm.js'), + 'xterm-addon-fit': path.join(__dirname, './node_modules/xterm-addon-fit/lib/xterm-addon-fit.js'), + 'xterm-addon-web-links': path.join(__dirname, './node_modules/xterm-addon-web-links/lib/xterm-addon-web-links.js'), + 'xterm-addon-search': path.join(__dirname, './node_modules/xterm-addon-search/lib/xterm-addon-search.js'), + + //socket + 'socketio': path.join(__dirname, './node_modules/socket.io-client/dist/socket.io.js'), + // Backbone and Backgrid 'backbone': path.join(__dirname, './node_modules/backbone/backbone'), 'backbone.undo': path.join(__dirname, './node_modules/backbone-undo/Backbone.Undo'), @@ -288,6 +297,8 @@ var webpackShimConfig = { 'pgadmin.tools.storage_manager': path.join(__dirname, './pgadmin/tools/storage_manager/static/js/storage_manager'), 'pgadmin.tools.erd_module': path.join(__dirname, './pgadmin/tools/erd/static/js/erd_module'), 'pgadmin.tools.erd': path.join(__dirname, './pgadmin/tools/erd/static/js'), + 'pgadmin.tools.psql_module': path.join(__dirname, './pgadmin/tools/psql/static/js/psql_module'), + 'pgadmin.tools.psql': path.join(__dirname, './pgadmin/tools/psql/static/js'), 'pgadmin.search_objects': path.join(__dirname, './pgadmin/tools/search_objects/static/js'), 'pgadmin.tools.user_management': path.join(__dirname, './pgadmin/tools/user_management/static/js/user_management'), 'pgadmin.user_management.current_user': '/user_management/current_user', diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js index e0b6fd69..3cc079f9 100644 --- a/web/webpack.test.config.js +++ b/web/webpack.test.config.js @@ -177,6 +177,7 @@ module.exports = { 'pgadmin.browser.preferences': path.join(__dirname, './pgadmin/browser/static/js/preferences'), 'pgadmin.browser.activity': path.join(__dirname, './pgadmin/browser/static/js/activity'), 'pgadmin.tools.erd': path.join(__dirname, './pgadmin/tools/erd/static/js'), + 'pgadmin.tools.psql': path.join(__dirname, './pgadmin/tools/psql/static/js'), 'bundled_codemirror': path.join(__dirname, './pgadmin/static/bundle/codemirror'), 'tools': path.join(__dirname, './pgadmin/tools/'), 'pgadmin.user_management.current_user': regressionDir + '/javascript/fake_current_user',