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

Помощь Мод (OpenID) + DLE

viktor6

Постоялец
Регистрация
16 Дек 2008
Сообщения
138
Реакции
6
Полазил по инету так и не нашол готового мода и решил своими убогими знаниями php сделать такой мод.
И так что было сделано
Кинул 2 файла по пути engine/modules/openid/
functions.openid.php

и
openid.php
В шаблоне login.tpl
добавил такую строку
Код:
<!-- Mod -->
{include file="engine/modules/openid/openid.php"}
<!--  Mod -->
перед
Код:
<input name="login" type="hidden" id="login" value="submit" />

Но вот как подключить авторизацию из DLE не знаю прошу помощи в дальнейших действиях.

что нужно изменить дописать в файле openid.php
PHP:
<?php

//=====================================================
// DataLife Engine 10.1
//-----------------------------------------------------
// Module for user authorization service
// 
//=====================================================


if(!defined('DATALIFEENGINE'))
{
    die("Hacking attempt!");
}

require 'functions.openid.php';
try
{
    $openid=new LightOpenID('http://site.com/engine/modules/openid/openid.php');
    if(!$openid->mode)
    {
        if(isset($_POST['openid_identifier']))
        {
            $openid->identity=$_POST['openid_identifier'];
            header('Location: '.$openid->authUrl());
        }
        }
    elseif($openid->mode=='cancel') $openid_e_message='Пользователь отменил аутентификацию!';
    else
    {
        if($openid->validate()) $openid_link=$openid->identity;
        else $openid_e_message='Пользователь не вошел';
        //print_r($openid->getAttributes());
    }
}
catch(ErrorException $e){$openid_error=$e->getMessage();}

if(isset($openid_link))
{
$userpart = explode("/", $openid_link);
$user = explode("-", $userpart[4]);

//$openid_identity - ссылка на проифиль
//$user[0] - идентификатор (account_id)
//$user[1] - игровое имя (ник)

echo "Profile: $openid_link <br />
ID - $user[0] <br />
Nickname: $user[1]";

//Дальнейшие действия с переменными

}
else
{
echo "<form method=\"post\"><input type=\"hidden\" name=\"openid_identifier\" value=\"ru.wargaming.net/id/\"></form>
<a href=\"#\" onclick=\"document.forms[0].submit()\"><img src=\"/wg.png\"> Login</a>";
}

?>
 

Вложения

  • Openid_dle.zip
    7,1 KB · Просмотры: 18
Тут надо начинать с обратного пути - что далжен делать с этой авторизацией сам ДЛЕ?
Как осуществляется привязка в БД к этому OpenID? Как регистрируется пользователь в системе?

Если нужно просто показывать "Вы авторизированы" - достаточно просто этого OpenID, но если нужно, чтобы это ещё и отражалось в комментариях, ЛС и прочем, как это обычно бывает - нужно переписывать сам ДЛЕ!
 
Вот что получлось но работает както все криво
из этого места уже не дает авторизироваться Для просмотра ссылки Войди или Зарегистрируйся
пишет Hacking attempt!
PHP:
<script type="text/javascript" charset="utf-8">
/*function login() {
alert ("OKay");
  // document.forms[0].submit();
};*/
</script>

<?php

//=====================================================
// DataLife Engine 10.1
//-----------------------------------------------------
// Module for user authorization service
//
//=====================================================




require 'functions.openid.php';
try
{
$openid=new LightOpenID('http://dle.plusnet.ks.ua/engine/modules/openid/openid.php');
if(!$openid->mode)
{
if(isset($_POST['openid_identifier']))
{
$openid->identity=$_POST['openid_identifier'];
header('Location: '.$openid->authUrl());
}
}
elseif($openid->mode=='cancel') $openid_e_message='Пользователь отменил аутентификацию!';
else
{
if($openid->validate()) $openid_link=$openid->identity;
else $openid_e_message='Пользователь не вошел';
//print_r($openid->getAttributes());
}
}
catch(ErrorException $e){$openid_error=$e->getMessage();}

if(isset($openid_link))
{
$userpart = explode("/", $openid_link);
$user = explode("-", $userpart[4]);

//$openid_identity - ссылка на проифиль
//$user[0] - идентификатор (account_id)
//$user[1] - игровое имя (ник)

echo "Profile: $openid_link <br />
ID - $user[0] <br />
Nickname: $user[1]";
//Дальнейшие действия с переменными

/*REGISTER USER*/
$regpassword = md5( $user[0] );
$name = trim( $db->safesql( htmlspecialchars( $user[1], ENT_COMPAT, $config['charset'] ) ) );
$name = preg_replace('#\s+#i', ' ', $name);
$email = $openid_link;

$add_time = time() + ($config['date_adjust'] * 60);
$_IP = get_ip();
if( intval( $config['reg_group'] ) < 3 ) $config['reg_group'] = 4;

$row = $db->super_query( "SELECT * FROM " . USERPREFIX . "_users WHERE xfields = ".$user[0]."" );

if (!$row['user_id']) {

$db->query( "INSERT INTO " . USERPREFIX . "_users (name, password, email, reg_date, lastdate, user_group, info, signature, favorites, xfields, logged_ip) VALUES ('$name', '$regpassword', '$email', '$add_time', '$add_time', '" . $config['reg_group'] . "', '', '', '', '".$user[0]."', '" . $_IP . "')" );
$id = $db->insert_id();


}
else {
$id = $row['user_id'];
if ($row['name']<>$user[1]) {
$db->super_query( "UPDATE " . USERPREFIX . "_users SET name='".$user[1]."' WHERE user_id = ".$row['user_id']."" );
}
}
set_cookie( "dle_user_id", $id, 365 );
set_cookie( "dle_password", $user[0], 365 );

$_SESSION['dle_user_id'] = $id;
$_SESSION['dle_password'] = $user[0];
header('Location: '.$_SERVER["PHP_SELF"]);
}
else
{
echo "<form method=\"post\"><input type=\"hidden\" name=\"openid_identifier\" value=\"ru.wargaming.net/id/\"></form>
<a href=\"#\" onclick=\"document.forms[0].submit()\"><img src=\"http://dle.plusnet.ks.ua/engine/modules/openid/visual-wot-logo.png\" align=\"center\" width=\"150px\"></a>";
}

?>
 
Последнее редактирование:
PHP:
<?
// Соединяемся с БД
if (@mysql_connect('localhost', $user, $pass)){
  $db = mysql_connect('localhost', $user, $pass);
} else {
  // для теста на денвере
  $db = mysql_connect('localhost', 'root');
};
// выбираем название БД
mysql_select_db($db_name, $db);
ЧТО ЭТО???? Вам зачем класс работы с БД дан?
Где объявление, что мы работаем внутри ДЛЕ?
Почему вообще модуль подключён прямым вызовом файла, а не вызовом из init.php/engine.php???? На худой конец, есть API, т.е. подключение через {include file=mod.php}...

Вам надо не просто файлик закинуть на FTP, не связанный с ДЛЕ, а править файл /engine/modules/init/init.php - в нём идёт стандартная авторизация. И именно его надо модифицировать...

Итог, модуль никак не связан с ДЛЕ, а Вы хотите, чтобы он работал - так не получится.
 
PHP:
<?
// Соединяемся с БД
if (@mysql_connect('localhost', $user, $pass)){
  $db = mysql_connect('localhost', $user, $pass);
} else {
  // для теста на денвере
  $db = mysql_connect('localhost', 'root');
};
// выбираем название БД
mysql_select_db($db_name, $db);
ЧТО ЭТО???? Вам зачем класс работы с БД дан?
Где объявление, что мы работаем внутри ДЛЕ?
Почему вообще модуль подключён прямым вызовом файла, а не вызовом из init.php/engine.php???? На худой конец, есть API, т.е. подключение через {include file=mod.php}...

Вам надо не просто файлик закинуть на FTP, не связанный с ДЛЕ, а править файл /engine/modules/init/init.php - в нём идёт стандартная авторизация. И именно его надо модифицировать...

Итог, модуль никак не связан с ДЛЕ, а Вы хотите, чтобы он работал - так не получится.
Смотри последнее мое сообщения там уже файл какбы поправил под дле.
Потому и обратился на форум то что не знаю как моды писать
 
Честно говоря, лень смотреть весь код... Давай начнём с нуля...
1) Чтобы авторизовать человека - его сначала нужно зарегистрировать. Т.е. необходимо из OpenID получить данные и загнать их в ДЛЕ (хотя бы логин и пароль). Как ты это делаешь?
 
Вот предыдущий мой пост я напечатал скрипт
вместо пароля идет индефикатор или другое значения можно подставить
//$user[0] - идентификатор (account_id)
$regpassword = md5( $user[0] );


Думал взять мод из ulogin и переделать под это дело но знаний маловато

PHP:
$userpart = explode("/", $openid_link);
$user = explode("-", $userpart[4]);

//$openid_identity - ссылка на проифиль
//$user[0] - идентификатор (account_id)
//$user[1] - игровое имя (ник)

echo "Profile: $openid_link <br />
ID - $user[0] <br />
Nickname: $user[1]";
//Дальнейшие действия с переменными

/*REGISTER USER*/
$regpassword = md5( $user[0] );
$name = trim( $db->safesql( htmlspecialchars( $user[1], ENT_COMPAT, $config['charset'] ) ) );
$name = preg_replace('#\s+#i', ' ', $name);
$email = $openid_link;

$add_time = time() + ($config['date_adjust'] * 60);
$_IP = get_ip();
if( intval( $config['reg_group'] ) < 3 ) $config['reg_group'] = 4;

$row = $db->super_query( "SELECT * FROM " . USERPREFIX . "_users WHERE xfields = ".$user[0]."" );

if (!$row['user_id']) {

$db->query( "INSERT INTO " . USERPREFIX . "_users (name, password, email, reg_date, lastdate, user_group, info, signature, favorites, xfields, logged_ip) VALUES ('$name', '$regpassword', '$email', '$add_time', '$add_time', '" . $config['reg_group'] . "', '', '', '', '".$user[0]."', '" . $_IP . "')" );
$id = $db->insert_id();
 
Вот что получлось но работает както все криво
из этого места уже не дает авторизироваться Для просмотра ссылки Войди или Зарегистрируйся

Недавно тоже связался с этой авторизацией...

Оно в принципе даёт авторизоваться только с корневой директории /
Если в адресной строке /index.php?xxxxxxx - выскакивает Hacking attempt!

По коду...

1. Поле email нужно заполнить чем-то другим, но не ссылкой...

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

3. ID также лучше писать в отдельную ячейку, а не в xfields. Если ты захочешь использовать дополнительные поля профиля - авторизация перестанет работать.

Поэтому надо создавать 2 дополнительные поля, я создал wot_profile_link и wot_user_id, и соответствующим образом сменил часть кода.

4. В качестве пароля используется банальный MD5... что это значит? Можно посмотреть игровой ник любого участника клана и авторизоваться под ним...подменив форму в браузере и отправив POST-запрос. А если он в другой группе и у него есть права?...

Т.к. прямая авторизация у нас не планируется, следует генерировать более сложный хэш. Но следует учесть ограничение поля password в 32 символа. Это может быть комбинация base64encode + salt, pack, hash и любых прочих зверств:) далее все этого загоняем в MD5, главное, чтобы алгоритм был конфиденциален. Либо банальный rand() + md5.
 
Итак. Потестил немного скрипт.

Если вносить изменения по части пароля, например усложнить алгоритм, вместо
Код:
$regpassword = md5( $user[0] );
поставить
Код:
$salt = "r8nbrn8btfyg8n";
$mix = $salt.$user[0];
$regpassword = md5($mix);
В этом случае новый пользователь регистрируется, но вот авторизоваться невозможно. Пробовал разные комбинации, авторизация работает только если в md5 загонять $user[0] либо $user[1]

UPDATED

В общем я идиот :) нужно также в нижней части скрипта внести соответстующие изменения, в этой части:
Код:
set_cookie( "dle_password", $mix, 365 );
$_SESSION['dle_password'] = $mix;

$salt меняем под себя, набираем любою билиберду.

Также в папку со скриптом добавить .htaccess с
Код:
Order Deny,Allow
Deny from all
картинки перенести в папку шаблона.
 
Последнее редактирование:
Ну как дело продвигается?
 
Назад
Сверху