diff options
Diffstat (limited to 'install/ui/ipa.js')
-rw-r--r-- | install/ui/ipa.js | 490 |
1 files changed, 490 insertions, 0 deletions
diff --git a/install/ui/ipa.js b/install/ui/ipa.js new file mode 100644 index 000000000..48c116a8c --- /dev/null +++ b/install/ui/ipa.js @@ -0,0 +1,490 @@ +/* Authors: + * Pavel Zuna <pzuna@redhat.com> + * Adam Young <ayoung@redhat.com> + * Endi Dewata <edewata@redhat.com> + * + * Copyright (C) 2010 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + + +/*global $:true, location:true */ + +var IPA = ( function () { + + var that = { + jsonrpc_id: 0 + }; + + that.use_static_files = false; + that.json_url = '/ipa/json'; + if (that.use_static_files){ + that.json_url = 'test/data'; + } + + that.ajax_options = { + type: 'POST', + contentType: 'application/json', + dataType: 'json', + async: true, + processData: false + }; + + that.messages = {}; + that.metadata = {}; + that.whoami = {}; + + + that.entities = []; + that.entities_by_name = {}; + + that.error_dialog = $('<div/>', { + id: 'error_dialog' + }); + + that.layout = $.bbq.getState('layout'); + that.layouts_dir = 'layouts'; + + that.get_template = function(path) { + var layout = that.layout || 'default'; + return that.layouts_dir+'/'+layout+'/'+path; + }; + + /* initialize the IPA JSON-RPC helper + * arguments: + * url - JSON-RPC URL to use (optional) */ + that.init = function (url, use_static_files, on_success, on_error) { + if (url) { + that.json_url = url; + } + + if (use_static_files) { + that.use_static_files = use_static_files; + } + + $.ajaxSetup(that.ajax_options); + + + var startup_batch = + [ + {"method":"json_metadata","params":[[],{}]}, + {"method":"i18n_messages","params":[[],{}]}, + {"method":"user_find","params":[[],{ + "whoami":"true","all":"true"}]}, + {"method":"env","params":[[],{}]} + ]; + + + IPA.cmd('batch', startup_batch, {}, + function (data, text_status, xhr) { + that.metadata = data.result.results[0].metadata; + that.messages = data.result.results[1].messages; + that.whoami = data.result.results[2].result[0]; + that.env = data.result.results[3].result; + if (on_success) { + on_success(data, text_status, xhr); + } + }, + on_error, + null, + 'ipa_init'); + }; + + that.get_entities = function () { + return that.entities; + }; + + that.get_entity = function (name) { + return that.entities_by_name[name]; + }; + + that.add_entity = function (entity) { + that.entities.push(entity); + that.entities_by_name[entity.name] = entity; + }; + + + that.show_page = function (entity_name, facet_name) { + + var state = {}; + state[entity_name + '-facet'] = facet_name; + $.bbq.pushState(state); + }; + + that.switch_and_show_page = function (this_entity, facet_name, pkey) { + if (!pkey){ + that.show_page(this_entity, facet_name); + return; + } + var state = {}; + state[this_entity+'-pkey'] = pkey; + state[this_entity + '-facet'] = facet_name; + $.bbq.pushState(state); + }; + + return that; +}()); + +IPA.command = function (spec) { + + spec = spec || {}; + + var that = {}; + + that.name = spec.name; + that.method = spec.method; + + that.args = $.merge([], spec.args || []); + that.options = $.extend({}, spec.options || {}); + + that.on_success = spec.on_success; + that.on_error = spec.on_error; + + that.add_arg = function(arg) { + that.args.push(arg); + }; + + that.set_option = function(name, value) { + that.options[name] = value; + }; + + that.get_option = function(name) { + return that.options[name]; + }; + + that.execute = function() { + IPA.cmd( + that.method, + that.args, + that.options, + that.on_success, + that.on_error, + null, + that.name); + }; + + that.to_json = function() { + var json = {}; + + json.method = that.method; + + json.params = []; + json.params[0] = that.args || []; + json.params[1] = that.options || {}; + + return json; + }; + + that.to_string = function() { + var string = that.method.replace(/_/g, '-'); + + for (var i=0; i<that.args.length; i++) { + string += ' '+that.args[i]; + } + + for (var name in that.options) { + string += ' --'+name+'=\''+that.options[name]+'\''; + } + + return string; + }; + + return that; +}; + +IPA.batch_command = function (spec) { + + spec = spec || {}; + + spec.method = 'batch'; + + var that = IPA.command(spec); + + that.commands = []; + + that.add_command = function(command) { + that.commands.push(command); + that.add_arg(command.to_json()); + }; + + that.add_commands = function(commands) { + for (var i=0; i<commands.length; i++) { + that.add_command(commands[i]); + } + }; + + that.execute = function() { + IPA.cmd( + that.method, + that.args, + that.options, + function(data, text_status, xhr) { + + for (var i=0; i<that.commands.length; i++) { + var command = that.commands[i]; + var result = data.result.results[i]; + + if (!result) { + if (command.on_error) command.on_error( + xhr, text_status, + { + title: 'Internal Error '+xhr.status, + message: result ? xhr.statusText : "Internal error" + } + ); + + } else if (result.error) { + if (command.on_error) command.on_error( + xhr, + text_status, + { + title: 'IPA Error '+result.error.code, + message: result.error.message + } + ); + + } else { + if (command.on_success) command.on_success(result, text_status, xhr); + } + } + if (that.on_success) that.on_success(data, text_status, xhr); + }, + function(xhr, text_status, error_thrown) { + // TODO: undefined behavior + if (that.on_error) { + that.on_error(xhr, text_status, error_thrown); + } + }, + null, + that.name); + }; + + return that; +}; + +/* call an IPA command over JSON-RPC + * arguments: + * name - name of the command or method if objname is set + * args - list of positional arguments, e.g. [username] + * options - dict of options, e.g. {givenname: 'Pavel'} + * win_callback - function to call if the JSON request succeeds + * fail_callback - function to call if the JSON request fails + * objname - name of an IPA object (optional) */ +IPA.cmd = function (name, args, options, win_callback, fail_callback, objname, command_name) +{ + var default_json_url = '/ipa/json'; + + var network_call_count = 0; + function display_activity_icon(){ + network_call_count += 1; + $('.network-activity-indicator').css('display','inline'); + } + + function hide_activity_icon(){ + network_call_count -= 1; + + if (0 === network_call_count){ + $('.network-activity-indicator').css('display','none'); + } + } + + function dialog_open(xhr, text_status, error_thrown) { + var that = this; + + IPA.error_dialog.dialog({ + modal: true, + width: 400, + buttons: { + 'Retry': function () { + IPA.error_dialog.dialog('close'); + IPA.cmd(name, args, options, win_callback, fail_callback, + objname, command_name); + }, + 'Cancel': function () { + IPA.error_dialog.dialog('close'); + if (fail_callback) { + fail_callback.call(that, xhr, text_status, + error_thrown); + } + } + } + }); + } + + function ajax_error_handler(xhr, text_status, error_thrown) { + IPA.error_dialog.empty(); + IPA.error_dialog.attr('title', error_thrown.title); + + IPA.error_dialog.append('<p>'+error_thrown.message+'</p>'); + + dialog_open.call(this, xhr, text_status, error_thrown); + } + + function error_handler(xhr, text_status, error_thrown) { + hide_activity_icon(); + if (!error_thrown) { + error_thrown = { + name: xhr.responseText || 'Unknown Error', + message: xhr.statusText || 'Unknown Error' + }; + } + + if (xhr.status === 401) { + error_thrown.name = 'Kerberos ticket no longer valid.'; + if (IPA.messages && IPA.messages.ajax){ + error_thrown.message = IPA.messages.ajax["401"]; + } else { + error_thrown.message = + "Your kerberos ticket no longer valid. "+ + "Please run kinit and then click 'retry'. "+ + "If this is your first time running the IPA Web UI "+ + "<a href='/ipa/config/unauthorized.html'>"+ + "follow these directions</a> to configure your browser."; + } + } + + error_thrown.title = 'AJAX Error: '+error_thrown.name; + ajax_error_handler.call(this, xhr, text_status, error_thrown); + } + + + function http_error_handler(xhr, text_status, error_thrown) { + IPA.error_dialog.empty(); + IPA.error_dialog.attr('title', error_thrown.title); + + IPA.error_dialog.append('<p>URL: '+this.url+'</p>'); + IPA.error_dialog.append('<p>'+error_thrown.message+'</p>'); + + dialog_open.call(this, xhr, text_status, error_thrown); + } + + //Think this should be removed + function alt_error_handler(xhr, text_status, error_thrown) { + hide_activity_icon(); + IPA.error_dialog.empty(); + IPA.error_dialog.attr('title', error_thrown.title); + + IPA.error_dialog.append('<p>'+error_thrown.message+'</p>'); + + dialog_open.call(this, xhr, text_status, error_thrown); + } + + + function success_handler(data, text_status, xhr) { + hide_activity_icon(); + if (!data) { + var error_thrown = { + title: 'HTTP Error '+xhr.status, + message: data ? xhr.statusText : "No response" + }; + http_error_handler.call(this, xhr, text_status, error_thrown); + + } else if (data.error) { + error_handler.call(this, xhr, text_status, /* error_thrown */ { + title: 'IPA Error '+data.error.code, + message: data.error.message + }); + + } else if (win_callback) { + win_callback.call(this, data, text_status, xhr); + } + } + + IPA.jsonrpc_id += 1; + var id = IPA.jsonrpc_id; + + var method_name = name; + + if (objname){ + method_name = objname + '_' + name; + } + + var url = IPA.json_url; + + if (IPA.use_static_files){ + if (command_name) { + url += '/' + command_name + '.json'; + } else { + url += '/' + method_name + '.json'; + } + } + var data = { + method: method_name, + params: [args, options], + id: id + }; + + var request = { + url: url, + data: JSON.stringify(data), + success: success_handler, + error: error_handler + }; + display_activity_icon(); + $.ajax(request); + + return (id); +}; + + +/* helper function used to retrieve information about an attribute */ +IPA.get_param_info = function(obj_name, attr) +{ + var obj = IPA.metadata[obj_name]; + if (!obj) { + return null; + } + + var takes_params = obj.takes_params; + if (!takes_params) { + return (null); + + } + for (var i = 0; i < takes_params.length; i += 1) { + if (takes_params[i].name === attr){ + return (takes_params[i]); + } + } + + return (null); +}; + +/* helper function used to retrieve attr name with members of type `member` */ +IPA.get_member_attribute = function (obj_name, member) +{ + var obj = IPA.metadata[obj_name]; + if (!obj) { + return null; + } + var attribute_members = obj.attribute_members; + for (var a in attribute_members) { + var objs = attribute_members[a]; + for (var i = 0; i < objs.length; i += 1) { + if (objs[i] === member){ + return a; + } + } + } + return null; + +}; + + +IPA.create_network_spinner = function(){ + return $('<span />',{ + 'class':'network-activity-indicator', + html: '<img src="spinner_small.gif" />'}); +}; |