*/
class admin_plugin_twofactor extends DokuWiki_Admin_Plugin
{
protected $userList = array(); // list of users with attributes
protected $filter = array(); // user selection filter(s)
protected $start = 0; // index of first user to be displayed
protected $last = 0; // index of the last user to be displayed
protected $pagesize = 20; // number of users to list on one page
protected $disabled = ''; // if disabled set to explanatory string
protected $lastdisabled = false; // set to true if last user is unknown and last button is hence buggy
/** @var helper_plugin_attribute */
protected $attribute;
/**
* Constructor
*/
public function __construct()
{
if (!(Manager::getInstance())->isReady()) return;
$this->attribute = plugin_load('helper', 'attribute');
$this->userList = $this->attribute->enumerateUsers('twofactor');
}
/** @inheritdoc */
public function handle()
{
global $INPUT, $INFO;
if (!$INFO['isadmin']) return false;
if ($this->disabled) {
// If disabled, don't process anything.
return true;
}
// extract the command and any specific parameters
// submit button name is of the form - fn[cmd][param(s)]
$fn = $INPUT->param('fn');
if (is_array($fn)) {
$cmd = key($fn);
$param = is_array($fn[$cmd]) ? key($fn[$cmd]) : null;
} else {
$cmd = $fn;
$param = null;
}
if ($cmd != "search") {
$this->start = $INPUT->int('start', 0);
$this->filter = $this->_retrieveFilter();
}
switch ($cmd) {
case "reset" :
$this->_resetUser();
break;
case "search" :
$this->_setFilter($param);
$this->start = 0;
break;
}
$this->_user_total = count($this->userList) > 0 ? $this->_getUserCount($this->filter) : -1;
// page handling
switch ($cmd) {
case 'start' :
$this->start = 0;
break;
case 'prev' :
$this->start -= $this->pagesize;
break;
case 'next' :
$this->start += $this->pagesize;
break;
case 'last' :
$this->start = $this->_user_total;
break;
}
$this->_validatePagination();
return true;
}
/**
* Output appropriate html
*
* @return bool
*/
public function html()
{
global $ID, $INFO;
$users = $this->getUsers($this->start, $this->pagesize, $this->filter);
$pagination = $this->getPagination();
echo $this->locale_xhtml('admin');
echo '
'; // FIXME do we reuse styles?
echo '
';
// FIXME check if isReady, display info if not
$form = new Form(['method' => 'POST']);
$form->setHiddenField('do', 'admin');
$form->setHiddenField('page', 'twofactor');
$form->setHiddenField('start', $this->start);
$form->addTagOpen('div')->addClass('table');
$form->addTagOpen('table')->addClass('inline');
$form = $this->addTableHead($form);
$form->addTagOpen('tbody');
foreach ($users as $user => $userinfo) {
$form = $this->addTableUser($form, $user, $userinfo);
}
$form->addTagClose('tbody');
$form->addTagClose('table');
$form->addTagClose('div');
echo $form->toHTML();
return true;
}
/**
* Add the table headers to the table in the given form
* @param Form $form
* @return Form
*/
protected function addTableHead(Form $form)
{
$form->addTagOpen('thead');
// header
$form->addTagOpen('tr');
$form->addTagOpen('th');
$form->addHTML($this->getLang('user_id'));
$form->addTagClose('th');
$form->addTagOpen('th');
$form->addHTML($this->getLang('user_name'));
$form->addTagClose('th');
$form->addTagOpen('th');
$form->addHTML($this->getLang('user_mail'));
$form->addTagClose('th');
$form->addTagOpen('th');
$form->addHTML($this->getLang('action'));
$form->addTagClose('th');
$form->addTagClose('tr');
// filter
$form->addTagOpen('tr');
$form->addTagOpen('th');
$form->addTextInput('userid');
$form->addTagClose('th');
$form->addTagOpen('th');
$form->addTextInput('username');
$form->addTagClose('th');
$form->addTagOpen('th');
$form->addTextInput('usermail');
$form->addTagClose('th');
$form->addTagOpen('th');
$form->addButton('', $this->getLang('search'))->attr('type', 'submit');
$form->addTagClose('th');
$form->addTagClose('tr');
$form->addTagClose('thead');
return $form;
}
/**
* Add
*
* @param Form $form
* @param $user
* @param $userinfo
* @return Form
*/
protected function addTableUser(Form $form, $user, $userinfo)
{
$form->addTagOpen('tr');
$form->addTagOpen('td');
$form->addHTML(hsc($user));
$form->addTagClose('td');
$form->addTagOpen('td');
$form->addHTML(hsc($userinfo['name']));
$form->addTagClose('td');
$form->addTagOpen('td');
$form->addHTML(hsc($userinfo['mail']));
$form->addTagClose('td');
$form->addTagOpen('td');
$form->addButton('reset[' . $user . ']', $this->getLang('reset'))->attr('type', 'submit');
$form->addTagClose('td');
$form->addTagClose('tr');
return $form;
}
/**
* @return int current start value for pageination
*/
public function getStart()
{
return $this->start;
}
/**
* @return int number of users per page
*/
public function getPagesize()
{
return $this->pagesize;
}
/**
* @param boolean $lastdisabled
*/
public function setLastdisabled($lastdisabled)
{
$this->lastdisabled = $lastdisabled;
}
/**
* Prints a inputfield
*
* @param string $id
* @param string $name
* @param string $label
* @param string $value
* @param bool $cando whether auth backend is capable to do this action
* @param int $indent
*/
protected function _htmlInputField($id, $name, $label, $value, $cando, $indent = 0)
{
$class = $cando ? '' : ' class="disabled"';
echo str_pad('', $indent);
if ($name == 'userpass' || $name == 'userpass2') {
$fieldtype = 'password';
$autocomp = 'autocomplete="off"';
} elseif ($name == 'usermail') {
$fieldtype = 'email';
$autocomp = '';
} else {
$fieldtype = 'text';
$autocomp = '';
}
$value = hsc($value);
echo "