def authSuccess(self): " Success authorization " r = XMLNode("success", {"xmlns": "urn:ietf:params:xml:ns:xmpp-sasl"}) self.send(r.toString()) self.user = self._user self.xml.restart()
def xmppAuth(self, xml): " Authorization " print "AUTH" b64 = None for x in xml.nodes: if isinstance(x, basestring): b64 = x if not b64: r = XMLNode(name="reject", attrs={"xmlns": "urn:ietf:params:xml:ns:xmpp-sasl"}) r.nodes.append(XMLNode(name="not-authorized")) self.send(t.toString()) str = base64.b64decode(b64) sl = str.split("\000") if len(sl) < 2: r = XMLNode(name="reject", attrs={"xmlns": "urn:ietf:params:xml:ns:xmpp-sasl"}) r.nodes.append(XMLNode(name="not-authorized")) self.send(t.toString()) name, passwd = sl[-2:] try: self._user = name self.proxy.auth(name, passwd) except: print_exc() r = XMLNode("reject", {"xmlns": "urn:ietf:params:xml:ns:xmpp-sasl"}) r.nodes.append(XMLNode(name="not-authorized")) self.sock.send(r.toString()) self.sock.send("</%s:stream>" % self.namespace)
def startStream(self, ns, attrs): print "START STREAM" self.from_ = attrs["to"] self.namespace = ns node = XMLNode( "%s:stream" % self.namespace, { "id": str(self.id), "version": "1.0", "xmlns": "jabber:client", "xmlns:stream": "http://etherx.jabber.org/streams", "from": self.from_, }, ) if not self.user: fs = XMLNode("%s:features" % self.namespace) mechs = XMLNode("mechanisms", {"xmlns": "urn:ietf:params:xml:ns:xmpp-sasl"}) mech = XMLNode("mechanism") mech.nodes.append("PLAIN") mechs.nodes.append(mech) fs.nodes.append(mechs) node.nodes.append(fs) else: fs = XMLNode("%s:features" % self.namespace) for p in self.iqs: f = self.iqs[p].getFeatures() if f: fs.nodes.append(f) node.nodes.append(fs) self.send(node.toString(pack=True, noclose=True))
def sendPresence(self, user, status, msg=None, show=None): " Send presence of user to client " if not msg: msg = status r = XMLNode("presence", {"from": user, "to": self.resource}) if status != "online": r.attrs["type"] = status if show: r.nodes.append(XMLNode("show")) r["show"].nodes.append(show) r.nodes.append(XMLNode("status")) r["status"].nodes.append(msg) self.send(r.toString(pack=True))
def sendRoster(self, id, rost): " Send roster to client. Roster is a list of tupples: (user, FN, subscription, [group]) " r = XMLNode("iq", {"to": self.resource, "id": id, "type": "result"}) roster = XMLNode("query", {"xmlns": "jabber:iq:roster"}) r.nodes.append(roster) for u in rost: item = XMLNode("item", {"name": u[1], "jid": u[0], "subscription": u[2]}) if len(u) > 3: item.nodes.append(XMLNode("group")) item["group"].nodes.append(u[3]) roster.nodes.append(item) self.send(r.toString(pack=True))
def sendVCard(self, id, info, user=None): " Send vCard to client. Info is map with params " r = XMLNode("iq", {"to": self.resource, "id": id, "type": "result"}) if user: r.attrs["from"] = user vcard = XMLNode("vCard", {"xmlns": "vcard-temp"}) for n in info: node = XMLNode(n) if isinstance(info[n], list): node.nodes.extend(info[n]) else: node.nodes.append(info[n]) vcard.nodes.append(node) r.nodes.append(vcard) self.send(r.toString(pack=True))
def sendSubscriptionRequest(self, from_): " Send subscription request to client " r = XMLNode("presence", {"type": "subscribe", "from": from_}) self.send(r.toString(pack=True))
def sendUnsubscribe(self, user): " Remove subscription from user: "******"presence", {"from": user, "type": "unsubscribed"}) self.send(r.toString(pack=True))
def sendSubscribe(self, user): " Send simple subscription presence to user " r = XMLNode("presence", {"from": user, "type": "subscribed"}) self.send(r.toString(pack=True))
def authReject(self): " Authorization failure " r = XMLNode("reject", {"xmlns": "urn:ietf:params:xml:ns:xmpp-sasl"}) r.nodes.append(XMLNode(name="not-authorized")) self.sock.send(r.toString()) self.sock.send("</%s:stream>" % self.namespace)