LINUX.ORG.RU

Нужна ваша помощь

 ,


0

1

Портирую xmpppy c python 2 на python 3. Уже почти получилось, но есть один баг, в попытках исправить который я провел все выходные, но так и не получилось. Вот исходники: https://bitbucket.org/inish777/xmpppy3
Форкнул я эту версию: http://sourceforge.net/projects/xmpppy/files/xmpppy/0.5.0-rc1/
Проблема проявляется при попытке залогиниться на сервере: gist.github.com

★★

В истории репозитория не видно твоих правок. А это печально, непонятно что было проделано. Так же не помешало бы описание сути проблемы.

Ну а так, конечно, молодец.

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

В истории репозитория не видно твоих правок.

Это еще не поздно исправить.

Так же не помешало бы описание сути проблемы.

Устанавливается SSL соединение с jabber сервером, клиент отправляет первое сообщение:

DEBUG: socket       sent  b'<?xml version=\'1.0\'?>
  <stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" to="jabber.ru" >'
Потом долгая пауза, затем вываливается это:
DEBUG: socket got b"<?xml version='1.0'?>
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='3907576160' from='jabber.ru' version='1.0' xml:lang='ru'>
<stream:features>
<compression xmlns='http://jabber.org/features/compress'>
<method>zlib</method>
</compression>
<mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
<mechanism>PLAIN</mechanism>
<mechanism>DIGEST-MD5</mechanism>
<mechanism>SCRAM-SHA-1</mechanism>
</mechanisms>
<c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.process-one.net/en/ejabberd/' ver='rvAR01fKsc40hT0hOLGDuG25y9o='/>
<register xmlns='http://jabber.org/features/iq-register'/>
</stream:features>"
DEBUG: dispatcher warn Unknown stanza: features
DEBUG: dispatcher ok Dispatching unknown stanza with type-> props->['http://jabber.org/features/compress', 'urn:ietf:params:xml:ns:xmpp-sasl', 'http://jabber.org/protocol/caps', 'http://jabber.org/features/iq-register'] id->None
DEBUG: sasl start Plugging <xmpp.auth.SASL object at 0x7f97a7ff7c90> into <xmpp.client.Client object at 0x7f97a800c190>
DEBUG: dispatcher info Registering handler <bound method SASL.SASLHandler of <xmpp.auth.SASL object at 0x7f97a7ff7c90>> for "challenge" type-> ns->(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher warn Registering namespace "urn:ietf:params:xml:ns:xmpp-sasl"
DEBUG: dispatcher info Registering protocol "unknown" as <class 'xmpp.protocol.Protocol'>(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher info Registering protocol "default" as <class 'xmpp.protocol.Protocol'>(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher warn Registering protocol "challenge" as <class 'xmpp.protocol.Protocol'>(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher info Registering handler <bound method SASL.SASLHandler of <xmpp.auth.SASL object at 0x7f97a7ff7c90>> for "failure" type-> ns->(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher warn Registering protocol "failure" as <class 'xmpp.protocol.Protocol'>(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher info Registering handler <bound method SASL.SASLHandler of <xmpp.auth.SASL object at 0x7f97a7ff7c90>> for "success" type-> ns->(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher warn Registering protocol "success" as <class 'xmpp.protocol.Protocol'>(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: socket sent b'<auth mechanism="DIGEST-MD5" xmlns="urn:ietf:params:xml:ns:xmpp-sasl" />'
DEBUG: socket error Socket error while receiving data
DEBUG: client stop Disconnect detected
DEBUG: socket error Socket operation failed
DEBUG: sasl stop Plugging <xmpp.auth.SASL object at 0x7f97a7ff7c90> out of <xmpp.client.Client object at 0x7f97a800c190>.
DEBUG: dispatcher info Registering handler <bound method Xmpp_interface.message_handler of <__main__.Xmpp_interface object at 0x7f97a954a8d0>> for "message" type-> ns->(jabber:client)
DEBUG: socket sent b'<presence id="1" />'
DEBUG: socket error Socket error while receiving data
DEBUG: client stop Disconnect detected
DEBUG: socket sent b'</stream:stream>'
DEBUG: socket error Socket error while receiving data
DEBUG: client stop Disconnect detected
DEBUG: socket error Socket operation failed
То есть, после загадочной паузы все пошло успешно, и вдруг сервер оборвал соединение. Я первым делом в подмодуль auth полез, но там вроде все нормально. В остальных тоже ничего подозрительного нет.

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

Прошу обратить внимание на удаление двух строк в конце файла transports.py

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

а можешь выложить дебаг-лог от оригинальной версии? Сравним посимвольно.

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

посмотрел репозиторий. Я так понимаю ты 2to3 использовал? Я бы разбил всё на два коммита: первый это 2to3 и второй это твои изменения.

Так что там с логом? :)

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

Да, кстати. В файле transports.py я удалил две строки:

315 -        tcpsock._sslIssuer = tcpsock._sslObj.issuer()
316 -        tcpsock._sslServer = tcpsock._sslObj.server()
Причина: не смог найти замены методам server() & issuer() Тем более, эти значения нигде не используются. Программа, на которой проверяю работоспособность библиотеки: https://bitbucket.org/inish777/hardinform

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

какие проблемы я вижу:

В твоём логе не открывается xml-поток. Т.е. не посылается <?xml version='1.0'?>.

Вторая проблема это то что ты в первом патче не просто портировал, а ещё форматирование поправил. Поэтому очень много лишнего прошлось посмотреть.

Вместо dict.__contains__(key) нужно просто key in dict. Впрочем, местами так и сделано, местами нет.

Ну а так у меня 2to3 вывалился на roster.py, но, вроде, сконвертил до конца. Попробуй запустить ту версию что он нагенерил.

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

изволит глохнуть на roster.py

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

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

В твоём логе не открывается xml-поток. Т.е. не посылается <?xml version='1.0'?>.

Как так? Есть ведь об этом запись.

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

И вот еще что заметил:

...Запустилось, вывело кучу фигни...
DEBUG: socket       sent  b'<?xml version=\'1.0\'?>
  <stream:stream xmlns="jabber:client" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" to="jabber.ru" >'
Нажимаем ctrl-C
^CDEBUG: socket       got   b"<?xml version='1.0'?>
  <stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='1137092790' from='jabber.ru' version='1.0' xml:lang='ru'>
  <stream:features>
  <compression xmlns='http://jabber.org/features/compress'>
  <method>zlib</method>
  </compression>
  <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
  <mechanism>PLAIN</mechanism>
  <mechanism>DIGEST-MD5</mechanism>
  <mechanism>SCRAM-SHA-1</mechanism>
  </mechanisms>
  <c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.process-one.net/en/ejabberd/' ver='rvAR01fKsc40hT0hOLGDuG25y9o='/>
  <register xmlns='http://jabber.org/features/iq-register'/>
  </stream:features>"
DEBUG: dispatcher   warn  Unknown stanza: features
DEBUG: dispatcher   ok    Dispatching unknown stanza with type-> props->['http://jabber.org/features/compress', 'urn:ietf:params:xml:ns:xmpp-sasl', 'http://jabber.org/protocol/caps', 'http://jabber.org/features/iq-register'] id->None
DEBUG: sasl         start Plugging <xmpp.auth.SASL object at 0x7f95c0e4dad0> into <xmpp.client.Client object at 0x7f95c239e890>
DEBUG: dispatcher   info  Registering handler <bound method SASL.SASLHandler of <xmpp.auth.SASL object at 0x7f95c0e4dad0>> for "challenge" type-> ns->(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher   warn  Registering namespace "urn:ietf:params:xml:ns:xmpp-sasl"
DEBUG: dispatcher   info  Registering protocol "unknown" as <class 'xmpp.protocol.Protocol'>(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher   info  Registering protocol "default" as <class 'xmpp.protocol.Protocol'>(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher   warn  Registering protocol "challenge" as <class 'xmpp.protocol.Protocol'>(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher   info  Registering handler <bound method SASL.SASLHandler of <xmpp.auth.SASL object at 0x7f95c0e4dad0>> for "failure" type-> ns->(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher   warn  Registering protocol "failure" as <class 'xmpp.protocol.Protocol'>(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher   info  Registering handler <bound method SASL.SASLHandler of <xmpp.auth.SASL object at 0x7f95c0e4dad0>> for "success" type-> ns->(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: dispatcher   warn  Registering protocol "success" as <class 'xmpp.protocol.Protocol'>(urn:ietf:params:xml:ns:xmpp-sasl)
DEBUG: socket       sent  b'<auth mechanism="DIGEST-MD5" xmlns="urn:ietf:params:xml:ns:xmpp-sasl" />'
И еще раз!
^CDEBUG: socket       got   b"<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>bm9uY2U9IjI4ODE0NTQ2NDgiLHFvcD0iYXV0aCIsY2hhcnNldD11dGYtOCxhbGdvcml0aG09bWQ1LXNlc3M=</challenge>"
DEBUG: dispatcher   ok    Got urn:ietf:params:xml:ns:xmpp-sasl/challenge stanza
DEBUG: dispatcher   ok    Dispatching challenge stanza with type-> props->[] id->None
DEBUG: sasl         ok    Got challenge:nonce="2881454648",qop="auth",charset=utf-8,algorithm=md5-sess
Traceback (most recent call last):
  File "linux-daemon/hardinform.py", line 516, in <module>
    main()
  File "linux-daemon/hardinform.py", line 511, in main
    iface.connect()
  File "linux-daemon/hardinform.py", line 170, in connect
    self.client.auth(self.config['xmpp_login'], self.config['xmpp_password'])
  File "/usr/lib64/python3.3/xmpp/client.py", line 226, in auth
    while self.SASL.startsasl=='in-process' and self.Process(1): pass
  File "/usr/lib64/python3.3/xmpp/dispatcher.py", line 125, in Process
    raise _pendingException[0](_pendingException[1]).with_traceback(_pendingException[2])
  File "/usr/lib64/python3.3/xmpp/dispatcher.py", line 303, in dispatch
    handler['func'](session,stanza)
  File "/usr/lib64/python3.3/xmpp/auth.py", line 194, in SASLHandler
    A1 = C([H(C([resp['username'],resp['realm'],self.password])),resp['nonce'],resp['cnonce']])
  File "/usr/lib64/python3.3/xmpp/auth.py", line 29, in C
    def C(some): return ':'.join(some.decode('utf-8'))
AttributeError: 'list' object has no attribute 'decode'
Это нормально? Просто сдохнуть оно должно было после первого ctrl-C как все остальные проги.

netcat ★★
() автор топика
Последнее исправление: netcat (всего исправлений: 1)
Ответ на: комментарий от netcat

Есть ведь об этом запись.

Я не вижу её в твоём логе выше. Там есть got b"<?xml version='1.0'?>, но это значит что данные к нам прилетели, а вот send <?xml ..> там нет.

Это нормально? Просто сдохнуть оно должно было после первого ctrl-C как все остальные проги.

если новые записи появляются в логе сразу после ctrl+C то не нормально и говорит о проблемах в event loop или тредами. Т.е., похоже, оно на чём-то блокируется.

Я попробую у себя воспроизвести сразу как только время будет.

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

Что-то я туплю чутка. Пошел по пути исправления всех ошибок, возникающих при двойном нажатии Ctrl-C. Дошел до этого:

Traceback (most recent call last):
  File "hardinform/linux-daemon/hardinform.py", line 516, in <module>
    main()
  File "hardinform/linux-daemon/hardinform.py", line 511, in main
    iface.connect()
  File "hardinform/linux-daemon/hardinform.py", line 170, in connect
    self.client.auth(self.config['xmpp_login'], self.config['xmpp_password'])
  File "/usr/lib64/python3.3/xmpp/client.py", line 226, in auth
    while self.SASL.startsasl=='in-process' and self.Process(1): pass
  File "/usr/lib64/python3.3/xmpp/dispatcher.py", line 125, in Process
    raise _pendingException[0](_pendingException[1]).with_traceback(_pendingException[2])
TypeError: function takes exactly 5 arguments (1 given)
В какой строке ошибка то? Неужели в последней?

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

ох дурдом этот код. Где угодно в этой строке может быть. Надо отладчиком смотреть. Типа komodo какого-нить.

У меня, кстати, после 2to3 ничего не работает. Если сейчас не найду причину то посмотрю твою ветку повнимательнее.

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

ох дурдом этот код

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

netcat ★★
() автор топика
Последнее исправление: netcat (всего исправлений: 1)
Ответ на: комментарий от netcat

слушай, может проще написать свой велосипед? Я как-то заморачивался лет 6 назад, даже что-то получалось.. Реально тут чёрт ногу сломит.

Короче, проблема в том что оно ждёт больше данных из сокета чем их есть. Т.е. либа делает socket.read() и блокируется. Потом ты жмёшь ctr+c, системный вызов обрывается и прога возвращается из read(). Посидев со strace я увидел что программа-то получает достаточно данных (как мне кажется, там же всё зашифровано). Это подтверждается тем что после ctrl+C она продолжает работать.

Куда копать... Надо посмотреть кто дёргает Dispatcher.Process . По моей логике это обёртка sasl. Самый простой вариант это просто при каждом вызове функции выводить бэктрейс и смотреть самый последний, который замирает.

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

Сумбурно написал. Короче, моя догадка: тот кто последний раз дёргает Dispatcher.Process тот и «вешает» всё. И это, наверно, sasl. А может и нет, но мне кажется что он т.к. на уровне сокета я проблем не вижу, на уровне xml я думаю сервер шлёт всё как надо.

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

Благодарю за помощь, буду разбираться.

netcat ★★
() автор топика
Ответ на: комментарий от netcat
import traceback
tb = traceback.format_stack(limit=TBLIMIT)
tb = "".join(tb)
print(tb)
true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.