<?php
// must be run within Dokuwiki
if (!defined('DOKU_INC')) die();
require_once(dirname(__FILE__).'/TokenHelper.php');
require_once(dirname(__FILE__).'/GoogleAuthenticator.php');
/**
 * Google Authenticator Two Factor Form Action Plugin
 *
 * @author Andreas Boehler dev@aboehler.at
 * @author Daniel Popp dan@danpopp.net
 */
class action_plugin_authg2fa extends DokuWiki_Action_Plugin {

    /**
     * Registers the event handlers.
     */
    function register(Doku_Event_Handler $controller)
    {
        $enable = $this->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);
    }

}
?>
