random jid local-part and general cleanup fixes
This commit is contained in:
parent
61902cef9c
commit
6eb146736d
|
@ -33,6 +33,8 @@ import daemon
|
||||||
import logging
|
import logging
|
||||||
import logging.handlers
|
import logging.handlers
|
||||||
import urllib
|
import urllib
|
||||||
|
import string
|
||||||
|
import random
|
||||||
|
|
||||||
STATUSSTATES = ['AVAILABLE','CHAT', 'AWAY', 'XA', 'DND', 'INVISIBLE']
|
STATUSSTATES = ['AVAILABLE','CHAT', 'AWAY', 'XA', 'DND', 'INVISIBLE']
|
||||||
TELEPAATTIVERSION = 2.0
|
TELEPAATTIVERSION = 2.0
|
||||||
|
@ -78,7 +80,7 @@ class ClientThread(Thread):
|
||||||
self.port = port
|
self.port = port
|
||||||
self.server = server
|
self.server = server
|
||||||
self.muc_server = muc_server
|
self.muc_server = muc_server
|
||||||
self.JID = None
|
|
||||||
self.passwd= None
|
self.passwd= None
|
||||||
|
|
||||||
self.nickname = None
|
self.nickname = None
|
||||||
|
@ -585,8 +587,7 @@ class ClientThread(Thread):
|
||||||
@type jid: string
|
@type jid: string
|
||||||
@param jid: Jabber id of the MUC
|
@param jid: Jabber id of the MUC
|
||||||
"""
|
"""
|
||||||
iq = protocol.Iq(frm=self.JID,
|
iq = protocol.Iq(to=jid,
|
||||||
to=jid,
|
|
||||||
queryNS=NS_DISCO_ITEMS,
|
queryNS=NS_DISCO_ITEMS,
|
||||||
typ = 'get')
|
typ = 'get')
|
||||||
iq.setID('disco4')
|
iq.setID('disco4')
|
||||||
|
@ -695,6 +696,8 @@ class ClientThread(Thread):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
self.component.registerJid(self)
|
||||||
|
|
||||||
while self.connected and self.nickname is None:
|
while self.connected and self.nickname is None:
|
||||||
try:
|
try:
|
||||||
data = self.socket.recv(4096)
|
data = self.socket.recv(4096)
|
||||||
|
@ -707,8 +710,8 @@ class ClientThread(Thread):
|
||||||
else:
|
else:
|
||||||
self.connected = False
|
self.connected = False
|
||||||
|
|
||||||
|
if self.connected:
|
||||||
nick = self.fixNick(self.nickname)
|
nick = self.nickname
|
||||||
lines = ["NOTICE AUTH :*** Looking up your hostname...",
|
lines = ["NOTICE AUTH :*** Looking up your hostname...",
|
||||||
"NOTICE AUTH :*** Found your hostname, welcome back",
|
"NOTICE AUTH :*** Found your hostname, welcome back",
|
||||||
"NOTICE AUTH :*** Checking ident",
|
"NOTICE AUTH :*** Checking ident",
|
||||||
|
@ -754,15 +757,22 @@ class ClientThread(Thread):
|
||||||
self.roomPingQueue[muc] = ''
|
self.roomPingQueue[muc] = ''
|
||||||
self.xmppCommandMUCMODE(muc)
|
self.xmppCommandMUCMODE(muc)
|
||||||
else:
|
else:
|
||||||
self.pingCounter = self.pingCounter + 1
|
self.pingCounter += 1
|
||||||
self.sendToIRC('PONG %s' % (self.server))
|
self.sendToIRC('PONG %s' % (self.server))
|
||||||
if data:
|
if data:
|
||||||
for line in data.splitlines():
|
for line in data.splitlines():
|
||||||
self.commandHandler(line)
|
self.commandHandler(line)
|
||||||
else:
|
else:
|
||||||
self.connected = False
|
self.connected = False
|
||||||
if not jt.connected:
|
if jt.connected:
|
||||||
|
# leave all rooms
|
||||||
|
for room in self.mucs.keys():
|
||||||
|
self.sendToXMPP(Presence(to='%s/%s' % (room, self.nickname),
|
||||||
|
typ='unavailable',
|
||||||
|
status=''))
|
||||||
|
else:
|
||||||
self.ircCommandNOTICE('XMPP server disconnected, shutting down Telepaatti.')
|
self.ircCommandNOTICE('XMPP server disconnected, shutting down Telepaatti.')
|
||||||
|
self.component.unregisterJid(self)
|
||||||
try:
|
try:
|
||||||
self.socket.shutdown(socket.SHUT_RDWR)
|
self.socket.shutdown(socket.SHUT_RDWR)
|
||||||
except socket.error:
|
except socket.error:
|
||||||
|
@ -1097,7 +1107,6 @@ class ClientThread(Thread):
|
||||||
if ns.startswith(NS_MUC):
|
if ns.startswith(NS_MUC):
|
||||||
MUC = True
|
MUC = True
|
||||||
|
|
||||||
# todo: remove all the non-muc code
|
|
||||||
if not MUC:
|
if not MUC:
|
||||||
self.printDebug('non-muc presence somehow? investigate...')
|
self.printDebug('non-muc presence somehow? investigate...')
|
||||||
return
|
return
|
||||||
|
@ -1292,20 +1301,13 @@ class ClientThread(Thread):
|
||||||
if (MUC):
|
if (MUC):
|
||||||
arguments = arguments[1:]
|
arguments = arguments[1:]
|
||||||
|
|
||||||
if self.JID is None:
|
if self.nickname is None:
|
||||||
if command == 'NICK':
|
if command == 'NICK':
|
||||||
nick = ''
|
nick = ''
|
||||||
if arguments[0] == ':':
|
if arguments[0] == ':':
|
||||||
nick = arguments[1:]
|
nick = arguments[1:]
|
||||||
else:
|
else:
|
||||||
nick = arguments
|
nick = arguments
|
||||||
bare_jid = "%s@%s" %(nick, self.server)
|
|
||||||
full_jid = "%s@%s/%s" %(nick, self.server, 'telepaatti')
|
|
||||||
self.JID = JID(full_jid)
|
|
||||||
# todo: handle changing jids
|
|
||||||
self.printDebug("adding jid to clients: (full: %s) (bare: %s)" % (full_jid, bare_jid))
|
|
||||||
self.component.clients[full_jid] = self
|
|
||||||
self.component.clients[bare_jid] = self
|
|
||||||
|
|
||||||
self.nickname = self.fixNick(nick)
|
self.nickname = self.fixNick(nick)
|
||||||
|
|
||||||
|
@ -1357,7 +1359,7 @@ class ClientThread(Thread):
|
||||||
room = JID(arguments.strip())
|
room = JID(arguments.strip())
|
||||||
if room not in self.mucs.keys(): # not in room
|
if room not in self.mucs.keys(): # not in room
|
||||||
return
|
return
|
||||||
self.sendToXMPP(Presence(to='%s/%s' % (room, self.newnick),
|
self.sendToXMPP(Presence(to='%s/%s' % (room, self.nickname),
|
||||||
typ='unavailable',
|
typ='unavailable',
|
||||||
status=text))
|
status=text))
|
||||||
|
|
||||||
|
@ -1563,6 +1565,30 @@ class XmppComponent():
|
||||||
self.jt = JabberThread(client)
|
self.jt = JabberThread(client)
|
||||||
self.jt.start()
|
self.jt.start()
|
||||||
|
|
||||||
|
# https://tools.ietf.org/html/rfc6122#section-2.3
|
||||||
|
def randomLocalpart(self, size=20, chars=string.ascii_lowercase + string.digits):
|
||||||
|
return ''.join(random.choice(chars) for _ in range(size))
|
||||||
|
|
||||||
|
def registerJid(self, irc_client):
|
||||||
|
nick = self.randomLocalpart()
|
||||||
|
bare_jid = "%s@%s" %(nick, irc_client.server)
|
||||||
|
#full_jid = "%s@%s/%s" %(nick, irc_client.server, 'telepaatti')
|
||||||
|
while bare_jid in self.clients:
|
||||||
|
# generate new random until we come across an unused one
|
||||||
|
nick = self.randomLocalpart()
|
||||||
|
bare_jid = "%s@%s" %(nick, irc_client.server)
|
||||||
|
|
||||||
|
irc_client.bare_jid = bare_jid
|
||||||
|
irc_client.JID = JID(bare_jid)
|
||||||
|
#irc_client.printDebug("adding jid to clients: (full: %s) (bare: %s)" % (full_jid, bare_jid))
|
||||||
|
irc_client.printDebug("adding jid to clients: %s" % (bare_jid))
|
||||||
|
#self.clients[full_jid] = self
|
||||||
|
self.clients[bare_jid] = irc_client
|
||||||
|
|
||||||
|
def unregisterJid(self, irc_client):
|
||||||
|
if irc_client.bare_jid in self.clients:
|
||||||
|
del (self.clients[irc_client.bare_jid])
|
||||||
|
|
||||||
def send(self, msg):
|
def send(self, msg):
|
||||||
"""Sends message XMPP server
|
"""Sends message XMPP server
|
||||||
|
|
||||||
|
@ -1574,11 +1600,10 @@ class XmppComponent():
|
||||||
self.xmppSem.release()
|
self.xmppSem.release()
|
||||||
|
|
||||||
def messageHandler(self, sess, mess):
|
def messageHandler(self, sess, mess):
|
||||||
print "in messageHandler"
|
|
||||||
self.logger.info("in messageHandler")
|
self.logger.info("in messageHandler")
|
||||||
try:
|
try:
|
||||||
jid = mess.getTo()
|
jid = mess.getTo()
|
||||||
self.logger.info("jid %s" % (jid))
|
self.logger.info("jid %s, clients: %s" % (jid, self.clients))
|
||||||
self.clients[jid].messageHandler(sess, mess)
|
self.clients[jid].messageHandler(sess, mess)
|
||||||
except:
|
except:
|
||||||
self.logger.error("Unexpected error: %s" % sys.exc_info()[0])
|
self.logger.error("Unexpected error: %s" % sys.exc_info()[0])
|
||||||
|
@ -1586,22 +1611,20 @@ class XmppComponent():
|
||||||
|
|
||||||
|
|
||||||
def presenceHandler(self, sess, mess):
|
def presenceHandler(self, sess, mess):
|
||||||
print "in presenceHandler"
|
|
||||||
self.logger.info("in presenceHandler")
|
self.logger.info("in presenceHandler")
|
||||||
try:
|
try:
|
||||||
jid = mess.getTo()
|
jid = mess.getTo()
|
||||||
self.logger.info("jid %s" % (jid))
|
self.logger.info("jid %s, clients: %s" % (jid, self.clients))
|
||||||
self.clients[jid].presenceHandler(sess, mess)
|
self.clients[jid].presenceHandler(sess, mess)
|
||||||
except:
|
except:
|
||||||
self.logger.error("Unexpected error: %s" % sys.exc_info()[0])
|
self.logger.error("Unexpected error: %s" % sys.exc_info()[0])
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def iqHandler(self, sess, mess):
|
def iqHandler(self, sess, mess):
|
||||||
print "in iqHandler"
|
|
||||||
self.logger.info("in iqHandler")
|
self.logger.info("in iqHandler")
|
||||||
try:
|
try:
|
||||||
jid = mess.getTo()
|
jid = mess.getTo()
|
||||||
self.logger.info("jid %s" % (jid))
|
self.logger.info("jid %s, clients: %s" % (jid, self.clients))
|
||||||
self.clients[jid].iqHandler(sess, mess)
|
self.clients[jid].iqHandler(sess, mess)
|
||||||
except:
|
except:
|
||||||
self.logger.error("Unexpected error: %s" % sys.exc_info()[0])
|
self.logger.error("Unexpected error: %s" % sys.exc_info()[0])
|
||||||
|
|
Loading…
Reference in New Issue