def safe_send(self, stanza): to = stanza.get_to() if not to.domain.endswith(self.config.domain): to = to.bare() stanza = Stanza(stanza, to_jid=to) dbg("tx:\n%s" % (fmt_evt(stanza), )) self.stream.send(stanza)
def safe_send(self, stanza): dbg("safe_send:\n%s" % (fmt_evt(stanza), )) to = stanza.get_to() if (to.node == self.config.dialback and to.domain.endswith(self.config.domain)): ## if this is to a dialback that is *not* online, swallow it rather ## than forwarding ## if it is an unavailable, that's always safe and may be a suicide ## note to a dialback that surprised us or didn't start properly so ## send it anyway if (get_presence(stanza) != "unavailable" and not (to in St['dialback_online'] and St['dialback_online'][to] == DIALBACK.online)): err("destination dialback not online! dbo:%s stanza:\n%s" % ((to in St['dialback_online'] and St['dialback_online'][to] or "None"), fmt_evt(stanza))) return True ## if this is *not* an iq and *not* to a dialback, strip the destination ## jid if (not is_iq(stanza) and not to.domain.endswith(self.config.domain)): to = to.bare() stanza = Stanza(stanza, to_jid=to) dbg("tx:\n%s" % (fmt_evt(stanza), )) self.stream.send(stanza)
def subscribed(self, stanza): dbg("subscribed:\n%s" % (fmt_evt(stanza), )) StLock.acquire() try: to = stanza.get_to() if to.bare().as_utf8() == self.config.component: ## to master pass else: ## to user @ skype frm = get_from(stanza) if frm in St['dialbacks']: ## ...from skype user ujid = St['dialbacks'][frm] self.safe_send( Stanza(stanza, to_jid=ujid, from_jid=stanza.get_to())) else: ## ...from a dialback: forward on to user ujid = frm.bare() if ujid not in St['users']: return True djid = St['users'][ujid] iq = Iq(to_jid=djid, from_jid=self.config.component, stanza_type="set") command = iq.new_query("http://vipadia.com/skype", "command") add_child(command, "item", attrs={ "from": "%s" % to.node, "command": "subscribed", }) dbg(" subscribed:\n%s" % (fmt_evt(iq), )) self.safe_send(iq) return True finally: StLock.release()
def safe_send(self, stanza): to = stanza.get_to() if not to.domain.endswith(self.config.domain): to = to.bare() stanza = Stanza(stanza, to_jid=to) self.stream.send(stanza)
def make_stanza(m): return Stanza(parseDoc(m).children)
def default_handler(self, stanza): dbg("default_handler:\n%s" % (fmt_evt(stanza), )) StLock.acquire() try: if stanza.stanza_type == "presence": handled = self.default_presence_handler(stanza) if handled: return True frm = get_from(stanza) dbg(" frm:%s node:%s domain:%s resource:%s config:%s,%s" % (frm.as_utf8(), frm.node, frm.domain, frm.resource, self.config.dialback, self.config.domain)) if (frm.node, frm.domain) == (self.config.dialback, self.config.domain): ## ...from dialback djid = frm if djid not in St['dialbacks']: return True ujid = St['dialbacks'][djid] hsh = "%s" % (hash(ujid), ) if not frm.resource.endswith(hsh): err("*** SPOOFED MESSAGE DETECTED ***") err(" ujid:%s hash(ujid):%s frm:%s" % (ujid.as_utf8(), hsh, frm.as_utf8())) err(fmt_evt(stanza)) err("*** DIE DIE DIE ***") os._exit(os.EX_PROTOCOL) if stanza.stanza_type == "iq": userjids = St['userjids'][ujid].keys() forward = Stanza(stanza, to_jid=userjids[0], from_jid=stanza.get_to()) else: forward = Stanza(stanza, to_jid=ujid, from_jid=stanza.get_to()) else: ## ...from the user ujid = frm.bare() dbg(" frm:%s ujid:%s users:%s" % (frm.as_utf8(), ujid.as_utf8(), St['users'].keys())) if ujid not in St['users']: return True djid = St['users'][ujid] dbg(" djid:%s to:%s" % ( djid.as_utf8(), stanza.get_to().as_utf8(), )) forward = Stanza(stanza, to_jid=djid, from_jid=stanza.get_to()) dbg(" forward:\n%s" % (fmt_evt(forward), )) if stanza.stanza_type == "message" and stanza.get_body() == None: dbg(" not forwarding blank message!") return True self.safe_send(forward) return True finally: StLock.release()