Prevent the user attempting to run external commands if the bin path is not configured. Fixes #1177

This commit is contained in:
Harshal Dhumal 2016-08-08 11:59:37 +01:00 committed by Dave Page
parent 8e099e29c3
commit f78024808e
7 changed files with 265 additions and 12 deletions

View File

@ -692,7 +692,24 @@ function(require, $, _, S, Bootstrap, pgAdmin, alertify, CodeMirror) {
pnlDialogHelp.focus();
iframe.openURL(url);
}
},
get_preference(module, preference_name) {
preference = null;
$.ajax({
async: false,
url: "{{ url_for('preferences.preferences') }}" +"/"+ module +"/"+ preference_name,
success: function(res) {
preference = res;
},
error: function(xhr, status, error) {
}
});
return preference;
}
});
window.onbeforeunload = function(ev) {

View File

@ -82,18 +82,37 @@ def script():
@blueprint.route("/preferences", methods=["GET"])
@blueprint.route("/preferences/<module>/<preference>")
@login_required
def preferences():
"""Fetch all the preferences of pgAdmin IV."""
def preferences(module=None, preference=None):
"""Fetch all/or requested preferences of pgAdmin IV."""
if module is not None and preference is not None:
try:
m = Preferences.module(module, create=False)
if m is None:
return Response(status=404)
p = m.preference(preference)
if p is None:
return Response(status=404)
return ajax_response(
response=p.to_json(),
status=200
)
except Exception as e:
return internal_server_error(errormsg=str(e))
# Load Preferences
preferences = Preferences.preferences()
pref = Preferences.preferences()
res = []
def label(p):
return p['label']
for m in preferences:
for m in pref:
if len(m['categories']):
om = {
"id": m['id'],

View File

@ -361,6 +361,48 @@ TODO LIST FOR BACKUP:
// Callback to draw Backup Dialog for globals/server
start_backup_global_server: function(action, item, params) {
var i = item || pgBrowser.tree.selected(),
server_data = null;
while (i) {
var node_data = pgBrowser.tree.itemData(i);
if (node_data._type == 'server') {
server_data = node_data;
break;
}
if (pgBrowser.tree.hasParent(i)) {
i = $(pgBrowser.tree.parent(i));
} else {
alertify.alert("{{ _("Please select server or child node from tree.") }}");
break;
}
}
if (!server_data) {
return;
}
var module = 'paths',
preference_name = 'pg_bin_dir',
msg = '{{ _('Please configure the PostgreSQL Binary Path in the Preferences dialog.') }}';
if (server_data.server_type == 'ppas') {
preference_name = 'ppas_bin_dir';
msg = '{{ _('Please configure the EDB Advanced Server Binary Path in the Preferences dialog.') }}';
}
var preference = pgBrowser.get_preference(module, preference_name);
if(preference) {
if (!preference.value) {
alertify.alert('{{ _("Configuration required") }}', msg);
return;
}
} else {
alertify.alert(S('{{ _('Failed to load preference %s of module %s') }}').sprintf(preference_name, module).value());
return;
}
var of_type = undefined;
@ -533,6 +575,50 @@ TODO LIST FOR BACKUP:
// Callback to draw Backup Dialog for objects
backup_objects: function(action, treeItem) {
var i = treeItem || pgBrowser.tree.selected(),
server_data = null;
while (i) {
var node_data = pgBrowser.tree.itemData(i);
if (node_data._type == 'server') {
server_data = node_data;
break;
}
if (pgBrowser.tree.hasParent(i)) {
i = $(pgBrowser.tree.parent(i));
} else {
alertify.alert("{{ _("Please select server or child node from tree.") }}");
break;
}
}
if (!server_data) {
return;
}
var module = 'paths',
preference_name = 'pg_bin_dir',
msg = '{{ _('Please set binary path for PostgreSQL Server from preferences.') }}';
if (server_data.server_type == 'ppas') {
preference_name = 'ppas_bin_dir';
msg = '{{ _('Please set binary path for EDB Advanced Server from preferences.') }}';
}
var preference = pgBrowser.get_preference(module, preference_name);
if(preference) {
if (!preference.value) {
alertify.alert(msg);
return;
}
} else {
alertify.alert(S('{{ _('Failed to load preference %s of module %s') }}').sprintf(preference_name, module).value());
return;
}
var title = S('{{ 'Backup (%s: %s)' }}'),
tree = pgBrowser.tree,
item = treeItem || tree.selected(),

View File

@ -298,6 +298,49 @@ define(
Open the dialog for the import functionality
*/
callback_import_export: function(args, item) {
var i = item || pgBrowser.tree.selected(),
server_data = null;
while (i) {
var node_data = pgBrowser.tree.itemData(i);
if (node_data._type == 'server') {
server_data = node_data;
break;
}
if (pgBrowser.tree.hasParent(i)) {
i = $(pgBrowser.tree.parent(i));
} else {
Alertify.alert("{{ _("Please select server or child node from tree.") }}");
break;
}
}
if (!server_data) {
return;
}
var module = 'paths',
preference_name = 'pg_bin_dir',
msg = '{{ _('Please configure the PostgreSQL Binary Path in the Preferences dialog.') }}';
if (server_data.server_type == 'ppas') {
preference_name = 'ppas_bin_dir';
msg = '{{ _('Please configure the EDB Advanced Server Binary Path in the Preferences dialog.') }}';
}
var preference = pgBrowser.get_preference(module, preference_name);
if(preference) {
if (!preference.value) {
Alertify.alert('{{ _("Configuration required") }}', msg);
return;
}
} else {
Alertify.alert(S('{{ _('Failed to load preference %s of module %s') }}').sprintf(preference_name, module).value());
return;
}
var self = this;
var input = args || {},
t = pgBrowser.tree,

View File

@ -187,8 +187,51 @@ define(
Open the dialog for the maintenance functionality
*/
callback_maintenace: function(args, item) {
var self = this;
var input = args || {},
var i = item || pgBrowser.tree.selected(),
server_data = null;
while (i) {
var node_data = pgBrowser.tree.itemData(i);
if (node_data._type == 'server') {
server_data = node_data;
break;
}
if (pgBrowser.tree.hasParent(i)) {
i = $(pgBrowser.tree.parent(i));
} else {
Alertify.alert("{{ _("Please select server or child node from tree.") }}");
break;
}
}
if (!server_data) {
return;
}
var module = 'paths',
preference_name = 'pg_bin_dir',
msg = '{{ _('Please configure the PostgreSQL Binary Path in the Preferences dialog.') }}';
if (server_data.server_type == 'ppas') {
preference_name = 'ppas_bin_dir';
msg = '{{ _('Please configure the EDB Advanced Server Binary Path in the Preferences dialog.') }}';
}
var preference = pgBrowser.get_preference(module, preference_name);
if(preference) {
if (!preference.value) {
Alertify.alert('{{ _("Configuration required") }}', msg);
return;
}
} else {
Alertify.alert(S('{{ _('Failed to load preference %s of module %s') }}').sprintf(preference_name, module).value());
return;
}
var self = this,
input = args || {},
t = pgBrowser.tree,
i = item || t.selected(),
d = i && i.length == 1 ? t.itemData(i) : undefined,

View File

@ -286,6 +286,50 @@ define([
},
// Callback to draw Backup Dialog for objects
restore_objects: function(action, treeItem) {
var i = treeItem || pgBrowser.tree.selected(),
server_data = null;
while (i) {
var node_data = pgBrowser.tree.itemData(i);
if (node_data._type == 'server') {
server_data = node_data;
break;
}
if (pgBrowser.tree.hasParent(i)) {
i = $(pgBrowser.tree.parent(i));
} else {
alertify.alert("{{ _("Please select server or child node from tree.") }}");
break;
}
}
if (!server_data) {
return;
}
var module = 'paths',
preference_name = 'pg_bin_dir',
msg = '{{ _('Please configure the PostgreSQL Binary Path in the Preferences dialog.') }}';
if (server_data.server_type == 'ppas') {
preference_name = 'ppas_bin_dir';
msg = '{{ _('Please configure the EDB Advanced Server Binary Path in the Preferences dialog.') }}';
}
var preference = pgBrowser.get_preference(module, preference_name);
if(preference) {
if (!preference.value) {
alertify.alert('{{ _("Configuration required") }}', msg);
return;
}
} else {
alertify.alert(S('{{ _('Failed to load preference %s of module %s') }}').sprintf(preference_name, module).value());
return;
}
var title = S('{{ 'Restore (%s: %s)' }}'),
tree = pgBrowser.tree,
item = treeItem || tree.selected(),

View File

@ -394,8 +394,7 @@ class Preferences(object):
if name in cat['preferences']:
return (cat['preferences'])[name]
assert False, """Couldn't find the preference in this preference!
Did you forget to register it?"""
return None
@classmethod
def preferences(cls):
@ -452,12 +451,13 @@ Did you forget to register it?"""
)
@classmethod
def module(cls, name):
def module(cls, name, create=True):
"""
module (classmethod)
Get the module preferences object
:param name: Name of the module
:param create: Flag to create Preferences object
:returns: a Preferences object representing for the module.
"""
if name in Preferences.modules:
@ -466,10 +466,11 @@ Did you forget to register it?"""
if m.label is None:
m.label = name
return m
else:
m = Preferences(name, None)
return m
if create:
return Preferences(name, None)
return None
@classmethod
def save(cls, mid, cid, pid, value):