LINUX.ORG.RU
ФорумAdmin

Проблема с ejabberd+внешняя авторизация


0

2

Доброго времени суток!

Что есть:
openSUSE 11.0
ejabberd 2.1.0
PHP 5.2.9
MySQL 5.0.51
Внешняя авторизация в MySQL через PHP-скрипт(http://www.ejabberd.im/check_mysql_php)
~1500 пользователей, ~500 постоянно подключенных.

И в довесок к этому есть следующая проблема:
После запуска сервера в течении нескольких дней все работает отлично, потом начинаются глюк с авторизацией - пускает любого пользователя с любым паролем. Иногда не с первого раза, но все равно пускает. Т.е. ввожу в клиенте несуществующего пользователя или существующего, но с неправильным паролем и подключаюсь как ни в чем не бывало. Иногда отбривает с первого раза, но после пару переподключений все равно пускает. Точно такая же ситуация с веб-админкой. Ввожу пароль админа, заведомо неправильный пароль - пару раз отбривает, потом пускает.

По логу скрипта видно, что сам скрипт отрабатывает нормально. Т.е. с БД общается, отвечает что пользователь/пароль неправильный, но у ejabberd как будто свое мнение на этот счет:

Nov  9 15:17:59 ns01 pipe-auth: Reading 29 bytes ... 
Nov  9 15:17:59 ns01 pipe-auth: IN: auth:zigmund:domain.com:passw
Nov  9 15:17:59 ns01 pipe-auth: GO: auth:zigmund:domain.com:passw
Nov  9 15:17:59 ns01 pipe-auth: data length is : 29
Nov  9 15:17:59 ns01 pipe-auth: Command was : auth
Nov  9 15:17:59 ns01 pipe-auth: Command : auth:zigmund:domain.com:cffbad68bb97a6c3f943538f119c992c ==> 0 
Nov  9 15:17:59 ns01 pipe-auth: RE: 
Nov  9 15:17:59 ns01 pipe-auth: OUT: 2

Подключение внешней авторизации в ejabberd:

{host_config, "domain.com",
    [
      {auth_method, external},
      {extauth_program, "/home/jabber/current/conf/auth-domain-com.php"}
    ]}.

Вначале стоял другой PHP-скрипт авторизации, было точно такая же проблема. То же самое и с ejabberd - обновлял несколько версий, глюк остается. Такое ощущение как будто буфер пайпа переполняет, или еще что-нибудь в этом роде... После перезапуска все отлично в течении нескольких дней / недели, потом опять все заново.


Включай в ёжике debug и смотри его лог - {loglevel, 5}. Если debug сильно будет мешать (юзеров то у тебя немало), открой extauth.erl, нади там строчку

?DEBUG("extauth call '~p' received data response:~n~p", [Msg, Data])
И замени на
?INFO_MSG("extauth call '~p' received data response:~n~p", [Msg, Data])

После чего прямо в исходниках ejabberd:

$ erlc extauth.erl

Никаких configure/make не надо. Полученный extauth.beam положи в директорию с другими бимами ёжика и рестартани сервер. Исходники для 2.1.0 брать здесь.

После того, как получишь результаты, отпишись :)

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

По идее можно без рестарта. Через ejabberdctl debug подключись к ёжику и набери l(extauth). Пример:

(ejabberd@localhost)1> l(extauth).
{module,extauth}

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

Пока все это дело отложилось, надеюсь на всегда.
Прикрутил перловую авторизацию, посмотрим как она себя поведет.

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

Дождался ошибки наконец-то...

Авторизуюсь под заведомо неправильным пользователем, скрипт отрабатывает нормально, в логи пишет свои ответы:

Dec  2 09:42:41 ns01 pipe-auth: Command : auth:iiiiiiiii:domain.com:e882b72bccfc2ad578c27b0d9b472a14 ==> 0 
Dec  2 09:42:45 ns01 pipe-auth: Command : auth:iiiiiiiii:domain.com:e882b72bccfc2ad578c27b0d9b472a14 ==> 0 
Dec  2 09:43:36 ns01 pipe-auth: Command : auth:iiiiiiiii:domain.com:e882b72bccfc2ad578c27b0d9b472a14 ==> 0 
Dec  2 09:43:40 ns01 pipe-auth: Command : auth:iiiiiiiii:domain.com:e882b72bccfc2ad578c27b0d9b472a14 ==> 0 
Dec  2 09:43:43 ns01 pipe-auth: Command : auth:iiiiiiiii:domain.com:e882b72bccfc2ad578c27b0d9b472a14 ==> 0

При этом меня отбривает только первый раз, остальные четыре раза я залогинился с неправильными данными:

=ERROR REPORT==== 2010-12-02 09:42:41 ===
E(<0.281.0>:extauth:73) : extauth call '["auth","iiiiiiiii","domain.com",
                                         "pppppp"]' received data response:
[0,0]

=ERROR REPORT==== 2010-12-02 09:42:45 ===
E(<0.281.0>:extauth:73) : extauth call '["auth","iiiiiiiii","domain.com",
                                         "pppppp"]' received data response:
[0,1]

=ERROR REPORT==== 2010-12-02 09:43:36 ===
E(<0.281.0>:extauth:73) : extauth call '["auth","iiiiiiiii","domain.com",
                                         "pppppp"]' received data response:
[0,1]

=ERROR REPORT==== 2010-12-02 09:43:40 ===
E(<0.281.0>:extauth:73) : extauth call '["auth","iiiiiiiii","domain.com",
                                         "pppppp"]' received data response:
[0,1]

=ERROR REPORT==== 2010-12-02 09:43:43 ===
E(<0.281.0>:extauth:73) : extauth call '["auth","iiiiiiiii","domain.com",
                                         "pppppp"]' received data response:
[0,1]
Мозг сломал уже...
Ежик коряво обрабатывает extauth? Почему тогда баг тянется через версии, и у других нормально работает.
Или же проблема с пайпом?..

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

> Ежик коряво обрабатывает extauth?

Понимаешь в чём фишка: ёжик использует внутренние механизмы эрланга для декодирования данных из порта. Эти механизмы используются в over 9000 мест в самом эрланге. Соответсвенно, если бы там был баг, то весь бы эрланг разваливался за считанные секунды. К тому же, я первый раз слышу о том, что у кого-то глючит extauth, и это за 6 лет его существования. Я бы всё-таки добавил дебаг к твоему скрипту: выводи в лог то, что непосредственно пишется в stdout. Кстати, можно ещё подцепить strace и помониторить вывод.

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

В том то и дело, что скрипт пишет в лог то, что выдает в stdout:

Dec  2 09:43:43 ns01 pipe-auth: Command : auth:iiiiiiiii:domain.com:e882b72bccfc2ad578c27b0d9b472a14 ==> 0

Это кусок кода скрипта, который выводит ответ в stdout и ведет лог. Переменная $result = true, если авторизация прошла и false, если нет:

    $return = ($return) ? 1 : 0;
    $this->logg("Command : ".$data[0].":".$parms." ==> ".$return." ");
    return @pack("nn", 2, $return);

Неправильная пара логин-пароль, скрипт выдает 0 в stdout, это же пишет в лог.Несколько дней ежик видит то, что говорит скрипт, то есть работает все идеально, потом начинаются проблемы - чаще видит 1 вместо 0.

Этот скрипт - один из нескольких, представленных на сайте ежика. Все перепробовал 3 скрипта с сайта - два на php, один на perl - везде одинаковая проблема.

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

Дык каждый вывод должен тэггироваться длиной же, а в логе я этого чота не вижу.

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

> Кстати, у тебя включен параллельный extauth? Может там гонка?

Кстати вариант. У меня есть еще один extauth с другим скриптом для домена третьего уровня а ля sub.domain.com, может из-за него глюки. На днях попробую скрестить все в один скрипт.

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

ZigmunD
() автор топика
28 сентября 2011 г.
Ответ на: комментарий от zenith

Спустя столько времени, проблема таки решилась. Починили в ежике эту багу.

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