Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mrDoctorWho/vk4xmpp.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Smith <mrdoctorwho@helldev.net>2019-01-03 07:43:19 +0300
committerJohn Smith <mrdoctorwho@helldev.net>2019-01-03 07:43:19 +0300
commit719c4113c0467266969a03856dba635d6fd5ff67 (patch)
tree9d933f48b96b69588e371ca7c5ea2251ed86152d
parent137e36b111f77e653b4eb09314d77f902a7c57cc (diff)
update xmpppy
-rw-r--r--library/xmpp/dispatcher.py1
-rw-r--r--library/xmpp/protocol.py6
-rw-r--r--library/xmpp/roster.py2
-rw-r--r--library/xmpp/simplexml.py6
-rw-r--r--library/xmpp/transports.py52
5 files changed, 46 insertions, 21 deletions
diff --git a/library/xmpp/dispatcher.py b/library/xmpp/dispatcher.py
index 694a407..f873ffd 100644
--- a/library/xmpp/dispatcher.py
+++ b/library/xmpp/dispatcher.py
@@ -54,7 +54,6 @@ class Dispatcher(PlugIn):
PlugIn.__init__(self)
self.handlers = {}
self._expected = {}
- self.dc=False
self._defaultHandler = None
self._pendingExceptions = []
self._eventHandler = None
diff --git a/library/xmpp/protocol.py b/library/xmpp/protocol.py
index b11cf1f..da8c2f5 100644
--- a/library/xmpp/protocol.py
+++ b/library/xmpp/protocol.py
@@ -145,7 +145,7 @@ NS_WAITINGLIST = "http://jabber.org/protocol/waitinglist" # XEP-0130
NS_XHTML_IM = "http://jabber.org/protocol/xhtml-im" # XEP-0071
NS_XMPP_STREAMS = "urn:ietf:params:xml:ns:xmpp-streams" # RFC 3920
NS_PING = "urn:xmpp:ping" # XEP-0199
-NS_CHAT_MARKERS = "urn:xmpp:chat-markers:0" # XEP-0333
+NS_CHAT_MARKERS = "urn:xmpp:chat-markers:0" # XEP-0333
NS_MUC_FILTER = "http://jabber.ru/muc-filter"
@@ -838,11 +838,11 @@ class Iq(Protocol):
if queryNS:
self.setQueryNS(queryNS)
- def getQuery(self):
+ def getQuery(self, namespace=None):
"""
Returns the query node.
"""
- return self.getTag("query")
+ return self.getTag("query", namespace=namespace)
def getQueryNS(self):
"""
diff --git a/library/xmpp/roster.py b/library/xmpp/roster.py
index 5a36059..b91000e 100644
--- a/library/xmpp/roster.py
+++ b/library/xmpp/roster.py
@@ -80,6 +80,8 @@ class Roster(PlugIn):
Subscription tracker. Used internally for setting items state in
internal roster representation.
"""
+ if not stanza or not stanza.getTag("query"):
+ raise NodeProcessed()
for item in stanza.getTag("query").getTags("item"):
jid = item.getAttr("jid")
if item.getAttr("subscription") == "remove":
diff --git a/library/xmpp/simplexml.py b/library/xmpp/simplexml.py
index bac6a1c..24d42d4 100644
--- a/library/xmpp/simplexml.py
+++ b/library/xmpp/simplexml.py
@@ -31,12 +31,14 @@ XML_ls = (
("'", "&apos;")
)
+ENCODING = "utf-8"
+
+
def XMLescape(body):
for char, edef in XML_ls:
body = body.replace(char, edef)
- return body.strip()
+ return body
-ENCODING = "utf-8"
def ustr(what):
"""
diff --git a/library/xmpp/transports.py b/library/xmpp/transports.py
index 956ba29..47d6bb5 100644
--- a/library/xmpp/transports.py
+++ b/library/xmpp/transports.py
@@ -43,7 +43,7 @@ from .protocol import *
# http://pydns.sourceforge.net
try:
- import dns
+ import DNS as dns
except ImportError:
dns = None
@@ -51,9 +51,13 @@ DATA_RECEIVED = 'DATA RECEIVED'
DATA_SENT = 'DATA SENT'
DBG_CONNECT_PROXY = 'CONNECTproxy'
-BUFLEN = 2024
+BUFLEN = 8192
SEND_INTERVAL = 0
+TCP_KEEPINTVL = 60
+TCP_KEEPIDLE = 60
+
+
class SendSemaphore(object):
def __init__(self):
@@ -81,6 +85,7 @@ class SendSemaphore(object):
def __exit__(self, *args):
self.release()
+
class error:
"""
An exception to be raised in case of low-level errors in methods of 'transports' module.
@@ -97,6 +102,23 @@ class error:
"""
return self._comment
+
+def configureSocket(sock):
+ # see man(7) tcp
+ try:
+ # enable keepalive probes
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
+ # the interval between subsequential keepalive probes, regardless of what the connection has exchanged in the meantime
+ # overrides tcp_keepalive_intvl
+ sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPINTVL, TCP_KEEPINTVL)
+ # the interval between the last data packet sent (simple ACKs are not considered data) and the first keepalive probe;
+ # after the connection is marked to need keepalive, this counter is not used any further
+ # overrides tcp_keepalive_time
+ sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, TCP_KEEPIDLE)
+ except (AttributeError, OSError):
+ pass
+
+
class TCPsocket(PlugIn):
"""
This class defines direct TCP connection method.
@@ -128,7 +150,7 @@ class TCPsocket(PlugIn):
if response.answers:
# Sort by priority, according to RFC 2782.
answers = sorted(response.answers, key=lambda a: a["data"][0])
- (port, host) = answers[0]["data"][2:]
+ (port, host) = answers[0]["data"][2:][:2]
server = str(host), int(port)
except dns.DNSError:
self.DEBUG("An error occurred while looking up %s." % query, "warn")
@@ -200,6 +222,7 @@ class TCPsocket(PlugIn):
except Exception:
pass
else:
+ configureSocket(self._sock)
self.DEBUG("Successfully connected to remote host %s." % repr(server), "start")
return "ok"
@@ -260,18 +283,17 @@ class TCPsocket(PlugIn):
data = data.encode("utf-8")
elif not isinstance(data, str):
data = ustr(data).encode("utf-8")
- with self._sequence:
- try:
- self._send(data)
- except (Exception, socket.error):
- self.DEBUG("Socket error while sending data.", "error")
- self._owner.disconnected()
- else:
- if not data.strip():
- data = repr(data)
- self.DEBUG(data, "sent")
- if hasattr(self._owner, "Dispatcher"):
- self._owner.Dispatcher.Event("", DATA_SENT, data)
+ try:
+ self._send(data)
+ except (Exception, socket.error):
+ self.DEBUG("Socket error while sending data.", "error")
+ self._owner.disconnected()
+ else:
+ if not data.strip():
+ data = repr(data)
+ self.DEBUG(data, "sent")
+ if hasattr(self._owner, "Dispatcher"):
+ self._owner.Dispatcher.Event("", DATA_SENT, data)
def pending_data(self, timeout=0):
"""