1163ac707SMichael Wilmes<?php 2163ac707SMichael Wilmes/* 3163ac707SMichael Wilmes * Twofactor Manager 4163ac707SMichael Wilmes * 5163ac707SMichael Wilmes * Dokuwiki Admin Plugin 6163ac707SMichael Wilmes * Special thanks to the useradmin extension as a starting point for this class 7163ac707SMichael Wilmes * 8163ac707SMichael Wilmes * @author Mike Wilmes <mwilmes@avc.edu> 9163ac707SMichael Wilmes */ 10163ac707SMichael Wilmes// must be run within Dokuwiki 11163ac707SMichael Wilmesif(!defined('DOKU_INC')) die(); 12163ac707SMichael Wilmes 13163ac707SMichael Wilmesif(!defined('DOKU_TWOFACTOR_PLUGIN_IMAGES')) define('DOKU_TWOFACTOR_PLUGIN_IMAGES',DOKU_BASE.'lib/plugins/twofactor/images/'); 14163ac707SMichael Wilmes 15163ac707SMichael Wilmes/** 16163ac707SMichael Wilmes * All DokuWiki plugins to extend the admin function 17163ac707SMichael Wilmes * need to inherit from this class 18163ac707SMichael Wilmes */ 19163ac707SMichael Wilmesclass admin_plugin_twofactor extends DokuWiki_Admin_Plugin { 20*2cc41bddSMichael Wilmes protected $_user_list = array(); // list of users with attributes 21163ac707SMichael Wilmes protected $_filter = array(); // user selection filter(s) 22163ac707SMichael Wilmes protected $_start = 0; // index of first user to be displayed 23163ac707SMichael Wilmes protected $_last = 0; // index of the last user to be displayed 24163ac707SMichael Wilmes protected $_pagesize = 20; // number of users to list on one page 25163ac707SMichael Wilmes protected $_disabled = ''; // if disabled set to explanatory string 26163ac707SMichael Wilmes protected $_lastdisabled = false; // set to true if last user is unknown and last button is hence buggy 27163ac707SMichael Wilmes 28163ac707SMichael Wilmes /** 29163ac707SMichael Wilmes * Constructor 30163ac707SMichael Wilmes */ 31163ac707SMichael Wilmes public function __construct(){ 32163ac707SMichael Wilmes global $auth; 33*2cc41bddSMichael Wilmes 34a675b66fSMichael Wilmes $this->setupLocale(); 35*2cc41bddSMichael Wilmes 36163ac707SMichael Wilmes if (!isset($auth)) { 37163ac707SMichael Wilmes $this->_disabled = $this->lang['noauth']; 38163ac707SMichael Wilmes } 39*2cc41bddSMichael Wilmes 40890553cfSMichael Wilmes $requireAttribute = $this->getConf("enable") === 1; 417e44460aSMichael Wilmes $this->attribute = $requireAttribute ? $this->loadHelper('attribute', 'TwoFactor depends on the Attribute plugin, but the Attribute plugin is not installed!') : null; 42185a84e4SMichael Wilmes 43185a84e4SMichael Wilmes $available = Twofactor_Auth_Module::_listModules(); 44185a84e4SMichael Wilmes $allmodules = Twofactor_Auth_Module::_loadModules($available); 45185a84e4SMichael Wilmes $failed = array_diff($available, array_keys($allmodules)); 46185a84e4SMichael Wilmes if (count($failed) > 0) { 47185a84e4SMichael Wilmes msg('At least one loaded module did not have a properly named class.' . ' ' . implode(', ', $failed), -1); 48185a84e4SMichael Wilmes } 49185a84e4SMichael Wilmes $this->modules = &$allmodules; 50163ac707SMichael Wilmes $this->_getUsers(); 51163ac707SMichael Wilmes } 5261ed09c1SMichael Wilmes 53163ac707SMichael Wilmes protected function _getUsers() { 544a341b06SMichael Wilmes if ($this->getConf("enable") === 1) { 55163ac707SMichael Wilmes if (!is_null($this->attribute)) { 56163ac707SMichael Wilmes $attr = $this->attribute; 57163ac707SMichael Wilmes $this->_user_list = $this->attribute->enumerateUsers('twofactor'); 58163ac707SMichael Wilmes } 59163ac707SMichael Wilmes else { 60163ac707SMichael Wilmes msg($this->lang['no_purpose'], -1); 61163ac707SMichael Wilmes } 62163ac707SMichael Wilmes } 634a341b06SMichael Wilmes } 64163ac707SMichael Wilmes 65163ac707SMichael Wilmes /** 66163ac707SMichael Wilmes * Return prompt for admin menu 67163ac707SMichael Wilmes * 68163ac707SMichael Wilmes * @param string $language 69163ac707SMichael Wilmes * @return string 70163ac707SMichael Wilmes */ 71163ac707SMichael Wilmes public function getMenuText($language) { 72163ac707SMichael Wilmes global $INFO; 73163ac707SMichael Wilmes if (!$INFO['isadmin']) 74163ac707SMichael Wilmes return parent::getMenuText($language); 75163ac707SMichael Wilmes 76163ac707SMichael Wilmes return $this->getLang('menu').' '.$this->_disabled; 77163ac707SMichael Wilmes } 78163ac707SMichael Wilmes 79163ac707SMichael Wilmes /** 80163ac707SMichael Wilmes * return sort order for position in admin menu 81163ac707SMichael Wilmes * 82163ac707SMichael Wilmes * @return int 83163ac707SMichael Wilmes */ 84163ac707SMichael Wilmes public function getMenuSort() { 85163ac707SMichael Wilmes return 2; 86163ac707SMichael Wilmes } 87163ac707SMichael Wilmes 88163ac707SMichael Wilmes /** 89163ac707SMichael Wilmes * @return int current start value for pageination 90163ac707SMichael Wilmes */ 91163ac707SMichael Wilmes public function getStart() { 92163ac707SMichael Wilmes return $this->_start; 93163ac707SMichael Wilmes } 94163ac707SMichael Wilmes 95163ac707SMichael Wilmes /** 96163ac707SMichael Wilmes * @return int number of users per page 97163ac707SMichael Wilmes */ 98163ac707SMichael Wilmes public function getPagesize() { 99163ac707SMichael Wilmes return $this->_pagesize; 100163ac707SMichael Wilmes } 101163ac707SMichael Wilmes 102163ac707SMichael Wilmes /** 103163ac707SMichael Wilmes * @param boolean $lastdisabled 104163ac707SMichael Wilmes */ 105163ac707SMichael Wilmes public function setLastdisabled($lastdisabled) { 106163ac707SMichael Wilmes $this->_lastdisabled = $lastdisabled; 107163ac707SMichael Wilmes } 108163ac707SMichael Wilmes 109163ac707SMichael Wilmes /** 110163ac707SMichael Wilmes * Handle user request 111163ac707SMichael Wilmes * 112163ac707SMichael Wilmes * @return bool 113163ac707SMichael Wilmes */ 114163ac707SMichael Wilmes public function handle() { 115163ac707SMichael Wilmes global $INPUT, $INFO; 116163ac707SMichael Wilmes if (!$INFO['isadmin']) return false; 117b71db9c8SMichael Wilmes if ($this->_disabled) { 118b71db9c8SMichael Wilmes // If disabled, don't process anything. 119b71db9c8SMichael Wilmes return true; 120b71db9c8SMichael Wilmes } 121163ac707SMichael Wilmes 122163ac707SMichael Wilmes // extract the command and any specific parameters 123163ac707SMichael Wilmes // submit button name is of the form - fn[cmd][param(s)] 124163ac707SMichael Wilmes $fn = $INPUT->param('fn'); 125163ac707SMichael Wilmes 126163ac707SMichael Wilmes if (is_array($fn)) { 127163ac707SMichael Wilmes $cmd = key($fn); 128163ac707SMichael Wilmes $param = is_array($fn[$cmd]) ? key($fn[$cmd]) : null; 129163ac707SMichael Wilmes } else { 130163ac707SMichael Wilmes $cmd = $fn; 131163ac707SMichael Wilmes $param = null; 132163ac707SMichael Wilmes } 133163ac707SMichael Wilmes 134163ac707SMichael Wilmes if ($cmd != "search") { 135163ac707SMichael Wilmes $this->_start = $INPUT->int('start', 0); 136163ac707SMichael Wilmes $this->_filter = $this->_retrieveFilter(); 137163ac707SMichael Wilmes } 138163ac707SMichael Wilmes 139163ac707SMichael Wilmes switch($cmd){ 140163ac707SMichael Wilmes case "reset" : $this->_resetUser(); break; 141163ac707SMichael Wilmes case "search" : $this->_setFilter($param); 142163ac707SMichael Wilmes $this->_start = 0; 143163ac707SMichael Wilmes break; 144163ac707SMichael Wilmes } 145163ac707SMichael Wilmes 146163ac707SMichael Wilmes $this->_user_total = count($this->_user_list) > 0 ? $this->_getUserCount($this->_filter) : -1; 147163ac707SMichael Wilmes 148163ac707SMichael Wilmes // page handling 149163ac707SMichael Wilmes switch($cmd){ 150163ac707SMichael Wilmes case 'start' : $this->_start = 0; break; 151163ac707SMichael Wilmes case 'prev' : $this->_start -= $this->_pagesize; break; 152163ac707SMichael Wilmes case 'next' : $this->_start += $this->_pagesize; break; 153163ac707SMichael Wilmes case 'last' : $this->_start = $this->_user_total; break; 154163ac707SMichael Wilmes } 155163ac707SMichael Wilmes $this->_validatePagination(); 156163ac707SMichael Wilmes return true; 157163ac707SMichael Wilmes } 158163ac707SMichael Wilmes 159163ac707SMichael Wilmes /** 160163ac707SMichael Wilmes * Output appropriate html 161163ac707SMichael Wilmes * 162163ac707SMichael Wilmes * @return bool 163163ac707SMichael Wilmes */ 164163ac707SMichael Wilmes public function html() { 165163ac707SMichael Wilmes global $ID, $INFO; 166163ac707SMichael Wilmes 167163ac707SMichael Wilmes if(!$INFO['isadmin']) { 168163ac707SMichael Wilmes print $this->lang['badauth']; 169163ac707SMichael Wilmes return false; 170163ac707SMichael Wilmes } 171163ac707SMichael Wilmes 172*2cc41bddSMichael Wilmes if ($this->disabled) { 173b71db9c8SMichael Wilmes msg($this->_disabled, -1); 174b71db9c8SMichael Wilmes return true; 175b71db9c8SMichael Wilmes } 176b71db9c8SMichael Wilmes 177163ac707SMichael Wilmes $user_list = $this->_retrieveUsers($this->_start, $this->_pagesize, $this->_filter); 178163ac707SMichael Wilmes 179163ac707SMichael Wilmes $page_buttons = $this->_pagination(); 180163ac707SMichael Wilmes 181163ac707SMichael Wilmes print $this->locale_xhtml('intro'); 182163ac707SMichael Wilmes print $this->locale_xhtml('list'); 183163ac707SMichael Wilmes 184163ac707SMichael Wilmes ptln("<div id=\"user__manager\">"); 185163ac707SMichael Wilmes ptln("<div class=\"level2\">"); 186163ac707SMichael Wilmes 187163ac707SMichael Wilmes if (count($this->_user_list) > 0) { 188163ac707SMichael Wilmes ptln("<p>".sprintf($this->lang['summary'],$this->_start+1,$this->_last,$this->_getUserCount($this->_filter),count($this->_user_list))."</p>"); 189163ac707SMichael Wilmes } else { 190163ac707SMichael Wilmes if(count($this->_user_list) < 0) { 191163ac707SMichael Wilmes $allUserTotal = 0; 192163ac707SMichael Wilmes } else { 193163ac707SMichael Wilmes $allUserTotal = count($this->_user_list); 194163ac707SMichael Wilmes } 195163ac707SMichael Wilmes ptln("<p>".sprintf($this->lang['nonefound'], $allUserTotal)."</p>"); 196163ac707SMichael Wilmes } 197163ac707SMichael Wilmes ptln("<form action=\"".wl($ID)."\" method=\"post\">"); 198163ac707SMichael Wilmes formSecurityToken(); 199163ac707SMichael Wilmes ptln(" <div class=\"table\">"); 200163ac707SMichael Wilmes ptln(" <table class=\"inline\">"); 201163ac707SMichael Wilmes ptln(" <thead>"); 202163ac707SMichael Wilmes ptln(" <tr>"); 203163ac707SMichael Wilmes ptln(" <th> </th><th>".$this->lang["user_id"]."</th><th>".$this->lang["user_name"]."</th><th>".$this->lang["user_mail"]."</th>"); 204163ac707SMichael Wilmes ptln(" </tr>"); 205163ac707SMichael Wilmes 206163ac707SMichael Wilmes ptln(" <tr>"); 207163ac707SMichael Wilmes ptln(" <td class=\"rightalign\"><input type=\"image\" src=\"".DOKU_TWOFACTOR_PLUGIN_IMAGES."search.png\" name=\"fn[search][new]\" title=\"".$this->lang['search_prompt']."\" alt=\"".$this->lang['search']."\" class=\"button\" /></td>"); 208163ac707SMichael Wilmes ptln(" <td><input type=\"text\" name=\"userid\" class=\"edit\" value=\"".$this->_htmlFilter('user')."\" /></td>"); 209163ac707SMichael Wilmes ptln(" <td><input type=\"text\" name=\"username\" class=\"edit\" value=\"".$this->_htmlFilter('name')."\" /></td>"); 210163ac707SMichael Wilmes ptln(" <td><input type=\"text\" name=\"usermail\" class=\"edit\" value=\"".$this->_htmlFilter('mail')."\" /></td>"); 211163ac707SMichael Wilmes ptln(" </tr>"); 212163ac707SMichael Wilmes ptln(" </thead>"); 213163ac707SMichael Wilmes 214163ac707SMichael Wilmes if ($this->_user_total) { 215163ac707SMichael Wilmes ptln(" <tbody>"); 216163ac707SMichael Wilmes foreach ($user_list as $user => $userinfo) { 217163ac707SMichael Wilmes extract($userinfo); 218163ac707SMichael Wilmes /** 219163ac707SMichael Wilmes * @var string $name 220163ac707SMichael Wilmes * @var string $pass 221163ac707SMichael Wilmes * @var string $mail 222163ac707SMichael Wilmes * @var array $grps 223163ac707SMichael Wilmes */ 224163ac707SMichael Wilmes ptln(" <tr class=\"user_info\">"); 225163ac707SMichael Wilmes ptln(" <td class=\"centeralign\"><input type=\"checkbox\" name=\"delete[".hsc($user)."]\" ".$delete_disable." /></td>"); 226163ac707SMichael Wilmes if ($editable) { 227163ac707SMichael Wilmes ptln(" <td><a href=\"".wl($ID,array('fn[edit]['.$user.']' => 1, 228163ac707SMichael Wilmes 'do' => 'admin', 229163ac707SMichael Wilmes 'page' => 'usermanager', 230163ac707SMichael Wilmes 'sectok' => getSecurityToken())). 231163ac707SMichael Wilmes "\" title=\"".$this->lang['edit_prompt']."\">".hsc($user)."</a></td>"); 232163ac707SMichael Wilmes } else { 233163ac707SMichael Wilmes ptln(" <td>".hsc($user)."</td>"); 234163ac707SMichael Wilmes } 235163ac707SMichael Wilmes ptln(" <td>".hsc($name)."</td><td>".hsc($mail)."</td>"); 236163ac707SMichael Wilmes ptln(" </tr>"); 237163ac707SMichael Wilmes } 238163ac707SMichael Wilmes ptln(" </tbody>"); 239163ac707SMichael Wilmes } 240163ac707SMichael Wilmes 241163ac707SMichael Wilmes ptln(" <tbody>"); 242163ac707SMichael Wilmes ptln(" <tr><td colspan=\"5\" class=\"centeralign\">"); 243163ac707SMichael Wilmes ptln(" <span class=\"medialeft\">"); 244163ac707SMichael Wilmes ptln(" <button type=\"submit\" name=\"fn[reset]\" id=\"usrmgr__reset\" >".$this->lang['reset_selected']."</button>"); 245163ac707SMichael Wilmes ptln(" "); 246163ac707SMichael Wilmes if (!empty($this->_filter)) { 247163ac707SMichael Wilmes ptln(" <button type=\"submit\" name=\"fn[search][clear]\">".$this->lang['clear']."</button>"); 248163ac707SMichael Wilmes } 249163ac707SMichael Wilmes ptln(" <input type=\"hidden\" name=\"do\" value=\"admin\" />"); 250163ac707SMichael Wilmes ptln(" <input type=\"hidden\" name=\"page\" value=\"twofactor\" />"); 251163ac707SMichael Wilmes 252163ac707SMichael Wilmes $this->_htmlFilterSettings(2); 253163ac707SMichael Wilmes ptln(" </span>"); 254163ac707SMichael Wilmes ptln(" <span class=\"mediaright\">"); 255163ac707SMichael Wilmes ptln(" <button type=\"submit\" name=\"fn[start]\" ".$page_buttons['start'].">".$this->lang['start']."</button>"); 256163ac707SMichael Wilmes ptln(" <button type=\"submit\" name=\"fn[prev]\" ".$page_buttons['prev'].">".$this->lang['prev']."</button>"); 257163ac707SMichael Wilmes ptln(" <button type=\"submit\" name=\"fn[next]\" ".$page_buttons['next'].">".$this->lang['next']."</button>"); 258163ac707SMichael Wilmes ptln(" <button type=\"submit\" name=\"fn[last]\" ".$page_buttons['last'].">".$this->lang['last']."</button>"); 259163ac707SMichael Wilmes ptln(" </span>"); 260163ac707SMichael Wilmes 261163ac707SMichael Wilmes ptln(" </td></tr>"); 262163ac707SMichael Wilmes ptln(" </tbody>"); 263163ac707SMichael Wilmes ptln(" </table>"); 264163ac707SMichael Wilmes ptln(" </div>"); 265163ac707SMichael Wilmes 266163ac707SMichael Wilmes ptln("</form>"); 267163ac707SMichael Wilmes ptln("</div>"); 268163ac707SMichael Wilmes 269163ac707SMichael Wilmes ptln("</div>"); 270163ac707SMichael Wilmes return true; 271163ac707SMichael Wilmes } 272163ac707SMichael Wilmes 273163ac707SMichael Wilmes 274163ac707SMichael Wilmes /** 275163ac707SMichael Wilmes * Prints a inputfield 276163ac707SMichael Wilmes * 277163ac707SMichael Wilmes * @param string $id 278163ac707SMichael Wilmes * @param string $name 279163ac707SMichael Wilmes * @param string $label 280163ac707SMichael Wilmes * @param string $value 281163ac707SMichael Wilmes * @param bool $cando whether auth backend is capable to do this action 282163ac707SMichael Wilmes * @param int $indent 283163ac707SMichael Wilmes */ 284163ac707SMichael Wilmes protected function _htmlInputField($id, $name, $label, $value, $cando, $indent=0) { 285163ac707SMichael Wilmes $class = $cando ? '' : ' class="disabled"'; 286163ac707SMichael Wilmes echo str_pad('',$indent); 287163ac707SMichael Wilmes 288163ac707SMichael Wilmes if($name == 'userpass' || $name == 'userpass2'){ 289163ac707SMichael Wilmes $fieldtype = 'password'; 290163ac707SMichael Wilmes $autocomp = 'autocomplete="off"'; 291163ac707SMichael Wilmes }elseif($name == 'usermail'){ 292163ac707SMichael Wilmes $fieldtype = 'email'; 293163ac707SMichael Wilmes $autocomp = ''; 294163ac707SMichael Wilmes }else{ 295163ac707SMichael Wilmes $fieldtype = 'text'; 296163ac707SMichael Wilmes $autocomp = ''; 297163ac707SMichael Wilmes } 298163ac707SMichael Wilmes $value = hsc($value); 299163ac707SMichael Wilmes 300163ac707SMichael Wilmes echo "<tr $class>"; 301163ac707SMichael Wilmes echo "<td><label for=\"$id\" >$label: </label></td>"; 302163ac707SMichael Wilmes echo "<td>"; 303163ac707SMichael Wilmes if($cando){ 304163ac707SMichael Wilmes echo "<input type=\"$fieldtype\" id=\"$id\" name=\"$name\" value=\"$value\" class=\"edit\" $autocomp />"; 305163ac707SMichael Wilmes }else{ 306163ac707SMichael Wilmes echo "<input type=\"hidden\" name=\"$name\" value=\"$value\" />"; 307163ac707SMichael Wilmes echo "<input type=\"$fieldtype\" id=\"$id\" name=\"$name\" value=\"$value\" class=\"edit disabled\" disabled=\"disabled\" />"; 308163ac707SMichael Wilmes } 309163ac707SMichael Wilmes echo "</td>"; 310163ac707SMichael Wilmes echo "</tr>"; 311163ac707SMichael Wilmes } 312163ac707SMichael Wilmes 313163ac707SMichael Wilmes /** 314163ac707SMichael Wilmes * Returns htmlescaped filter value 315163ac707SMichael Wilmes * 316163ac707SMichael Wilmes * @param string $key name of search field 317163ac707SMichael Wilmes * @return string html escaped value 318163ac707SMichael Wilmes */ 319163ac707SMichael Wilmes protected function _htmlFilter($key) { 320163ac707SMichael Wilmes if (empty($this->_filter)) return ''; 321163ac707SMichael Wilmes return (isset($this->_filter[$key]) ? hsc($this->_filter[$key]) : ''); 322163ac707SMichael Wilmes } 323163ac707SMichael Wilmes 324163ac707SMichael Wilmes /** 325163ac707SMichael Wilmes * Print hidden inputs with the current filter values 326163ac707SMichael Wilmes * 327163ac707SMichael Wilmes * @param int $indent 328163ac707SMichael Wilmes */ 329163ac707SMichael Wilmes protected function _htmlFilterSettings($indent=0) { 330163ac707SMichael Wilmes 331163ac707SMichael Wilmes ptln("<input type=\"hidden\" name=\"start\" value=\"".$this->_start."\" />",$indent); 332163ac707SMichael Wilmes 333163ac707SMichael Wilmes foreach ($this->_filter as $key => $filter) { 334163ac707SMichael Wilmes ptln("<input type=\"hidden\" name=\"filter[".$key."]\" value=\"".hsc($filter)."\" />",$indent); 335163ac707SMichael Wilmes } 336163ac707SMichael Wilmes } 337163ac707SMichael Wilmes 338163ac707SMichael Wilmes /** 339163ac707SMichael Wilmes * Reset user (a user has been selected to remove two factor authentication) 340163ac707SMichael Wilmes * 341163ac707SMichael Wilmes * @param string $param id of the user 342163ac707SMichael Wilmes * @return bool whether succesful 343163ac707SMichael Wilmes */ 344163ac707SMichael Wilmes protected function _resetUser() { 345163ac707SMichael Wilmes global $INPUT; 346163ac707SMichael Wilmes if (!checkSecurityToken()) return false; 347163ac707SMichael Wilmes 348163ac707SMichael Wilmes $selected = $INPUT->arr('delete'); 349163ac707SMichael Wilmes if (empty($selected)) return false; 350163ac707SMichael Wilmes $selected = array_keys($selected); 351163ac707SMichael Wilmes 352163ac707SMichael Wilmes if(in_array($_SERVER['REMOTE_USER'], $selected)) { 353163ac707SMichael Wilmes msg($this->lang['reset_not_self'], -1); 354163ac707SMichael Wilmes return false; 355163ac707SMichael Wilmes } 356163ac707SMichael Wilmes 357163ac707SMichael Wilmes $count = 0; 358163ac707SMichael Wilmes foreach($selected as $user) { 359163ac707SMichael Wilmes // All users here have a attribute namespace file. Purge them. 360185a84e4SMichael Wilmes $purged = $this->attribute->purge('twofactor', $user); 361185a84e4SMichael Wilmes foreach($this->modules as $mod) { 362185a84e4SMichael Wilmes $purged |= $this->attribute->purge($mod->moduleName, $user); 363185a84e4SMichael Wilmes } 364185a84e4SMichael Wilmes $count += $purged ? 1 : 0; 365163ac707SMichael Wilmes } 366163ac707SMichael Wilmes 367163ac707SMichael Wilmes if ($count == count($selected)) { 368163ac707SMichael Wilmes $text = str_replace('%d', $count, $this->lang['reset_ok']); 369163ac707SMichael Wilmes msg("$text.", 1); 370163ac707SMichael Wilmes } else { 371163ac707SMichael Wilmes $part1 = str_replace('%d', $count, $this->lang['reset_ok']); 372163ac707SMichael Wilmes $part2 = str_replace('%d', (count($selected)-$count), $this->lang['reset_fail']); 373*2cc41bddSMichael Wilmes // Output results. 374163ac707SMichael Wilmes msg("$part1, $part2",-1); 375163ac707SMichael Wilmes } 376163ac707SMichael Wilmes 377163ac707SMichael Wilmes // Now refresh the user list. 378163ac707SMichael Wilmes $this->_getUsers(); 379163ac707SMichael Wilmes 380163ac707SMichael Wilmes return true; 381163ac707SMichael Wilmes } 382163ac707SMichael Wilmes 383163ac707SMichael Wilmes protected function _retrieveFilteredUsers($filter = array()) { 384*2cc41bddSMichael Wilmes global $auth; 385163ac707SMichael Wilmes $users = array(); 386*2cc41bddSMichael Wilmes $noUsers = is_null($auth) || !$auth->canDo('getUsers'); 387163ac707SMichael Wilmes foreach ($this->_user_list as $user) { 388*2cc41bddSMichael Wilmes if ($noUsers) { 389*2cc41bddSMichael Wilmes $userdata = array('user'=>$user, 'name'=>$user, 'mail'=>null); 390*2cc41bddSMichael Wilmes } else { 391*2cc41bddSMichael Wilmes $userdata = $auth->getUserData($user); 392*2cc41bddSMichael Wilmes } 393163ac707SMichael Wilmes $include = true; 394163ac707SMichael Wilmes foreach ($filter as $key=>$value) { 395163ac707SMichael Wilmes $include &= strstr($userdata[$key], $value); 396163ac707SMichael Wilmes } 397163ac707SMichael Wilmes if ($include) { $users[$user] = $userdata; } 398163ac707SMichael Wilmes } 399163ac707SMichael Wilmes return $users; 400163ac707SMichael Wilmes } 401163ac707SMichael Wilmes 402163ac707SMichael Wilmes protected function _getUserCount($filter) { 403163ac707SMichael Wilmes return count($this->_retrieveFilteredUsers($filter)); 404163ac707SMichael Wilmes } 405163ac707SMichael Wilmes 406163ac707SMichael Wilmes protected function _retrieveUsers($start, $pagesize, $filter) { 407163ac707SMichael Wilmes $users = $this->_retrieveFilteredUsers($filter); 408163ac707SMichael Wilmes return $users; 409163ac707SMichael Wilmes } 410163ac707SMichael Wilmes 411163ac707SMichael Wilmes /** 412163ac707SMichael Wilmes * Retrieve & clean user data from the form 413163ac707SMichael Wilmes * 414163ac707SMichael Wilmes * @param bool $clean whether the cleanUser method of the authentication backend is applied 415163ac707SMichael Wilmes * @return array (user, password, full name, email, array(groups)) 416163ac707SMichael Wilmes */ 417163ac707SMichael Wilmes protected function _retrieveUser($clean=true) { 418163ac707SMichael Wilmes /** @var DokuWiki_Auth_Plugin $auth */ 419163ac707SMichael Wilmes global $auth; 420163ac707SMichael Wilmes global $INPUT; 421163ac707SMichael Wilmes 422163ac707SMichael Wilmes $user = array(); 423*2cc41bddSMichael Wilmes $user[] = $INPUT->str('userid'); 424*2cc41bddSMichael Wilmes $user[] = $INPUT->str('username'); 425*2cc41bddSMichael Wilmes $user[] = $INPUT->str('usermail'); 426163ac707SMichael Wilmes 427163ac707SMichael Wilmes return $user; 428163ac707SMichael Wilmes } 429163ac707SMichael Wilmes 430163ac707SMichael Wilmes /** 431163ac707SMichael Wilmes * Set the filter with the current search terms or clear the filter 432163ac707SMichael Wilmes * 433163ac707SMichael Wilmes * @param string $op 'new' or 'clear' 434163ac707SMichael Wilmes */ 435163ac707SMichael Wilmes protected function _setFilter($op) { 436163ac707SMichael Wilmes 437163ac707SMichael Wilmes $this->_filter = array(); 438163ac707SMichael Wilmes 439163ac707SMichael Wilmes if ($op == 'new') { 440*2cc41bddSMichael Wilmes list($user,$name,$mail) = $this->_retrieveUser(); 441163ac707SMichael Wilmes 442163ac707SMichael Wilmes if (!empty($user)) $this->_filter['user'] = $user; 443163ac707SMichael Wilmes if (!empty($name)) $this->_filter['name'] = $name; 444163ac707SMichael Wilmes if (!empty($mail)) $this->_filter['mail'] = $mail; 445163ac707SMichael Wilmes } 446163ac707SMichael Wilmes } 447163ac707SMichael Wilmes 448163ac707SMichael Wilmes /** 449163ac707SMichael Wilmes * Get the current search terms 450163ac707SMichael Wilmes * 451163ac707SMichael Wilmes * @return array 452163ac707SMichael Wilmes */ 453163ac707SMichael Wilmes protected function _retrieveFilter() { 454163ac707SMichael Wilmes global $INPUT; 455163ac707SMichael Wilmes 456163ac707SMichael Wilmes $t_filter = $INPUT->arr('filter'); 457163ac707SMichael Wilmes 458163ac707SMichael Wilmes // messy, but this way we ensure we aren't getting any additional crap from malicious users 459163ac707SMichael Wilmes $filter = array(); 460163ac707SMichael Wilmes 461163ac707SMichael Wilmes if (isset($t_filter['user'])) $filter['user'] = $t_filter['user']; 462163ac707SMichael Wilmes if (isset($t_filter['name'])) $filter['name'] = $t_filter['name']; 463163ac707SMichael Wilmes if (isset($t_filter['mail'])) $filter['mail'] = $t_filter['mail']; 464163ac707SMichael Wilmes 465163ac707SMichael Wilmes return $filter; 466163ac707SMichael Wilmes } 467163ac707SMichael Wilmes 468163ac707SMichael Wilmes /** 469163ac707SMichael Wilmes * Validate and improve the pagination values 470163ac707SMichael Wilmes */ 471163ac707SMichael Wilmes protected function _validatePagination() { 472163ac707SMichael Wilmes 473163ac707SMichael Wilmes if ($this->_start >= $this->_user_total) { 474163ac707SMichael Wilmes $this->_start = $this->_user_total - $this->_pagesize; 475163ac707SMichael Wilmes } 476163ac707SMichael Wilmes if ($this->_start < 0) $this->_start = 0; 477163ac707SMichael Wilmes 478163ac707SMichael Wilmes $this->_last = min($this->_user_total, $this->_start + $this->_pagesize); 479163ac707SMichael Wilmes } 480163ac707SMichael Wilmes 481163ac707SMichael Wilmes /** 482163ac707SMichael Wilmes * Return an array of strings to enable/disable pagination buttons 483163ac707SMichael Wilmes * 484163ac707SMichael Wilmes * @return array with enable/disable attributes 485163ac707SMichael Wilmes */ 486163ac707SMichael Wilmes protected function _pagination() { 487163ac707SMichael Wilmes 488163ac707SMichael Wilmes $disabled = 'disabled="disabled"'; 489163ac707SMichael Wilmes 490163ac707SMichael Wilmes $buttons = array(); 491163ac707SMichael Wilmes $buttons['start'] = $buttons['prev'] = ($this->_start == 0) ? $disabled : ''; 492163ac707SMichael Wilmes 493163ac707SMichael Wilmes if ($this->_user_total == -1) { 494163ac707SMichael Wilmes $buttons['last'] = $disabled; 495163ac707SMichael Wilmes $buttons['next'] = ''; 496163ac707SMichael Wilmes } else { 497163ac707SMichael Wilmes $buttons['last'] = $buttons['next'] = (($this->_start + $this->_pagesize) >= $this->_user_total) ? $disabled : ''; 498163ac707SMichael Wilmes } 499163ac707SMichael Wilmes 500163ac707SMichael Wilmes if ($this->_lastdisabled) { 501163ac707SMichael Wilmes $buttons['last'] = $disabled; 502163ac707SMichael Wilmes } 503163ac707SMichael Wilmes 504163ac707SMichael Wilmes return $buttons; 505163ac707SMichael Wilmes } 506163ac707SMichael Wilmes 507163ac707SMichael Wilmes 508163ac707SMichael Wilmes} 509