import logging
import ssl
from packaging import version
from slixmpp import ClientXMPP, __version__
from slixmpp.exceptions import IqError, IqTimeout
[docs]class RegistrationException(Exception):
pass
[docs]class XMPPClient(ClientXMPP):
def __init__(self, jid, password, verify_security, auto_register):
ClientXMPP.__init__(self, jid, password)
self.logger = logging.getLogger("spade.Agent")
if version.parse(__version__) >= version.Version("1.10.0"):
self.enable_direct_tls = False
if not verify_security:
self.ssl_context.check_hostname = False
self.ssl_context.verify_mode = ssl.CERT_NONE
self.add_event_handler("session_start", self.session_start)
# XMPP Ping
self.register_plugin("xep_0199")
# In-band-registration
if auto_register:
self.add_event_handler("register", self.register)
self.register_plugin("xep_0077")
# Ping / Keepalive connection
self.register_plugin("xep_0199")
self["xep_0199"].enable_keepalive(interval=55)
# HTTP File Upload
self.register_plugin("xep_0363")
[docs] def session_start(self, event):
self.send_presence()
self.get_roster()
[docs] async def register(self, event):
resp = self.Iq()
resp["type"] = "set"
resp["register"]["username"] = self.boundjid.user
resp["register"]["password"] = self.password
try:
await resp.send()
except IqError as e:
if e.iq["error"]["condition"] == "conflict":
self.logger.debug("Account already exists. Trying to login")
pass
except IqTimeout:
raise RegistrationException("Timeout error during the register process.")