Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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()
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 def make_stanza(m):
     return Stanza(parseDoc(m).children)
Ejemplo n.º 6
0
    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()