178 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace dokuwiki\Action;
 | 
						|
 | 
						|
use dokuwiki\Action\Exception\ActionAbort;
 | 
						|
use dokuwiki\Action\Exception\ActionDisabledException;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class Resendpwd
 | 
						|
 *
 | 
						|
 * Handle password recovery
 | 
						|
 *
 | 
						|
 * @package dokuwiki\Action
 | 
						|
 */
 | 
						|
class Resendpwd extends AbstractAclAction {
 | 
						|
 | 
						|
    /** @inheritdoc */
 | 
						|
    public function minimumPermission() {
 | 
						|
        return AUTH_NONE;
 | 
						|
    }
 | 
						|
 | 
						|
    /** @inheritdoc */
 | 
						|
    public function checkPreconditions() {
 | 
						|
        parent::checkPreconditions();
 | 
						|
 | 
						|
        /** @var \dokuwiki\Extension\AuthPlugin $auth */
 | 
						|
        global $auth;
 | 
						|
        global $conf;
 | 
						|
        if(isset($conf['resendpasswd']) && !$conf['resendpasswd']) throw new ActionDisabledException(); //legacy option
 | 
						|
        if(!$auth->canDo('modPass')) throw new ActionDisabledException();
 | 
						|
    }
 | 
						|
 | 
						|
    /** @inheritdoc */
 | 
						|
    public function preProcess() {
 | 
						|
        if($this->resendpwd()) {
 | 
						|
            throw new ActionAbort('login');
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /** @inheritdoc */
 | 
						|
    public function tplContent() {
 | 
						|
        html_resendpwd();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Send a  new password
 | 
						|
     *
 | 
						|
     * This function handles both phases of the password reset:
 | 
						|
     *
 | 
						|
     *   - handling the first request of password reset
 | 
						|
     *   - validating the password reset auth token
 | 
						|
     *
 | 
						|
     * @author Benoit Chesneau <benoit@bchesneau.info>
 | 
						|
     * @author Chris Smith <chris@jalakai.co.uk>
 | 
						|
     * @author Andreas Gohr <andi@splitbrain.org>
 | 
						|
     * @fixme this should be split up into multiple methods
 | 
						|
     * @return bool true on success, false on any error
 | 
						|
     */
 | 
						|
    protected function resendpwd() {
 | 
						|
        global $lang;
 | 
						|
        global $conf;
 | 
						|
        /* @var \dokuwiki\Extension\AuthPlugin $auth */
 | 
						|
        global $auth;
 | 
						|
        global $INPUT;
 | 
						|
 | 
						|
        if(!actionOK('resendpwd')) {
 | 
						|
            msg($lang['resendna'], -1);
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        $token = preg_replace('/[^a-f0-9]+/', '', $INPUT->str('pwauth'));
 | 
						|
 | 
						|
        if($token) {
 | 
						|
            // we're in token phase - get user info from token
 | 
						|
 | 
						|
            $tfile = $conf['cachedir'] . '/' . $token[0] . '/' . $token . '.pwauth';
 | 
						|
            if(!file_exists($tfile)) {
 | 
						|
                msg($lang['resendpwdbadauth'], -1);
 | 
						|
                $INPUT->remove('pwauth');
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
            // token is only valid for 3 days
 | 
						|
            if((time() - filemtime($tfile)) > (3 * 60 * 60 * 24)) {
 | 
						|
                msg($lang['resendpwdbadauth'], -1);
 | 
						|
                $INPUT->remove('pwauth');
 | 
						|
                @unlink($tfile);
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
 | 
						|
            $user = io_readfile($tfile);
 | 
						|
            $userinfo = $auth->getUserData($user, $requireGroups = false);
 | 
						|
            if(!$userinfo['mail']) {
 | 
						|
                msg($lang['resendpwdnouser'], -1);
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
 | 
						|
            if(!$conf['autopasswd']) { // we let the user choose a password
 | 
						|
                $pass = $INPUT->str('pass');
 | 
						|
 | 
						|
                // password given correctly?
 | 
						|
                if(!$pass) return false;
 | 
						|
                if($pass != $INPUT->str('passchk')) {
 | 
						|
                    msg($lang['regbadpass'], -1);
 | 
						|
                    return false;
 | 
						|
                }
 | 
						|
 | 
						|
                // change it
 | 
						|
                if(!$auth->triggerUserMod('modify', array($user, array('pass' => $pass)))) {
 | 
						|
                    msg($lang['proffail'], -1);
 | 
						|
                    return false;
 | 
						|
                }
 | 
						|
 | 
						|
            } else { // autogenerate the password and send by mail
 | 
						|
 | 
						|
                $pass = auth_pwgen($user);
 | 
						|
                if(!$auth->triggerUserMod('modify', array($user, array('pass' => $pass)))) {
 | 
						|
                    msg($lang['proffail'], -1);
 | 
						|
                    return false;
 | 
						|
                }
 | 
						|
 | 
						|
                if(auth_sendPassword($user, $pass)) {
 | 
						|
                    msg($lang['resendpwdsuccess'], 1);
 | 
						|
                } else {
 | 
						|
                    msg($lang['regmailfail'], -1);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            @unlink($tfile);
 | 
						|
            return true;
 | 
						|
 | 
						|
        } else {
 | 
						|
            // we're in request phase
 | 
						|
 | 
						|
            if(!$INPUT->post->bool('save')) return false;
 | 
						|
 | 
						|
            if(!$INPUT->post->str('login')) {
 | 
						|
                msg($lang['resendpwdmissing'], -1);
 | 
						|
                return false;
 | 
						|
            } else {
 | 
						|
                $user = trim($auth->cleanUser($INPUT->post->str('login')));
 | 
						|
            }
 | 
						|
 | 
						|
            $userinfo = $auth->getUserData($user, $requireGroups = false);
 | 
						|
            if(!$userinfo['mail']) {
 | 
						|
                msg($lang['resendpwdnouser'], -1);
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
 | 
						|
            // generate auth token
 | 
						|
            $token = md5(auth_randombytes(16)); // random secret
 | 
						|
            $tfile = $conf['cachedir'] . '/' . $token[0] . '/' . $token . '.pwauth';
 | 
						|
            $url = wl('', array('do' => 'resendpwd', 'pwauth' => $token), true, '&');
 | 
						|
 | 
						|
            io_saveFile($tfile, $user);
 | 
						|
 | 
						|
            $text = rawLocale('pwconfirm');
 | 
						|
            $trep = array(
 | 
						|
                'FULLNAME' => $userinfo['name'],
 | 
						|
                'LOGIN' => $user,
 | 
						|
                'CONFIRM' => $url
 | 
						|
            );
 | 
						|
 | 
						|
            $mail = new \Mailer();
 | 
						|
            $mail->to($userinfo['name'] . ' <' . $userinfo['mail'] . '>');
 | 
						|
            $mail->subject($lang['regpwmail']);
 | 
						|
            $mail->setBody($text, $trep);
 | 
						|
            if($mail->send()) {
 | 
						|
                msg($lang['resendpwdconfirm'], 1);
 | 
						|
            } else {
 | 
						|
                msg($lang['regmailfail'], -1);
 | 
						|
            }
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
        // never reached
 | 
						|
    }
 | 
						|
 | 
						|
}
 |