don't send more than 5 (by default) stanza per seconde

This commit is contained in:
Yann Leboulanger 2005-06-29 08:28:12 +00:00
parent 6a4214fcab
commit acf31c1585
2 changed files with 69 additions and 46 deletions

View File

@ -138,6 +138,7 @@ class Config:
'keep_alive_disconnect_secs': [ opt_int, 120 ],
# try for 2 minutes before giving up (aka. timeout after those seconds)
'try_connecting_for_foo_secs': [ opt_int, 120 ],
'max_stanza_per_sec': [ opt_int, 5],
}, {}),
'statusmsg': ({
'message': [ opt_str, '' ],

View File

@ -101,7 +101,8 @@ def get_os_info():
# sourcemage_version has all the info we need
if not os.path.basename(path_to_file).startswith('sourcemage'):
text = distro_name + ' ' + text
elif path_to_file.endswith('aurox-release'): # file doesn't have version
elif path_to_file.endswith('aurox-release'):
# file doesn't have version
text = distro_name
elif path_to_file.endswith('lfs-release'): # file just has version
text = distro_name + ' ' + text
@ -130,6 +131,8 @@ class Connection:
self.on_purpose = False
self.last_incoming = time.time()
self.keep_alive_sent = False
self.to_be_sent = []
self.last_sent = []
self.password = gajim.config.get_per('accounts', name, 'password')
if USE_GPG:
self.gpg = GnuPG.GnuPG()
@ -151,7 +154,7 @@ class Connection:
iq = common.xmpp.Iq(typ = 'get', to = jid, queryNS = ns)
if node:
iq.setQuerynode(node)
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
def discoverItems(self, jid, node = None):
'''According to JEP-0030: jid is mandatory,
@ -279,10 +282,12 @@ class Connection:
gajim.log.debug('subscribe request from %s' % who)
if gajim.config.get('alwaysauth') or who.find("@") <= 0:
if self.connection:
self.connection.send(common.xmpp.Presence(who, 'subscribed'))
self.to_be_sent.insert(0, common.xmpp.Presence(who,
'subscribed'))
if who.find("@") <= 0:
self.dispatch('NOTIFY', (prs.getFrom().getStripped().encode('utf8'), \
'offline', 'offline', prs.getFrom().getResource().encode('utf8'), prio, \
self.dispatch('NOTIFY',
(prs.getFrom().getStripped().encode('utf8'), 'offline',
'offline', prs.getFrom().getResource().encode('utf8'), prio,
keyID, None, None, None, None, None, None))
else:
if not status:
@ -290,9 +295,10 @@ class Connection:
self.dispatch('SUBSCRIBE', (who, status))
elif ptype == 'subscribed':
jid = prs.getFrom()
self.dispatch('SUBSCRIBED', (jid.getStripped().encode('utf8'), jid.getResource().encode('utf8')))
self.dispatch('UPDUSER', (jid.getStripped().encode('utf8'), jid.getNode(), \
['General']))
self.dispatch('SUBSCRIBED', (jid.getStripped().encode('utf8'),
jid.getResource().encode('utf8')))
self.dispatch('UPDUSER', (jid.getStripped().encode('utf8'),
jid.getNode(), ['General']))
#BE CAREFUL : no con.updateRosterItem() in a callback
gajim.log.debug('we are now subscribed to %s' % who)
elif ptype == 'unsubscribe':
@ -401,7 +407,7 @@ class Connection:
gajim.log.debug('DiscoverInfoErrorCB')
iq = common.xmpp.Iq(to = iq_obj.getFrom(), typ = 'get', queryNS =\
common.xmpp.NS_AGENTS)
con.send(iq)
self.to_be_sent.insert(0, iq)
def _DiscoverInfoCB(self, con, iq_obj):
gajim.log.debug('DiscoverInfoCB')
@ -426,7 +432,7 @@ class Connection:
features.append(i.getAttr('var'))
jid = str(iq_obj.getFrom())
if not identities:
self.connection.send(common.xmpp.Iq(typ = 'get', queryNS = \
self.to_be_sent.insert(0, common.xmpp.Iq(typ = 'get', queryNS = \
common.xmpp.NS_AGENTS))
else:
self.dispatch('AGENT_INFO_INFO', (jid, node, identities, features))
@ -441,7 +447,7 @@ class Connection:
send_os = gajim.config.get('send_os_info')
if send_os:
qp.setTagData('os', get_os_info())
con.send(iq_obj)
self.to_be_sent.insert(0, iq_obj)
raise common.xmpp.NodeProcessed
def _VersionResultCB(self, con, iq_obj):
@ -540,11 +546,12 @@ class Connection:
for i in roster.keys():
props = roster[i]
if props.has_key('name') and props['name']:
props['name']=props['name'].encode('utf8')
props['name'] = props['name'].encode('utf8')
if props.has_key('groups') and props['groups']:
props['groups']= map(lambda e:e.encode('utf8'),props['groups'])
props['groups'] = map(lambda e:e.encode('utf8'), props['groups'])
if props.has_key('resources') and props['resources']:
props['resources']= map(lambda e:e.encode('utf8'),props['resources'])
props['resources'] = map(lambda e:e.encode('utf8'),
props['resources'])
del roster[i]
roster[i.encode('utf8')] = props
@ -706,7 +713,8 @@ class Connection:
gajim.log.debug("Couldn't authenticate to %s" % self.name)
self.connected = 0
self.dispatch('STATUS', 'offline')
self.dispatch('ERROR', (_('Authentication failed with "%s"') % self.name,
self.dispatch('ERROR', (_('Authentication failed with "%s"') % \
self.name,
_('Please check your login and password for correctness.')))
return None
# END connect
@ -749,7 +757,8 @@ class Connection:
signed = ''
keyID = gajim.config.get_per('accounts', self.name, 'keyid')
if keyID and USE_GPG:
if self.connected < 2 and self.gpg.passphrase == None: # We didn't set a passphrase
if self.connected < 2 and self.gpg.passphrase == None:
# We didn't set a passphrase
self.dispatch('ERROR', (_('OpenPGP Key was not given'),
_('You will be connected to %s without OpenPGP.') % self.name))
else:
@ -828,7 +837,7 @@ class Connection:
msg_iq = common.xmpp.Message(to = jid, body = msgtxt, typ = 'chat')
if msgenc:
msg_iq.setTag(common.xmpp.NS_ENCRYPTED + ' x').setData(msgenc)
self.connection.send(msg_iq)
self.to_be_sent.insert(0, msg_iq)
gajim.logger.write('outgoing', msg, jid)
self.dispatch('MSGSENT', (jid, msg, keyID))
@ -840,17 +849,17 @@ class Connection:
if not msg:
msg = _('I would like to add you to my roster.')
pres.setStatus(msg)
self.connection.send(pres)
self.to_be_sent.insert(0, pres)
def send_authorization(self, jid):
if not self.connection:
return
self.connection.send(common.xmpp.Presence(jid, 'subscribed'))
self.to_be_sent.insert(0, common.xmpp.Presence(jid, 'subscribed'))
def refuse_authorization(self, jid):
if not self.connection:
return
self.connection.send(common.xmpp.Presence(jid, 'unsubscribed'))
self.to_be_sent.insert(0, common.xmpp.Presence(jid, 'unsubscribed'))
def unsubscribe(self, jid):
if not self.connection:
@ -882,7 +891,7 @@ class Connection:
def request_agents(self, jid, node):
if self.connection:
self.connection.send(common.xmpp.Iq(to = jid, typ = 'get',
self.to_be_sent.insert(0, common.xmpp.Iq(to = jid, typ = 'get',
queryNS = common.xmpp.NS_BROWSE))
self.discoverInfo(jid, node)
@ -960,7 +969,7 @@ class Connection:
return
iq = common.xmpp.Iq(to=jid + '/' + resource, typ = 'get', queryNS =\
common.xmpp.NS_VERSION)
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
def request_vcard(self, jid = None):
'''request the VCARD and return the iq'''
@ -970,7 +979,7 @@ class Connection:
if jid:
iq.setTo(jid)
iq.setTag(common.xmpp.NS_VCARD + ' vCard')
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
return iq
#('VCARD', {entry1: data, entry2: {entry21: data, ...}, ...})
@ -993,7 +1002,7 @@ class Connection:
iq3.addChild(k).setData(j[k])
else:
iq2.addChild(i).setData(vcard[i])
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
def get_settings(self):
''' Get Gajim settings as described in JEP 0049 '''
@ -1002,7 +1011,7 @@ class Connection:
iq = common.xmpp.Iq(typ='get')
iq2 = iq.addChild(name='query', namespace='jabber:iq:private')
iq3 = iq2.addChild(name='gajim', namespace='gajim:prefs')
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
def get_bookmarks(self):
''' Get Bookmarks from storage as described in JEP 0048 '''
@ -1012,7 +1021,7 @@ class Connection:
iq = common.xmpp.Iq(typ='get')
iq2 = iq.addChild(name="query", namespace="jabber:iq:private")
iq3 = iq2.addChild(name="storage", namespace="storage:bookmarks")
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
def store_bookmarks(self):
''' Send bookmarks to the storage namespace '''
@ -1028,14 +1037,13 @@ class Connection:
iq4.setAttr('name',bm['name'])
iq5 = iq4.setTagData('nick',bm['nick'])
iq5 = iq4.setTagData('password',bm['password'])
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
def send_agent_status(self, agent, ptype):
if not self.connection:
return
p = common.xmpp.Presence(to = agent, typ = ptype)
self.connection.send(p)
self.to_be_sent.insert(0, p)
def join_gc(self, nick, room, server, password):
if not self.connection:
@ -1049,30 +1057,30 @@ class Connection:
t = p.setTag(common.xmpp.NS_MUC + ' x')
if password:
t.setTagData('password', password)
self.connection.send(p)
self.to_be_sent.insert(0, p)
def send_gc_message(self, jid, msg):
if not self.connection:
return
msg_iq = common.xmpp.Message(jid, msg, typ = 'groupchat')
self.connection.send(msg_iq)
self.to_be_sent.insert(0, msg_iq)
self.dispatch('MSGSENT', (jid, msg))
def send_gc_subject(self, jid, subject):
if not self.connection:
return
msg_iq = common.xmpp.Message(jid,typ = 'groupchat', subject = subject)
self.connection.send(msg_iq)
self.to_be_sent.insert(0, msg_iq)
def request_gc_config(self, room_jid):
iq = common.xmpp.Iq(typ = 'get', queryNS = common.xmpp.NS_MUC_OWNER,
to = room_jid)
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
def change_gc_nick(self, room_jid, nick):
if not self.connection:
return
self.connection.send(common.xmpp.Presence(to = '%s/%s' % (room_jid,
self.to_be_sent.insert(0, common.xmpp.Presence(to = '%s/%s' % (room_jid,
nick)))
def send_gc_status(self, nick, jid, show, status):
@ -1084,7 +1092,7 @@ class Connection:
show = None
if show == 'online':
show = None
self.connection.send(common.xmpp.Presence(to = '%s/%s' % (jid, nick),
self.to_be_sent.insert(0, common.xmpp.Presence(to = '%s/%s' % (jid, nick),
typ = ptype, show = show, status = status))
def gc_set_role(self, room_jid, nick, role):
@ -1095,7 +1103,7 @@ class Connection:
item = iq.getTag('query').setTag('item')
item.setAttr('nick', nick)
item.setAttr('role', role)
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
def gc_set_affiliation(self, room_jid, jid, affiliation):
if not self.connection:
@ -1105,7 +1113,7 @@ class Connection:
item = iq.getTag('query').setTag('item')
item.setAttr('jid', jid)
item.setAttr('affiliation', affiliation)
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
def send_gc_config(self, room_jid, config):
iq = common.xmpp.Iq(typ = 'set', to = room_jid, queryNS =\
@ -1132,7 +1140,7 @@ class Connection:
val = '1'
tag.setTagData('value', val)
i += 1
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
def gpg_passphrase(self, passphrase):
if USE_GPG:
@ -1158,7 +1166,7 @@ class Connection:
q = iq.setTag(common.xmpp.NS_REGISTER + ' query')
q.setTagData('username',username)
q.setTagData('password',password)
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
def unregister_account(self):
if self.connected == 0:
@ -1167,33 +1175,47 @@ class Connection:
hostname = gajim.config.get_per('accounts', self.name, 'hostname')
iq = common.xmpp.Iq(typ = 'set', to = hostname)
q = iq.setTag(common.xmpp.NS_REGISTER + ' query').setTag('remove')
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
def send_keepalive(self):
# we received nothing for the last foo seconds (60 secs by default)
hostname = gajim.config.get_per('accounts', self.name,
'hostname')
iq = common.xmpp.Iq('get', common.xmpp.NS_LAST, to = hostname)
self.connection.send(iq)
self.to_be_sent.insert(0, iq)
self.keep_alive_sent = True
def process(self, timeout):
if not self.connection:
return
if self.connected:
now = time.time()
l = []
for t in self.last_sent:
if (now - t) < 1:
l.append(t)
self.last_sent = l
t_limit = time.time() + timeout
while time.time() < t_limit and len(self.to_be_sent) and \
len(self.last_sent) < gajim.config.get_per('accounts',
self.name, 'max_stanza_per_sec'):
self.connection.send(self.to_be_sent.pop())
self.last_sent.append(time.time())
try:
if gajim.config.get_per('accounts', self.name,
'keep_alives_enabled'): # do we want keepalives?
keep_alive_every_foo_secs = gajim.config.get_per('accounts',
self.name,'keep_alive_every_foo_secs')
if time.time() > (self.last_incoming + keep_alive_every_foo_secs)\
and not self.keep_alive_sent: #should we send keepalive?
#should we send keepalive?
if time.time() > (self.last_incoming + \
keep_alive_every_foo_secs) and not self.keep_alive_sent:
self.send_keepalive()
# did the server reply to the keepalive? if no disconnect
keep_alive_disconnect_secs = gajim.config.get_per('accounts',
self.name, 'keep_alive_disconnect_secs') # 2 mins by default
if time.time() > (self.last_incoming + keep_alive_disconnect_secs):
if time.time() > (self.last_incoming + \
keep_alive_disconnect_secs):
self.connection.disconnect() # disconnect if no answer
msg = '%s seconds have passed and server did not reply to our keepalive. Gajim disconnected from %s' % (str(keep_alive_disconnect_secs), self.name)
gajim.log.debug(msg)