Translated using Weblate (Hindi)
[phpmyadmin.git] / js / server_privileges.js
blobb55ceb30341ef74767d6ba180f4bff9c161539a7
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) {
18     if (the_form.elements.pred_hostname.value === 'userdefined' && the_form.elements.hostname.value === '') {
19         alert(PMA_messages.strHostEmpty);
20         the_form.elements.hostname.focus();
21         return false;
22     }
24     if (the_form.elements.pred_username.value === 'userdefined' && the_form.elements.username.value === '') {
25         alert(PMA_messages.strUserEmpty);
26         the_form.elements.username.focus();
27         return false;
28     }
30     return PMA_checkPassword($(the_form));
31 } // end of the 'checkAddUser()' function
33 function checkPasswordStrength (value, meter_obj, meter_object_label, username) {
34     // List of words we don't want to appear in the password
35     customDict = [
36         'phpmyadmin',
37         'mariadb',
38         'mysql',
39         'php',
40         'my',
41         'admin',
42     ];
43     if (username !== null) {
44         customDict.push(username);
45     }
46     var zxcvbn_obj = zxcvbn(value, customDict);
47     var strength = zxcvbn_obj.score;
48     strength = parseInt(strength);
49     meter_obj.val(strength);
50     switch (strength) {
51     case 0: meter_obj_label.html(PMA_messages.strExtrWeak);
52         break;
53     case 1: meter_obj_label.html(PMA_messages.strVeryWeak);
54         break;
55     case 2: meter_obj_label.html(PMA_messages.strWeak);
56         break;
57     case 3: meter_obj_label.html(PMA_messages.strGood);
58         break;
59     case 4: meter_obj_label.html(PMA_messages.strStrong);
60     }
63 /**
64  * AJAX scripts for server_privileges page.
65  *
66  * Actions ajaxified here:
67  * Add user
68  * Revoke a user
69  * Edit privileges
70  * Export privileges
71  * Paginate table of users
72  * Flush privileges
73  *
74  * @memberOf    jQuery
75  * @name        document.ready
76  */
79 /**
80  * Unbind all event handlers before tearing down a page
81  */
82 AJAX.registerTeardown('server_privileges.js', function () {
83     $('#fieldset_add_user_login').off('change', 'input[name=\'username\']');
84     $(document).off('click', '#fieldset_delete_user_footer #buttonGo.ajax');
85     $(document).off('click', 'a.edit_user_group_anchor.ajax');
86     $(document).off('click', 'button.mult_submit[value=export]');
87     $(document).off('click', 'a.export_user_anchor.ajax');
88     $(document).off('click',  '#initials_table a.ajax');
89     $('#checkbox_drop_users_db').off('click');
90     $(document).off('click', '.checkall_box');
91     $(document).off('change', '#checkbox_SSL_priv');
92     $(document).off('change', 'input[name="ssl_type"]');
93     $(document).off('change', '#select_authentication_plugin');
94 });
96 AJAX.registerOnload('server_privileges.js', function () {
97     /**
98      * Display a warning if there is already a user by the name entered as the username.
99      */
100     $('#fieldset_add_user_login').on('change', 'input[name=\'username\']', function () {
101         var username = $(this).val();
102         var $warning = $('#user_exists_warning');
103         if ($('#select_pred_username').val() === 'userdefined' && username !== '') {
104             var href = $('form[name=\'usersForm\']').attr('action');
105             var params = {
106                 'ajax_request' : true,
107                 'server' : PMA_commonParams.get('server'),
108                 'validate_username' : true,
109                 'username' : username
110             };
111             $.get(href, params, function (data) {
112                 if (data.user_exists) {
113                     $warning.show();
114                 } else {
115                     $warning.hide();
116                 }
117             });
118         } else {
119             $warning.hide();
120         }
121     });
123     /**
124      * Indicating password strength
125      */
126     $('#text_pma_pw').on('keyup', function () {
127         meter_obj = $('#password_strength_meter');
128         meter_obj_label = $('#password_strength');
129         username = $('input[name="username"]');
130         username = username.val();
131         checkPasswordStrength($(this).val(), meter_obj, meter_obj_label, username);
132     });
134     /**
135      * Automatically switching to 'Use Text field' from 'No password' once start writing in text area
136      */
137     $('#text_pma_pw').on('input', function () {
138         if ($('#text_pma_pw').val() !== '') {
139             $('#select_pred_password').val('userdefined');
140         }
141     });
143     $('#text_pma_change_pw').on('keyup', function () {
144         meter_obj = $('#change_password_strength_meter');
145         meter_obj_label = $('#change_password_strength');
146         checkPasswordStrength($(this).val(), meter_obj, meter_obj_label, PMA_commonParams.get('user'));
147     });
149     /**
150      * Display a notice if sha256_password is selected
151      */
152     $(document).on('change', '#select_authentication_plugin', function () {
153         var selected_plugin = $(this).val();
154         if (selected_plugin === 'sha256_password') {
155             $('#ssl_reqd_warning').show();
156         } else {
157             $('#ssl_reqd_warning').hide();
158         }
159     });
161     /**
162      * AJAX handler for 'Revoke User'
163      *
164      * @see         PMA_ajaxShowMessage()
165      * @memberOf    jQuery
166      * @name        revoke_user_click
167      */
168     $(document).on('click', '#fieldset_delete_user_footer #buttonGo.ajax', function (event) {
169         event.preventDefault();
171         var $thisButton = $(this);
172         var $form = $('#usersForm');
174         $thisButton.PMA_confirm(PMA_messages.strDropUserWarning, $form.attr('action'), function (url) {
175             var $drop_users_db_checkbox = $('#checkbox_drop_users_db');
176             if ($drop_users_db_checkbox.is(':checked')) {
177                 var is_confirmed = confirm(PMA_messages.strDropDatabaseStrongWarning + '\n' + PMA_sprintf(PMA_messages.strDoYouReally, 'DROP DATABASE'));
178                 if (! is_confirmed) {
179                     // Uncheck the drop users database checkbox
180                     $drop_users_db_checkbox.prop('checked', false);
181                 }
182             }
184             PMA_ajaxShowMessage(PMA_messages.strRemovingSelectedUsers);
186             var argsep = PMA_commonParams.get('arg_separator');
187             $.post(url, $form.serialize() + argsep + 'delete=' + $thisButton.val() + argsep + 'ajax_request=true', function (data) {
188                 if (typeof data !== 'undefined' && data.success === true) {
189                     PMA_ajaxShowMessage(data.message);
190                     // Refresh navigation, if we droppped some databases with the name
191                     // that is the same as the username of the deleted user
192                     if ($('#checkbox_drop_users_db:checked').length) {
193                         PMA_reloadNavigation();
194                     }
195                     // Remove the revoked user from the users list
196                     $form.find('input:checkbox:checked').parents('tr').slideUp('medium', function () {
197                         var this_user_initial = $(this).find('input:checkbox').val().charAt(0).toUpperCase();
198                         $(this).remove();
200                         // If this is the last user with this_user_initial, remove the link from #initials_table
201                         if ($('#tableuserrights').find('input:checkbox[value^="' + this_user_initial + '"], input:checkbox[value^="' + this_user_initial.toLowerCase() + '"]').length === 0) {
202                             $('#initials_table').find('td > a:contains(' + this_user_initial + ')').parent('td').html(this_user_initial);
203                         }
205                         // Re-check the classes of each row
206                         $form
207                             .find('tbody').find('tr:odd')
208                             .removeClass('even').addClass('odd')
209                             .end()
210                             .find('tr:even')
211                             .removeClass('odd').addClass('even');
213                         // update the checkall checkbox
214                         $(checkboxes_sel).trigger('change');
215                     });
216                 } else {
217                     PMA_ajaxShowMessage(data.error, false);
218                 }
219             }); // end $.post()
220         });
221     }); // end Revoke User
223     $(document).on('click', 'a.edit_user_group_anchor.ajax', function (event) {
224         event.preventDefault();
225         $(this).parents('tr').addClass('current_row');
226         var $msg = PMA_ajaxShowMessage();
227         $.get(
228             $(this).attr('href'),
229             {
230                 'ajax_request': true,
231                 'edit_user_group_dialog': true
232             },
233             function (data) {
234                 if (typeof data !== 'undefined' && data.success === true) {
235                     PMA_ajaxRemoveMessage($msg);
236                     var buttonOptions = {};
237                     buttonOptions[PMA_messages.strGo] = function () {
238                         var usrGroup = $('#changeUserGroupDialog')
239                             .find('select[name="userGroup"]')
240                             .val();
241                         var $message = PMA_ajaxShowMessage();
242                         var argsep = PMA_commonParams.get('arg_separator');
243                         $.post(
244                             'server_privileges.php',
245                             $('#changeUserGroupDialog').find('form').serialize() + argsep + 'ajax_request=1',
246                             function (data) {
247                                 PMA_ajaxRemoveMessage($message);
248                                 if (typeof data !== 'undefined' && data.success === true) {
249                                     $('#usersForm')
250                                         .find('.current_row')
251                                         .removeClass('current_row')
252                                         .find('.usrGroup')
253                                         .text(usrGroup);
254                                 } else {
255                                     PMA_ajaxShowMessage(data.error, false);
256                                     $('#usersForm')
257                                         .find('.current_row')
258                                         .removeClass('current_row');
259                                 }
260                             }
261                         );
262                         $(this).dialog('close');
263                     };
264                     buttonOptions[PMA_messages.strClose] = function () {
265                         $(this).dialog('close');
266                     };
267                     var $dialog = $('<div/>')
268                         .attr('id', 'changeUserGroupDialog')
269                         .append(data.message)
270                         .dialog({
271                             width: 500,
272                             minWidth: 300,
273                             modal: true,
274                             buttons: buttonOptions,
275                             title: $('legend', $(data.message)).text(),
276                             close: function () {
277                                 $(this).remove();
278                             }
279                         });
280                     $dialog.find('legend').remove();
281                 } else {
282                     PMA_ajaxShowMessage(data.error, false);
283                     $('#usersForm')
284                         .find('.current_row')
285                         .removeClass('current_row');
286                 }
287             }
288         );
289     });
291     /**
292      * AJAX handler for 'Export Privileges'
293      *
294      * @see         PMA_ajaxShowMessage()
295      * @memberOf    jQuery
296      * @name        export_user_click
297      */
298     $(document).on('click', 'button.mult_submit[value=export]', function (event) {
299         event.preventDefault();
300         // can't export if no users checked
301         if ($(this.form).find('input:checked').length === 0) {
302             PMA_ajaxShowMessage(PMA_messages.strNoAccountSelected, 2000, 'success');
303             return;
304         }
305         var $msgbox = PMA_ajaxShowMessage();
306         var button_options = {};
307         button_options[PMA_messages.strClose] = function () {
308             $(this).dialog('close');
309         };
310         var argsep = PMA_commonParams.get('arg_separator');
311         var serverId = PMA_commonParams.get('server');
312         var selectedUsers = $('#usersForm input[name*=\'selected_usr\']:checkbox').serialize();
313         var postStr = selectedUsers + '&submit_mult=export' + argsep + 'ajax_request=true&server=' + serverId;
314         $.post(
315             $(this.form).prop('action'),
316             postStr,
317             function (data) {
318                 if (typeof data !== 'undefined' && data.success === true) {
319                     var $ajaxDialog = $('<div />')
320                         .append(data.message)
321                         .dialog({
322                             title: data.title,
323                             width: 500,
324                             buttons: button_options,
325                             close: function () {
326                                 $(this).remove();
327                             }
328                         });
329                     PMA_ajaxRemoveMessage($msgbox);
330                     // Attach syntax highlighted editor to export dialog
331                     PMA_getSQLEditor($ajaxDialog.find('textarea'));
332                 } else {
333                     PMA_ajaxShowMessage(data.error, false);
334                 }
335             }
336         ); // end $.post
337     });
338     // if exporting non-ajax, highlight anyways
339     PMA_getSQLEditor($('textarea.export'));
341     $(document).on('click', 'a.export_user_anchor.ajax', function (event) {
342         event.preventDefault();
343         var $msgbox = PMA_ajaxShowMessage();
344         /**
345          * @var button_options  Object containing options for jQueryUI dialog buttons
346          */
347         var button_options = {};
348         button_options[PMA_messages.strClose] = function () {
349             $(this).dialog('close');
350         };
351         $.get($(this).attr('href'), { 'ajax_request': true }, function (data) {
352             if (typeof data !== 'undefined' && data.success === true) {
353                 var $ajaxDialog = $('<div />')
354                     .append(data.message)
355                     .dialog({
356                         title: data.title,
357                         width: 500,
358                         buttons: button_options,
359                         close: function () {
360                             $(this).remove();
361                         }
362                     });
363                 PMA_ajaxRemoveMessage($msgbox);
364                 // Attach syntax highlighted editor to export dialog
365                 PMA_getSQLEditor($ajaxDialog.find('textarea'));
366             } else {
367                 PMA_ajaxShowMessage(data.error, false);
368             }
369         }); // end $.get
370     }); // end export privileges
372     /**
373      * AJAX handler to Paginate the Users Table
374      *
375      * @see         PMA_ajaxShowMessage()
376      * @name        paginate_users_table_click
377      * @memberOf    jQuery
378      */
379     $(document).on('click', '#initials_table a.ajax', function (event) {
380         event.preventDefault();
381         var $msgbox = PMA_ajaxShowMessage();
382         $.get($(this).attr('href'), { 'ajax_request' : true }, function (data) {
383             if (typeof data !== 'undefined' && data.success === true) {
384                 PMA_ajaxRemoveMessage($msgbox);
385                 // This form is not on screen when first entering Privileges
386                 // if there are more than 50 users
387                 $('div.notice').remove();
388                 $('#usersForm').hide('medium').remove();
389                 $('#fieldset_add_user').hide('medium').remove();
390                 $('#initials_table')
391                     .prop('id', 'initials_table_old')
392                     .after(data.message).show('medium')
393                     .siblings('h2').not(':first').remove();
394                 // prevent double initials table
395                 $('#initials_table_old').remove();
396             } else {
397                 PMA_ajaxShowMessage(data.error, false);
398             }
399         }); // end $.get
400     }); // end of the paginate users table
402     $(document).on('change', 'input[name="ssl_type"]', function (e) {
403         var $div = $('#specified_div');
404         if ($('#ssl_type_SPECIFIED').is(':checked')) {
405             $div.find('input').prop('disabled', false);
406         } else {
407             $div.find('input').prop('disabled', true);
408         }
409     });
411     $(document).on('change', '#checkbox_SSL_priv', function (e) {
412         var $div = $('#require_ssl_div');
413         if ($(this).is(':checked')) {
414             $div.find('input').prop('disabled', false);
415             $('#ssl_type_SPECIFIED').trigger('change');
416         } else {
417             $div.find('input').prop('disabled', true);
418         }
419     });
421     $('#checkbox_SSL_priv').trigger('change');
423     /*
424      * Create submenu for simpler interface
425      */
426     var addOrUpdateSubmenu = function () {
427         var $topmenu2 = $('#topmenu2');
428         var $edit_user_dialog = $('#edit_user_dialog');
429         var submenu_label;
430         var submenu_link;
431         var link_number;
433         // if submenu exists yet, remove it first
434         if ($topmenu2.length > 0) {
435             $topmenu2.remove();
436         }
438         // construct a submenu from the existing fieldsets
439         $topmenu2 = $('<ul/>').prop('id', 'topmenu2');
441         $('#edit_user_dialog .submenu-item').each(function () {
442             submenu_label = $(this).find('legend[data-submenu-label]').data('submenu-label');
444             submenu_link = $('<a/>')
445                 .prop('href', '#')
446                 .html(submenu_label);
448             $('<li/>')
449                 .append(submenu_link)
450                 .appendTo($topmenu2);
451         });
453         // click handlers for submenu
454         $topmenu2.find('a').click(function (e) {
455             e.preventDefault();
456             // if already active, ignore click
457             if ($(this).hasClass('tabactive')) {
458                 return;
459             }
460             $topmenu2.find('a').removeClass('tabactive');
461             $(this).addClass('tabactive');
463             // which section to show now?
464             link_number = $topmenu2.find('a').index($(this));
465             // hide all sections but the one to show
466             $('#edit_user_dialog .submenu-item').hide().eq(link_number).show();
467         });
469         // make first menu item active
470         // TODO: support URL hash history
471         $topmenu2.find('> :first-child a').addClass('tabactive');
472         $edit_user_dialog.prepend($topmenu2);
474         // hide all sections but the first
475         $('#edit_user_dialog .submenu-item').hide().eq(0).show();
477         // scroll to the top
478         $('html, body').animate({ scrollTop: 0 }, 'fast');
479     };
481     $('input.autofocus').focus();
482     $(checkboxes_sel).trigger('change');
483     displayPasswordGenerateButton();
484     if ($('#edit_user_dialog').length > 0) {
485         addOrUpdateSubmenu();
486     }
488     var windowwidth = $(window).width();
489     $('.jsresponsive').css('max-width', (windowwidth - 35) + 'px');