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