Custom-encode forward slashes in URL parameters as Apache HTTPD doesn't allow them in some cases. Fixes #3998

This commit is contained in:
Murtuza Zabuawala 2019-03-01 14:55:25 +00:00 committed by Dave Page
parent ecbba79c2a
commit 36ffdb93e8
6 changed files with 93 additions and 17 deletions

View File

@ -45,6 +45,7 @@ Bug fixes
| `Bug #3982 <https://redmine.postgresql.org/issues/3982>`_ - Add full support and testsfor all PG server side encodings.
| `Bug #3985 <https://redmine.postgresql.org/issues/3985>`_ - Don't embed docs and external sites in iframes, to allow the external sites to set X-FRAME-OPTIONS = DENY for security.
| `Bug #3992 <https://redmine.postgresql.org/issues/3992>`_ - Add full support and testsfor all PG server side encodings.
| `Bug #3998 <https://redmine.postgresql.org/issues/3998>`_ - Custom-encode forward slashes in URL parameters as Apache HTTPD doesn't allow them in some cases.
| `Bug #4000 <https://redmine.postgresql.org/issues/4000>`_ - Update CodeMirror to 5.43.0 to resolve issues with tab indent with use spaces enabled.
| `Bug #4013 <https://redmine.postgresql.org/issues/4013>`_ - Ensure long queries don't cause errors when downloading CSV in the Query Tool.
| `Bug #4021 <https://redmine.postgresql.org/issues/4021>`_ - Disable the editor and execute functions whilst queries are executing.

View File

@ -195,6 +195,22 @@ define(['jquery', 'sources/gettext', 'sources/url_for'],
}
return '1em';
},
removeSlashInTheString: (value) => {
let locationList = [];
let idx = 0;
while (value && value.indexOf('/') !== -1) {
locationList.push(value.indexOf('/') + idx);
value = value.replace('/', '');
// No of slashes already removed, so we need to increment the
// index accordingly when adding into location list
idx++;
}
return {
'slashLocations': locationList.join(','),
'title': encodeURIComponent(value),
};
},
};
return sqlEditorUtils;
});

View File

@ -230,6 +230,16 @@ def panel(trans_id, is_query_tool, editor_title):
else:
server_type = None
# If title has slash(es) in it then replace it
if request.args and request.args['fslashes'] != '':
try:
fslashesList = request.args['fslashes'].split(',')
for idx in fslashesList:
idx = int(idx)
editor_title = editor_title[:idx] + '/' + editor_title[idx:]
except IndexError as e:
app.logger.exception(e)
# We need client OS information to render correct Keyboard shortcuts
user_agent = UserAgent(request.headers.get('User-Agent'))

View File

@ -234,17 +234,7 @@ define('pgadmin.datagrid', [
return;
}
var nsp_name = '';
if (parentData.schema != undefined) {
nsp_name = parentData.schema.label;
}
else if (parentData.view != undefined) {
nsp_name = parentData.view.label;
}
else if (parentData.catalog != undefined) {
nsp_name = parentData.catalog.label;
}
let nsp_name = showData.retrieveNameSpaceName(parentData);
var url_params = {
'cmd_type': data.mnuid,
@ -263,8 +253,8 @@ define('pgadmin.datagrid', [
'did': url_params['did'],
'obj_id': url_params['obj_id'],
});
var grid_title = parentData.server.label + '-' + parentData.database.label + '-'
+ nsp_name + '.' + d.label;
let grid_title = showData.generateDatagridTitle(parentData, nsp_name, d);
// Create filter dialog using alertify
if (!alertify.filterDialog) {
@ -481,13 +471,16 @@ define('pgadmin.datagrid', [
}
// Open the panel if frame is initialized
let titileForURLObj = sqlEditorUtils.removeSlashInTheString(grid_title);
var url_params = {
'trans_id': trans_obj.gridTransId,
'is_query_tool': trans_obj.is_query_tool,
'editor_title': encodeURIComponent(grid_title),
'editor_title': titileForURLObj.title,
},
baseUrl = url_for('datagrid.panel', url_params) +
'?' + 'query_url=' + encodeURI(trans_obj.sURL) + '&server_type=' + encodeURIComponent(trans_obj.server_type);
'?' + 'query_url=' + encodeURI(trans_obj.sURL) +
'&server_type=' + encodeURIComponent(trans_obj.server_type) +
'&fslashes=' + titileForURLObj.slashLocations;
if (self.preferences.new_browser_tab) {
var newWin = window.open(baseUrl, '_blank');

View File

@ -52,7 +52,7 @@ export function showDataGrid(
}
function retrieveNameSpaceName(parentData) {
export function retrieveNameSpaceName(parentData) {
if (parentData.schema !== undefined) {
return parentData.schema.label;
}
@ -87,6 +87,6 @@ function hasSchemaOrCatalogOrViewInformation(parentData) {
parentData.catalog !== undefined;
}
function generateDatagridTitle(parentData, namespaceName, nodeData) {
export function generateDatagridTitle(parentData, namespaceName, nodeData) {
return `${namespaceName}.${nodeData.label}`;
}

View File

@ -36,5 +36,61 @@ function (SqlEditorUtils) {
expect(SqlEditorUtils.calcFontSize(2)).toEqual('2em');
});
});
describe('Remove the slashes', function () {
it('it will remove the slashes', function () {
expect(
SqlEditorUtils.removeSlashInTheString('/')
).toEqual({
'slashLocations': '0',
'title': '',
});
});
it('it will remove if slashes are present', function () {
expect(
SqlEditorUtils.removeSlashInTheString('my/test')
).toEqual({
'slashLocations': '2',
'title': 'mytest',
});
});
it('it will remove all the slashes are present', function () {
expect(
SqlEditorUtils.removeSlashInTheString('my/test/value')
).toEqual({
'slashLocations': '2,7',
'title': 'mytestvalue',
});
});
it('it will remove all the slashes are present', function () {
expect(
SqlEditorUtils.removeSlashInTheString('a/bb/ccc/dddd/eeeee')
).toEqual({
'slashLocations': '1,4,8,13',
'title': 'abbcccddddeeeee',
});
});
it('it will not remove if slash is not present', function () {
expect(
SqlEditorUtils.removeSlashInTheString('mytest')
).toEqual({
'slashLocations': '',
'title': 'mytest',
});
});
it('it will not remove if value is not present', function () {
expect(
SqlEditorUtils.removeSlashInTheString('')
).toEqual({
'slashLocations': '',
'title': '',
});
});
});
});
});