phpDocumentor pond
[ class tree: pond ] [ index: pond ] [ all elements ]

Source for file users.ctrl.php

Documentation is available at users.ctrl.php

  1. <?php
  2. /**
  3.  * This file implements the UI controller for settings management.
  4.  *
  5.  * This file is part of Quam Plures - {@link http://quamplures.net/}
  6.  * See also {@link https://launchpad.net/quam-plures}.
  7.  *
  8.  * @copyright (c) 2009 - 2011 by the Quam Plures developers - {@link http://quamplures.net/}
  9.  * @copyright (c)2003-2009 by Francois PLANQUE - {@link http://fplanque.net/}
  10.  *  Parts of this file are copyright (c)2004-2006 by Daniel HAHLER - {@link http://thequod.de/contact}.
  11.  *
  12.  *  {@internal License choice
  13.  *  - If you have received this file as part of a package, please find the license.txt file in
  14.  *    the same folder or the closest folder above for complete license terms.
  15.  *  - If you have received this file individually (e-g: from http://evocms.cvs.sourceforge.net/)
  16.  *    then you must choose one of the following licenses before using the file:
  17.  *    - GNU General Public License 2 (GPL) - http://www.opensource.org/licenses/gpl-license.php
  18.  *    - Mozilla Public License 1.1 (MPL) - http://www.opensource.org/licenses/mozilla1.1.php
  19.  *  }}}
  20.  *
  21.  *  {@internal Open Source relicensing agreement:
  22.  *  Daniel HAHLER grants Francois PLANQUE the right to license
  23.  *  Daniel HAHLER's contributions to this file and the b2evolution project
  24.  *  under any OSI approved OSS license (http://www.opensource.org/licenses/).
  25.  *  }}}
  26.  *
  27.  *  {@internal Below is a list of authors who have contributed to design/coding of this file: }}
  28.  * @author fplanque: Francois PLANQUE
  29.  * @author blueyed: Daniel HAHLER
  30.  *
  31.  * @todo separate object inits and permission checks
  32.  *
  33.  * @package pond
  34.  */
  35. if!defined('QP_MAIN_INIT') ) die'Please, do not access this page directly.' );
  36.  
  37. /**
  38.  * @var AdminUI_general 
  39.  */
  40. global $AdminUI;
  41.  
  42.  
  43. $AdminUI->set_path'users' );
  44.  
  45. param_action'list' );
  46.  
  47. param'user_ID''integer'NULL );    // Note: should NOT be memorized (would kill navigation/sorting) use memorize_param() if needed
  48. param'grp_ID''integer'NULL );        // Note: should NOT be memorized:    -- " --
  49.  
  50. /**
  51.  * @global boolean true, if user is only allowed to edit his profile
  52.  */
  53. $user_profile_only $current_User->check_perm'users''view' );
  54.  
  55. if$user_profile_only )
  56. // User has no permissions to view: he can only edit his profile
  57.  
  58.     if( (isset($user_ID&& $user_ID != $current_User->ID)
  59.      || isset($grp_ID) )
  60.     // User is trying to edit something he should not: add error message (Should be prevented by UI)
  61.         $Messages->addT_('You have no permission to view other users or groups!')'error' );
  62.     }
  63.  
  64.     // Make sure the user only edits himself:
  65.     $user_ID $current_User->ID;
  66.     $grp_ID NULL;
  67.     ifin_array$actionarray'userupdate''edit_user''default_settings' ) ) )
  68.     {
  69.         $action 'edit_user';
  70.     }
  71. }
  72.  
  73. /*
  74.  * Load editable objects and set $action (while checking permissions)
  75.  */
  76.  
  77. $UserCache get_Cache'UserCache' );
  78. $GroupCache get_Cache'GroupCache' );
  79.  
  80. ifis_null($user_ID) )
  81. // User selected
  82.     if$action == 'userupdate' && $user_ID == )
  83.     // we create a new user
  84.         $edited_User new User();
  85.         $edited_User->set_datecreated$localtimenow );
  86.     }
  87.     elseif( ($edited_User $UserCache->get_by_ID$user_IDfalse )) === false )
  88.     {    // We could not find the User to edit:
  89.         unset$edited_User );
  90.         forget_param'user_ID' );
  91.         $Messages->head T_('Cannot edit user!');
  92.         $Messages->addT_('Requested user does not exist any longer.')'error' );
  93.         $action 'list';
  94.     }
  95.     elseif$action == 'list' )
  96.     // 'list' is default, $user_ID given
  97.         if$user_ID == $current_User->ID || $current_User->check_perm'users''edit' ) )
  98.         {
  99.             $action 'edit_user';
  100.         }
  101.         else
  102.         {
  103.             $action 'view_user';
  104.         }
  105.     }
  106.  
  107.     if$action != 'view_user' && $action != 'list' )
  108.     // check edit permissions
  109.         if$current_User->check_perm'users''edit' )
  110.             && $edited_User->ID != $current_User->ID )
  111.         // user is only allowed to _view_ other user's profiles
  112.             $Messages->addT_('You have no permission to edit other users!')'error' );
  113.             $action 'view_user';
  114.         }
  115.         elseif$demo_mode )
  116.         // Demo mode restrictions: admin/demouser/demoblogger/demospecial cannot be edited
  117.             if$edited_User->ID == 1
  118.                 || $edited_User->login == 'demouser'
  119.                 || $edited_User->login == 'demoblogger'
  120.                 || $edited_User->login == 'demospecial' )
  121.             {
  122.                 $Messages->addT_('Demo mode: you cannot edit the admin\'s or any demo-name\'s profile!')'error' );
  123.  
  124.                 ifstrpos$action'delete_' === || $action == 'promote' )
  125.                 // Fallback to list/view action
  126.                     $action 'list';
  127.                 }
  128.                 else
  129.                 {
  130.                     $action 'view_user';
  131.                 }
  132.             }
  133.         }
  134.     }
  135. }
  136. elseif$grp_ID !== NULL )
  137. // Group selected
  138.     if$action == 'groupupdate' && $grp_ID == )
  139.     // New Group:
  140.         $edited_Group new Group();
  141.     }
  142.     elseif( ($edited_Group $GroupCache->get_by_ID$grp_IDfalse )) === false )
  143.     // We could not find the Group to edit:
  144.         unset$edited_Group );
  145.         forget_param'grp_ID' );
  146.         $Messages->head T_('Cannot edit group!');
  147.         $Messages->addT_('Requested group does not exist any longer.')'error' );
  148.         $action 'list';
  149.     }
  150.     elseif$action == 'list' )
  151.     // 'list' is default, $grp_ID given
  152.         if$current_User->check_perm'users''edit' ) )
  153.         {
  154.             $action 'edit_group';
  155.         }
  156.         else
  157.         {
  158.             $action 'view_group';
  159.         }
  160.     }
  161.  
  162.     if$action != 'view_group' && $action != 'list' )
  163.     // check edit permissions
  164.         if!$current_User->check_perm'users''edit' ) )
  165.         {
  166.             $Messages->addT_('You have no permission to edit groups!')'error' );
  167.             $action 'view_group';
  168.         }
  169.         elseif$demo_mode )
  170.         // Additional checks for demo mode: no changes to admin's and demo<name>'s group allowed
  171.             $admin_User $UserCache->get_by_ID(1);
  172.             $demo_User $UserCache->get_by_login('demouser');
  173.             $blogger_User $UserCache->get_by_login('demoblogger');
  174.             $special_User $UserCache->get_by_login('demospecial');
  175.             if$edited_Group->ID == $admin_User->Group->ID
  176.                 || $edited_Group->ID == $demo_User->group_ID
  177.                 || $edited_Group->ID == $blogger_User->group_ID
  178.                 || $edited_Group->ID == $special_User->group_ID )
  179.             {
  180.                 $Messages->addT_('You cannot edit the groups of user &laquo;admin&raquo; or any &laquo;demo-name&raquo; in demo mode!')'error' );
  181.                 $action 'view_group';
  182.             }
  183.         }
  184.     }
  185. }
  186.  
  187.  
  188. /*
  189.  * Perform actions, if there were no errors:
  190.  */
  191. if!$Messages->count('error') )
  192. // no errors
  193.     switch$action )
  194.     {
  195.         case 'new_user':
  196.             // We want to create a new user:
  197.             ifisset$edited_User ) )
  198.             // We want to use a template
  199.                 $new_User $edited_User// Copy !
  200.                 $new_User->set'ID');
  201.                 $edited_User $new_User;
  202.             }
  203.             else
  204.             // We use an empty user:
  205.                 $edited_User new User();
  206.             }
  207.  
  208.             // Determine if the user must validate before using the system:
  209.             $edited_User->set'validated'$Settings->get('newusers_mustvalidate') );
  210.             break;
  211.  
  212.  
  213.         case 'change_admin_template':
  214.             // Template switch from menu
  215.             param'new_admin_template''string'true );
  216.         param'redirect_to''string''' );
  217.  
  218.         $UserSettings->set'admin_template'$new_admin_template );
  219.             $UserSettings->dbupdate();
  220.             $Messages->addsprintfT_('Admin template changed to &laquo;%s&raquo;')$new_admin_template )'success' );
  221.  
  222.       header_nocache();
  223.             header_redirect();
  224.             /* EXITED */
  225.             break;
  226.  
  227.  
  228.         case 'userupdate':
  229.             // Update existing user OR create new user:
  230.             ifempty($edited_User|| !is_object($edited_User) )
  231.             {
  232.                 $Messages->add'No user set!' )// Needs no translation, should be prevented by UI.
  233.                 $action 'list';
  234.                 break;
  235.             }
  236.  
  237.             $reload_page false// We set it to true, if a setting changes that needs a page reload (locale, admin template, ..)
  238.  
  239.             if!$current_User->check_perm'users''edit' && $edited_User->ID != $current_User->ID )
  240.             // user is only allowed to update him/herself
  241.                 $Messages->addT_('You are only allowed to update your own profile!')'error' );
  242.                 $action 'view_user';
  243.                 break;
  244.             }
  245.  
  246.             param'edited_user_login''string' );
  247.             param_check_not_empty'edited_user_login'T_('You must provide a login!') );
  248.             // We want all logins to be lowercase to guarantee uniqueness regardless of the database case handling for UNIQUE indexes:
  249.             $edited_user_login strtolower$edited_user_login );
  250.  
  251.             if$current_User->check_perm'users''edit' ) )
  252.             // changing level/group is allowed (not in profile mode)
  253.                 param_integer_range'edited_user_level'010T_('User level must be between %d and %d.') );
  254.                 $edited_User->set'level'$edited_user_level );
  255.  
  256.                 param'edited_user_validated''integer');
  257.                 if$edited_User->set'validated'$edited_user_validated && $edited_User->ID == $current_User->ID )
  258.                 // validated value has changed for the current user
  259.                     $reload_page true;
  260.                 }
  261.                 param'edited_user_grp_ID''integer'true );
  262.                 $edited_user_Group $GroupCache->get_by_ID$edited_user_grp_ID );
  263.                 $edited_User->set_Group$edited_user_Group );
  264.                 // $edited_User->Group->disp('name');
  265.             }
  266.  
  267.             // check if new login already exists for another user_ID
  268.             $query '
  269.                 SELECT user_ID
  270.                   FROM T_users
  271.                  WHERE user_login = '.$DB->quote($edited_user_login).'
  272.                    AND user_ID != '.$edited_User->ID;
  273.             if$q $DB->get_var$query ) )
  274.             {
  275.                 param_error'edited_user_login',
  276.                     sprintfT_('This login already exists. Do you want to <a %s>edit the existing user</a>?'),
  277.                         'href="?ctrl=users&amp;user_ID='.$q.'"' ) );
  278.             }
  279.  
  280.             param'edited_user_firstname''string'true );
  281.             param'edited_user_lastname''string'true );
  282.  
  283.             param'edited_user_nickname''string'true );
  284.             param_check_not_empty'edited_user_nickname'T_('Please enter a nickname (can be the same as your login).') );
  285.  
  286.             param'edited_user_idmode''string'true );
  287.             param'edited_user_locale''string'true );
  288.  
  289.             param'edited_user_email''string'true );
  290.             param_check_not_empty'edited_user_email'T_('Please enter an e-mail address.') );
  291.             param_check_email'edited_user_email'true );
  292.  
  293.             param'edited_user_url''string'true );
  294.             param_check_url'edited_user_url''commenting' );
  295.  
  296.             param'edited_user_allow_msgform''integer');
  297.             param'edited_user_notify''integer');
  298.             param'edited_user_showonline''integer');
  299.             param'edited_user_set_login_multiple_sessions''integer');
  300.  
  301.             param'edited_user_pass1''string'true );
  302.             param'edited_user_pass2''string'true );
  303.             ifparam_check_passwords'edited_user_pass1''edited_user_pass2'($edited_User->ID == 0) ) ) // required for new users
  304.             // passwords not the same or empty: empty them for the form
  305.                 $edited_user_pass1 '';
  306.                 $edited_user_pass2 '';
  307.             }
  308.  
  309.             $edited_User->set'login'$edited_user_login );
  310.             $edited_User->set'firstname'$edited_user_firstname );
  311.             $edited_User->set'lastname'$edited_user_lastname );
  312.             $edited_User->set'nickname'$edited_user_nickname );
  313.             $edited_User->set'idmode'$edited_user_idmode );
  314.             if$edited_User->set'locale'$edited_user_locale && $edited_User->ID == $current_User->ID )
  315.             // locale value has changed for the current user
  316.                 $reload_page true;
  317.             }
  318.             $edited_User->set'email'$edited_user_email );
  319.             $edited_User->set'url'$edited_user_url );
  320.             $edited_User->set'allow_msgform'$edited_user_allow_msgform );
  321.             $edited_User->set'notify'$edited_user_notify );
  322.             $edited_User->set'showonline'$edited_user_showonline );
  323.  
  324.             // Features
  325.             param'edited_user_admin_template''string'true );
  326.             param_integer_range'edited_user_action_icon_threshold'15T_('The threshold must be between 1 and 5.') );
  327.             param_integer_range'edited_user_action_word_threshold'15T_('The threshold must be between 1 and 5.') );
  328.             param'edited_user_legend''integer');
  329.             param'edited_user_bozo''integer');
  330.             param'edited_user_focusonfirst''integer');
  331.             param'edited_user_results_per_page''integer'null );
  332.             param'edited_user_num_admin_blogs''integer'null );
  333.  
  334.             /**
  335.              * @todo EdB: probably don't need the messages->count(error) bit
  336.              *  but it doesn't hurt and can be removed later by someone smart.
  337.              *  A bunch of "experimental user field" stuff used to be here ...
  338.              */
  339.  
  340.             if$Messages->count'error' ) )
  341.             {    // We have found validation errors:
  342.                 $action 'edit_user';
  343.                 break;
  344.             }
  345.  
  346.             // OK, no error.
  347.             $new_pass '';
  348.  
  349.             if!empty($edited_user_pass2) )
  350.             // Password provided, we must encode it
  351.                 $new_pass md5$edited_user_pass2 );
  352.  
  353.                 $edited_User->set'pass'$new_pass )// set password
  354.             }
  355.  
  356.             if$edited_User->ID != )
  357.             // Commit update to the DB:
  358.                 $update_r $edited_User->dbupdate();
  359.  
  360.                 if$edited_User->ID == $current_User->ID )
  361.                 // User updates his profile:
  362.                     if$update_r )
  363.                     {
  364.                         $Messages->addT_('Your profile has been updated.')'success' );
  365.                     }
  366.                     else
  367.                     {
  368.                         $Messages->addT_('Your profile has not been changed.')'note' );
  369.                     }
  370.                 }
  371.                 else
  372.                 {
  373.                     $Messages->addT_('User updated.')'success' );
  374.                 }
  375.             }
  376.             else
  377.             // Insert user into DB
  378.                 $edited_User->dbinsert();
  379.                 $Messages->addT_('New user created.')'success' );
  380.             }
  381.  
  382.             // Now that the User exists in the DB and has an ID, update the settings:
  383.  
  384.             $UserSettings->set'login_multiple_sessions'$edited_user_set_login_multiple_sessions$edited_User->ID );
  385.  
  386.             if$UserSettings->set'admin_template'$edited_user_admin_template$edited_User->ID )
  387.                     && ($edited_User->ID == $current_User->ID) )
  388.             // admin_template has changed or was set the first time for the current user
  389.                 $reload_page true;
  390.             }
  391.  
  392.             // Action icon params:
  393.             $UserSettings->set'action_icon_threshold'$edited_user_action_icon_threshold$edited_User->ID );
  394.             $UserSettings->set'action_word_threshold'$edited_user_action_word_threshold$edited_User->ID );
  395.             $UserSettings->set'display_icon_legend'$edited_user_legend$edited_User->ID );
  396.  
  397.             // Set bozo validador activation
  398.             $UserSettings->set'control_form_abortions'$edited_user_bozo$edited_User->ID );
  399.  
  400.             // Focus on first
  401.             $UserSettings->set'focus_on_first_input'$edited_user_focusonfirst$edited_User->ID );
  402.  
  403.             // Results per page
  404.             ifisset($edited_user_results_per_page) )
  405.             {
  406.                 $UserSettings->set'results_per_page'$edited_user_results_per_page$edited_User->ID );
  407.             }
  408.             // Number of blogs to display in admin
  409.             ifisset($edited_user_num_admin_blogs) )
  410.             {
  411.                 $UserSettings->set'num_admin_blogs'$edited_user_num_admin_blogs$edited_User->ID );
  412.             }
  413.  
  414.             // Update user settings:
  415.             if$UserSettings->dbupdate() )
  416.             {
  417.                 $Messages->addT_('User feature settings have been changed.')'success');
  418.             }
  419.  
  420.             // PluginUserSettings
  421.             load_funcs('plugins/_plugin.funcs.php');
  422.  
  423.             $any_plugin_settings_updated false;
  424.             $Plugins->restart();
  425.             while$loop_Plugin $Plugins->get_next() )
  426.             {
  427.                 $pluginusersettings $loop_Plugin->GetDefaultUserSettings$tmp_params array('for_editing'=>true) );
  428.                 ifempty($pluginusersettings) )
  429.                 {
  430.                     continue;
  431.                 }
  432.  
  433.                 // Loop through settings for this plugin:
  434.                 foreach$pluginusersettings as $set_name => $set_meta )
  435.                 {
  436.                     autoform_set_param_from_request$set_name$set_meta$loop_Plugin'UserSettings'$edited_User );
  437.                 }
  438.  
  439.                 // Let the plugin handle custom fields:
  440.                 $ok_to_update $Plugins->call_method$loop_Plugin->ID'PluginUserSettingsUpdateAction'$tmp_params array(
  441.                     'User' => $edited_User'action' => 'save' ) );
  442.  
  443.                 if$ok_to_update === false )
  444.                 {
  445.                     $loop_Plugin->UserSettings->reset();
  446.                 }
  447.                 elseif$loop_Plugin->UserSettings->dbupdate() )
  448.                 {
  449.                     $any_plugin_settings_updated true;
  450.                 }
  451.             }
  452.             if$any_plugin_settings_updated )
  453.             {
  454.                 $Messages->addT_('Usersettings of Plugins have been updated.')'success' );
  455.             }
  456.  
  457.             if$user_profile_only )
  458.             {
  459.                 $action 'edit_user';
  460.             }
  461.  
  462.             if$reload_page )
  463.             // reload the current page through header redirection:
  464.                 if$action != 'edit_user' )
  465.                 {
  466.                     $action 'list';
  467.                 }
  468.                 header_redirectregenerate_url'''user_ID='.$edited_User->ID.'&action='.$action'''&' ) )// will save $Messages into Session
  469.             }
  470.             break;
  471.  
  472.  
  473.         case 'default_settings':
  474.             $reload_page false// We set it to true, if a setting changes that needs a page reload (locale, admin template, ..)
  475.  
  476.             // Admin template:
  477.             $cur_admin_template $UserSettings->get('admin_template');
  478.  
  479.             $UserSettings->delete'admin_template'$edited_User->ID );
  480.             if$cur_admin_template
  481.                     && $UserSettings->get('admin_template'$edited_User->ID != $cur_admin_template
  482.                     && ($edited_User->ID == $current_User->ID) )
  483.             // admin_template has changed:
  484.                 $reload_page true;
  485.             }
  486.  
  487.             // Remove all UserSettings where a default exists:
  488.             foreach$UserSettings->_defaults as $k => $v )
  489.             {
  490.                 $UserSettings->delete$k$edited_User->ID );
  491.             }
  492.  
  493.             // Update user settings:
  494.             if$UserSettings->dbupdate() ) $Messages->addT_('User feature settings have been changed.')'success');
  495.  
  496.             // PluginUserSettings
  497.             $any_plugin_settings_updated false;
  498.             $Plugins->restart();
  499.             while$loop_Plugin $Plugins->get_next() )
  500.             {
  501.                 $pluginusersettings $loop_Plugin->GetDefaultUserSettings$tmp_params array('for_editing'=>true) );
  502.  
  503.                 ifempty($pluginusersettings) )
  504.                 {
  505.                     continue;
  506.                 }
  507.  
  508.                 foreach$pluginusersettings as $k => $l_meta )
  509.                 {
  510.                     ifisset($l_meta['layout']|| empty($l_meta['no_edit']) )
  511.                     // a layout "setting" or not for editing
  512.                         continue;
  513.                     }
  514.  
  515.                     $loop_Plugin->UserSettings->delete($k$edited_User->ID);
  516.                 }
  517.  
  518.                 // Let the plugin handle custom fields:
  519.                 $ok_to_update $Plugins->call_method$loop_Plugin->ID'PluginUserSettingsUpdateAction'$tmp_params array(
  520.                     'User' => $edited_User'action' => 'reset' ) );
  521.  
  522.                 if$ok_to_update === false )
  523.                 {
  524.                     $loop_Plugin->UserSettings->reset();
  525.                 }
  526.                 elseif$loop_Plugin->UserSettings->dbupdate() )
  527.                 {
  528.                     $any_plugin_settings_updated true;
  529.                 }
  530.             }
  531.             if$any_plugin_settings_updated )
  532.             {
  533.                 $Messages->addT_('Usersettings of Plugins have been updated.')'success' );
  534.             }
  535.  
  536.             // Always display the profile again:
  537.             $action 'edit_user';
  538.  
  539.             if$reload_page )
  540.             // reload the current page through header redirection:
  541.                 header_redirectregenerate_url'''user_ID='.$edited_User->ID.'&action='.$action'''&' ) )// will save $Messages into Session
  542.             }
  543.             break;
  544.  
  545.  
  546.         case 'promote':
  547.             param'prom''string'true );
  548.  
  549.             if!isset($edited_User)
  550.                 || in_array$promarray('up''down') )
  551.                 || $prom == 'up' && $edited_User->get('level')
  552.                 || $prom == 'down' && $edited_User->get('level')
  553.               )
  554.             {
  555.                 $Messages->addT_('Invalid promotion.')'error' );
  556.             }
  557.             else
  558.             {
  559.                 $sql '
  560.                     UPDATE T_users
  561.                        SET user_level = user_level '.$prom == 'up' '+' '-' ).' 1
  562.                      WHERE user_ID = '.$edited_User->ID;
  563.  
  564.                 if$DB->query$sql ) )
  565.                 {
  566.                     $Messages->addT_('User level changed.')'success' );
  567.                 }
  568.                 else
  569.                 {
  570.                     $Messages->addsprintf'Couldn\'t change %s\'s level.'$edited_User->login )'error' );
  571.                 }
  572.             }
  573.             break;
  574.  
  575.  
  576.         case 'delete_user':
  577.             /*
  578.              * Delete user
  579.              */
  580.             if!isset($edited_User) )
  581.                 debug_die'no User set' );
  582.  
  583.             if$edited_User->ID == $current_User->ID )
  584.             {
  585.                 $Messages->addT_('You can\'t delete yourself!')'error' );
  586.                 $action 'view_user';
  587.                 break;
  588.             }
  589.             if$edited_User->ID == )
  590.             {
  591.                 $Messages->addT_('You can\'t delete User #1!')'error' );
  592.                 $action 'view_user';
  593.                 break;
  594.             }
  595.  
  596.             $fullname $edited_User->dget'fullname' );
  597.             ifparam'confirm''integer') )
  598.             // confirmed, Delete from DB:
  599.                 if empty$fullname ) )
  600.                 {
  601.                     $msg sprintfT_('User &laquo;%s&raquo; [%s] deleted.')$fullname$edited_User->dget'login' ) );
  602.                 }
  603.                 else
  604.                 {
  605.                     $msg sprintfT_('User &laquo;%s&raquo; deleted.')$edited_User->dget'login' ) );
  606.                 }
  607.  
  608.                 $edited_User->dbdelete$Messages );
  609.                 unset($edited_User);
  610.                 forget_param('user_ID');
  611.                 $Messages->add$msg'success' );
  612.                 $action 'list';
  613.             }
  614.             else
  615.             {    // not confirmed, Check for restrictions:
  616.                 memorize_param'user_ID''integer'true );
  617.                 if empty$fullname ) )
  618.                 {
  619.                     $msg sprintfT_('Cannot delete User &laquo;%s&raquo; [%s]')$fullname$edited_User->dget'login' ) );
  620.                 }
  621.                 else
  622.                 {
  623.                     $msg sprintfT_('Cannot delete User &laquo;%s&raquo;')$edited_User->dget'login' ) );
  624.                 }
  625.  
  626.                 if$edited_User->check_delete$msg ) )
  627.                 {    // There are restrictions:
  628.                     $action 'view_user';
  629.                 }
  630.             }
  631.             break;
  632.  
  633.  
  634.         case 'del_settings_set':
  635.             // Delete a set of an array type setting:
  636.             param'plugin_ID''integer'true );
  637.             param'set_path' );
  638.  
  639.             $admin_Plugins get_Cache('Plugins_admin');
  640.             $admin_Plugins->restart();
  641.             $edit_Plugin $admin_Plugins->get_by_ID($plugin_ID);
  642.  
  643.             load_funcs('plugins/_plugin.funcs.php');
  644.             _set_setting_by_path$edit_Plugin'UserSettings'$set_pathNULL );
  645.  
  646.             $edit_Plugin->Settings->dbupdate();
  647.  
  648.             $action 'edit_user';
  649.  
  650.             break;
  651.  
  652.  
  653.         case 'add_settings_set'// delegates to edit_settings
  654.             // Add a new set to an array type setting:
  655.             param'plugin_ID''integer'true );
  656.             param'set_path''string''' );
  657.  
  658.             $admin_Plugins get_Cache('Plugins_admin');
  659.             $admin_Plugins->restart();
  660.             $edit_Plugin $admin_Plugins->get_by_ID($plugin_ID);
  661.  
  662.             load_funcs('plugins/_plugin.funcs.php');
  663.             _set_setting_by_path$edit_Plugin'UserSettings'$set_patharray() );
  664.  
  665.             $edit_Plugin->Settings->dbupdate();
  666.  
  667.             $action 'edit_user';
  668.  
  669.             break;
  670.  
  671.  
  672.         // ---- GROUPS --------------------------------------------------------------------------------------
  673.  
  674.         case 'new_group':
  675.             // We want to create a new group:
  676.             ifisset$edited_Group ) )
  677.             // We want to use a template
  678.                 $new_Group $edited_Group// Copy !
  679.                 $new_Group->set'ID');
  680.                 $edited_Group $new_Group;
  681.             }
  682.             else
  683.             // We use an empty group:
  684.                 $edited_Group new Group();
  685.             }
  686.             break;
  687.  
  688.  
  689.         case 'groupupdate':
  690.             ifempty($edited_Group|| !is_object($edited_Group) )
  691.             {
  692.                 $Messages->add'No group set!' )// Needs no translation, should be prevented by UI.
  693.                 $action 'list';
  694.                 break;
  695.             }
  696.             param'edited_grp_name''string' );
  697.  
  698.             param_check_not_empty'edited_grp_name'T_('You must provide a group name!') );
  699.  
  700.             // check if the group name already exists for another group
  701.             $query 'SELECT grp_ID FROM T_groups
  702.                        WHERE grp_name = '.$DB->quote($edited_grp_name).'
  703.                          AND grp_ID != '.$edited_Group->ID;
  704.             if$q $DB->get_var$query ) )
  705.             {
  706.                 param_error'edited_grp_name',
  707.                     sprintfT_('This group name already exists! Do you want to <a %s>edit the existing group</a>?'),
  708.                         'href="?ctrl=users&amp;grp_ID='.$q.'"' ) );
  709.             }
  710.  
  711.             $edited_Group->set'name'$edited_grp_name );
  712.  
  713.             $edited_Group->set'perm_blogs'param'edited_grp_perm_blogs''string'true ) );
  714.             $edited_Group->set'perm_bypass_antispam'param'apply_antispam''integer');
  715.             $edited_Group->set'perm_xhtmlvalidation'param'perm_xhtmlvalidation''string'true ) );
  716.             $edited_Group->set'perm_xhtmlvalidation_xmlrpc'param'perm_xhtmlvalidation_xmlrpc''string'true ) );
  717.             $edited_Group->set'perm_xhtml_css_tweaks'param'prevent_css_tweaks''integer');
  718.             $edited_Group->set'perm_xhtml_iframes'param'prevent_iframes''integer');
  719.             $edited_Group->set'perm_xhtml_javascript'param'prevent_javascript''integer');
  720.             $edited_Group->set'perm_xhtml_objects'param'prevent_objects''integer');
  721.             $edited_Group->set'perm_spamblacklist'param'edited_grp_perm_spamblacklist''string'true ) );
  722.             $edited_Group->set'perm_templates'param'edited_grp_perm_templates''integer') );
  723.             $edited_Group->set'perm_stats'param'edited_grp_perm_stats''string'true ) );
  724.             $edited_Group->set'perm_options'param'edited_grp_perm_options''string'true ) );
  725.             $edited_Group->set'perm_files'param'edited_grp_perm_files''string'true ) );
  726.  
  727.             if$edited_Group->ID != )
  728.             // Groups others than #1 can be prevented from logging in or editing users
  729.                 $edited_Group->set'perm_admin'param'edited_grp_perm_admin''string'true ) );
  730.                 $edited_Group->set'perm_users'param'edited_grp_perm_users''string'true ) );
  731.             }
  732.  
  733.             if$Messages->count'error' ) )
  734.             {    // We have found validation errors:
  735.                 $action 'edit_group';
  736.                 break;
  737.             }
  738.  
  739.             if$edited_Group->ID == )
  740.             // Insert into the DB:
  741.                 $edited_Group->dbinsert();
  742.                 $Messages->addT_('New group created.')'success' );
  743.             }
  744.             else
  745.             // Commit update to the DB:
  746.                 $edited_Group->dbupdate();
  747.                 $Messages->addT_('Group updated.')'success' );
  748.             }
  749.             // Commit changes in cache:
  750.             $GroupCache->add$edited_Group );
  751.             break;
  752.  
  753.  
  754.         case 'delete_group':
  755.             /*
  756.              * Delete group
  757.              */
  758.             if!isset($edited_Group) )
  759.                 debug_die'no Group set' );
  760.  
  761.             if$edited_Group->ID == )
  762.             {
  763.                 $Messages->addT_('You can\'t delete Group #1!')'error' );
  764.                 $action 'view_group';
  765.                 break;
  766.             }
  767.             if$edited_Group->ID == $Settings->get('newusers_grp_ID' ) )
  768.             {
  769.                 $Messages->addT_('You can\'t delete the default group for new users!')'error' );
  770.                 $action 'view_group';
  771.                 break;
  772.             }
  773.  
  774.             ifparam'confirm''integer') )
  775.             // confirmed, Delete from DB:
  776.                 $msg sprintfT_('Group &laquo;%s&raquo; deleted.')$edited_Group->dget'name' ) );
  777.                 $edited_Group->dbdelete$Messages );
  778.                 unset($edited_Group);
  779.                 forget_param('grp_ID');
  780.                 $Messages->add$msg'success' );
  781.                 $action 'list';
  782.             }
  783.             else
  784.             {    // not confirmed, Check for restrictions:
  785.                 memorize_param'grp_ID''integer'true );
  786.                 if$edited_Group->check_deletesprintfT_('Cannot delete Group &laquo;%s&raquo;')$edited_Group->dget'name' ) ) ) )
  787.                 {    // There are restrictions:
  788.                     $action 'view_group';
  789.                 }
  790.             }
  791.             break;
  792.     }
  793. }
  794.  
  795.  
  796. // We might delegate to this action from above:
  797. if$action == 'edit_user' )
  798. {
  799.     $Plugins->trigger_event'PluginUserSettingsEditAction'$tmp_params array'User' => $edited_User ) );
  800.  
  801.     $Session->delete'core.changepwd.request_id' )// delete the request_id for password change request (from /qp_srvc/login.php)
  802. }
  803.  
  804.  
  805. // Display <html><head>...</head> section! (Note: should be done early if actions do not redirect)
  806. $AdminUI->disp_html_head();
  807.  
  808. // Display title, menu, messages, etc. (Note: messages MUST be displayed AFTER the actions)
  809. $AdminUI->disp_body_top();
  810.  
  811.  
  812. /*
  813.  * Display appropriate payload:
  814.  */
  815. switch$action )
  816. {
  817.     case 'nil':
  818.         // Display NO payload!
  819.         break;
  820.  
  821.  
  822.         case 'delete_user':
  823.             // We need to ask for confirmation:
  824.             $fullname $edited_User->dget'fullname' );
  825.             if empty$fullname ) )
  826.             {
  827.                 $msg sprintfT_('Delete user &laquo;%s&raquo; [%s]?')$fullname$edited_User->dget'login' ) );
  828.             }
  829.             else
  830.             {
  831.                 $msg sprintfT_('Delete user &laquo;%s&raquo;?')$edited_User->dget'login' ) );
  832.             }
  833.  
  834.             $edited_User->confirm_delete$msg$actionget_memorized'action' ) );
  835.         case 'new_user':
  836.         case 'view_user':
  837.         case 'edit_user':
  838.             // Display user form:
  839.             $AdminUI->disp_view'users/views/_user.form.php' );
  840.             break;
  841.  
  842.  
  843.         case 'delete_group':
  844.             // We need to ask for confirmation:
  845.             $edited_Group->confirm_delete(
  846.                     sprintfT_('Delete group &laquo;%s&raquo;?')$edited_Group->dget'name' ) ),
  847.                     $actionget_memorized'action' ) );
  848.         case 'new_group':
  849.         case 'edit_group':
  850.         case 'view_group':
  851.             // Display group form:
  852.             $AdminUI->disp_view'users/views/_group.form.php' );
  853.             break;
  854.  
  855.  
  856.     case 'promote':
  857.     default:
  858.         // Display user list:
  859.         // NOTE: we don't want this (potentially very long) list to be displayed again and again)
  860.         $AdminUI->disp_payload_begin();
  861.         $AdminUI->disp_view'users/views/_user_list.view.php' );
  862.         $AdminUI->disp_payload_end();
  863. }
  864.  
  865.  
  866. // Display body bottom, debug info and close </html>:
  867. $AdminUI->disp_global_footer();
  868.  
  869. ?>