И так... Наш любимый разработчик не меняя версию API (0.07) прекрасно вносит в него изменения...
Функция проверки логина ранее была такой:
PHP:
function external_auth($login, $password)
{
$login = $this->db->safesql( $login );
$password = md5( md5( $password ) );
$arr = $this->load_table(USERPREFIX."_users", "user_id", "name = '$login' AND password = '$password'");
if( ! empty( $arr['user_id'] ) )
return true;
else
return false;
}
Теперь она такая:
PHP:
function external_auth($login, $password)
{
$login = $this->db->safesql( $login );
$arr = $this->load_table(USERPREFIX."_users", "user_id, password", "name = '$login'");
if( !empty( $arr['user_id'] ) ) {
if( $password AND $arr['password'] AND password_verify($password, $arr['password'] ) ) return true;
else return false;
} else return false;
}
Связано это с изменением способа хеширования пароля...
Но вот незадача, появился вызов функции password_verify(), которая в классе не описана, а описана в functions.php и functions.ini.php, которые мы так же не подключаем.
Т.е. по сути API у 12.0 не рабочий, скорее всего подох он около 11.1 версии... Лень тестить всё подряд...
Фиксим это недоразуменее очень легко. Идём
и культурно с помощью разбитой бутылки объясняем разработчику как кодить не надо и что такое синтетическое и QA тестирование в файл api.class.php и находим строку:
Вставляем выше:
PHP:
function password_verify($password, $hash) {
if (!function_exists('crypt')) {
die("Crypt must be loaded for password_hash to function");
}
$ret = crypt($password, $hash);
if (!is_string($ret) || strlen_8bit($ret) != strlen_8bit($hash) || strlen_8bit($ret) <= 13) {
return false;
}
$status = 0;
for ($i = 0; $i < strlen_8bit($ret); $i++) {
$status |= (ord($ret[$i]) ^ ord($hash[$i]));
}
return $status === 0;
}
Профит
P.s. конечно, это костыль, но быстрый костыль...
Есть предположение, что более красивым решением будет подключение файла functions.php.
Но мне ппц лень ставить DLE, а в блокноте раздэбажить получилось только то, что написал выше...