ulang = utils.getLang(el) ptype = el.getAttribute("type") if to.find('@') < 0: # If the presence packet is to the transport (not a user) and there isn't already a session if not ptype: # Don't create a session unless they're sending available presence if self.serviceplugins['Statistics'].stats["OnlineSessions"] < 1000: LogEvent(INFO, msg="Attempting to create a new session") s = session.makeSession(self, froj.userhost(), ulang, toj) if s: self.sessions[froj.userhost()] = s LogEvent(INFO, msg="New session created") # Send the first presence s.onPresence(el) else: LogEvent(INFO, msg="Failed to create session") jabw.sendMessage(self, to=froj.userhost(), fro=config.jid, body=lang.get("notregistered", ulang)) else: LogEvent(INFO, msg="Max sessions limit reached") jabw.sendMessage(self, to=froj.userhost(), fro=config.jid, body=lang.get("sessionslimit", ulang)) elif ptype != "error": LogEvent(INFO, msg="Sending unavailable presence to non-logged in user") pres = Element((None, "presence")) pres.attributes["from"] = to pres.attributes["to"] = fro pres.attributes["type"] = "unavailable" self.send(pres) return elif ptype and (ptype.startswith("subscribe") or ptype.startswith("unsubscribe")): # They haven't logged in, and are trying to change subscription to a user
class RegisterManager: def __init__(self, pytrans): self.pytrans = pytrans if config.allowRegister: self.pytrans.discovery.addFeature(disco.IQREGISTER, self.incomingRegisterIq, config.jid) LogEvent(INFO) def removeRegInfo(self, jabberID): LogEvent(INFO) try: # If the session is active then send offline presences session = self.pytrans.sessions[jabberID] session.removeMe() except KeyError: pass self.pytrans.xdb.remove(jabberID) LogEvent(INFO, "", "done") def setRegInfo(self, jabberID, username, password): LogEvent(INFO) if (len(password) == 0): (blah1, password, blah3) = self.getRegInfo(jabberID) reginfo = legacy.formRegEntry(username, password) self.pytrans.xdb.set( internJID(jabberID).userhost(), legacy.namespace, reginfo) def getRegInfo(self, jabberID): LogEvent(INFO) result = self.pytrans.xdb.request( internJID(jabberID).userhost(), legacy.namespace) if (result == None): LogEvent(INFO, "", "Not registered!") return None username, password = legacy.getAttributes(result) if (username and password and len(username) > 0 and len(password) > 0): LogEvent(INFO, "", "Returning reg info.") return (username, password) else: LogEvent(WARN, "", "Registration data corrupted!") return None def incomingRegisterIq(self, incoming): # Check what type the Iq is.. itype = incoming.getAttribute("type") LogEvent(INFO) if (itype == "get"): self.sendRegistrationFields(incoming) elif (itype == "set"): self.updateRegistration(incoming) def sendRegistrationFields(self, incoming): # Construct a reply with the fields they must fill out ID = incoming.getAttribute("id") fro = incoming.getAttribute("from") LogEvent(INFO) reply = Element((None, "iq")) reply.attributes["from"] = config.jid reply.attributes["to"] = fro if ID: reply.attributes["id"] = ID reply.attributes["type"] = "result" query = reply.addElement("query") query.attributes["xmlns"] = "jabber:iq:register" instructions = query.addElement("instructions") ulang = utils.getLang(incoming) instructions.addContent(lang.get(ulang).registerText) userEl = query.addElement("username") passEl = query.addElement("password") # Check to see if they're registered result = self.getRegInfo(incoming.getAttribute("from")) if (result): username, password = result userEl.addContent(username) query.addElement("registered") self.pytrans.send(reply) def updateRegistration(self, incoming): # Grab the username, password ID = incoming.getAttribute("id") fro = incoming.getAttribute("from") LogEvent(INFO) source = internJID(fro).userhost() ulang = utils.getLang(incoming) username = None password = None for queryFind in incoming.elements(): if (queryFind.name == "query"): for child in queryFind.elements(): try: if (child.name == "username"): username = child.__str__() elif (child.name == "password"): password = child.__str__() elif (child.name == "remove"): # The user wants to unregister the transport! Gasp! LogEvent(INFO, "", "Unregistering.") try: self.removeRegInfo(source) self.successReply(incoming) except: self.xdbErrorReply(incoming) return LogEvent(INFO, "", "Unregistered!") return except AttributeError, TypeError: continue # Ignore any errors, we'll check everything below if (self.isValid(username) and password and len(username) > 0 and len(password) > 0): # Valid registration data LogEvent(INFO, "", "Updating XDB") try: self.setRegInfo(source, username, password) LogEvent(INFO, "", "Updated XDB") self.successReply(incoming) LogEvent(INFO, "", "Sent a result Iq") to = internJID(incoming.getAttribute("from")).userhost() jabw.sendPresence(self.pytrans, to=to, fro=config.jid, ptype="subscribe") if (config.registerMessage): jabw.sendMessage(self.pytrans, to=incoming.getAttribute("from"), fro=config.jid, body=config.registerMessage) except: self.xdbErrorReply(incoming) raise else: self.badRequestReply(incoming)
return except AttributeError, TypeError: continue # Ignore any errors, we'll check everything below if username and password and len(username) > 0 and len(password) > 0: # Valid registration data LogEvent(INFO, msg="Updating XDB") try: self.pytrans.xdb.setRegistration(source, username, password) LogEvent(INFO, msg="Updated XDB") self.successReply(incoming) LogEvent(INFO, msg="Sent a result Iq") to = internJID(incoming.getAttribute("from")).userhost() jabw.sendPresence(self.pytrans, to=to, fro=config.jid, ptype="subscribe") if config.registerMessage: jabw.sendMessage(self.pytrans, to=incoming.getAttribute("from"), fro=config.jid, body=config.registerMessage) except: self.xdbErrorReply(incoming) raise else: self.badRequestReply(incoming) def badRequestReply(self, incoming): LogEvent(INFO) # Send an error Iq reply = incoming reply.swapAttributeValues("to", "from") reply.attributes["type"] = "error" error = reply.addElement("error") error.attributes["type"] = "modify"
ulang = utils.getLang(el) ptype = el.getAttribute("type") if to.find('@') < 0: # If the presence packet is to the transport (not a user) and there isn't already a session if not ptype: # Don't create a session unless they're sending available presence LogEvent(INFO, msg="Attempting to create a new session") s = session.makeSession(self, froj.userhost(), ulang, toj) if s: self.sessions[froj.userhost()] = s LogEvent(INFO, msg="New session created") # Send the first presence s.onPresence(el) else: LogEvent(INFO, msg="Failed to create session") jabw.sendMessage(self, to=froj.userhost(), fro=config.jid, body=lang.get("notregistered", ulang)) elif ptype != "error": LogEvent( INFO, msg="Sending unavailable presence to non-logged in user" ) pres = Element((None, "presence")) pres.attributes["from"] = to pres.attributes["to"] = fro pres.attributes["type"] = "unavailable" self.send(pres) return elif ptype and (ptype.startswith("subscribe")
# If the presence packet is to the transport (not a user) and there isn't already a session if not el.getAttribute( "type" ): # Don't create a session unless they're sending available presence LogEvent(INFO, "", "Attempting to create a new session.") s = session.makeSession(self, froj.userhost(), ulang) if s: self.statistics.stats["TotalUsers"] += 1 self.sessions[froj.userhost()] = s LogEvent(INFO, "", "New session created.") # Send the first presence s.onPresence(el) else: LogEvent(INFO, "", "Failed to create session") jabw.sendMessage(self, to=froj.userhost(), fro=config.jid, body=lang.get(ulang).notRegistered) elif el.getAttribute("type") != "error": LogEvent( INFO, "", "Sending unavailable presence to non-logged in user.") jabw.sendPresence(self, fro, to, ptype="unavailable") return elif ptype and (ptype.startswith("subscribe") or ptype.startswith("unsubscribe")): # They haven't logged in, and are trying to change subscription to a user # No, lets not log them in. Lets send an error :) jabw.sendPresence(self, fro, to, ptype="error")
if username and password and len(username) > 0 and len(password) > 0: # Valid registration data LogEvent(INFO, msg="Updating XDB") try: self.pytrans.xdb.setRegistration(source, username, password) LogEvent(INFO, msg="Updated XDB") self.successReply(incoming) LogEvent(INFO, msg="Sent a result Iq") to = internJID(incoming.getAttribute("from")).userhost() jabw.sendPresence(self.pytrans, to=to, fro=config.jid, ptype="subscribe") if config.registerMessage: jabw.sendMessage(self.pytrans, to=incoming.getAttribute("from"), fro=config.jid, body=config.registerMessage) except: self.xdbErrorReply(incoming) raise else: self.badRequestReply(incoming) def badRequestReply(self, incoming): LogEvent(INFO) # Send an error Iq reply = incoming reply.swapAttributeValues("to", "from") reply.attributes["type"] = "error" error = reply.addElement("error")