• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела killoff лично.

Помощь Вопросы по DLE (ВНИМАТЕЛЬНО читаем первый пост!!!)

Горбушка

Ищу её...
Регистрация
2 Май 2008
Сообщения
3.444
Реакции
2.524
Для просмотра ссылки Войди или Зарегистрируйся | Для просмотра ссылки Войди или Зарегистрируйся | Для просмотра ссылки Войди или Зарегистрируйся | Для просмотра ссылки Войди или Зарегистрируйся | Для просмотра ссылки Войди или Зарегистрируйся

Если у Вас недостаточно постов/уровня для создания новой темы, пишите свои вопросы здесь.

Если постов хватает - в новую тему.

Спасибо на этом форуме говорят кнопкой "Мне нравится"...
 
Последнее редактирование:
Здравствуйте. Подскажите пожалуйста, как можно реализовать проверку логина/пароля в dle 11.3->12 из вне, то есть у меня есть программное обеспечение использующее скрипт на сайте для проверки наличия логина и пароля в базе данных, раньше он работал, использую для теста демо версию dle12 пытаюсь подключится к api но выдаёт ошибку(с оригиналом активированным 11.3, точно такая-же проблема). И программа и движок на одном хосте, только что программа работает из под root, а движок из под пользователя.
java.io.IOException: Server returned HTTP response code: 500 for URL
То есть не может его углядеть он, не пойму почему.
<?php
include('engine/api/api.class.php');

//Секретный ключ
$api_key_secret = "API_KEY";

//Входящие параметры
$login = $_GET['login'];
$password = $_GET['password'];
$api_key = $_GET['api_key'];

if(empty($api_key)) { exit("Error 001"); }
if(strcmp($api_key, $api_key_secret) != 0) { exit("Error 002"); }

if(empty($login)) { exit("Empty login"); }
if(empty($password)) { exit("Empty password"); }

$auth_result = external_auth($login, $password);
echo($auth_result ? "OK:" . $login : "Incorrect login or password");
?>
 
Последнее редактирование:
программа работает из под root
А поделись ссылочкой, люблю сервера с программами от root'а :devil:

Судя по всему, скрипт у тебя работает на Java. Возращает 500-ую ошибку.

500-ая ошибка чаще всего говорит о ошибках на сервере при выключенном выводе ошибок.

Диагностика:
1) Открываешь логи Apache и читаешь чего там PHP тебе написал. Скорее всего будет что-то типа, что файла по такому адресу нет.
2) Открой эту страницу напрямую - не через Java. Если так же 500-ая ошибка - значит беда в ДЛЕ, если нет - беда в твоём приложении...

P.s. Tomcat переведи на пользователя tomcat.
То есть не может его углядеть он
Неа, тогда б была 404..
 
А поделись ссылочкой, люблю сервера с программами от root'а :devil:

Судя по всему, скрипт у тебя работает на Java. Возращает 500-ую ошибку.

500-ая ошибка чаще всего говорит о ошибках на сервере при выключенном выводе ошибок.

Диагностика:
1) Открываешь логи Apache и читаешь чего там PHP тебе написал. Скорее всего будет что-то типа, что файла по такому адресу нет.
2) Открой эту страницу напрямую - не через Java. Если так же 500-ая ошибка - значит беда в ДЛЕ, если нет - беда в твоём приложении...

P.s. Tomcat переведи на пользователя tomcat.

Неа, тогда б была 404..
Вот что обнаружил в логах:
PHP Notice: Undefined variable: config in /engine/api/api.class.php on line 643
PHP Fatal error: Call to undefined function password_verify() in /engine/api/api.class.php on line 274
При открытии через браузер файла скрипта, как и положено выдаёт ошибку об отсутствии обращения. Отправкa запроса, вызывает 500-ую ошибочку.
Что делать с этим DLE, не могут же две разные версии одинаково сойти с ума, к слову дистрибутив 11.3 на другой машине того-же хоста не давал таких проблем, от того и знаю что скрипт рабочий.(пробовал уже переустанавливать ОС, и даже ещё раз сменил VPS, уже сомневаюсь что в этом может быть проблема)
 
Последнее редактирование:
И так... Наш любимый разработчик не меняя версию 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:
    class DLE_API
Вставляем выше:
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, а в блокноте раздэбажить получилось только то, что написал выше...
 
И так... Наш любимый разработчик не меняя версию 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:
    class DLE_API
Вставляем выше:
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, а в блокноте раздэбажить получилось только то, что написал выше...
Благодарю за помощь, костыль ваш не сработал, ругаться начал на строку
if (!is_string($ret) || strlen_8bit($ret) != strlen_8bit($hash) || strlen_8bit($ret) <= 13) {
А вот подключить functions.php помогло
include_once (ENGINE_DIR . '/modules/functions.php');
Проверил по логам, теперь он на него в паре строк ругается и на апи тоже :facepalm:
[Tue Sep 05 07:53:06 2017] [error] PHP Notice: Undefined variable: config in /engine/modules/functions.php on line 21
[Tue Sep 05 07:53:06 2017] [error] PHP Notice: Undefined variable: config in /engine/modules/functions.php on line 43
[Tue Sep 05 07:53:06 2017] [error] PHP Notice: Undefined variable: config in /engine/api/api.class.php on line 665
PHP:
if ( $config['auth_domain'] ) {

    $domain_cookie = explode (".", clean_url( $_SERVER['HTTP_HOST'] ));
    $domain_cookie_count = count($domain_cookie);
    $domain_allow_count = -2;

    if ( $domain_cookie_count > 2 ) {

        if ( in_array($domain_cookie[$domain_cookie_count-2], array('com', 'net', 'org') )) $domain_allow_count = -3;
        if ( $domain_cookie[$domain_cookie_count-1] == 'ua' ) $domain_allow_count = -3;
        $domain_cookie = array_slice($domain_cookie, $domain_allow_count);
    }

    $domain_cookie = "." . implode (".", $domain_cookie);

    if( (ip2long($_SERVER['HTTP_HOST']) == -1 OR ip2long($_SERVER['HTTP_HOST']) === FALSE) AND strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' ) define( 'DOMAIN', $domain_cookie );
    else define( 'DOMAIN', null );

} else define( 'DOMAIN', null );
PHP:
if ( $config['cache_type'] ) {

    include_once ENGINE_DIR . '/classes/memcache.class.php';
    $mcache = new dle_memcache($config);

}
PHP:
if( !$config['version_id'] ) {
        include_once (ENGINE_DIR . '/data/config.php');
        date_default_timezone_set ( $config['date_adjust'] );
        }
Стоит ли с ними что-то делать?
UPD. Возможно эти ошибки, из-за того что я на демо версии сижу, вылезают.
 
Последнее редактирование:
И так... Наш любимый разработчик не меняя версию 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:
    class DLE_API
Вставляем выше:
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, а в блокноте раздэбажить получилось только то, что написал выше...
а не проще просто удалить api.class.php, чем вносить все эти правки?)
 
По аналогии выдераем strlen_8bit() из functions.php и вставляем в api.class.php :)
Чёт думал это стандартная функция )))
 
DLE 11.2

Всем доброго времени суток.... Опять же вопрос к нашим много уважаемым Сэнсям.

При большом количестве доп. полей, становиться не удобно добавлять новости. Тем самым возникает вопрос, каким образом в админ панеле можно все эти доп.поля поместить в "спойлер", каждый отдельно?
Например вот так:

1504874176_image_2017-09-08_17-30-39.png
Заранее спасибо за Ваш ответ.


З.Ы Объясняю для чего это мне нужно. Это для плеера с сереалами, тем самым в доп поле кидаются ссылки на сериал. Т.е одно доп. поле это один сезон, а сезонов может быть 7-12 а то и все 17. Тем самым при добавлении новости возникают неудобства.
 
Последнее редактирование:
Назад
Сверху