Перейти к публикации

Рекомендованные сообщения

Доброе время суток, дорогие друзья!

С радостью хочу объявить о второй ветке DLE API - версии 2.0.

Что же ждёт нас в версии 2.0?

1) Код полностью портирован под PHP 5.1, что сильно расширяет его возможности. Из главных - ООПность и статические методы.

Одна копия объекта на всю систему в ЛЮБОМ месте. Ничего не нужно объявлять, глобалить, наследовать

2) Расширенный конструктор запросов. Помимо уже привычного loadTable будет также insert, insertUpdate, update и новый select.

3) HTTP расширение, которое позволит связать воедино сотни сайтов. Дополнительно будет защита для доступа к АПИ по принципу:

host:ID:ключ.

Если у Вас популярный сайт на ДЛЕ, то Вы сможете создавать десятки новых ресурсов на основе одного.

4) Внешний парсер

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

Кроме того Вы можете использовать свои бб-тэги. Эта функция также работает в HTTP-режиме.

Грубо говоря если Вы хотите сделать свой бб-тэг [simple]12345[/simple], то будет вызвана функция simple и в неё будет передана строка 12345.

Это позволяет делать свою разметку и использовать на сторонних ресурсах.

5) Теперь апи можно без проблем использовать для создания своих backend'ов. Ещё в старой версии появился метод checkAuth, который проверял авторизацию.

Теперь его также можно использовать.

6) Методы addNews, addVote, sendEmailMessage

Новые методы, которые ещё больше расширяют возможности движка.

7) Суб-класс HTTPRequest

Суб-класс для удобной работы с HTTP-запросами

Вот примерный список того, что будет в новой версии API.

Высказываемся :)

Версия 2.0 Alpha:

1) Реализовано

6) Реализован sendEmailMessage

Дополнительно:

- Оптимизирован весь код

- Проверки email заменены на аналоги из версии 8.5

- Функции сгруппированы по типам

- Изменён стиль кода

- Улучшен синтаксис SQL

Изменено пользователем IT-Security
Ссылка на сообщение
Поделиться на других сайтах

>>С радостью хочу объявить о второй ветке DLE API - версии 2.0.

Ну вот, здорово, хорошая новость, можно теперь потихоньку в модах на АПИ переходить, всё код проще будет :rolleyes:

Хорошо бы еще примерчики кода какие-нибудь для наглядности, а то я пару недель назад чуть до истерики не дошел, чтоб понять, что вместо "гет-роуз" нужно "супер" запрос в БД писать на АПИ - весь код перерыл для этого, плюнул на АПИ и написал обычный запрос в БД :lol:

>>Если у Вас популярный сайт на ДЛЕ, то Вы сможете создавать десятки новых ресурсов на основе одного.

Тут как раз социалку просили... :) к вам отправил... Пора вам платный раздел открывать :D

Ссылка на сообщение
Поделиться на других сайтах
  • 1 месяц спустя...

Пресс релиз исходника :)

Для затравки так сказать :)


<?php

/**

 * API for DataLife Engine

 * @package DLE

 * @subpackage API

 * @author IT-Security

 * @since DLE 9.0

 */

/*

=====================================================

 DataLife Engine - by SoftNews Media Group 

-----------------------------------------------------

 http://dle-news.ru/

-----------------------------------------------------

 Copyright (c) 2010 IT-Security (Asafov Sergey)

=====================================================

 Данный код защищен авторскими правами

=====================================================

 Файл: api.class.php

-----------------------------------------------------

 Назначение: API для написания модификаций или интеграции в другие скрипты

 Версия 2.0 под PHP5

=====================================================

*/

if( ! defined( 'DATALIFEENGINE' ) ) {

	define( 'DATALIFEENGINE', true );

}

if( ! defined( 'ROOT_DIR' ) ) {

	define( 'ROOT_DIR', substr( dirname( __FILE__ ), 0, - 11 ) );

}


if( ! defined( 'ENGINE_DIR' ) ) {

	define( 'ENGINE_DIR', ROOT_DIR . '/engine' );

}

if( ! class_exists( 'DleAPI' ) ) {

	class DleAPI {

		public static $config = Array ();

		public static $db = false;

		public static $version = '2.0';

		public static $cache_dir = '';

		public static $_TIME = 0;

		public static $mail = false;

		public static $cache_files = Array ();

		/**

		 * Initialisation

		 */

		public static function init () {

			if (!isset(self::$config['version_id'])) {

				include_once (ENGINE_DIR . '/data/config.php');

				self::$config = $config;

			}

			if (!self::$db) {

				include_once (ENGINE_DIR . '/classes/mysql.php');

				include_once (ENGINE_DIR . '/data/dbconfig.php');

				self::$db = $db;

			}

			self::$cache_dir = ENGINE_DIR."/cache/";

			if (isset($_TIME)) {

				self::$_TIME = $_TIME;

			}

			else {

				self::$_TIME = time () + (self::$config['date_adjust'] * 60);

			}

			if (isset($mail)) {

				self::$mail = $mail;

			}

			else {

				include_once ENGINE_DIR.'/classes/mail.class.php';

				self::$mail = new dle_mail (self::$config, true);

			}

		}

		/*

		 * Service

		 */

		/**

		 * Service function - take params from table

		 * @param $table string - название таблицы

		 * @param $fields string - необходимые поля через запятйю или * для всех

		 * @param $where string - условие выборки

		 * @param $multirow bool - забирать ли один ряд или несколько

		 * @param $start int - начальное значение выборки

		 * @param $limit int - количество записей для выборки, 0 - выбрать все

		 * @param $sort string - поле, по которому осуществляется сортировка

		 * @param $sort_order - направление сортировки

		 * @return array с данными или false если mysql вернуль 0 рядов

		 */

		public static function loadTable ($table = '', $fields = "*", $where = '1', $multirow = false, $start = 0, $limit = 0, $sort = '', $sort_order = 'desc') {

			$values = Array ();

			if (!$table) {

				return ;

			}

			if ($sort!='') {

				$where.= ' order by '.$sort.' '.$sort_order;

			}

			if ($limit>0) {

				$where.= ' limit '.$start.','.$limit;

			}

			$q = self::$db->query ("Select ".$fields." from `".$table."` where ".$where);

			if ($multirow) {

				while ($row = self::$db->get_row($q)) {

					$values[] = $row;

				}

			}

			else {

				$values = self::$db->get_row($q);

			}

			if (count($values)==0) {

				return ;

			}

			return $values;

		}

		/**

		 * Проверка существования группы с указанным ID

		 * @param $group int - ID группы

		 * @return bool - true если существует и false если нет

		 */		

		private static function _checkGroup($group) {

			$row = $this->db->super_query('SELECT `id` FROM `'.USERPREFIX.'_usergroups` WHERE `id` = '.intval($group));

			return isset($row['id']);

		}

		/**

		 * Сохранение параметров скрипта

		 * @param $key string или array

		 * 		string: Название параметра

		 * 		 array: ассоциативный массив параметров

		 * @param $new_value - значение параметра. Не используется, если $key массив

		 * @return null;

		 */

		public static function editConfig ($key, $new_value = '') {

			$find = Array ();

			$replace = Array ();

			$find[] = "'\r'";

			$replace[] = "";

			$find[] = "'\n'";

			$replace[] = "";

			if (is_array($key)) {

				foreach ($key as $ckey=>$cvalue) {

					if (self::$config[$ckey]) {

						self::$config[$ckey] = $cvalue;

					}

				}

			}

			else {

				if (self::$config[$key]) {

					self::$config[$key] = $new_value;

				}

			}

			// Записываем новый конфиг

			$handle = @fopen(ENGINE_DIR.'/data/config.php', 'w');

			fwrite( $handle, "<?PHP \n\n//System Configurations\n\n\$config = array (\n\n" );

			foreach ( self::$config as $name => $value ) {

				if( $name != "offline_reason" ) {

					$value = trim( stripslashes( $value ) );

					$value = htmlspecialchars( $value);

					$value = preg_replace( $find, $replace, $value );

					$name = trim( stripslashes( $name ) );

					$name = htmlspecialchars( $name, ENT_QUOTES );

					$name = preg_replace( $find, $replace, $name );

				}

				$value = str_replace( "$", "$", $value );

				$value = str_replace( "{", "{", $value );

				$value = str_replace( "}", "}", $value );

				$name = str_replace( "$", "$", $name );

				$name = str_replace( "{", "{", $name );

				$name = str_replace( "}", "}", $name );

				fwrite( $handle, "'{$name}' => \"{$value}\",\n\n");

			}

			fwrite( $handle, ");\n\n?>" );

			fclose( $handle );

			self::cleanCache();

		}

		/**

		 * Установка административной части модуля

		 * @param $name string		- название модуля, а именно файла .php находящегося в папке engine/inc/,

									но без расширения файла

		 * @param $title string		- заголовок модуля

		 * @param $descr string		- описание модуля

		 * @param $icon string		- имя иконки для модуля, без указания пути.

		 							Иконка обязательно при этом должна находится в папке engine/skins/images/

		 * @param $perm string		- информация о группах которым разрешен показ данного модуля.

		 							Данное поле может принимать следующие значения: all или ID групп через запятую.

									Например: 1,2,3. если указано значение all то модуль будет показываться всем

									пользователям имеющим доступ в админпанель

		 * @return bool - true если успешно установлено и false если нет

		 */

		public static function installAdminModule ($name, $title, $descr, $icon, $perm = '1') {

			$name = self::$db->safesql($name);

			$title = self::$db->safesql($title);

			$descr = self::$db->safesql($descr);

			$icon = self::$db->safesql($icon);

			$perm = self::$db->safesql($perm);

			// Для начала проверяем наличие модуля

			self::$db->query("Select name from `".PREFIX."_admin_sections` where name = '$name'");

			if (self::$db->num_rows()>0)

			{

				// Модуль есть, обновляем данные

				self::$db->query("UPDATE `".PREFIX."_admin_sections` set title = '$title', descr = '$descr', icon = '$icon', allow_groups = '$perm' where name = '$name'");

				return true;

			}

			else

			{

				// Модуля нету, добавляем

				self::$db->query("INSERT INTO `".PREFIX."_admin_sections` (`name`, `title`, `descr`, `icon`, `allow_groups`) VALUES ('$name', '$title', '$descr', '$icon', '$perm')");

				return true;

			}


			return false;

		}

		/**

		 * Удаление административной части модуля

		 * @param $name string - название модуля

		 * @return null

		 */

		public static function uninstallAdminModule ($name) {

			$name = self::$db->safesql($name);

			self::$db->query("DELETE FROM `".PREFIX."_admin_sections` where `name` = '$name'");

		}

		/**

		 * Изменение прав административной части модуля

		 * @param $name string 		- название модуля

		 * @param $perm string		- информация о группах которым разрешен показ данного модуля.

		 							Данное поле может принимать следующие значения: all или ID групп через запятую.

									Например: 1,2,3. если указано значение all то модуль будет показываться всем

									пользователям имеющим доступ в админпанель

		 * @return null

		 */

		public static function changeAdminModulePerms ($name, $perm) {

            $name = self::$db->safesql($name);

            $perm = self::$db->safesql($perm);

			self::$db->query("UPDATE `".PREFIX."_admin_sections` set `allow_groups` = '$perm' where `name` = '$name'");

		}

		/*

		 * Users

		 */

		/**

		 * Получение информации о пользователе по его ID

		 * @param $user_id int - ID пользователя

		 * @param $select_list string - Перечень полей с информации или * для всех

		 * @return Массив с данными в случае успеха и false если пользователь не найден

		 */	

		public static function takeUserById ($user_id, $select_list = '*') {

			$user_id = intval ($user_id);

			if ($user_id<=0) {

				return ;

			}

			$row = self::loadTable (USERPREFIX."_users", $select_list, "`user_id` = '$user_id'");

			if (count($row)==0) {

				return ;

			}

			return $row;

		}

		/**

		 * Получение информации о пользователе по его имени

		 * @param $name string - Имя пользователя

		 * @param $select_list string - Перечень полей с информации или * для всех

		 * @return Массив с данными в случае успеха и false если пользователь не найден

		 */

		public static function takeUserByName ($name, $select_list = '*') {

			$name = self::$db->safesql ($name);

			if ($name == '') {

				return ;

			}

			$row = self::loadTable(USERPREFIX."_users", $select_list, "`name` = '$name'");

			if (count($row)==0) {

				return ;

			}

			return $row;

		}

		/**

		 * Получение информации о пользователе по его емайлу

		 * @param $email string - Емайл пользователя

		 * @param $select_list string - Перечень полей с информации или * для всех

		 * @return Массив с данными в случае успеха и false если пользователь не найден

		 */	

		public static function takeUserByEmail ($email, $select_list = '*') {

			$email = self::$db->safesql ($email);

			if ($email == '') {

				return ;

			}

			$row = self::loadTable(USERPREFIX."_users", $select_list, "`email` = '$email'");

			if (count($row)==0) {

				return ;

			}

			return $row;

		}

		/**

		 * Получение данных пользователей определённой группы

		 * @param $group int - ID группы

		 * @param $select_list string - Перечень полей с информации или * для всех

		 * @param $limit int - Количество получаемых пользователей

		 * @return 2-х мерный массив с данными в случае успеха и false если пользователь не найден

		 */

		public static function takeUsersByGroup ($group, $select_list = "*", $limit = 0) {

			$group = intval ($group);

			if ($group<=0) {

				return ;

			}

			$data = self::loadTable(USERPREFIX."_users", $select_list, "`user_group` = '$group'", true, 0, $limit);

			if (count($data)==0) {

				return ;

			}

			return $data;

		}

		/**

		 * Получение данных пользователей, засветившихся под определённым IP

		 * @param $ip string - Интересующий нас IP

		 * @param $like bool - использовать ли маску при поиске

		 * @param $select_list string - Перечень полей с информации или * для всех

		 * @param $limit int - Количество получаемых пользователей

		 * @return 2-х мерный массив с данными в случае успеха и false если пользователь не найден

		 */

		public static function takeUsersByIp ($ip, $like = false, $select_list = "*", $limit = 0) {

			$ip = self::$db->safesql( $ip );

			$data = array();

			if( $ip == '' ) {

				return;

			}

			if( $like ) {

				$condition  = "`logged_ip` like '$ip%'";

			}

			else {

				$condition  = "`logged_ip` = '$ip'";

			}

			$data = self::loadTable(USERPREFIX."_users", $select_list, $condition, true, 0, $limit);

			if( count( $data ) == 0 ) {

				return;

			}

			else {

				return $data;

			}

		}

		/**

		 * Смена имени пользователя

		 * @param $user_id int - ID пользователя

		 * @param $new_name string - Новое имя пользователя

		 * @return bool - true в случае успеха и false ежели новое имя уже занято другим пользователем

		 */

		public static function changeUserName ($user_id, $new_name) {

			$user_id = intval( $user_id );

			$new_name = self::$db->safesql( $new_name );

			$count_arr = self::loadTable(USERPREFIX."_users", "count(user_id) as count", "name = '$new_name'");

			$count = $count_arr['count'];


			if( $count > 0 ) {

				return;

			}

			$old_name_arr = self::loadTable(USERPREFIX."_users", "name", "user_id = '$user_id'");

			$old_name = $old_name_arr['name'];

			// Fix old name

			self::$db->query( "UPDATE `" . PREFIX . "_post` SET `autor`='$new_name' WHERE `autor`='{$old_name}'" );

			self::$db->query( "UPDATE `" . PREFIX . "_comments` SET `autor`='$new_name' WHERE `autor`='{$old_name}' AND `is_register`='1'" );

			self::$db->query( "UPDATE `" . USERPREFIX . "_pm` SET `user_from`='$new_name' WHERE `user_from`='{$old_name}'" );

			self::$db->query( "UPDATE `" . PREFIX . "_vote_result` SET `name`='$new_name' WHERE `name`='{$old_name}'" );

			self::$db->query( "UPDATE `" . PREFIX . "_images` SET `author`='$new_name' WHERE `author`='{$old_name}'" );

			self::$db->query( "UPDATE `" . USERPREFIX . "_users` set `name` = '$new_name' where `user_id` = '$user_id'" );

			return true;

		}

		/**

		 * Изменение пароля пользователя

		 * @param $user_id int - ID пользователя

		 * @param $new_password string - новый пароль

		 * @return null

		 */

		public static function changeUserPassword($user_id, $new_password) {

			$user_id = intval( $user_id );

			$new_password = md5( md5( $new_password ) );

			self::$db->query( "update " . USERPREFIX . "_users set `password` = '$new_password' where `user_id` = '$user_id'" );

		}

		/**

		 * Изменение емайла пользователя

		 * @param $user_id int - ID пользователя

		 * @param $new_email string - новый емайл пользователя

		 * @return int - некий код

		 * 		-2: некорректный емайл

		 * 		-1: новый емайл используется другим пользователем

		 * 		 1: операция прошла успешно

		 */

		public static function changeUserEmail($user_id, $new_email) {

			$user_id = intval( $user_id );

			if( (! preg_match('/^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])'.'(([a-z0-9-])*([a-z0-9]))+' . '(\.([a-z0-9])([-a-z0-9_-])?([a-z0-9])+)+$/i', $new_email )) or (empty( $new_email )) ) {

				return -2;

			}

			$new_email = self::$db->safesql( $new_email );

			$email_exist_arr = self::loadTable(USERPREFIX."_users", "count(user_id) as count", "email = '$new_email'");

			if ($email_exist_arr['count'] > 0) {

				return -1;

			}

			$q = self::$db->query( "update " . USERPREFIX . "_users set email = '$new_email' where user_id = '$user_id'" );

			return 1;	

		}

		/**

		 * Изменение группы пользователя

		 * @param $user_id int - ID пользователя

		 * @param $new_group int - ID новой группы пользователя

		 * @return bool - true в случае успеха и false если указан ID несуществующей группы

		 */

		public static function changeUserGroup($user_id, $new_group, $limit=0) {

			$user_id = intval( $user_id );

			$new_group = intval( $new_group );

			if(self::_checkGroup($new_group) === false) { 

				return;

			}

			if ($limit>0) {

				$time_limit = self::$_TIME+$limit;

				self::$db->query( "update " . USERPREFIX . "_users set `user_group` = '$new_group', `time_limit` = '$time_limit' where `user_id` = '$user_id'" );

			}

			else {

				self::$db->query( "update " . USERPREFIX . "_users set `user_group` = '$new_group' where `user_id` = '$user_id'" );

			}

			return true;

		}

		/**

		 * Авторизация пользователя по имени и паролю

		 * @param $login string - имя пользователя

		 * @param $password string - пароль пользователя

		 * @return bool

		 * 		true:	разрешаем авторизацию

		 * 		false:	авторизация не пройдена

		 */

		public static function externalAuth($login, $password) {

			$login = self::$db->safesql( $login );

			$password = md5( md5( $password ) );

			$arr = self::loadTable(USERPREFIX."_users", "user_id", "`name` = '$login' AND `password` = '$password'");

			if( ! empty( $arr['user_id'] ) )

				return true;

			else

				return;

		}

		/**

		 * Внешняя авторизация

		 * @param $source array - Массив с данными [ 

		 * 							-	dle_user_id - ID пользователя, 

		 * 							-	dle_password - хэш

		 * 							]

		 * @return 

		 * 		bool false - авторизация не пройдена

		 * 		array - массив с данными пользователя

		*/

		public static function checkAuth ($source='') {

			// Пробуем по переданному массиву

			if (isset($source['dle_user_id'])) {

				$user_id = intval($source['dle_user_id']);

				$hash = md5 ($source['dle_password']);

			}

			elseif (isset($_SESSION['dle_user_id'])) {

				// По сессии

				$user_id = intval($_SESSION['dle_user_id']);

				$hash = md5 ($_SESSION['dle_password']);

			}

			elseif (isset($_COOKIE['dle_user_id'])) {

				$user_id = intval($_COOKIE['dle_user_id']);

				$hash = md5 ($_COOKIE['dle_password']);

			}

			else {

				return;

			}

			$res = self::$db->get_row( self::$db->query("Select * from `".USERPREFIX."_users` where `user_id` = '$user_id' AND `password` = '$hash'"));

			if (isset($res['user_id'])) {

				return $res;

			}

			return;

	    }

		/**

		 * Добавление в базу нового пользователя

		 * @param $login string - имя пользователя

		 * @param $password string - пароль пользователя

		 * @param $email string - емайл пользователя

		 * @param $group int - группа пользователя

		 * @return int - код

		 * 		-4: задана несуществующая группа

		 * 		-3: некорректный емайл

		 * 		-2: емайл занят другим пользователем

		 * 		-1: имя пользователя тоже занято, вот неудача

		 * 		 1: операция прошла успешно

		 */

		public static function externalRegister($login, $password, $email, $group) {

			$login = $this->db->safesql( $login );

			$password = md5( md5( $password ) );

			$email = self::$db->safesql( $email );

			$group = intval( $group );


			$login_exist_arr = self::loadTable(USERPREFIX."_users", "count(user_id) as count", "name = '$login'");

			if ( $login_exist_arr['count'] > 0 ) {

				return -1;

			}


			$email_exist_arr = self::loadTable(USERPREFIX."_users", "count(user_id) as count", "email = '$email'");

			if( $email_exist_arr['count'] > 0 ) {

				return -2;

			}


			if ((!preg_match("/^([a-z0-9]([\-\_\.]*[a-z0-9])*)+@([a-z0-9]([\-]*[a-z0-9])*\.)+[a-z]{2,6}$/i", $email ) || (empty( $email )) || strlen( $email ) > 50)) {

				return -3;

			}


			if($this->checkGroup($group) === false) {

				return -4;

			}


			$now = self::$_TIME;

			$q = self::$db->query( "insert into " . USERPREFIX . "_users (`email`, `password`, `name`, `user_group`, `reg_date`) VALUES ('$email', '$password', '$login', '$group', '$now')" );

			return 1;

		}

		/**

		 * Метод для обновления поля в таблице базы

		 * @param int $user_id - ID пользователя

		 * @param string $field - название поля

		 * @param string $value - значение поля

		 */

		public static function updateProfile ($user_id, $field, $value) {

			if (is_array ($field) && is_array($value)) {

				foreach ($field as $key=>$val) {

					self::updateProfile ($user_id, $field[$key], $value[$key]);

				}

				return ;

			}

			if ($field=='user_id') {

				return;

			}

			elseif ($field=='name') {

				return self::changeUserName ($user_id, $value);

			}

			elseif ($field=='password') {

				return self::changeUserPassword ($user_id, $value);

			}

			elseif ($field=='email') {

				return self::changeUserEmail ($user_id, $value);

			}

			elseif ($field=='user_group') {

				return self::changeUserGroup($user_id, $value);

			}

			else {

				$field = self::$db->safesql($field);

				$value = self::$db->safesql($value);

				// Check

				$fields = Array ();

				$fields_arr = self::loadTable(USERPREFIX.'_users', '*', '1', false, 0, 1);

				foreach ($fields_arr as $k=>$v) {

					$fields[] = $k;

				}

				if (in_array($field, $fields)) {

					self::$db->query ("UPDATE `".USERPREFIX."_users` SET `".$field."` = '$value' WHERE `user_id` ='$user_id'");

					return true;

				}

				return;

			}

		}

		/**

		 * Messaging

		 */

		/**

		 * Отправка пользователю персонального сообщения

		 * @param $user_id int - ID получателя

		 * @param $subject string - тема сообщения

		 * @param $text string - текст сообщения

		 * @param $from string - имя отправителя

		 * @return int - код

		 * 		-1: получатель не существует

		 * 		 0: операция неудалась

		 * 		 1: операция прошла успешно

		 */

		public static function sendPmToUser ($user_id, $subject, $text, $from) {

			$user_id = intval( $user_id );

			// Check if user exist

			$count_arr = self::loadTable(USERPREFIX."_users", "count(user_id) as count", "user_id = '$user_id'");

			if($count_arr['count'] == 0 ) {

				return - 1;

			}

			$subject = $this->db->safesql( $subject );

			$text = $this->db->safesql( $text );

			$from = $this->db->safesql( $from );

			$now = self::$_TIME;

			$q = $this->db->query( "insert into " . PREFIX . "_pm (subj, text, user, user_from, date, pm_read, folder) VALUES ('$subject', '$text', '$user_id', '$from', '$now', 'no', 'inbox')" );

			if( ! $q ) {

				return 0;

			}

			self::$db->query( "update " . USERPREFIX . "_users set pm_unread = pm_unread + 1, pm_all = pm_all+1  where user_id = '$user_id'" );

			return 1;

		}

		/**

		 * Метод для отправки email-сообшения пользователю

		 * @param int $user_id - ID пользователя

		 * @param string $subject - заголовок сообщения

		 * @param string $text - тело сообщения

		 */

		public static function sendEmailToUser ($user_id, $subject, $text) {

			$user_id = intval( $user_id );

			// Check if user exist

			$check = self::loadTable(USERPREFIX."_users", "email", "user_id = '$user_id'");

			if(!isset($check['email'])) {

				return - 1;

			}

			$charset = self::$config['charset'];

			$text = <<<HTML

<html><title>{$subject}</title>

<meta content="text/html; charset={$charset}" http-equiv=Content-Type>

<style type="text/css">

html,body{

font-size: 11px;

font-family: verdana;

}


a:active,

a:visited,

a:link {

	color: #4b719e;

	text-decoration:none;

	}


a:hover {

	color: #4b719e;

	text-decoration: underline;

	}

</style>

<body>

{$text}

</body>

</html>

HTML;

			self::$mail->send ($check['email'], $subject, $text);

		}

		/**

		 * Cache

		 */

		/**

		 * Получение массива содержащего названия файлов кеша

		 * @return array

		 */		

		public static function getCachedFiles() {

			$handle = opendir($this->cache_dir);

			while (($file = readdir($handle)) !== false) {

				if ($file != '.' && $file != '..' && (!is_dir($this->cache_dir.$file) && $file !='.htaccess')) {

					$this->cache_files [] = $file;

				}

			}

			closedir($handle);

		}

		/**

		 * Удаление кеша

		 * @param $name string - имя файла для удаления. При значении GLOBAL удаляем весь кеш

		 * @return null

		 */				

		public static function cleanCache($name = 'GLOBAL') {

			self::getCachedFiles();

			if ($name=='GLOBAL') {

				foreach (self::$cache_files as $cached_file) {

					@unlink(self::$cache_dir.$cached_file);

				}

			}

			elseif (in_array($name . '.tmp', self::$cache_files)) {

				@unlink(self::$cache_dir.$name . '.tmp');

			}

		}

		/**

		 * Загрузка данных из кеша

		 * @param $fname string - имя файла для кеша без расширения

		 * @param $timeout int - время жизни кэша в секундах

		 * @param $type string - тип данных в кеше. если не text - считаем, что хранился массив

		 * @return unknown_type

		 */

		public static function loadFromCache ($fname, $timeout=300, $type = 'text') {

			$filename = $fname . '.tmp';

			if (!file_exists(self::$cache_dir.$filename)) {

				return false;

			}

			if ((filemtime(self::$cache_dir.$filename)) < (time()-$timeout)) {

				return false;

			}


			if ($type=='text'){

				return file_get_contents(self::$cache_dir.$filename);

			}

			else {

				return unserialize(file_get_contents(self::$cache_dir.$filename));

			}

		}

		/**

		 * Сохранение данных в локальный кэш

		 * @param string $fname - имя файла для кеша без расширения

		 * @param mixed $vars - данные для записи

		 * @return bool/mixed -  false если файл недоступен для записи и $vars если всё нормально

		 */

		public static function saveToCache ($fname, $vars) {

			$filename = $fname . '.tmp';

			if (is_array($vars)) {

				$vars = serialize($vars);

			}

			if (is_writable(self::$cache_dir.$filename)) {

				file_put_contents (self::$cache_dir.$filename, $vars);

				return $vars;

			}

			return;

		}

		/*

		 * News

		 */

		/**

		 * Получение новостей

		 * @param $cat string - категории новостей, через запятую

		 * @param $fields string - перечень получаемых полей новостей или * для всех

		 * @param $start int - начальное значение выборки

		 * @param $limit int - количество новостей для выборки, 0 - выбрать все новости

		 * @param $sort string - поле, по которому осуществляется сортировка

		 * @param $sort_order - направление сортировки

		 * @return array - ассоциативный 2-х мерный массив с новостями

		 */

		function takeNews ($cat, $fields = "*", $start = 0, $limit = 10, $sort = 'id', $sort_order = 'desc') {

			if (self::$config['allow_multi_category'] == 1) {

				$condition = 'category regexp "[[:<:]]('.str_replace(',', '|', $cat).')[[:>:]]"';

			}

			else {

				$condition = 'category IN ('.$cat.')';

			}

			return self::loadTable (PREFIX."_post", $fields, $condition, $multirow = true, $start, $limit, $sort, $sort_order);

		}

		/*

		 * Comments

		 */

		/**

		 * Функция добавления комментария

		 * @param $newsId int - ID новости

		 * @param $userName string - имя пользователя

		 * @param $ip string - IP пользователя

		 * @param $text string - комментарий

		 * @return bool true/false - результат операции

		*/

	    function addComment ($newsId, $userName, $ip, $text) {

	      $userName = self::$db->safesql($userName);

	      $newsId = intval ($newsId);

	      $text = self::$db->safesql($text);

	      $ip = self::$db->safesql($ip);

	      // Try to take userId

	        $user_id_data = self::loadTable (USERPREFIX.'_users', 'user_id', "`name` = '$userName'");

	        if (isset($user_id_data['user_id'])) {

	          $user_id = $user_id_data['user_id'];

	          self::$db->query("INSERT INTO `".PREFIX."_comments` (`post_id`, `user_id`, `date`, `autor`, `text`, `ip`, `is_register`, `approve`) VALUES ('$newsId', '$user_id', NOW(), '$userName', '$text', '$ip', '1', '1')");

	          // Обновляем счётчик комментариев

	          self::$db->query("UPDATE `".USERPREFIX."_users` set `comm_num` = `comm_num` + 1 where `name` = '$userName'");

	          // Обновляем счётчик у новости

	          self::$db->query("UPDATE `".PREFIX."_post` set `comm_num` = `comm_num` + 1 where `id` = '$newsId'");

	          return true;

	        }

	        return false;

	    }

	}

	DleAPI::init();

}

Ссылка на сообщение
Поделиться на других сайтах

Какую то билеберду ты написал Сергей... нифига не понятно)))) Намекните хоть что это вообще? Для этого нужно PHP учить чтоб использовать API или это как то должно по другому облегчить жизнь?

Надо прогу сделать чтоб можно было как в конструкторе модули собирать)))

И вообще для чего этот API я слышал что в нём можно точно так же косячить как и в PHP и дыры могут быть ещё больше, с другой стороны слышал что он наоборот безопасность повышает. Объясните.

А то такое ощущение что, у нас началось разделение на песочницы))

Ссылка на сообщение
Поделиться на других сайтах

АПИ нужно для удобной разработки и поддержания модулей.

Никакого отношения к безопасности и косякам оно не имеет. Это просто инструмент.

Ссылка на сообщение
Поделиться на других сайтах

Разумеется учить ПХП. Я ведь сказал, что это инструмент для создания и поддержания модулей)

Версия 2.0 Alpha:

1) Реализовано

6) Реализован sendEmailMessage

Дополнительно:

- Оптимизирован весь код

- Проверки email заменены на аналоги из версии 8.5

- Функции сгруппированы по типам

- Изменён стиль кода

- Улучшен синтаксис SQL

Ссылка на сообщение
Поделиться на других сайтах
  • 3 недели спустя...

К примеру:

  public static function externalRegister($login, $password, $email, $group) {
Никак не анализирует:
$config['allow_registration']

$config['max_users']

Длинну логина, пароля. Бан по имени, бан по мылу и прочие проверки происходящие при стандартной регистрации в ДЛЕ.

Ведь прелесть в АПИ заключается в том, что не надо самому выдергивать куски из кода движка, а достаточно использовать одну стандартную ф-цию. Сейчас же придется либо "забить" на все проверки и вызвать ф-цию регистрации, либо самому сделать все проверки. В первом случае есть здоровенная дыра, во втором вообще не видится смысл АПИ. Как-то так... ;) ЗЫ: Если уж и писать ф-цию "externalRegister", то мне она видится так:
  public static function externalRegister($login, $password, $email, $group, $ver_email=true, $ver_name=true, $ver_IP=true) {

Чтобы для особо жаждущих можно было отключать верификацию при вызове ф-ции.

Ну и проверять, чтобы не давало регаться по правилам массива $replace_word .

Никакого отношения к безопасности и косякам оно не имеет.

Позвольте немного не согласиться, т.к. все зависит "с какой стороны смотреть"..... ;)

Так вот, к примеру приведенному мной выше, если пользователь использует в своем модуле АПИ регистрации пользователя, то:

1. Автор модуля ПОЛНОСТЬЮ надеется на всевозможные проверки по регистрации пользователей и ... "попадает".. Т.к. банально будут регаться с забанеными мылами, НИКами и будут появляться такие "двойнки": Ivan, Ivаn, Ivaп и т.п. хотя стандартная регистрация ДЛЕ такое отсевает.

2. Автор модуля более продвинут и никому не доверяет и перед вызовом АПИ ф-ции делает всевозможные проверки сам. Тогда все пучком ;)

ЗЫ: Ведь "попадалово" получается в 1м случае и все красиво во 2м. Вот и безопасность.... Это безобидный пример я привел, а ведь можно поискать и более "печальный" пример.

ЗЫЗЫ: Я не злой, просто хочется если видеть АПИ - то который будет очень достойный и без дыр ;)

Ссылка на сообщение
Поделиться на других сайтах

Да вообщем-то никто и не говорит, что Вы злой. Но людей который не просто сидят за заднице - единицы и приходится всё проектировать самому.

Ссылка на сообщение
Поделиться на других сайтах

Да вообщем-то никто и не говорит, что Вы злой.

Т.е. по вопросу более полного анализа при регистрации Вы возможно измените код в API ? ;)

ЗЫ: Про по поводу "задницы" согласен. За что Вам почет и уважение ;)

Ссылка на сообщение
Поделиться на других сайтах

Добавлю свои 5 копеек :)

Сейчас глянул функцию кеширования... м... У меня либо ошибки так полезут, либо вообще ничего не произойдет, ну, как я понимаю это дело. В любом случае, пока особо пользоваться АПИ не спешу - много не понятно и видится еще сырым, если я правильно думаю.

Вот, например, не ясно, откуда берется $fname - как его задавать? Я думал сначала, что это уже по умолчанию идет, но если мы задаем "имя" произвольно для создания временного файлика, то у меня такое не прокатит и я даже не буду знать, где и куда копать, просто потому, что у меня запрещено на серваке что-либо создавать, копировать и т.д., отключены частично курлы и некоторые функции - фиг его знает, зачем такой геморой, но, видимо, хостер так борется со взломами :D В любом случае, пока написал свои очень огромные функции почти под всё мне необходимое, учёл все возможные варианты, чего должно быть и в АПИ ;)

 public static function saveToCache ($fname, $vars) {

                        $filename = $fname . '.tmp';

                        if (is_array($vars)) {

                                $vars = serialize($vars);

                        }

                        if (is_writable(self::$cache_dir.$filename)) {

                                file_put_contents (self::$cache_dir.$filename, $vars);

                                return $vars;

                        }

                        return;

                }

Для себя я писал что-то типа:

if (is_file) {

if (@file_put_contents()) {...}

else echo 'No writing cash.';

} else echo 'No existing file.';

Еще с десяток различных проверок на различные функции, например, проверку наличия и работы функции CHMODE, которая у меня также выключена.

Если проверок не делать, то ничего просто не будет работать и просто навсего ничего не произойдет в модуле, хотя при этом никаких ошибок не будет, а просто пустая страница - прыгай потом вокруг коста с бубном по ночам... :)

Ссылка на сообщение
Поделиться на других сайтах

Да вообщем-то никто и не говорит, что Вы злой.

Т.е. по вопросу более полного анализа при регистрации Вы возможно измените код в API ? ;)

ЗЫ: Про по поводу "задницы" согласен. За что Вам почет и уважение ;)

Разумеется. Я ведь не только для себя его пишу :)

Добавлю свои 5 копеек :)

Сейчас глянул функцию кеширования... м... У меня либо ошибки так полезут, либо вообще ничего не произойдет, ну, как я понимаю это дело. В любом случае, пока особо пользоваться АПИ не спешу - много не понятно и видится еще сырым, если я правильно думаю.

Вот, например, не ясно, откуда берется $fname - как его задавать? Я думал сначала, что это уже по умолчанию идет, но если мы задаем "имя" произвольно для создания временного файлика, то у меня такое не прокатит и я даже не буду знать, где и куда копать, просто потому, что у меня запрещено на серваке что-либо создавать, копировать и т.д., отключены частично курлы и некоторые функции - фиг его знает, зачем такой геморой, но, видимо, хостер так борется со взломами :D В любом случае, пока написал свои очень огромные функции почти под всё мне необходимое, учёл все возможные варианты, чего должно быть и в АПИ ;)

 public static function saveToCache ($fname, $vars) {

                        $filename = $fname . '.tmp';

                        if (is_array($vars)) {

                                $vars = serialize($vars);

                        }

                        if (is_writable(self::$cache_dir.$filename)) {

                                file_put_contents (self::$cache_dir.$filename, $vars);

                                return $vars;

                        }

                        return;

                }

Для себя я писал что-то типа:

if (is_file) {

if (@file_put_contents()) {...}

else echo 'No writing cash.';

} else echo 'No existing file.';

Еще с десяток различных проверок на различные функции, например, проверку наличия и работы функции CHMODE, которая у меня также выключена.

Если проверок не делать, то ничего просто не будет работать и просто навсего ничего не произойдет в модуле, хотя при этом никаких ошибок не будет, а просто пустая страница - прыгай потом вокруг коста с бубном по ночам... :)

Моя система кэширования пишет в ту же папку, что и кэш ДЛЕ. Просто она более удобна, чем длешная.

Если у Вас всё так плохо, то и встроенная система кэша работать по идее не должна.

$fname - имя файла

Ссылка на сообщение
Поделиться на других сайтах

Встроенное от ДЛЕ у меня тоже не работает, помнится, я при установке ручками всё делал; по крайней мере, мне хоть сообщения выходили, типа "создайте пустой файл" или "поставьте права 777", а в данном случае в АПИ нет никаких сообщений (от ДЛЕ они должны появиться или от АПИ - не понятно мне) - у кого-то будет чистый лист и тот не поймет в чем дело. Вот такая ерунда со многими плагинами у меня - где-то что-то не работает, плюну, сяду, да свой плагинчик напишу. :lol: Ну, впрочем, как свой код писать - дело каждого, я только хотел подсказать о найденном недочёте. :unsure:

А вот и живой пример еще у кого-то: http://forum.dle-news.ru/index.php?showtopic=51989

Изменено пользователем zgr
Ссылка на сообщение
Поделиться на других сайтах

Несколько раз менял и попадал. Плохих хостингов, как утверждают сами хостеры - нет, - только все чужие плохие. :D

Сейчас уже месяц как переехал но более крутой сервак, при чем далеко не самый дешевый, оплатил за год, денег больше нет.

Лучше рассчитывать на невысокую квалификацию хостера или вебмастера, чем писать о переезде - это лишь свидетельствует о профессионализме и грамотном подходе того, кто пишет код, который должен учитывать если не все, то многие нюансы, быть максимум универсальным и гибким. Иначе могу точно сказать, что порядка 3к сайтов (их примерно столько на хостинге или даже больше) просто пролетают с ДЛЕ, АПИ и всякими модулями. Геморой - ну а что делать, деваться некуда ;)

Ссылка на сообщение
Поделиться на других сайтах
  • 3 недели спустя...

К сожалению из-за большой нагрузки я не успел скинуть релиз Владимиру в срок.

Поэтому DleAPI v2.0 будет интегрировано в DLE 9.0 API Edition.

Ссылка на сообщение
Поделиться на других сайтах

К сожалению из-за большой нагрузки я не успел скинуть релиз Владимиру в срок.

Поэтому DleAPI v2.0 будет интегрировано в DLE 9.0 API Edition.

супер! а когда примерно будет?

Ссылка на сообщение
Поделиться на других сайтах
  • 3 месяца спустя...
  • 2 недели спустя...
  • 3 недели спустя...

Так вообще есть смысл ждать этого API или можно расслабиться и забыть о нём, так как обещали его выход ещё кто-за когда ?

Ссылка на сообщение
Поделиться на других сайтах
  • 3 недели спустя...

скажите пожалуйста. Если старая версия api работала вызовом

$reg = $dle_api->external_register

то в новой версии

$checkauth = $dle_api-> checkAuth

ругается.

можно ли узнать почему?

код ошибки:

Fatal error: Call to undefined method DLE_API::checkAuth()

или метод вызова изменился?

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...