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 { 20163ac707SMichael Wilmes protected $_auth = null; // auth object 21163ac707SMichael Wilmes protected $_user_list = array(); // number of users with attributes 22163ac707SMichael Wilmes protected $_filter = array(); // user selection filter(s) 23163ac707SMichael Wilmes protected $_start = 0; // index of first user to be displayed 24163ac707SMichael Wilmes protected $_last = 0; // index of the last user to be displayed 25163ac707SMichael Wilmes protected $_pagesize = 20; // number of users to list on one page 26163ac707SMichael Wilmes protected $_disabled = ''; // if disabled set to explanatory string 27163ac707SMichael Wilmes protected $_lastdisabled = false; // set to true if last user is unknown and last button is hence buggy 28163ac707SMichael Wilmes 29163ac707SMichael Wilmes /** 30163ac707SMichael Wilmes * Constructor 31163ac707SMichael Wilmes */ 32163ac707SMichael Wilmes public function __construct(){ 33163ac707SMichael Wilmes global $auth; 34163ac707SMichael Wilmes if (!isset($auth)) { 35163ac707SMichael Wilmes $this->_disabled = $this->lang['noauth']; 36163ac707SMichael Wilmes } else if (!$auth->canDo('getUsers')) { 37163ac707SMichael Wilmes $this->_disabled = $this->lang['nosupport']; 38163ac707SMichael Wilmes } else { 39163ac707SMichael Wilmes // we're good to go 40163ac707SMichael Wilmes $this->_auth = & $auth; 41163ac707SMichael Wilmes } 42163ac707SMichael Wilmes $this->setupLocale(); 43*890553cfSMichael Wilmes $requireAttribute = $this->getConf("enable") === 1; 44163ac707SMichael Wilmes $this->attribute = $requireAttribute ? $this->loadHelper('attribute', 'Attribute plugin required!') : null; 45163ac707SMichael Wilmes $this->_getUsers(); 46163ac707SMichael Wilmes } 47163ac707SMichael Wilmes 48163ac707SMichael Wilmes protected function _getUsers() { 49163ac707SMichael Wilmes if (!is_null($this->attribute)) { 50163ac707SMichael Wilmes $attr = $this->attribute; 51163ac707SMichael Wilmes $this->_user_list = $this->attribute->enumerateUsers('twofactor'); 52163ac707SMichael Wilmes } 53163ac707SMichael Wilmes else { 54163ac707SMichael Wilmes msg($this->lang['no_purpose'], -1); 55163ac707SMichael Wilmes } 56163ac707SMichael Wilmes } 57163ac707SMichael Wilmes 58163ac707SMichael Wilmes /** 59163ac707SMichael Wilmes * Return prompt for admin menu 60163ac707SMichael Wilmes * 61163ac707SMichael Wilmes * @param string $language 62163ac707SMichael Wilmes * @return string 63163ac707SMichael Wilmes */ 64163ac707SMichael Wilmes public function getMenuText($language) { 65163ac707SMichael Wilmes global $INFO; 66163ac707SMichael Wilmes if (!$INFO['isadmin']) 67163ac707SMichael Wilmes return parent::getMenuText($language); 68163ac707SMichael Wilmes 69163ac707SMichael Wilmes return $this->getLang('menu').' '.$this->_disabled; 70163ac707SMichael Wilmes } 71163ac707SMichael Wilmes 72163ac707SMichael Wilmes /** 73163ac707SMichael Wilmes * return sort order for position in admin menu 74163ac707SMichael Wilmes * 75163ac707SMichael Wilmes * @return int 76163ac707SMichael Wilmes */ 77163ac707SMichael Wilmes public function getMenuSort() { 78163ac707SMichael Wilmes return 2; 79163ac707SMichael Wilmes } 80163ac707SMichael Wilmes 81163ac707SMichael Wilmes /** 82163ac707SMichael Wilmes * @return int current start value for pageination 83163ac707SMichael Wilmes */ 84163ac707SMichael Wilmes public function getStart() { 85163ac707SMichael Wilmes return $this->_start; 86163ac707SMichael Wilmes } 87163ac707SMichael Wilmes 88163ac707SMichael Wilmes /** 89163ac707SMichael Wilmes * @return int number of users per page 90163ac707SMichael Wilmes */ 91163ac707SMichael Wilmes public function getPagesize() { 92163ac707SMichael Wilmes return $this->_pagesize; 93163ac707SMichael Wilmes } 94163ac707SMichael Wilmes 95163ac707SMichael Wilmes /** 96163ac707SMichael Wilmes * @param boolean $lastdisabled 97163ac707SMichael Wilmes */ 98163ac707SMichael Wilmes public function setLastdisabled($lastdisabled) { 99163ac707SMichael Wilmes $this->_lastdisabled = $lastdisabled; 100163ac707SMichael Wilmes } 101163ac707SMichael Wilmes 102163ac707SMichael Wilmes /** 103163ac707SMichael Wilmes * Handle user request 104163ac707SMichael Wilmes * 105163ac707SMichael Wilmes * @return bool 106163ac707SMichael Wilmes */ 107163ac707SMichael Wilmes public function handle() { 108163ac707SMichael Wilmes global $INPUT, $INFO; 109163ac707SMichael Wilmes if (!$INFO['isadmin']) return false; 110163ac707SMichael Wilmes 111163ac707SMichael Wilmes // extract the command and any specific parameters 112163ac707SMichael Wilmes // submit button name is of the form - fn[cmd][param(s)] 113163ac707SMichael Wilmes $fn = $INPUT->param('fn'); 114163ac707SMichael Wilmes 115163ac707SMichael Wilmes if (is_array($fn)) { 116163ac707SMichael Wilmes $cmd = key($fn); 117163ac707SMichael Wilmes $param = is_array($fn[$cmd]) ? key($fn[$cmd]) : null; 118163ac707SMichael Wilmes } else { 119163ac707SMichael Wilmes $cmd = $fn; 120163ac707SMichael Wilmes $param = null; 121163ac707SMichael Wilmes } 122163ac707SMichael Wilmes 123163ac707SMichael Wilmes if ($cmd != "search") { 124163ac707SMichael Wilmes $this->_start = $INPUT->int('start', 0); 125163ac707SMichael Wilmes $this->_filter = $this->_retrieveFilter(); 126163ac707SMichael Wilmes } 127163ac707SMichael Wilmes 128163ac707SMichael Wilmes switch($cmd){ 129163ac707SMichael Wilmes case "reset" : $this->_resetUser(); break; 130163ac707SMichael Wilmes case "search" : $this->_setFilter($param); 131163ac707SMichael Wilmes $this->_start = 0; 132163ac707SMichael Wilmes break; 133163ac707SMichael Wilmes } 134163ac707SMichael Wilmes 135163ac707SMichael Wilmes $this->_user_total = count($this->_user_list) > 0 ? $this->_getUserCount($this->_filter) : -1; 136163ac707SMichael Wilmes 137163ac707SMichael Wilmes // page handling 138163ac707SMichael Wilmes switch($cmd){ 139163ac707SMichael Wilmes case 'start' : $this->_start = 0; break; 140163ac707SMichael Wilmes case 'prev' : $this->_start -= $this->_pagesize; break; 141163ac707SMichael Wilmes case 'next' : $this->_start += $this->_pagesize; break; 142163ac707SMichael Wilmes case 'last' : $this->_start = $this->_user_total; break; 143163ac707SMichael Wilmes } 144163ac707SMichael Wilmes $this->_validatePagination(); 145163ac707SMichael Wilmes return true; 146163ac707SMichael Wilmes } 147163ac707SMichael Wilmes 148163ac707SMichael Wilmes /** 149163ac707SMichael Wilmes * Output appropriate html 150163ac707SMichael Wilmes * 151163ac707SMichael Wilmes * @return bool 152163ac707SMichael Wilmes */ 153163ac707SMichael Wilmes public function html() { 154163ac707SMichael Wilmes global $ID, $INFO; 155163ac707SMichael Wilmes 156163ac707SMichael Wilmes if(!$INFO['isadmin']) { 157163ac707SMichael Wilmes print $this->lang['badauth']; 158163ac707SMichael Wilmes return false; 159163ac707SMichael Wilmes } 160163ac707SMichael Wilmes 161163ac707SMichael Wilmes $user_list = $this->_retrieveUsers($this->_start, $this->_pagesize, $this->_filter); 162163ac707SMichael Wilmes 163163ac707SMichael Wilmes $page_buttons = $this->_pagination(); 164163ac707SMichael Wilmes 165163ac707SMichael Wilmes print $this->locale_xhtml('intro'); 166163ac707SMichael Wilmes print $this->locale_xhtml('list'); 167163ac707SMichael Wilmes 168163ac707SMichael Wilmes ptln("<div id=\"user__manager\">"); 169163ac707SMichael Wilmes ptln("<div class=\"level2\">"); 170163ac707SMichael Wilmes 171163ac707SMichael Wilmes if (count($this->_user_list) > 0) { 172163ac707SMichael Wilmes ptln("<p>".sprintf($this->lang['summary'],$this->_start+1,$this->_last,$this->_getUserCount($this->_filter),count($this->_user_list))."</p>"); 173163ac707SMichael Wilmes } else { 174163ac707SMichael Wilmes if(count($this->_user_list) < 0) { 175163ac707SMichael Wilmes $allUserTotal = 0; 176163ac707SMichael Wilmes } else { 177163ac707SMichael Wilmes $allUserTotal = count($this->_user_list); 178163ac707SMichael Wilmes } 179163ac707SMichael Wilmes ptln("<p>".sprintf($this->lang['nonefound'], $allUserTotal)."</p>"); 180163ac707SMichael Wilmes } 181163ac707SMichael Wilmes ptln("<form action=\"".wl($ID)."\" method=\"post\">"); 182163ac707SMichael Wilmes formSecurityToken(); 183163ac707SMichael Wilmes ptln(" <div class=\"table\">"); 184163ac707SMichael Wilmes ptln(" <table class=\"inline\">"); 185163ac707SMichael Wilmes ptln(" <thead>"); 186163ac707SMichael Wilmes ptln(" <tr>"); 187163ac707SMichael Wilmes ptln(" <th> </th><th>".$this->lang["user_id"]."</th><th>".$this->lang["user_name"]."</th><th>".$this->lang["user_mail"]."</th>"); 188163ac707SMichael Wilmes ptln(" </tr>"); 189163ac707SMichael Wilmes 190163ac707SMichael Wilmes ptln(" <tr>"); 191163ac707SMichael 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>"); 192163ac707SMichael Wilmes ptln(" <td><input type=\"text\" name=\"userid\" class=\"edit\" value=\"".$this->_htmlFilter('user')."\" /></td>"); 193163ac707SMichael Wilmes ptln(" <td><input type=\"text\" name=\"username\" class=\"edit\" value=\"".$this->_htmlFilter('name')."\" /></td>"); 194163ac707SMichael Wilmes ptln(" <td><input type=\"text\" name=\"usermail\" class=\"edit\" value=\"".$this->_htmlFilter('mail')."\" /></td>"); 195163ac707SMichael Wilmes ptln(" </tr>"); 196163ac707SMichael Wilmes ptln(" </thead>"); 197163ac707SMichael Wilmes 198163ac707SMichael Wilmes if ($this->_user_total) { 199163ac707SMichael Wilmes ptln(" <tbody>"); 200163ac707SMichael Wilmes foreach ($user_list as $user => $userinfo) { 201163ac707SMichael Wilmes extract($userinfo); 202163ac707SMichael Wilmes /** 203163ac707SMichael Wilmes * @var string $name 204163ac707SMichael Wilmes * @var string $pass 205163ac707SMichael Wilmes * @var string $mail 206163ac707SMichael Wilmes * @var array $grps 207163ac707SMichael Wilmes */ 208163ac707SMichael Wilmes $groups = join(', ',$grps); 209163ac707SMichael Wilmes ptln(" <tr class=\"user_info\">"); 210163ac707SMichael Wilmes ptln(" <td class=\"centeralign\"><input type=\"checkbox\" name=\"delete[".hsc($user)."]\" ".$delete_disable." /></td>"); 211163ac707SMichael Wilmes if ($editable) { 212163ac707SMichael Wilmes ptln(" <td><a href=\"".wl($ID,array('fn[edit]['.$user.']' => 1, 213163ac707SMichael Wilmes 'do' => 'admin', 214163ac707SMichael Wilmes 'page' => 'usermanager', 215163ac707SMichael Wilmes 'sectok' => getSecurityToken())). 216163ac707SMichael Wilmes "\" title=\"".$this->lang['edit_prompt']."\">".hsc($user)."</a></td>"); 217163ac707SMichael Wilmes } else { 218163ac707SMichael Wilmes ptln(" <td>".hsc($user)."</td>"); 219163ac707SMichael Wilmes } 220163ac707SMichael Wilmes ptln(" <td>".hsc($name)."</td><td>".hsc($mail)."</td>"); 221163ac707SMichael Wilmes ptln(" </tr>"); 222163ac707SMichael Wilmes } 223163ac707SMichael Wilmes ptln(" </tbody>"); 224163ac707SMichael Wilmes } 225163ac707SMichael Wilmes 226163ac707SMichael Wilmes ptln(" <tbody>"); 227163ac707SMichael Wilmes ptln(" <tr><td colspan=\"5\" class=\"centeralign\">"); 228163ac707SMichael Wilmes ptln(" <span class=\"medialeft\">"); 229163ac707SMichael Wilmes ptln(" <button type=\"submit\" name=\"fn[reset]\" id=\"usrmgr__reset\" >".$this->lang['reset_selected']."</button>"); 230163ac707SMichael Wilmes ptln(" "); 231163ac707SMichael Wilmes if (!empty($this->_filter)) { 232163ac707SMichael Wilmes ptln(" <button type=\"submit\" name=\"fn[search][clear]\">".$this->lang['clear']."</button>"); 233163ac707SMichael Wilmes } 234163ac707SMichael Wilmes ptln(" <input type=\"hidden\" name=\"do\" value=\"admin\" />"); 235163ac707SMichael Wilmes ptln(" <input type=\"hidden\" name=\"page\" value=\"twofactor\" />"); 236163ac707SMichael Wilmes 237163ac707SMichael Wilmes $this->_htmlFilterSettings(2); 238163ac707SMichael Wilmes ptln(" </span>"); 239163ac707SMichael Wilmes ptln(" <span class=\"mediaright\">"); 240163ac707SMichael Wilmes ptln(" <button type=\"submit\" name=\"fn[start]\" ".$page_buttons['start'].">".$this->lang['start']."</button>"); 241163ac707SMichael Wilmes ptln(" <button type=\"submit\" name=\"fn[prev]\" ".$page_buttons['prev'].">".$this->lang['prev']."</button>"); 242163ac707SMichael Wilmes ptln(" <button type=\"submit\" name=\"fn[next]\" ".$page_buttons['next'].">".$this->lang['next']."</button>"); 243163ac707SMichael Wilmes ptln(" <button type=\"submit\" name=\"fn[last]\" ".$page_buttons['last'].">".$this->lang['last']."</button>"); 244163ac707SMichael Wilmes ptln(" </span>"); 245163ac707SMichael Wilmes 246163ac707SMichael Wilmes ptln(" </td></tr>"); 247163ac707SMichael Wilmes ptln(" </tbody>"); 248163ac707SMichael Wilmes ptln(" </table>"); 249163ac707SMichael Wilmes ptln(" </div>"); 250163ac707SMichael Wilmes 251163ac707SMichael Wilmes ptln("</form>"); 252163ac707SMichael Wilmes ptln("</div>"); 253163ac707SMichael Wilmes 254163ac707SMichael Wilmes ptln("</div>"); 255163ac707SMichael Wilmes return true; 256163ac707SMichael Wilmes } 257163ac707SMichael Wilmes 258163ac707SMichael Wilmes 259163ac707SMichael Wilmes /** 260163ac707SMichael Wilmes * Prints a inputfield 261163ac707SMichael Wilmes * 262163ac707SMichael Wilmes * @param string $id 263163ac707SMichael Wilmes * @param string $name 264163ac707SMichael Wilmes * @param string $label 265163ac707SMichael Wilmes * @param string $value 266163ac707SMichael Wilmes * @param bool $cando whether auth backend is capable to do this action 267163ac707SMichael Wilmes * @param int $indent 268163ac707SMichael Wilmes */ 269163ac707SMichael Wilmes protected function _htmlInputField($id, $name, $label, $value, $cando, $indent=0) { 270163ac707SMichael Wilmes $class = $cando ? '' : ' class="disabled"'; 271163ac707SMichael Wilmes echo str_pad('',$indent); 272163ac707SMichael Wilmes 273163ac707SMichael Wilmes if($name == 'userpass' || $name == 'userpass2'){ 274163ac707SMichael Wilmes $fieldtype = 'password'; 275163ac707SMichael Wilmes $autocomp = 'autocomplete="off"'; 276163ac707SMichael Wilmes }elseif($name == 'usermail'){ 277163ac707SMichael Wilmes $fieldtype = 'email'; 278163ac707SMichael Wilmes $autocomp = ''; 279163ac707SMichael Wilmes }else{ 280163ac707SMichael Wilmes $fieldtype = 'text'; 281163ac707SMichael Wilmes $autocomp = ''; 282163ac707SMichael Wilmes } 283163ac707SMichael Wilmes $value = hsc($value); 284163ac707SMichael Wilmes 285163ac707SMichael Wilmes echo "<tr $class>"; 286163ac707SMichael Wilmes echo "<td><label for=\"$id\" >$label: </label></td>"; 287163ac707SMichael Wilmes echo "<td>"; 288163ac707SMichael Wilmes if($cando){ 289163ac707SMichael Wilmes echo "<input type=\"$fieldtype\" id=\"$id\" name=\"$name\" value=\"$value\" class=\"edit\" $autocomp />"; 290163ac707SMichael Wilmes }else{ 291163ac707SMichael Wilmes echo "<input type=\"hidden\" name=\"$name\" value=\"$value\" />"; 292163ac707SMichael Wilmes echo "<input type=\"$fieldtype\" id=\"$id\" name=\"$name\" value=\"$value\" class=\"edit disabled\" disabled=\"disabled\" />"; 293163ac707SMichael Wilmes } 294163ac707SMichael Wilmes echo "</td>"; 295163ac707SMichael Wilmes echo "</tr>"; 296163ac707SMichael Wilmes } 297163ac707SMichael Wilmes 298163ac707SMichael Wilmes /** 299163ac707SMichael Wilmes * Returns htmlescaped filter value 300163ac707SMichael Wilmes * 301163ac707SMichael Wilmes * @param string $key name of search field 302163ac707SMichael Wilmes * @return string html escaped value 303163ac707SMichael Wilmes */ 304163ac707SMichael Wilmes protected function _htmlFilter($key) { 305163ac707SMichael Wilmes if (empty($this->_filter)) return ''; 306163ac707SMichael Wilmes return (isset($this->_filter[$key]) ? hsc($this->_filter[$key]) : ''); 307163ac707SMichael Wilmes } 308163ac707SMichael Wilmes 309163ac707SMichael Wilmes /** 310163ac707SMichael Wilmes * Print hidden inputs with the current filter values 311163ac707SMichael Wilmes * 312163ac707SMichael Wilmes * @param int $indent 313163ac707SMichael Wilmes */ 314163ac707SMichael Wilmes protected function _htmlFilterSettings($indent=0) { 315163ac707SMichael Wilmes 316163ac707SMichael Wilmes ptln("<input type=\"hidden\" name=\"start\" value=\"".$this->_start."\" />",$indent); 317163ac707SMichael Wilmes 318163ac707SMichael Wilmes foreach ($this->_filter as $key => $filter) { 319163ac707SMichael Wilmes ptln("<input type=\"hidden\" name=\"filter[".$key."]\" value=\"".hsc($filter)."\" />",$indent); 320163ac707SMichael Wilmes } 321163ac707SMichael Wilmes } 322163ac707SMichael Wilmes 323163ac707SMichael Wilmes /** 324163ac707SMichael Wilmes * Reset user (a user has been selected to remove two factor authentication) 325163ac707SMichael Wilmes * 326163ac707SMichael Wilmes * @param string $param id of the user 327163ac707SMichael Wilmes * @return bool whether succesful 328163ac707SMichael Wilmes */ 329163ac707SMichael Wilmes protected function _resetUser() { 330163ac707SMichael Wilmes global $INPUT; 331163ac707SMichael Wilmes if (!checkSecurityToken()) return false; 332163ac707SMichael Wilmes 333163ac707SMichael Wilmes $selected = $INPUT->arr('delete'); 334163ac707SMichael Wilmes if (empty($selected)) return false; 335163ac707SMichael Wilmes $selected = array_keys($selected); 336163ac707SMichael Wilmes 337163ac707SMichael Wilmes if(in_array($_SERVER['REMOTE_USER'], $selected)) { 338163ac707SMichael Wilmes msg($this->lang['reset_not_self'], -1); 339163ac707SMichael Wilmes return false; 340163ac707SMichael Wilmes } 341163ac707SMichael Wilmes 342163ac707SMichael Wilmes $count = 0; 343163ac707SMichael Wilmes foreach($selected as $user) { 344163ac707SMichael Wilmes // All users here have a attribute namespace file. Purge them. 345163ac707SMichael Wilmes $count += $this->attribute->purge('twofactor', $user)? 1 : 0; 346163ac707SMichael Wilmes } 347163ac707SMichael Wilmes 348163ac707SMichael Wilmes if ($count == count($selected)) { 349163ac707SMichael Wilmes $text = str_replace('%d', $count, $this->lang['reset_ok']); 350163ac707SMichael Wilmes msg("$text.", 1); 351163ac707SMichael Wilmes } else { 352163ac707SMichael Wilmes $part1 = str_replace('%d', $count, $this->lang['reset_ok']); 353163ac707SMichael Wilmes $part2 = str_replace('%d', (count($selected)-$count), $this->lang['reset_fail']); 354163ac707SMichael Wilmes msg("$part1, $part2",-1); 355163ac707SMichael Wilmes } 356163ac707SMichael Wilmes 357163ac707SMichael Wilmes // Now refresh the user list. 358163ac707SMichael Wilmes $this->_getUsers(); 359163ac707SMichael Wilmes 360163ac707SMichael Wilmes return true; 361163ac707SMichael Wilmes } 362163ac707SMichael Wilmes 363163ac707SMichael Wilmes protected function _retrieveFilteredUsers($filter = array()) { 364163ac707SMichael Wilmes $users = array(); 365163ac707SMichael Wilmes foreach ($this->_user_list as $user) { 366163ac707SMichael Wilmes $userdata = $this->_auth->getUserData($user); 367163ac707SMichael Wilmes $include = true; 368163ac707SMichael Wilmes foreach ($filter as $key=>$value) { 369163ac707SMichael Wilmes $include &= strstr($userdata[$key], $value); 370163ac707SMichael Wilmes } 371163ac707SMichael Wilmes if ($include) { $users[$user] = $userdata; } 372163ac707SMichael Wilmes } 373163ac707SMichael Wilmes return $users; 374163ac707SMichael Wilmes } 375163ac707SMichael Wilmes 376163ac707SMichael Wilmes protected function _getUserCount($filter) { 377163ac707SMichael Wilmes return count($this->_retrieveFilteredUsers($filter)); 378163ac707SMichael Wilmes } 379163ac707SMichael Wilmes 380163ac707SMichael Wilmes protected function _retrieveUsers($start, $pagesize, $filter) { 381163ac707SMichael Wilmes $users = $this->_retrieveFilteredUsers($filter); 382163ac707SMichael Wilmes return $users; 383163ac707SMichael Wilmes } 384163ac707SMichael Wilmes 385163ac707SMichael Wilmes /** 386163ac707SMichael Wilmes * Retrieve & clean user data from the form 387163ac707SMichael Wilmes * 388163ac707SMichael Wilmes * @param bool $clean whether the cleanUser method of the authentication backend is applied 389163ac707SMichael Wilmes * @return array (user, password, full name, email, array(groups)) 390163ac707SMichael Wilmes */ 391163ac707SMichael Wilmes protected function _retrieveUser($clean=true) { 392163ac707SMichael Wilmes /** @var DokuWiki_Auth_Plugin $auth */ 393163ac707SMichael Wilmes global $auth; 394163ac707SMichael Wilmes global $INPUT; 395163ac707SMichael Wilmes 396163ac707SMichael Wilmes $user = array(); 397163ac707SMichael Wilmes $user[0] = ($clean) ? $auth->cleanUser($INPUT->str('userid')) : $INPUT->str('userid'); 398163ac707SMichael Wilmes $user[1] = $INPUT->str('userpass'); 399163ac707SMichael Wilmes $user[2] = $INPUT->str('username'); 400163ac707SMichael Wilmes $user[3] = $INPUT->str('usermail'); 401163ac707SMichael Wilmes $user[4] = explode(',',$INPUT->str('usergroups')); 402163ac707SMichael Wilmes $user[5] = $INPUT->str('userpass2'); // repeated password for confirmation 403163ac707SMichael Wilmes 404163ac707SMichael Wilmes $user[4] = array_map('trim',$user[4]); 405163ac707SMichael Wilmes if($clean) $user[4] = array_map(array($auth,'cleanGroup'),$user[4]); 406163ac707SMichael Wilmes $user[4] = array_filter($user[4]); 407163ac707SMichael Wilmes $user[4] = array_unique($user[4]); 408163ac707SMichael Wilmes if(!count($user[4])) $user[4] = null; 409163ac707SMichael Wilmes 410163ac707SMichael Wilmes return $user; 411163ac707SMichael Wilmes } 412163ac707SMichael Wilmes 413163ac707SMichael Wilmes /** 414163ac707SMichael Wilmes * Set the filter with the current search terms or clear the filter 415163ac707SMichael Wilmes * 416163ac707SMichael Wilmes * @param string $op 'new' or 'clear' 417163ac707SMichael Wilmes */ 418163ac707SMichael Wilmes protected function _setFilter($op) { 419163ac707SMichael Wilmes 420163ac707SMichael Wilmes $this->_filter = array(); 421163ac707SMichael Wilmes 422163ac707SMichael Wilmes if ($op == 'new') { 423163ac707SMichael Wilmes list($user,/* $pass */,$name,$mail,$grps) = $this->_retrieveUser(false); 424163ac707SMichael Wilmes 425163ac707SMichael Wilmes if (!empty($user)) $this->_filter['user'] = $user; 426163ac707SMichael Wilmes if (!empty($name)) $this->_filter['name'] = $name; 427163ac707SMichael Wilmes if (!empty($mail)) $this->_filter['mail'] = $mail; 428163ac707SMichael Wilmes } 429163ac707SMichael Wilmes } 430163ac707SMichael Wilmes 431163ac707SMichael Wilmes /** 432163ac707SMichael Wilmes * Get the current search terms 433163ac707SMichael Wilmes * 434163ac707SMichael Wilmes * @return array 435163ac707SMichael Wilmes */ 436163ac707SMichael Wilmes protected function _retrieveFilter() { 437163ac707SMichael Wilmes global $INPUT; 438163ac707SMichael Wilmes 439163ac707SMichael Wilmes $t_filter = $INPUT->arr('filter'); 440163ac707SMichael Wilmes 441163ac707SMichael Wilmes // messy, but this way we ensure we aren't getting any additional crap from malicious users 442163ac707SMichael Wilmes $filter = array(); 443163ac707SMichael Wilmes 444163ac707SMichael Wilmes if (isset($t_filter['user'])) $filter['user'] = $t_filter['user']; 445163ac707SMichael Wilmes if (isset($t_filter['name'])) $filter['name'] = $t_filter['name']; 446163ac707SMichael Wilmes if (isset($t_filter['mail'])) $filter['mail'] = $t_filter['mail']; 447163ac707SMichael Wilmes 448163ac707SMichael Wilmes return $filter; 449163ac707SMichael Wilmes } 450163ac707SMichael Wilmes 451163ac707SMichael Wilmes /** 452163ac707SMichael Wilmes * Validate and improve the pagination values 453163ac707SMichael Wilmes */ 454163ac707SMichael Wilmes protected function _validatePagination() { 455163ac707SMichael Wilmes 456163ac707SMichael Wilmes if ($this->_start >= $this->_user_total) { 457163ac707SMichael Wilmes $this->_start = $this->_user_total - $this->_pagesize; 458163ac707SMichael Wilmes } 459163ac707SMichael Wilmes if ($this->_start < 0) $this->_start = 0; 460163ac707SMichael Wilmes 461163ac707SMichael Wilmes $this->_last = min($this->_user_total, $this->_start + $this->_pagesize); 462163ac707SMichael Wilmes } 463163ac707SMichael Wilmes 464163ac707SMichael Wilmes /** 465163ac707SMichael Wilmes * Return an array of strings to enable/disable pagination buttons 466163ac707SMichael Wilmes * 467163ac707SMichael Wilmes * @return array with enable/disable attributes 468163ac707SMichael Wilmes */ 469163ac707SMichael Wilmes protected function _pagination() { 470163ac707SMichael Wilmes 471163ac707SMichael Wilmes $disabled = 'disabled="disabled"'; 472163ac707SMichael Wilmes 473163ac707SMichael Wilmes $buttons = array(); 474163ac707SMichael Wilmes $buttons['start'] = $buttons['prev'] = ($this->_start == 0) ? $disabled : ''; 475163ac707SMichael Wilmes 476163ac707SMichael Wilmes if ($this->_user_total == -1) { 477163ac707SMichael Wilmes $buttons['last'] = $disabled; 478163ac707SMichael Wilmes $buttons['next'] = ''; 479163ac707SMichael Wilmes } else { 480163ac707SMichael Wilmes $buttons['last'] = $buttons['next'] = (($this->_start + $this->_pagesize) >= $this->_user_total) ? $disabled : ''; 481163ac707SMichael Wilmes } 482163ac707SMichael Wilmes 483163ac707SMichael Wilmes if ($this->_lastdisabled) { 484163ac707SMichael Wilmes $buttons['last'] = $disabled; 485163ac707SMichael Wilmes } 486163ac707SMichael Wilmes 487163ac707SMichael Wilmes return $buttons; 488163ac707SMichael Wilmes } 489163ac707SMichael Wilmes 490163ac707SMichael Wilmes 491163ac707SMichael Wilmes} 492