#!/usr/bin/env python3 """Тест авторизации на Prosody 13.0 (test.nixg.ru:15222).""" import asyncio, sys, logging, ssl import slixmpp logging.basicConfig(level=logging.WARNING, format='%(levelname)s %(name)s: %(message)s') async def try_login(jid, password, expect_ok=True): class T(slixmpp.ClientXMPP): def __init__(self): super().__init__(jid, password) self.ok = None # Отключаем проверку сертификата (тестовый стенд, самоподписанный) self.ssl_context = ssl.create_default_context() self.ssl_context.check_hostname = False self.ssl_context.verify_mode = ssl.CERT_NONE self.add_event_handler('session_start', self.on_start) self.add_event_handler('failed_auth', self.on_fail) self.add_event_handler('disconnected', self.on_disc) self.add_event_handler('connected', self.on_conn) def on_conn(self, ev): print(f" [connected] {jid}") def on_start(self, ev): self.ok = True print(f" [AUTH OK] {jid} — session_start, full JID={self.boundjid}") self.disconnect() def on_fail(self, ev): self.ok = False print(f" [AUTH FAILED] {jid} — incorrect credentials rejected correctly") self.disconnect() def on_disc(self, ev): if self.ok is None: print(f" [DISCONNECTED before auth] {jid} reason={ev}") x = T() # Явно указываем хост/порт тестового сервера (15222 = нестандартный c2s) try: await x.connect('127.0.0.1', 15222) await asyncio.wait_for(x.wait_until('session_start' if expect_ok else 'failed_auth'), 15) except asyncio.TimeoutError: print(f" [TIMEOUT] {jid} — no auth result in 15s") x.disconnect() except Exception as e: print(f" [ERROR] {jid}: {type(e).__name__}: {e}") finally: try: x.disconnect() except: pass async def main(): print("=== 1. Верный пароль: testuser1@test.nixg.ru ===") await try_login("testuser1@test.nixg.ru", "pass12345", True) print("=== 2. Верный пароль: testuser2@test.nixg.ru ===") await try_login("testuser2@test.nixg.ru", "pass12345", True) print("=== 3. Админ ===") await try_login("admin@test.nixg.ru", "adminpass123", True) print("=== 4. НЕВЕРНЫЙ пароль (должен отказать) ===") await try_login("testuser1@test.nixg.ru", "WRONG", False) asyncio.run(main())