def mainthread(self): try: clientprefs = self.recv() clientwantsencryption = int(clientprefs[0]) clientcanserve = int(clientprefs[1]) if config.sslavailable and (clientcanserve or config.canserve): #if the server can do any kind of encryption and either party can serve encryptionpossible = True else: encryptionpossible = False if encryptionpossible and (clientwantsencryption or config.forceencryption): usingencryption = True else: usingencryption = False if config.canserve: serving = True else: serving = False self.send(str(int(usingencryption)) + str(int(serving))) #if encryption is not possible even though it is required by the client, it will d/c at this point if usingencryption: self.secure(serving) print 'Using secure connection with %s (serving = %s)' % (self.ip, str(bool(serving))) except: print 'Securing connection with %s failed: %s' % (self.ip, str(sys.exc_info()[1])) self.send('oops!') #this will trigger sanity checks to fail at the client, rather than just a hang. return try: tmpnick = self.getnick() except: print '%s getnick failed: %s' % (self.ip, str(sys.exc_info()[1])) return if registernick(tmpnick) > 0: self.send("!NOTE Nickname could not be registered!") self.send("!TERMINATE") self.close() return else: self.nick = tmpnick print "%s logged in as %s" % (self.ip, self.nick) self.send("!CHATMODE") time.sleep(0.1) self.bcast("%s joined!" % self.nick, 'tehsrvr') self.welcome() thread.start_new_thread(self.pingthread, ()) self.ready = True while 1: #recv loop. spends most of time on self.recv() try: message = self.recv() except: self.bcast("%s quit: %s" % (self.nick, str(sys.exc_info()[1])), "tehsrvr") if self.ip != self.nick: #if the client still has a registered nick freenick(self.nick) self.nick = self.ip break if message.startswith('/'): self.command(message) else: #just a regular message self.bcast("<%s> %s" % (self.nick, message), self.nick)
def send(self, text): if self.closed: return try: self.c.send(text) except: #sending didn't work print "Client %s no longer available" % self.nick if self.ip != self.nick: #if the client still has a registered nick freenick(self.nick) self.nick = self.ip self.close() return 1
def mainthread(self): try: clientprefs = self.recv() clientwantsencryption = int(clientprefs[0]) clientcanserve = int(clientprefs[1]) if config.sslavailable and (clientcanserve or config.canserve): #if the server can do any kind of encryption and either party can serve encryptionpossible = True else: encryptionpossible = False if encryptionpossible and (clientwantsencryption or config.forceencryption): usingencryption = True else: usingencryption = False if config.canserve: serving = True else: serving = False self.send(str(int(usingencryption)) + str(int(serving))) #if encryption is not possible even though it is required by the client, it will d/c at this point if usingencryption: self.secure(serving) print 'Using secure connection with %s (serving = %s)' % ( self.ip, str(bool(serving))) except: print 'Securing connection with %s failed: %s' % ( self.ip, str(sys.exc_info()[1])) self.send( 'oops!' ) #this will trigger sanity checks to fail at the client, rather than just a hang. return try: tmpnick = self.getnick() except: print '%s getnick failed: %s' % (self.ip, str(sys.exc_info()[1])) return if registernick(tmpnick) > 0: self.send("!NOTE Nickname could not be registered!") self.send("!TERMINATE") self.close() return else: self.nick = tmpnick print "%s logged in as %s" % (self.ip, self.nick) self.send("!CHATMODE") time.sleep(0.1) self.bcast("%s joined!" % self.nick, 'tehsrvr') self.welcome() thread.start_new_thread(self.pingthread, ()) self.ready = True while 1: #recv loop. spends most of time on self.recv() try: message = self.recv() except: self.bcast("%s quit: %s" % (self.nick, str(sys.exc_info()[1])), "tehsrvr") if self.ip != self.nick: #if the client still has a registered nick freenick(self.nick) self.nick = self.ip break if message.startswith('/'): self.command(message) else: #just a regular message self.bcast("<%s> %s" % (self.nick, message), self.nick)