31
31
protected $_edit_userdata = array();
32
32
protected $_disabled = ''; // if disabled set to explanatory string
33
33
protected $_import_failures = array();
34
protected $_lastdisabled = false; // set to true if last user is unknown and last button is hence buggy
38
public function admin_plugin_usermanager(){
39
public function __construct(){
39
40
/** @var DokuWiki_Auth_Plugin $auth */
62
* Return prompt for admin menu
63
* Return prompt for admin menu
65
* @param string $language
64
68
public function getMenuText($language) {
66
70
if (!is_null($this->_auth))
73
77
* return sort order for position in admin menu
75
81
public function getMenuSort() {
86
* @return int current start value for pageination
88
public function getStart() {
93
* @return int number of users per page
95
public function getPagesize() {
96
return $this->_pagesize;
100
* @param boolean $lastdisabled
102
public function setLastdisabled($lastdisabled) {
103
$this->_lastdisabled = $lastdisabled;
80
107
* Handle user request
82
111
public function handle() {
192
223
$groups = join(', ',$grps);
193
224
ptln(" <tr class=\"user_info\">");
194
ptln(" <td class=\"centeralign\"><input type=\"checkbox\" name=\"delete[".$user."]\" ".$delete_disable." /></td>");
225
ptln(" <td class=\"centeralign\"><input type=\"checkbox\" name=\"delete[".hsc($user)."]\" ".$delete_disable." /></td>");
196
ptln(" <td><a href=\"".wl($ID,array('fn[edit]['.hsc($user).']' => 1,
227
ptln(" <td><a href=\"".wl($ID,array('fn[edit]['.$user.']' => 1,
198
229
'page' => 'usermanager',
199
230
'sectok' => getSecurityToken())).
210
241
ptln(" <tbody>");
211
242
ptln(" <tr><td colspan=\"5\" class=\"centeralign\">");
212
243
ptln(" <span class=\"medialeft\">");
213
ptln(" <input type=\"submit\" name=\"fn[delete]\" ".$delete_disable." class=\"button\" value=\"".$this->lang['delete_selected']."\" id=\"usrmgr__del\" />");
244
ptln(" <button type=\"submit\" name=\"fn[delete]\" id=\"usrmgr__del\" ".$delete_disable.">".$this->lang['delete_selected']."</button>");
215
246
ptln(" <span class=\"mediaright\">");
216
ptln(" <input type=\"submit\" name=\"fn[start]\" ".$page_buttons['start']." class=\"button\" value=\"".$this->lang['start']."\" />");
217
ptln(" <input type=\"submit\" name=\"fn[prev]\" ".$page_buttons['prev']." class=\"button\" value=\"".$this->lang['prev']."\" />");
218
ptln(" <input type=\"submit\" name=\"fn[next]\" ".$page_buttons['next']." class=\"button\" value=\"".$this->lang['next']."\" />");
219
ptln(" <input type=\"submit\" name=\"fn[last]\" ".$page_buttons['last']." class=\"button\" value=\"".$this->lang['last']."\" />");
247
ptln(" <button type=\"submit\" name=\"fn[start]\" ".$page_buttons['start'].">".$this->lang['start']."</button>");
248
ptln(" <button type=\"submit\" name=\"fn[prev]\" ".$page_buttons['prev'].">".$this->lang['prev']."</button>");
249
ptln(" <button type=\"submit\" name=\"fn[next]\" ".$page_buttons['next'].">".$this->lang['next']."</button>");
250
ptln(" <button type=\"submit\" name=\"fn[last]\" ".$page_buttons['last'].">".$this->lang['last']."</button>");
220
251
ptln(" </span>");
221
252
if (!empty($this->_filter)) {
222
ptln(" <input type=\"submit\" name=\"fn[search][clear]\" class=\"button\" value=\"".$this->lang['clear']."\" />");
253
ptln(" <button type=\"submit\" name=\"fn[search][clear]\">".$this->lang['clear']."</button>");
224
ptln(" <input type=\"submit\" name=\"fn[export]\" class=\"button\" value=\"".$export_label."\" />");
255
ptln(" <button type=\"submit\" name=\"fn[export]\">".$export_label."</button>");
225
256
ptln(" <input type=\"hidden\" name=\"do\" value=\"admin\" />");
226
257
ptln(" <input type=\"hidden\" name=\"page\" value=\"usermanager\" />");
326
357
// save current $user, we need this to access details if the name is changed
328
ptln(" <input type=\"hidden\" name=\"userid_old\" value=\"".$user."\" />",$indent);
359
ptln(" <input type=\"hidden\" name=\"userid_old\" value=\"".hsc($user)."\" />",$indent);
330
361
$this->_htmlFilterSettings($indent+10);
332
ptln(" <input type=\"submit\" name=\"fn[".$cmd."]\" class=\"button\" value=\"".$this->lang[$cmd]."\" />",$indent);
363
ptln(" <button type=\"submit\" name=\"fn[".$cmd."]\">".$this->lang[$cmd]."</button>",$indent);
333
364
ptln(" </td>",$indent);
334
365
ptln(" </tr>",$indent);
335
366
ptln(" </tbody>",$indent);
339
370
ptln(" <ul class=\"notes\">");
340
371
foreach ($notes as $note) {
341
ptln(" <li><span class=\"li\">".$note."</span></li>",$indent);
372
ptln(" <li><span class=\"li\">".$note."</li>",$indent);
424
456
ptln(' <form action="'.wl($ID).'" method="post" enctype="multipart/form-data">',$indent);
425
457
formSecurityToken();
426
458
ptln(' <label>'.$this->lang['import_userlistcsv'].'<input type="file" name="import" /></label>',$indent);
427
ptln(' <input type="submit" name="fn[import]" value="'.$this->lang['import'].'" />',$indent);
459
ptln(' <button type="submit" name="fn[import]">'.$this->lang['import'].'</button>',$indent);
428
460
ptln(' <input type="hidden" name="do" value="admin" />',$indent);
429
461
ptln(' <input type="hidden" name="page" value="usermanager" />',$indent);
764
797
$this->_filter = array();
766
799
if ($op == 'new') {
767
list($user,$pass,$name,$mail,$grps) = $this->_retrieveUser(false);
800
list($user,/* $pass */,$name,$mail,$grps) = $this->_retrieveUser(false);
769
802
if (!empty($user)) $this->_filter['user'] = $user;
770
803
if (!empty($name)) $this->_filter['name'] = $name;
937
975
* Returns cleaned user data
939
977
* @param array $candidate raw values of line from input file
941
* @return array|bool cleaned data or false
978
* @param string $error
979
* @return array|false cleaned data or false
943
981
protected function _cleanImportUser($candidate, & $error){
951
989
$INPUT->set('usergroups', $candidate[4]);
953
991
$cleaned = $this->_retrieveUser();
954
list($user,$pass,$name,$mail,$grps) = $cleaned;
992
list($user,/* $pass */,$name,$mail,/* $grps */) = $cleaned;
955
993
if (empty($user)) {
956
994
$error = $this->lang['import_error_baduserid'];
1032
1073
* @deprecated remove when dokuwiki php requirement increases to 5.3+
1033
1074
* also associated unit test & mock access method
1076
* @param string $csv string to parse
1035
1079
protected function _getcsv($csv) {
1036
1080
return function_exists('str_getcsv') ? str_getcsv($csv) : $this->str_getcsv($csv);
1041
1085
* loosely based on www.php.net/str_getcsv#88311
1043
1087
* @deprecated remove when dokuwiki php requirement increases to 5.3+
1089
* @param string $str string to parse
1045
1092
protected function str_getcsv($str) {
1046
1093
$fp = fopen("php://temp/maxmemory:1048576", 'r+'); // 1MiB