getConf("g2fa_enable"); if($enable===1) { $controller->register_hook('HTML_LOGINFORM_OUTPUT', 'BEFORE', $this, 'two_fa_login_form', array()); $controller->register_hook('HTML_UPDATEPROFILEFORM_OUTPUT', 'AFTER', $this, 'handle_profile_form', array()); } } /** * Handles the login form rendering. */ function two_fa_login_form(&$event, $param) { global $conf; // Show login form above submit button (and above remember me option, if enabled) $pos = $event->data->findElementByAttribute('type', 'submit'); if($conf["rememberme"]) $pos = $pos-1; $event->data->insertElement($pos, form_makePasswordField('t', $this->getLang('g2fa'), '', 'block')); } function handle_profile_form(&$event, $param) { global $ID; global $INPUT; $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; } $th = new TokenHelper(); $secret = $th->getSecret($_SERVER['REMOTE_USER']); $form = new Doku_Form($ID); $form->startFieldset($this->getLang('g2fa_fieldset')); $form->addHidden('do', 'profile'); $form->addHidden('g2fa', '1'); $reveal = false; switch($cmd) { case "gensecret" : if($th->createTokenForUser($_SERVER['REMOTE_USER'])) { msg($this->getLang('g2fa_created')); $secret = $th->getSecret($_SERVER['REMOTE_USER']); } break; case "update": if($INPUT->param('secret') == "********") { msg($this->getLang('g2fa_notchanged')); break; } if($th->saveToken($_SERVER['REMOTE_USER'], $INPUT->param('secret'))) msg($this->getLang('g2fa_updated')); else msg($this->getLang('g2fa_notchanged')); $secret = $th->getSecret($_SERVER['REMOTE_USER']); break; case "showqr" : if($secret != '') { $ga = new PHPGangsta_GoogleAuthenticator(); $url = $ga->getQRCodeGoogleUrl(urlencode('DokuWiki:'.$_SERVER['REMOTE_USER']), $secret); $form->addElement(form_makeTag('img', array('src' => $url, 'alt' => 'Google 2FA QR Image'))); $form->addElement(form_makeTag('br')); $reveal = true; } break; case "delsecret" : if($th->deleteTokenForUser($_SERVER['REMOTE_USER'])) { msg($this->getLang('g2fa_removed')); $secret = ''; } break; } if($reveal) { $form->addElement(form_makeTextField('secret', $secret, $this->getLang('secret'), '', 'block', array('size'=>'50'))); } else { $form->addElement(form_makeTextField('secret', '********', $this->getLang('secret'), '', 'block', array('size'=>'50'))); } $form->addElement(form_makeButton('submit', '', $this->getLang('showqr'), array('name' => 'fn[showqr]', 'disabled' => $secret == '' ? 'disabled' : ''))); $form->addElement(form_makeTag('br')); $form->addElement(form_makeButton('submit', '', $this->getLang('generate'), array('name' => 'fn[gensecret]'))); $form->addElement(form_makeButton('submit', '', $this->getLang('update'), array('name' => 'fn[update]'))); $form->addElement(form_makeTag('br')); $form->addElement(form_makeButton('submit', '', $this->getLang('delete'), array('name' => 'fn[delsecret]', 'disabled' => $secret == '' ? 'disabled' : '' ))); $form->endFieldset(); html_form('g2fa', $form); } } ?>