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
|
|
}
|
|
|
|
}
|