Exemple #1
0
def xmpp(request, to):
    if request.method == 'POST':
        try:
            s = stanza_from_string(request.body)
            sfrom = JID(s.get_from().full)
            sto = JID(s.get_to().full)
        except:
            return HttpResponse('invalid stanza\n', content_type='text/plain')

        if isinstance(s, Presence):
            stype = s._get_attr('type')
            if stype == 'subscribe' or stype == 'unsubscribe':
                out = []

                # ack request
                resp = Presence()
                resp.set_from(sto)
                resp.set_to(sfrom)
                resp.set_type(stype + 'd')
                out.append(resp)

                # send presence
                resp = Presence()
                sto.resource = 'chillpad'
                sto.regenerate()
                resp.set_from(sto)
                resp.set_to(sfrom)
                if stype == 'unsubscribe':
                    resp.set_type('unavailable')
                out.append(resp)

                return stanzas_to_response(out)
            elif stype == 'probe':
                resp = Presence()
                sto.resource = 'chillpad'
                sto.regenerate()
                resp.set_from(sto)
                resp.set_to(sfrom)
                return stanzas_to_response([resp])
            else:
                # ignore
                return HttpResponse()
        elif isinstance(s, Message):
            is_chat = (s._get_attr('type') == 'chat')
            resp = Message()
            resp.set_from(sto)
            resp.set_to(sfrom)
            if is_chat:
                resp.set_type('chat')
            resp['body'] = 'You sent: %s' % s['body']
            return stanzas_to_response([resp])
        else:
            # be a jerk and ignore IQs
            return HttpResponse()
    else:
        return HttpResponseNotAllowed(['POST'])
Exemple #2
0
    def _handle_caps_feature(self, features):
        # We already have a method to process presence with
        # caps, so wrap things up and use that.
        p = Presence()
        p['from'] = self.xmpp.boundjid.domain
        p.append(features['caps'])
        self.xmpp.features.add('caps')

        self.xmpp.event('entity_caps', p)
Exemple #3
0
    def Presence(self, *args, **kwargs):
        """
        Create a Presence stanza.

        Uses same arguments as StanzaBase.__init__

        Arguments:
            xml -- An XML object to use for the Iq's values.
        """
        return Presence(self.xmpp, *args, **kwargs)
Exemple #4
0
def stanza_from_string(s):
    if not isinstance(s, unicode):
        s = s.decode('utf-8')
    e = ET.fromstring(s)
    if e.tag == '{jabber:client}message':
        stanza = Message(xml=e)
    elif e.tag == '{jabber:client}presence':
        stanza = Presence(xml=e)
    elif e.tag == '{jabber:client}iq':
        stanza = Iq(xml=e)
    else:
        raise ValueError('string is not valid stanza')
    return stanza
 def Presence(self, *args, **kwargs):
     """Create a Presence stanza associated with this stream."""
     return Presence(self, *args, **kwargs)
Exemple #6
0
 def Presence(self, *args, **kwargs):
     """Create a Presence stanza associated with this stream."""
     pres = Presence(self, *args, **kwargs)
     pres['lang'] = self.default_lang
     return pres