LINUX.ORG.RU
ФорумAdmin

Jabberd2 - непонятки с авторизацией :(


0

0

Мистика, блин, какая-то. :(

Поставил последний jabberd2. Настройки по умолчанию на mysql. Все запустилось - отлично работает. Регистрация нового аккоунта проходит. Клиент тоже нормально подключается.

Но! Я пытаюсь в БД поменять например пароль юзера. Метод шифрования по умолчанию (sha_hex). По тестовому примеру, в моей проге ручного изменения юзера в БД hash формируется правильно.

1. Добавляю нового юзера. Подключиться не могу.
2. Меняю пароль у существующего юзера. Подлкючение идет только со старым паролем.

Это-то еще ладно - может сервак рестартовать надо...
Рестартовал сервак - все осталось по прежнему. Юзер с измененным паролем заходит по старому паролю, а новый вообще не подключается. 8(

Может кто в курсе - что это за фокусы? :(

Блин! Я тормоз. :)
Все поля как надо обновил кроме поля password. Мне почему-то сначала показалось что там не пароль стоит, а метод его шифрования. :)

UncleAndy ★★★
() автор топика

> По тестовому примеру, в моей проге ручного изменения юзера в БД hash формируется правильно.

Кстати, ты не мог бы рассказать как? Я на сайте не нашёл. И, если можно, поподробней... Если исходник небольшой, думаю, никто не против будет его публикации.

stark_lnx
()
Ответ на: комментарий от stark_lnx

Так это-ж элементарно. Исходник есть и в утилитке мигрирования с 1.4 на 2 в исходниках jabberd2 (каталог tools) и в самом исходнике на сях.

Вот мой вариант (add_j_user.pl):

=============================================================
#! /usr/bin/perl

use DBI;
use Digest::SHA1 qw(sha1_hex);

my $username = $ARGV[0];
my $pass = $ARGV[1];

if (($username eq '') || ($pass eq ''))
{
print "Usage:\n ./add_j_user.pl username password\n";
exit;
}
else
{
print $username, ": ", $pass, "\n";
};

my $seq = 500;
my $t = time();
my $token = sprintf("%X", $t);
my $h = sha1_hex($pass);
$h = sha1_hex($h.$token);
for(my $i = 0; $i < $seq; $i++) {
$h = sha1_hex($h);
};

print $token, "-", $seq, "-", $h, "\n";

my $dbho = DBI->connect("dbi:mysql:dbname=jabberd2;host=localhost", 'root', 'secure', { AutoCommit => 0, RaiseError => 1 });

my $c = $dbho->prepare('select username from authreg where username = ?');
$c->execute($username);
my ($un) = $c->fetchrow_array;
$c->finish;
if ($un eq $username)
{
# Если существует - обновляем пароль
$dbho->do('update authreg set password = ?, token = ?, sequence = ?, hash = ? where username = ?', undef, $pass, $token, $seq, $h, $userna}
else
{
# Если не существует добавляем нового
$dbho->do('insert into authreg (username, realm, password, token, sequence, hash) values (?, ?, ?, ?, ?, ?)', undef, $username, "andy", $p};

# Проверяем наличие записи в active
$un = $username.'@andy';
$c = $dbho->prepare('select time from active where `collection-owner` = ?');
$c->execute($un);
my ($tm) = $c->fetchrow_array;
$c->finish;
if ($tm eq '')
{
# Добавляем
$dbho->do('insert into active (`collection-owner`, time) values (?, ?)', undef, $un, $t);
}
else
{
# Обновляем
$dbho->do('update active set time= ? where `collection-owner` = ?', undef, $t, $un);
};

$dbho->commit;
$dbho->disconnect;
=============================================================

Правда, я не уверен, что добавлять запись в active обязательно. Просто пробовал разные варианты для устарнения описанного "глюка". :)

Домен здесь прописан явно в скрипте ("andy"). Думаю, сделать его передачей в параметрах кому надо будет не сложно. :)

UncleAndy ★★★
() автор топика
Ответ на: комментарий от UncleAndy

Блин! Неправильно скопировался.
Вот правильный исходник:

================================================================
#! /usr/bin/perl

use DBI;
use Digest::SHA1 qw(sha1_hex);

my $username = $ARGV[0];
my $pass = $ARGV[1];

if (($username eq '') || ($pass eq ''))
{
print "Usage:\n ./add_j_user.pl username password\n";
exit;
}
else
{
print $username, ": ", $pass, "\n";
};

my $seq = 500;
my $t = time();
my $token = sprintf("%X", $t);
my $h = sha1_hex($pass);
$h = sha1_hex($h.$token);
for(my $i = 0; $i < $seq; $i++) {
$h = sha1_hex($h);
};

print $token, "-", $seq, "-", $h, "\n";

my $dbho = DBI->connect("dbi:mysql:dbname=jabberd2;host=localhost", 'root', '', { AutoCommit => 0, RaiseError => 1 });

my $c = $dbho->prepare('select username from authreg where username = ?');
$c->execute($username);
my ($un) = $c->fetchrow_array;
$c->finish;
if ($un eq $username)
{
# Если существует - обновляем пароль
$dbho->do('update authreg set password = ?, token = ?, sequence = ?, hash = ? where username = ?', undef, $pass, $token, $seq, $h, $username);
}
else
{
# Если не существует добавляем нового
$dbho->do('insert into authreg (username, realm, password, token, sequence, hash) values (?, ?, ?, ?, ?, ?)', undef, $username, "andy", $pass, $token, $seq, $h);
};

# Проверяем наличие записи в active
$un = $username.'@andy';
$c = $dbho->prepare('select time from active where `collection-owner` = ?');
$c->execute($un);
my ($tm) = $c->fetchrow_array;
$c->finish;
if ($tm eq '')
{
# Добавляем
$dbho->do('insert into active (`collection-owner`, time) values (?, ?)', undef, $un, $t);
}
else
{
# Обновляем
$dbho->do('update active set time= ? where `collection-owner` = ?', undef, $t, $un);
};

$dbho->commit;
$dbho->disconnect;
================================================================

UncleAndy ★★★
() автор топика
Ответ на: комментарий от UncleAndy

Спасибо большое. Я теперь понял, что это обначают все поля в таблице `authreg`, а то приходилось искать в Инете патч, который обходился только полями username и password... Ты меня очень выручил.

stark_lnx
()

Кстати, как у вас дела обстоят с администрированием Jabberd2? Мне пришлось самому на скорую руку писать интерфейс (PHP), но поскольку времени нету его доработать, то можут у кого есть какие-нибудь наработки... Можно было объеденится и сделать сообща полезное дело...

stark_lnx
()
Ответ на: комментарий от anonymous

Имеется ввиду, я так думаю, вариант работы без возможности авторегистрации юзеров. Тогда админу нужна возможность самому регистрировать юзеров в базе.

Я тоже в ближайшее время собираюсь сделать удаленную админку для джабера. Тем более, что у меня несколько удаленных филиалов к серваку подключены - сделаю для их админов возможность самим своих юзеров добавлять. :)

UncleAndy ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.