Ars Longa, Vita Brevis

Июнь 26, 2008

Сброс пароля в WordPress 2.5.1

Рубрика: Патчи
Метки: , , , ,
Vladimir @ 2:52 дп
RSS 2.0

Патч, решающий проблему сброса пароля в WordPress 2.5.1

У WordPress 2.5.1 есть одна весьма нехорошая ошибка: не работает сброс пароля. При попытке сброса WordPress выдает следующую ошибку: "Sorry, that key does not appear to be valid". Данная ошибка исправлена в dev-версии WordPress 2.5.2.

Тем не менее, все мы люди, и нам, к сожалению, свойственно забывать. В том числе и пароли. Для восстановления пароля ждать выхода официальной версии 2.5.2 не кажется логичным, поэтому будем исправлять то, что есть.

Проблема возникает из-за двух особенностей (читай: ошибок):

  1. Случайно генерируемый пароль содержит специальные символы !@#$%^&*(), вследствие чего ссылка с кодом для сброса пароля воспринимается неправильно (почтовики воспринимают ссылку лишь частично — забыли разработчики прогнать сгенерированный пароль через urlencode()).
  2. Вторая ошибка гораздо серьёзнее: рассмотрим, почему. Допустим, пришло письмо с ссылкой на wp-login.php?action=rp&key=hX(ZLKYR)*gl. WordPress вызовет reset_password("hX(ZLKYR)*gl"), а в функции reset_password() есть такая замечательная строка:
    [-]
    View Code PHP
    1. $key = preg_replace('/[^a-z0-9]/i', '', $key);

    Иными словами, всё, что не цифра и не буква английского алфавита, будет удалено. Код активации примет вид hXZLKYRgl и будет сравниваться с кодом, который хранится в базе данных (hX(ZLKYR)*gl). Очевидно, что они не совпадут, и мы увидим сообщение об ошибке.

Ниже приведён патч в формате unified diff для исправления данной проблемы.

[-]
Index: wp-login.php
===================================================================
--- wp-login.php (original)
+++ wp-login.php (corrected)
@@ -94,5 +94,5 @@
    if ( empty($key) ) {
        // Generate something random for a key...
-       $key = wp_generate_password();
+       $key = wp_generate_password(20, false);
        do_action('retrieve_password_key', $user_login, $key);
        // Now insert the new md5 key into the db
Index: wp-includes/pluggable.php
===================================================================
--- wp-includes/pluggable.php (original)
+++ wp-includes/pluggable.php (corrected)
@@ -1169,6 +1169,9 @@
  * @return string The random password
  **/
-function wp_generate_password($length = 12) {
-   $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()";
+function wp_generate_pa