Removed global variables with array counts in sqlparser.lib.php
[phpmyadmin.git] / js / server_privileges.js
blob070640501281928a4babdbdf87d1ffa2b3e6e601
1 /* vim: set expandtab sw=4 ts=4 sts=4: */
2 /**
3  * @fileoverview    functions used in server privilege pages
4  * @name            Server Privileges
5  *
6  * @requires    jQuery
7  * @requires    jQueryUI
8  * @requires    js/functions.js
9  *
10  */
12 /**
13  * Validates the password field in a form
14  *
15  * @see     PMA_messages['strPasswordEmpty']
16  * @see     PMA_messages['strPasswordNotSame']
17  * @param   object   the form
18  * @return  boolean  whether the field value is valid or not
19  */
20 function checkPassword(the_form)
22     // Did the user select 'no password'?
23     if (typeof(the_form.elements['nopass']) != 'undefined'
24      && the_form.elements['nopass'][0].checked) {
25         return true;
26     } else if (typeof(the_form.elements['pred_password']) != 'undefined'
27      && (the_form.elements['pred_password'].value == 'none'
28       || the_form.elements['pred_password'].value == 'keep')) {
29         return true;
30     }
32     var password = the_form.elements['pma_pw'];
33     var password_repeat = the_form.elements['pma_pw2'];
34     var alert_msg = false;
36     if (password.value == '') {
37         alert_msg = PMA_messages['strPasswordEmpty'];
38     } else if (password.value != password_repeat.value) {
39         alert_msg = PMA_messages['strPasswordNotSame'];
40     }
42     if (alert_msg) {
43         alert(alert_msg);
44         password.value  = '';
45         password_repeat.value = '';
46         password.focus();
47         return false;
48     }
50     return true;
51 } // end of the 'checkPassword()' function
54 /**
55  * Validates the "add a user" form
56  *
57  * @return  boolean  whether the form is validated or not
58  */
59 function checkAddUser(the_form)
61     if (the_form.elements['pred_hostname'].value == 'userdefined' && the_form.elements['hostname'].value == '') {
62         alert(PMA_messages['strHostEmpty']);
63         the_form.elements['hostname'].focus();
64         return false;
65     }
67     if (the_form.elements['pred_username'].value == 'userdefined' && the_form.elements['username'].value == '') {
68         alert(PMA_messages['strUserEmpty']);
69         the_form.elements['username'].focus();
70         return false;
71     }
73     return checkPassword(the_form);
74 } // end of the 'checkAddUser()' function
76 /**
77  * When a new user is created and retrieved over Ajax, append the user's row to
78  * the user's table
79  *
80  * @param   new_user_string         the html for the new user's row
81  * @param   new_user_initial        the first alphabet of the user's name
82  * @param   new_user_initial_string html to replace the initial for pagination
83  */
84 function appendNewUser(new_user_string, new_user_initial, new_user_initial_string) {
85     //Append the newly retrived user to the table now
87     //Calculate the index for the new row
88     var $curr_last_row = $("#usersForm").find('tbody').find('tr:last');
89     var $curr_first_row = $("#usersForm").find('tbody').find('tr:first');
90     var first_row_initial = $curr_first_row.find('label').html().substr(0, 1).toUpperCase();
91     var curr_shown_initial = $curr_last_row.find('label').html().substr(0, 1).toUpperCase();
92     var curr_last_row_index_string = $curr_last_row.find('input:checkbox').attr('id').match(/\d+/)[0];
93     var curr_last_row_index = parseFloat(curr_last_row_index_string);
94     var new_last_row_index = curr_last_row_index + 1;
95     var new_last_row_id = 'checkbox_sel_users_' + new_last_row_index;
96     var is_show_all = (first_row_initial != curr_shown_initial) ? true : false;
98     //Append to the table and set the id/names correctly
99     if((curr_shown_initial == new_user_initial) || is_show_all) {
100         $(new_user_string)
101         .insertAfter($curr_last_row)
102         .find('input:checkbox')
103         .attr('id', new_last_row_id)
104         .val(function() {
105             //the insert messes up the &27; part. let's fix it
106             return $(this).val().replace(/&/,'&');
107         })
108         .end()
109         .find('label')
110         .attr('for', new_last_row_id)
111         .end();
112     }
114     //Let us sort the table alphabetically
115     $("#usersForm").find('tbody').PMA_sort_table('label');
117     $("#initials_table").find('td:contains('+new_user_initial+')')
118     .html(new_user_initial_string);
121 /**#@+
122  * @namespace   jQuery
123  */
126  * AJAX scripts for server_privileges page.
128  * Actions ajaxified here:
129  * Add a new user
130  * Revoke a user
131  * Edit privileges
132  * Export privileges
133  * Paginate table of users
134  * Flush privileges
136  * @memberOf    jQuery
137  * @name        document.ready
138  */
140 $(document).ready(function() {
141     /** @lends jQuery */
143     /**
144      * Set a parameter for all Ajax queries made on this page.  Some queries
145      * are affected by cache settings on the server side, and hence, show stale
146      * data.  Don't let the web server serve cached pages
147      */
148     $.ajaxSetup({
149         cache: 'false'
150     });
152     /**
153      * AJAX event handler for 'Add a New User'
154      *
155      * @see         PMA_ajaxShowMessage()
156      * @see         appendNewUser()
157      * @see         $cfg['AjaxEnable']
158      * @memberOf    jQuery
159      * @name        add_user_click
160      *
161      */
162     $("#fieldset_add_user a.ajax").live("click", function(event) {
163         /** @lends jQuery */
164         event.preventDefault();
166         var $msgbox = PMA_ajaxShowMessage();
168         /**
169          * @var button_options  Object containing options for jQueryUI dialog buttons
170          */
171         var button_options = {};
172         button_options[PMA_messages['strCreateUser']] = function() {
174             /**
175              * @var $form    stores reference to current form
176              */
177             var $form = $(this).find("form[name=usersForm]").last();
179             if (! checkAddUser($form.get(0))) {
180                 PMA_ajaxShowMessage(PMA_messages['strFormEmpty']);
181                 return false;
182             }
184             //We also need to post the value of the submit button in order to get this to work correctly
185             $.post($form.attr('action'), $form.serialize() + "&adduser_submit=" + $(this).find("input[name=adduser_submit]").attr('value'), function(data) {
186                 if (data.success == true) {
187                     $("#add_user_dialog").dialog("close").remove();
188                     PMA_ajaxShowMessage(data.message);
189                     $("#topmenucontainer")
190                      .next('div')
191                      .remove()
192                      .end()
193                      .after(data.sql_query);
195                     //Remove the empty notice div generated due to a NULL query passed to PMA_showMessage()
196                     var $notice_class = $("#topmenucontainer").next("div").find('.notice');
197                     if ($notice_class.text() == '') {
198                         $notice_class.remove();
199                     }
200                     if ($('#fieldset_add_user a.ajax').attr('name') == 'db_specific') {
202                         /*process the fieldset_add_user attribute and get the val of privileges*/
203                         var url = $('#fieldset_add_user a.ajax').attr('val');
205                         if (url.substring(url.length - 23, url.length) == "&goto=db_operations.php") {
206                             url = url.substring(0, url.length - 23);
207                         }
208                         url = url + "&ajax_request=true&db_specific=true";
210                         /* post request for get the updated userForm table */
211                         $.post($form.attr('action' ), url, function(priv_data) {
213                             /*Remove the old userForm table*/
214                             if ($('#userFormDiv').length != 0) {
215                                 $('#userFormDiv').remove();
216                             } else {
217                                 $("#usersForm").remove();
218                             }
219                             var user_div = $('<div id="userFormDiv"></div>');
220                             /*If the JSON string parsed correctly*/
221                             if (typeof priv_data.success != 'undefined') {
222                                 if (priv_data.success == true) {
223                                     user_div
224                                      .html(priv_data.user_form)
225                                      .insertAfter('#result_query');
226                                 } else {
227                                     PMA_ajaxShowMessage(PMA_messages['strErrorProcessingRequest'] + " : " + priv_data.error, "7000");
228                                 }
229                             } else {
230                                 /*parse the JSON string*/
231                                 var obj = $.parseJSON(priv_data);
232                                 user_div
233                                  .html(obj.user_form)
234                                  .insertAfter('#result_query');
235                             }
236                         });
237                     } else {
238                         appendNewUser(data.new_user_string, data.new_user_initial, data.new_user_initial_string);
239                     }
240                 } else {
241                     PMA_ajaxShowMessage(PMA_messages['strErrorProcessingRequest'] + " : " + data.error, "7000");
242                 }
243             })
244         };
245         button_options[PMA_messages['strCancel']] = function() { $(this).dialog("close").remove(); }
247         $.get($(this).attr("href"), {'ajax_request':true}, function(data) {
248             $('<div id="add_user_dialog"></div>')
249             .prepend(data)
250             .find("#fieldset_add_user_footer").hide() //showing the "Go" and "Create User" buttons together will confuse the user
251             .end()
252             .find("form[name=usersForm]").append('<input type="hidden" name="ajax_request" value="true" />')
253             .end()
254             .dialog({
255                 title: PMA_messages['strAddNewUser'],
256                 width: 800,
257                 // height is a workaround for this Chrome problem:
258                 // http://bugs.jqueryui.com/ticket/4671
259                 // also it's interesting to be able to scroll this window
260                 height: 600,
261                 modal: true,
262                 buttons: button_options
263             }); //dialog options end
264             displayPasswordGenerateButton();
265             PMA_ajaxRemoveMessage($msgbox);
266         }); // end $.get()
268     });//end of Add New User AJAX event handler
271     /**
272      * Ajax event handler for 'Reload Privileges' anchor
273      *
274      * @see         PMA_ajaxShowMessage()
275      * @see         $cfg['AjaxEnable']
276      * @memberOf    jQuery
277      * @name        reload_privileges_click
278      */
279     $("#reload_privileges_anchor.ajax").live("click", function(event) {
280         event.preventDefault();
282         var $msgbox = PMA_ajaxShowMessage(PMA_messages['strReloadingPrivileges']);
284         $.get($(this).attr("href"), {'ajax_request': true}, function(data) {
285             if(data.success == true) {
286                 PMA_ajaxRemoveMessage($msgbox);
287             }
288             else {
289                 PMA_ajaxShowMessage(data.error);
290             }
291         }); //end $.get()
293     }); //end of Reload Privileges Ajax event handler
295     /**
296      * AJAX handler for 'Revoke User'
297      *
298      * @see         PMA_ajaxShowMessage()
299      * @see         $cfg['AjaxEnable']
300      * @memberOf    jQuery
301      * @name        revoke_user_click
302      */
303     $("#fieldset_delete_user_footer #buttonGo.ajax").live('click', function(event) {
304         event.preventDefault();
306         PMA_ajaxShowMessage(PMA_messages['strRemovingSelectedUsers']);
308         $form = $("#usersForm");
310         $.post($form.attr('action'), $form.serialize() + "&delete=" + $(this).attr('value') + "&ajax_request=true", function(data) {
311             if(data.success == true) {
312                 PMA_ajaxShowMessage(data.message);
314                 //Remove the revoked user from the users list
315                 $form.find("input:checkbox:checked").parents("tr").slideUp("medium", function() {
316                     var this_user_initial = $(this).find('input:checkbox').val().charAt(0).toUpperCase();
317                     $(this).remove();
319                     //If this is the last user with this_user_initial, remove the link from #initials_table
320                     if($("#tableuserrights").find('input:checkbox[value^=' + this_user_initial + ']').length == 0) {
321                         $("#initials_table").find('td > a:contains(' + this_user_initial + ')').parent('td').html(this_user_initial);
322                     }
324                     //Re-check the classes of each row
325                     $form
326                     .find('tbody').find('tr:odd')
327                     .removeClass('even').addClass('odd')
328                     .end()
329                     .find('tr:even')
330                     .removeClass('odd').addClass('even');
331                 })
332             }
333             else {
334                 PMA_ajaxShowMessage(data.error);
335             }
336         }) // end $.post()
337     }) // end Revoke User
339     /**
340      * AJAX handler for 'Edit User'
341      *
342      * @see         PMA_ajaxShowMessage()
343      *
344      */
346     /**
347      * Step 1: Load Edit User Dialog
348      * @memberOf    jQuery
349      * @name        edit_user_click
350      * @see         $cfg['AjaxEnable']
351      */
352     $(".edit_user_anchor.ajax").live('click', function(event) {
353         /** @lends jQuery */
354         event.preventDefault();
356         var $msgbox = PMA_ajaxShowMessage();
358         $(this).parents('tr').addClass('current_row');
360         /**
361          * @var button_options  Object containing options for jQueryUI dialog buttons
362          */
363         var button_options = {};
364         button_options[PMA_messages['strCancel']] = function() {$(this).dialog("close").remove();}
366         $.get($(this).attr('href'), {'ajax_request':true, 'edit_user_dialog': true}, function(data) {
367             $('<div id="edit_user_dialog"></div>')
368             .append(data)
369             .dialog({
370                 width: 900,
371                 height: 600,
372                 buttons: button_options
373             }); //dialog options end
374             displayPasswordGenerateButton();
375             PMA_ajaxRemoveMessage($msgbox);
376         }) // end $.get()
377     })
379     /**
380      * Step 2: Submit the Edit User Dialog
381      *
382      * @see         PMA_ajaxShowMessage()
383      * @see         $cfg['AjaxEnable']
384      * @memberOf    jQuery
385      * @name        edit_user_submit
386      */
387     $("#edit_user_dialog").find("form").live('submit', function(event) {
388         /** @lends jQuery */
389         event.preventDefault();
391         PMA_ajaxShowMessage(PMA_messages['strProcessingRequest']);
393         $(this).append('<input type="hidden" name="ajax_request" value="true" />');
395         /**
396          * @var curr_submit_name    name of the current button being submitted
397          */
398         var curr_submit_name = $(this).find('.tblFooters').find('input:submit').attr('name');
400         /**
401          * @var curr_submit_value    value of the current button being submitted
402          */
403         var curr_submit_value = $(this).find('.tblFooters').find('input:submit').val();
405         $.post($(this).attr('action'), $(this).serialize() + '&' + curr_submit_name + '=' + curr_submit_value, function(data) {
406             if(data.success == true) {
408                 PMA_ajaxShowMessage(data.message);
410                 //Close the jQueryUI dialog
411                 $("#edit_user_dialog").dialog("close").remove();
413                 if(data.sql_query) {
414                     $("#topmenucontainer")
415                     .next('div')
416                     .remove()
417                     .end()
418                     .after(data.sql_query);
419                     var notice_class = $("#topmenucontainer").next("div").find('.notice');
420                     if($(notice_class).text() == '') {
421                         $(notice_class).remove();
422                     }
423                 } //Show SQL Query that was executed
425                 //Append new user if necessary
426                 if(data.new_user_string) {
427                     appendNewUser(data.new_user_string, data.new_user_initial, data.new_user_initial_string);
428                 }
430                 //Check if we are on the page of the db-specific privileges
431                 var db_priv_page = !!($('#dbspecificuserrights').length); // the "!!" part is merely there to ensure a value of type boolean
432                 // we always need to reload on the db-specific privilege page
433                 // and on the global page when adjusting global privileges,
434                 // but not on the global page when adjusting db-specific privileges.
435                 var reload_privs = false;
436                 if (data.db_specific_privs == false || (db_priv_page == data.db_specific_privs)) {
437                     reload_privs = true;
438                 }
440                 //Change privileges, if they were edited and need to be reloaded
441                 if(data.new_privileges && reload_privs) {
442                     $("#usersForm")
443                     .find('.current_row')
444                     .find('tt')
445                     .html(data.new_privileges);
446                 }
448                 $("#usersForm")
449                 .find('.current_row')
450                 .removeClass('current_row');
451             }
452             else {
453                 PMA_ajaxShowMessage(data.error);
454             }
455         });
456     })
457     //end Edit user
459     /**
460      * AJAX handler for 'Export Privileges'
461      *
462      * @see         PMA_ajaxShowMessage()
463      * @see         $cfg['AjaxEnable']
464      * @memberOf    jQuery
465      * @name        export_user_click
466      */
467     $(".export_user_anchor.ajax").live('click', function(event) {
468         /** @lends jQuery */
469         event.preventDefault();
471         var $msgbox = PMA_ajaxShowMessage();
473         /**
474          * @var button_options  Object containing options for jQueryUI dialog buttons
475          */
476         var button_options = {};
477         button_options[PMA_messages['strClose']] = function() {$(this).dialog("close").remove();}
479         $.get($(this).attr('href'), {'ajax_request': true}, function(data) {
480             $('<div id="export_dialog"></div>')
481             .prepend(data)
482             .dialog({
483                 width : 500,
484                 buttons: button_options
485             });
486             PMA_ajaxRemoveMessage($msgbox);
487         }) //end $.get
488     }) //end export privileges
490     /**
491      * AJAX handler to Paginate the Users Table
492      *
493      * @see         PMA_ajaxShowMessage()
494      * @see         $cfg['AjaxEnable']
495      * @name        paginate_users_table_click
496      * @memberOf    jQuery
497      */
498     $("#initials_table.ajax").find("a").live('click', function(event) {
499         event.preventDefault();
501         var $msgbox = PMA_ajaxShowMessage();
503         $.get($(this).attr('href'), {'ajax_request' : true}, function(data) {
504             // This form is not on screen when first entering Privileges
505             // if there are more than 50 users
506             $("#usersForm").hide("medium").remove();
507             $("#fieldset_add_user").hide("medium").remove();
508             $("#initials_table")
509              .after(data).show("medium")
510              .siblings("h2").not(":first").remove();
512             PMA_ajaxRemoveMessage($msgbox);
513         }) // end $.get
514     })// end of the paginate users table
516     /*
517      * Additional confirmation dialog after clicking
518      * 'Drop the databases...'
519      */
520     $('#checkbox_drop_users_db').click(function() {
521         $this_checkbox = $(this);
522         if ($this_checkbox.is(':checked')) {
523             var is_confirmed = confirm(PMA_messages['strDropDatabaseStrongWarning'] + '\n' + PMA_messages['strDoYouReally'] + ' :\nDROP DATABASE');
524             if (! is_confirmed) {
525                 $this_checkbox.attr('checked', false);
526             }
527         }
528     });
530 }, 'top.frame_content'); //end $(document).ready()
532 /**#@- */