Translated using Weblate (French)
[phpmyadmin.git] / js / server_privileges.js
blob6228dfce9d95e281e912185ee7526a043bb6beba
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 "add a user" form
14  *
15  * @return boolean  whether the form is validated or not
16  */
17 function checkAddUser(the_form)
19     if (the_form.elements.pred_hostname.value == 'userdefined' && the_form.elements.hostname.value === '') {
20         alert(PMA_messages.strHostEmpty);
21         the_form.elements.hostname.focus();
22         return false;
23     }
25     if (the_form.elements.pred_username.value == 'userdefined' && the_form.elements.username.value === '') {
26         alert(PMA_messages.strUserEmpty);
27         the_form.elements.username.focus();
28         return false;
29     }
31     return PMA_checkPassword($(the_form));
32 } // end of the 'checkAddUser()' function
34 /**
35  * AJAX scripts for server_privileges page.
36  *
37  * Actions ajaxified here:
38  * Add user
39  * Revoke a user
40  * Edit privileges
41  * Export privileges
42  * Paginate table of users
43  * Flush privileges
44  *
45  * @memberOf    jQuery
46  * @name        document.ready
47  */
50 /**
51  * Unbind all event handlers before tearing down a page
52  */
53 AJAX.registerTeardown('server_privileges.js', function () {
54     $(document).off("focusout", "#fieldset_add_user_login input[name='username']");
55     $(document).off('click', "#fieldset_delete_user_footer #buttonGo.ajax");
56     $(document).off('click', "a.edit_user_group_anchor.ajax");
57     $(document).off('click', "button.mult_submit[value=export]");
58     $(document).off('click', "a.export_user_anchor.ajax");
59     $(document).off('click',  "#initials_table a.ajax");
60     $('#checkbox_drop_users_db').unbind('click');
61     $(document).off("click", ".checkall_box");
62     $(document).off('change', '#checkbox_SSL_priv');
63     $(document).off('change', 'input[name="ssl_type"]');
64     $(document).off('change', '#select_authentication_plugin');
65 });
67 AJAX.registerOnload('server_privileges.js', function () {
68     /**
69      * Display a warning if there is already a user by the name entered as the username.
70      */
71     $(document).on("focusout", "#fieldset_add_user_login input[name='username']", function () {
72         var username = $(this).val();
73         var $warning = $("#user_exists_warning");
74         if ($("#select_pred_username").val() == 'userdefined' && username !== '') {
75             var href = $("form[name='usersForm']").attr('action');
76             var params = {
77                 'ajax_request' : true,
78                 'token' : PMA_commonParams.get('token'),
79                 'server' : PMA_commonParams.get('server'),
80                 'validate_username' : true,
81                 'username' : username
82             };
83             $.get(href, params, function (data) {
84                 if (data.user_exists) {
85                     $warning.show();
86                 } else {
87                     $warning.hide();
88                 }
89             });
90         } else {
91             $warning.hide();
92         }
93     });
95     /**
96      * Display a notice if sha256_password is selected
97      */
98     $(document).on("change", "#select_authentication_plugin", function () {
99         var selected_plugin = $(this).val();
100         if (selected_plugin === 'sha256_password') {
101             $('#ssl_reqd_warning').show();
102         } else {
103             $('#ssl_reqd_warning').hide();
104         }
105     });
107     /**
108      * AJAX handler for 'Revoke User'
109      *
110      * @see         PMA_ajaxShowMessage()
111      * @memberOf    jQuery
112      * @name        revoke_user_click
113      */
114     $(document).on('click', "#fieldset_delete_user_footer #buttonGo.ajax", function (event) {
115         event.preventDefault();
117         var $thisButton = $(this);
118         var $form = $("#usersForm");
120         $thisButton.PMA_confirm(PMA_messages.strDropUserWarning, $form.attr('action'), function (url) {
122             var $drop_users_db_checkbox = $("#checkbox_drop_users_db");
123             if ($drop_users_db_checkbox.is(':checked')) {
124                 var is_confirmed = confirm(PMA_messages.strDropDatabaseStrongWarning + '\n' + PMA_sprintf(PMA_messages.strDoYouReally, 'DROP DATABASE'));
125                 if (! is_confirmed) {
126                     // Uncheck the drop users database checkbox
127                     $drop_users_db_checkbox.prop('checked', false);
128                 }
129             }
131             PMA_ajaxShowMessage(PMA_messages.strRemovingSelectedUsers);
133             $.post(url, $form.serialize() + "&delete=" + $thisButton.val() + "&ajax_request=true", function (data) {
134                 if (typeof data !== 'undefined' && data.success === true) {
135                     PMA_ajaxShowMessage(data.message);
136                     // Refresh navigation, if we droppped some databases with the name
137                     // that is the same as the username of the deleted user
138                     if ($('#checkbox_drop_users_db:checked').length) {
139                         PMA_reloadNavigation();
140                     }
141                     //Remove the revoked user from the users list
142                     $form.find("input:checkbox:checked").parents("tr").slideUp("medium", function () {
143                         var this_user_initial = $(this).find('input:checkbox').val().charAt(0).toUpperCase();
144                         $(this).remove();
146                         //If this is the last user with this_user_initial, remove the link from #initials_table
147                         if ($("#tableuserrights").find('input:checkbox[value^="' + this_user_initial + '"], input:checkbox[value^="' + this_user_initial.toLowerCase() + '"]').length === 0) {
148                             $("#initials_table").find('td > a:contains(' + this_user_initial + ')').parent('td').html(this_user_initial);
149                         }
151                         //Re-check the classes of each row
152                         $form
153                         .find('tbody').find('tr:odd')
154                         .removeClass('even').addClass('odd')
155                         .end()
156                         .find('tr:even')
157                         .removeClass('odd').addClass('even');
159                         //update the checkall checkbox
160                         $(checkboxes_sel).trigger("change");
161                     });
162                 } else {
163                     PMA_ajaxShowMessage(data.error, false);
164                 }
165             }); // end $.post()
167         });
169     }); // end Revoke User
171     $(document).on('click', "a.edit_user_group_anchor.ajax", function (event) {
172         event.preventDefault();
173         $(this).parents('tr').addClass('current_row');
174         var token = $(this).parents('form').find('input[name="token"]').val();
175         var $msg = PMA_ajaxShowMessage();
176         $.get(
177             $(this).attr('href'),
178             {
179                 'ajax_request': true,
180                 'edit_user_group_dialog': true,
181                 'token': token
182             },
183             function (data) {
184                 if (typeof data !== 'undefined' && data.success === true) {
185                     PMA_ajaxRemoveMessage($msg);
186                     var buttonOptions = {};
187                     buttonOptions[PMA_messages.strGo] = function () {
188                         var usrGroup = $('#changeUserGroupDialog')
189                             .find('select[name="userGroup"]')
190                             .val();
191                         var $message = PMA_ajaxShowMessage();
192                         $.get(
193                             'server_privileges.php',
194                             $('#changeUserGroupDialog').find('form').serialize() + '&ajax_request=1',
195                             function (data) {
196                                 PMA_ajaxRemoveMessage($message);
197                                 if (typeof data !== 'undefined' && data.success === true) {
198                                     $("#usersForm")
199                                         .find('.current_row')
200                                         .removeClass('current_row')
201                                         .find('.usrGroup')
202                                         .text(usrGroup);
203                                 } else {
204                                     PMA_ajaxShowMessage(data.error, false);
205                                     $("#usersForm")
206                                         .find('.current_row')
207                                         .removeClass('current_row');
208                                 }
209                             }
210                         );
211                         $(this).dialog("close");
212                     };
213                     buttonOptions[PMA_messages.strClose] = function () {
214                         $(this).dialog("close");
215                     };
216                     var $dialog = $('<div/>')
217                         .attr('id', 'changeUserGroupDialog')
218                         .append(data.message)
219                         .dialog({
220                             width: 500,
221                             minWidth: 300,
222                             modal: true,
223                             buttons: buttonOptions,
224                             title: $('legend', $(data.message)).text(),
225                             close: function () {
226                                 $(this).remove();
227                             }
228                         });
229                     $dialog.find('legend').remove();
230                 } else {
231                     PMA_ajaxShowMessage(data.error, false);
232                     $("#usersForm")
233                         .find('.current_row')
234                         .removeClass('current_row');
235                 }
236             }
237         );
238     });
240     /**
241      * AJAX handler for 'Export Privileges'
242      *
243      * @see         PMA_ajaxShowMessage()
244      * @memberOf    jQuery
245      * @name        export_user_click
246      */
247     $(document).on('click', "button.mult_submit[value=export]", function (event) {
248         event.preventDefault();
249         // can't export if no users checked
250         if ($(this.form).find("input:checked").length === 0) {
251             return;
252         }
253         var $msgbox = PMA_ajaxShowMessage();
254         var button_options = {};
255         button_options[PMA_messages.strClose] = function () {
256             $(this).dialog("close");
257         };
258         $.post(
259             $(this.form).prop('action'),
260             $(this.form).serialize() + '&submit_mult=export&ajax_request=true',
261             function (data) {
262                 if (typeof data !== 'undefined' && data.success === true) {
263                     var $ajaxDialog = $('<div />')
264                     .append(data.message)
265                     .dialog({
266                         title: data.title,
267                         width: 500,
268                         buttons: button_options,
269                         close: function () {
270                             $(this).remove();
271                         }
272                     });
273                     PMA_ajaxRemoveMessage($msgbox);
274                     // Attach syntax highlighted editor to export dialog
275                     PMA_getSQLEditor($ajaxDialog.find('textarea'));
276                 } else {
277                     PMA_ajaxShowMessage(data.error, false);
278                 }
279             }
280         ); //end $.post
281     });
282     // if exporting non-ajax, highlight anyways
283     PMA_getSQLEditor($('textarea.export'));
285     $(document).on('click', "a.export_user_anchor.ajax", function (event) {
286         event.preventDefault();
287         var $msgbox = PMA_ajaxShowMessage();
288         /**
289          * @var button_options  Object containing options for jQueryUI dialog buttons
290          */
291         var button_options = {};
292         button_options[PMA_messages.strClose] = function () {
293             $(this).dialog("close");
294         };
295         $.get($(this).attr('href'), {'ajax_request': true}, function (data) {
296             if (typeof data !== 'undefined' && data.success === true) {
297                 var $ajaxDialog = $('<div />')
298                 .append(data.message)
299                 .dialog({
300                     title: data.title,
301                     width: 500,
302                     buttons: button_options,
303                     close: function () {
304                         $(this).remove();
305                     }
306                 });
307                 PMA_ajaxRemoveMessage($msgbox);
308                 // Attach syntax highlighted editor to export dialog
309                 PMA_getSQLEditor($ajaxDialog.find('textarea'));
310             } else {
311                 PMA_ajaxShowMessage(data.error, false);
312             }
313         }); //end $.get
314     }); //end export privileges
316     /**
317      * AJAX handler to Paginate the Users Table
318      *
319      * @see         PMA_ajaxShowMessage()
320      * @name        paginate_users_table_click
321      * @memberOf    jQuery
322      */
323     $(document).on('click', "#initials_table a.ajax", function (event) {
324         event.preventDefault();
325         var $msgbox = PMA_ajaxShowMessage();
326         $.get($(this).attr('href'), {'ajax_request' : true}, function (data) {
327             if (typeof data !== 'undefined' && data.success === true) {
328                 PMA_ajaxRemoveMessage($msgbox);
329                 // This form is not on screen when first entering Privileges
330                 // if there are more than 50 users
331                 $("div.notice").remove();
332                 $("#usersForm").hide("medium").remove();
333                 $("#fieldset_add_user").hide("medium").remove();
334                 $("#initials_table")
335                     .prop("id", "initials_table_old")
336                     .after(data.message).show("medium")
337                     .siblings("h2").not(":first").remove();
338                 // prevent double initials table
339                 $("#initials_table_old").remove();
340             } else {
341                 PMA_ajaxShowMessage(data.error, false);
342             }
343         }); // end $.get
344     }); // end of the paginate users table
346     $(document).on('change', 'input[name="ssl_type"]', function (e) {
347         var $div = $('#specified_div');
348         if ($('#ssl_type_specified').is(':checked')) {
349             $div.find('input').prop('disabled', false);
350         } else {
351             $div.find('input').prop('disabled', true);
352         }
353     });
355     $(document).on('change', '#checkbox_SSL_priv', function (e) {
356         var $div = $('#require_ssl_div');
357         if ($(this).is(':checked')) {
358             $div.find('input').prop('disabled', false);
359             $('#ssl_type_specified').trigger('change');
360         } else {
361             $div.find('input').prop('disabled', true);
362         }
363     });
365     $('#checkbox_SSL_priv').trigger('change');
367     /*
368      * Create submenu for simpler interface
369      */
370     var addOrUpdateSubmenu = function () {
371         var $topmenu2 = $("#topmenu2"),
372             $edit_user_dialog = $("#edit_user_dialog"),
373             submenu_label,
374             submenu_link,
375             link_number;
377         // if submenu exists yet, remove it first
378         if ($topmenu2.length > 0) {
379             $topmenu2.remove();
380         }
382         // construct a submenu from the existing fieldsets
383         $topmenu2 = $("<ul/>").prop("id", "topmenu2");
385         $("#edit_user_dialog .submenu-item").each(function () {
386             submenu_label = $(this).find("legend[data-submenu-label]").data("submenu-label");
388             submenu_link = $("<a/>")
389             .prop("href", "#")
390             .html(submenu_label);
392             $("<li/>")
393             .append(submenu_link)
394             .appendTo($topmenu2);
395         });
397         // click handlers for submenu
398         $topmenu2.find("a").click(function (e) {
399             e.preventDefault();
400             // if already active, ignore click
401             if ($(this).hasClass("tabactive")) {
402                 return;
403             }
404             $topmenu2.find("a").removeClass("tabactive");
405             $(this).addClass("tabactive");
407             // which section to show now?
408             link_number = $topmenu2.find("a").index($(this));
409             // hide all sections but the one to show
410             $("#edit_user_dialog .submenu-item").hide().eq(link_number).show();
411         });
413         // make first menu item active
414         // TODO: support URL hash history
415         $topmenu2.find("> :first-child a").addClass("tabactive");
416         $edit_user_dialog.prepend($topmenu2);
418         // hide all sections but the first
419         $("#edit_user_dialog .submenu-item").hide().eq(0).show();
421         // scroll to the top
422         $('html, body').animate({scrollTop: 0}, 'fast');
423     };
425     $("input.autofocus").focus();
426     $(checkboxes_sel).trigger("change");
427     displayPasswordGenerateButton();
428     if ($("#edit_user_dialog").length > 0) {
429         addOrUpdateSubmenu();
430     }