From 802269910c37a52aa57479bbcc1d8d078f6a88e1 Mon Sep 17 00:00:00 2001 From: Khushboo Vashi Date: Tue, 13 Mar 2018 16:45:20 -0400 Subject: [PATCH] Fix unicode handling in the external process tools and show the complete command in the process viewer. Fixes #2963. Fixes #3157. --- web/pgadmin/misc/bgprocess/processes.py | 36 +++++++++++++++++-- .../misc/bgprocess/static/js/bgprocess.js | 6 ++-- web/pgadmin/tools/backup/__init__.py | 5 ++- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/web/pgadmin/misc/bgprocess/processes.py b/web/pgadmin/misc/bgprocess/processes.py index 02b953d74..385b7bd74 100644 --- a/web/pgadmin/misc/bgprocess/processes.py +++ b/web/pgadmin/misc/bgprocess/processes.py @@ -78,10 +78,20 @@ class BatchProcess(object): _("Could not find a process with the specified ID.") ) + try: + tmp_desc = loads(p.desc.encode('latin-1')) if \ + IS_PY2 and hasattr(p.desc, 'encode') else loads(p.desc) + except UnicodeDecodeError: + tmp_desc = loads(p.desc.encode('utf-8')) if \ + IS_PY2 and hasattr(p.desc, 'encode') else loads(p.desc) + except Exception as e: + tmp_desc = loads(p.desc.encode('utf-8', 'ignore')) if \ + IS_PY2 and hasattr(p.desc, 'encode') else loads(p.desc) + # ID self.id = _id # Description - self.desc = loads(p.desc) + self.desc = tmp_desc # Status Acknowledged time self.atime = p.acknowledge # Command @@ -171,6 +181,16 @@ class BatchProcess(object): csv_writer.writerow(_args) args_val = args_csv_io.getvalue().strip(str('\r\n')) + tmp_desc = dumps(self.desc) + try: + tmp_desc =tmp_desc.decode('utf-8') if\ + IS_PY2 and hasattr(tmp_desc, 'decode') else tmp_desc + except UnicodeDecodeError: + tmp_desc = tmp_desc.decode('latin-1') if \ + IS_PY2 and hasattr(tmp_desc, 'decode') else tmp_desc + except Exception: + tmp_desc = tmp_desc.decode('utf-8', 'ignore') if \ + IS_PY2 and hasattr(tmp_desc, 'decode') else tmp_desc j = Process( pid=int(id), @@ -178,7 +198,7 @@ class BatchProcess(object): arguments=args_val.decode('utf-8', 'replace') if IS_PY2 and hasattr(args_val, 'decode') else args_val, logdir=log_dir, - desc=dumps(self.desc), + desc=tmp_desc, user_id=current_user.id ) db.session.add(j) @@ -534,7 +554,17 @@ class BatchProcess(object): etime = parser.parse(p.end_time or get_current_time()) execution_time = (etime - stime).total_seconds() - desc = loads(p.desc) + desc = "" + try: + desc = loads(p.desc.encode('latin-1')) if \ + IS_PY2 and hasattr(p.desc, 'encode') else loads(p.desc) + except UnicodeDecodeError: + desc = loads(p.desc.encode('utf-8')) if \ + IS_PY2 and hasattr(p.desc, 'encode') else loads(p.desc) + except Exception: + desc = loads(p.desc.encode('utf-8', 'ignore')) if \ + IS_PY2 and hasattr(p.desc, 'encode') else loads(p.desc) + details = desc if isinstance(desc, IProcessDesc): diff --git a/web/pgadmin/misc/bgprocess/static/js/bgprocess.js b/web/pgadmin/misc/bgprocess/static/js/bgprocess.js index 5e305908c..0934ae408 100644 --- a/web/pgadmin/misc/bgprocess/static/js/bgprocess.js +++ b/web/pgadmin/misc/bgprocess/static/js/bgprocess.js @@ -248,7 +248,7 @@ define('misc.bgprocess', [ if (!self.notifier) { var header = $('
', { class: 'h5 pg-bg-notify-header', - }).append($('').text(self.desc)), + }).append($('').text(_.unescape(self.desc))), content = $('
').append( header ).append( @@ -366,7 +366,7 @@ define('misc.bgprocess', [ self.logs[0].scrollTop = self.logs[0].scrollHeight; }); // set bgprocess detailed description - $header.find('.bg-detailed-desc').html(self.detailed_desc); + $header.find('.bg-detailed-desc').html(_.unescape(self.detailed_desc)); } // set bgprocess start time @@ -562,4 +562,4 @@ define('misc.bgprocess', [ }); return pgBrowser.BackgroundProcessObsorver; -}); \ No newline at end of file +}); diff --git a/web/pgadmin/tools/backup/__init__.py b/web/pgadmin/tools/backup/__init__.py index 715ff6e0d..9e70c4f4e 100644 --- a/web/pgadmin/tools/backup/__init__.py +++ b/web/pgadmin/tools/backup/__init__.py @@ -97,11 +97,9 @@ class BackupMessage(IProcessDesc): def cmdArg(x): if x: - # x = html.safe_str(x) x = x.replace('\\', '\\\\') x = x.replace('"', '\\"') x = x.replace('""', '\\"') - return ' "' + x + '"' return '' @@ -111,6 +109,7 @@ class BackupMessage(IProcessDesc): else: self.cmd += cmdArg(arg) + @property def message(self): # Fetch the server details like hostname, port, roles etc @@ -189,7 +188,7 @@ class BackupMessage(IProcessDesc): res += '
' res += _("Running command:") res += '
' - res += html.safe_str(self.cmd) + res += html.safe_str(cmd + self.cmd) res += '
' return res