X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=mod%2Flostpass.php;h=af4518ca16246292a9b8a18f8461797d9e9646e1;hb=80ac7da01d3dedf92e3673b4b97d37287bb16488;hp=57e6d696537c24b3e5440d751b5e1fa6c4e6625a;hpb=d5a6e7b1767ebc337f31745984f1ce0904b77780;p=friendica.git diff --git a/mod/lostpass.php b/mod/lostpass.php old mode 100755 new mode 100644 index 57e6d69653..af4518ca16 --- a/mod/lostpass.php +++ b/mod/lostpass.php @@ -1,128 +1,176 @@ $pwdreset_token, + 'pwdreset_time' => DateTimeFormat::utcNow() + ]; + $result = dba::update('user', $fields, ['uid' => $user['uid']]); + if ($result) { + info(L10n::t('Password reset request issued. Check your email.') . EOL); + } - $r = q("SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' ) AND `verified` = 1 AND `blocked` = 0 LIMIT 1", - dbesc($loginame), - dbesc($loginame) - ); + $sitename = $a->config['sitename']; + $resetlink = System::baseUrl() . '/lostpass/' . $pwdreset_token; - if(! count($r)) { - notice( t('No valid account found.') . EOL); - goaway(z_root()); - } + $preamble = deindent(L10n::t(' + Dear %1$s, + A request was recently received at "%2$s" to reset your account + password. In order to confirm this request, please select the verification link + below or paste it into your web browser address bar. - $uid = $r[0]['uid']; - $username = $r[0]['username']; - $email = $r[0]['email']; - - $new_password = autoname(12) . mt_rand(100,9999); - $new_password_encoded = hash('whirlpool',$new_password); - - $r = q("UPDATE `user` SET `pwdreset` = '%s' WHERE `uid` = %d LIMIT 1", - dbesc($new_password_encoded), - intval($uid) - ); - if($r) - info( t('Password reset request issued. Check your email.') . EOL); - - $email_tpl = get_intltext_template("lostpass_eml.tpl"); - $email_tpl = replace_macros($email_tpl, array( - '$sitename' => $a->config['sitename'], - '$siteurl' => $a->get_baseurl(), - '$username' => $username, - '$email' => $email, - '$reset_link' => $a->get_baseurl() . '/lostpass?verify=' . $new_password - )); - - $res = mail($email, sprintf( t('Password reset requested at %s'),$a->config['sitename']), - $email_tpl, - 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n" - . 'Content-type: text/plain; charset=UTF-8' . "\n" - . 'Content-transfer-encoding: 8bit' ); - - - goaway(z_root()); -} + If you did NOT request this change, please DO NOT follow the link + provided and ignore and/or delete this email, the request will expire shortly. + + Your password will not be changed unless we can verify that you + issued this request.', $user['username'], $sitename)); + $body = deindent(L10n::t(' + Follow this link soon to verify your identity: + %1$s -function lostpass_content(&$a) { + You will then receive a follow-up message containing the new password. + You may change that password from your account settings page after logging in. + The login details are as follows: - if(x($_GET,'verify')) { - $verify = $_GET['verify']; - $hash = hash('whirlpool', $verify); + Site Location: %2$s + Login Name: %3$s', $resetlink, System::baseUrl(), $user['email'])); - $r = q("SELECT * FROM `user` WHERE `pwdreset` = '%s' LIMIT 1", - dbesc($hash) - ); - if(! count($r)) { - notice( t("Request could not be verified. \x28You may have previously submitted it.\x29 Password reset failed.") . EOL); - goaway(z_root()); - return; + notification([ + 'type' => SYSTEM_EMAIL, + 'to_email' => $user['email'], + 'uid' => $user['uid'], + 'subject' => L10n::t('Password reset requested at %s', $sitename), + 'preamble' => $preamble, + 'body' => $body + ]); + + goaway(System::baseUrl()); +} + +function lostpass_content(App $a) +{ + $o = ''; + if ($a->argc > 1) { + $pwdreset_token = $a->argv[1]; + + $user = dba::selectFirst('user', ['uid', 'username', 'email', 'pwdreset_time'], ['pwdreset' => $pwdreset_token]); + if (!DBM::is_result($user)) { + notice(L10n::t("Request could not be verified. \x28You may have previously submitted it.\x29 Password reset failed.")); + + return lostpass_form(); } - $uid = $r[0]['uid']; - $username = $r[0]['username']; - $email = $r[0]['email']; - - $new_password = autoname(6) . mt_rand(100,9999); - $new_password_encoded = hash('whirlpool',$new_password); - - $r = q("UPDATE `user` SET `password` = '%s', `pwdreset` = '' WHERE `uid` = %d LIMIT 1", - dbesc($new_password_encoded), - intval($uid) - ); - if($r) { - $tpl = get_markup_template('pwdreset.tpl'); - $o .= replace_macros($tpl,array( - '$lbl1' => t('Password Reset'), - '$lbl2' => t('Your password has been reset as requested.'), - '$lbl3' => t('Your new password is'), - '$lbl4' => t('Save or copy your new password - and then'), - '$lbl5' => '' . t('click here to login') . '.', - '$lbl6' => t('Your password may be changed from the Settings page after successful login.'), - '$newpass' => $new_password, - '$baseurl' => $a->get_baseurl() - - )); - info("Your password has been reset." . EOL); - - - - $email_tpl = get_intltext_template("passchanged_eml.tpl"); - $email_tpl = replace_macros($email_tpl, array( - '$sitename' => $a->config['sitename'], - '$siteurl' => $a->get_baseurl(), - '$username' => $username, - '$email' => $email, - '$new_password' => $new_password, - '$uid' => $newuid )); - - $res = mail($email,"Your password has changed at {$a->config['sitename']}",$email_tpl, - 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n" - . 'Content-type: text/plain; charset=UTF-8' . "\n" - . 'Content-transfer-encoding: 8bit' ); - - return $o; + + // Password reset requests expire in 60 minutes + if ($user['pwdreset_time'] < DateTimeFormat::utc('now - 1 hour')) { + $fields = [ + 'pwdreset' => null, + 'pwdreset_time' => null + ]; + dba::update('user', $fields, ['uid' => $user['uid']]); + + notice(L10n::t('Request has expired, please make a new one.')); + + return lostpass_form(); } - + + return lostpass_generate_password($user); + } else { + return lostpass_form(); } - else { - $tpl = get_markup_template('lostpass.tpl'); +} - $o .= replace_macros($tpl,array( - '$title' => t('Forgot your Password?'), - '$desc' => t('Enter your email address and submit to have your password reset. Then check your email for further instructions.'), - '$name' => t('Nickname or Email: '), - '$submit' => t('Reset') - )); +function lostpass_form() +{ + $tpl = get_markup_template('lostpass.tpl'); + $o = replace_macros($tpl, [ + '$title' => L10n::t('Forgot your Password?'), + '$desc' => L10n::t('Enter your email address and submit to have your password reset. Then check your email for further instructions.'), + '$name' => L10n::t('Nickname or Email: '), + '$submit' => L10n::t('Reset') + ]); + + return $o; +} - return $o; +function lostpass_generate_password($user) +{ + $o = ''; + $a = get_app(); + + $new_password = User::generateNewPassword(); + $result = User::updatePassword($user['uid'], $new_password); + if (DBM::is_result($result)) { + $tpl = get_markup_template('pwdreset.tpl'); + $o .= replace_macros($tpl, [ + '$lbl1' => L10n::t('Password Reset'), + '$lbl2' => L10n::t('Your password has been reset as requested.'), + '$lbl3' => L10n::t('Your new password is'), + '$lbl4' => L10n::t('Save or copy your new password - and then'), + '$lbl5' => '' . L10n::t('click here to login') . '.', + '$lbl6' => L10n::t('Your password may be changed from the Settings page after successful login.'), + '$newpass' => $new_password, + '$baseurl' => System::baseUrl() + ]); + + info("Your password has been reset." . EOL); + + $sitename = $a->config['sitename']; + $preamble = deindent(L10n::t(' + Dear %1$s, + Your password has been changed as requested. Please retain this + information for your records ' . "\x28" . 'or change your password immediately to + something that you will remember' . "\x29" . '. + ', $user['username'])); + $body = deindent(L10n::t(' + Your login details are as follows: + + Site Location: %1$s + Login Name: %2$s + Password: %3$s + + You may change that password from your account settings page after logging in. + ', System::baseUrl(), $user['email'], $new_password)); + + notification([ + 'type' => SYSTEM_EMAIL, + 'to_email' => $user['email'], + 'uid' => $user['uid'], + 'subject' => L10n::t('Your password has been changed at %s', $sitename), + 'preamble' => $preamble, + 'body' => $body + ]); } + return $o; }