Ejemplo n.º 1
0
 def testJIDaliases(self):
     """Test changing JID using aliases for domain."""
     j = JID('user@someserver/resource')
     j.server = 'anotherserver'
     self.check_jid(j, domain='anotherserver')
     j.host = 'yetanother'
     self.check_jid(j, domain='yetanother')
Ejemplo n.º 2
0
def zulip_to_jid(email, jabber_domain):
    jid = JID(email, domain=jabber_domain)
    if (options.zulip_email_suffix
        and options.zulip_email_suffix in jid.username
        and not jid.username.endswith("-bot")):
        jid.username = jid.username.rpartition(options.zulip_email_suffix)[0]
    return jid
Ejemplo n.º 3
0
    def testJIDUnescape(self):
        jid = JID(local='here\'s_a_wild_&_/cr%zy/_address_for:<wv>("IMPS")',
                  domain='example.com')
        ujid = jid.unescape()
        self.assertEqual(ujid.local, 'here\'s_a_wild_&_/cr%zy/_address_for:<wv>("IMPS")')

        jid = JID(local='blah\\foo\\20bar', domain='example.com')
        ujid = jid.unescape()
        self.assertEqual(ujid.local, 'blah\\foo\\20bar')
Ejemplo n.º 4
0
 def testJIDSetFullWithUser(self):
     """Test setting the full JID with a user portion."""
     j = JID('user@domain/resource')
     j.full = 'otheruser@otherdomain/otherresource'
     self.check_jid(j,
                    'otheruser',
                    'otherdomain',
                    'otherresource',
                    'otheruser@otherdomain',
                    'otheruser@otherdomain/otherresource',
                    'otheruser@otherdomain/otherresource')
Ejemplo n.º 5
0
 def testJIDBareNoUser(self):
     """Test setting the bare JID without a user."""
     j = JID('user@domain/resource')
     j.bare = 'otherdomain'
     self.check_jid(j,
                    '',
                    'otherdomain',
                    'resource',
                    'otherdomain',
                    'otherdomain/resource',
                    'otherdomain/resource')
Ejemplo n.º 6
0
 def testJIDchange(self):
     """Test changing JID of the form 'user@server/resource/with/slashes'"""
     j = JID('user1@someserver1/some1/resource1')
     j.user = '******'
     j.domain = 'someserver'
     j.resource = 'some/resource'
     self.check_jid(j,
                    'user',
                    'someserver',
                    'some/resource',
                    'user@someserver',
                    'user@someserver/some/resource',
                    'user@someserver/some/resource')
Ejemplo n.º 7
0
 def testJIDFullNoUserNoResource(self):
     """
     Test setting the full JID without a user
     portion and without a resource.
     """
     j = JID('user@domain/resource')
     j.full = 'otherdomain'
     self.check_jid(j,
                    '',
                    'otherdomain',
                    '',
                    'otherdomain',
                    'otherdomain',
                    'otherdomain')
    def stream_message(self, msg):
        # type: (Dict[str, str]) -> None
        assert (self.jabber is not None)
        stream = msg['display_recipient']
        if not stream.endswith("/xmpp"):
            return

        room = stream_to_room(stream)
        jabber_recipient = JID(local=room, domain=options.conference_domain)
        outgoing = self.jabber.make_message(mto=jabber_recipient,
                                            mbody=msg['content'],
                                            mtype='groupchat')
        outgoing['thread'] = u'\u1FFFE'
        outgoing.send()
Ejemplo n.º 9
0
    def testJIDUnescape(self):
        jid = JID(local='here\'s_a_wild_&_/cr%zy/_address_for:<wv>("IMPS")',
                  domain='example.com')
        ujid = jid.unescape()
        self.assertEqual(ujid.local, 'here\'s_a_wild_&_/cr%zy/_address_for:<wv>("IMPS")')

        jid = JID(local='blah\\foo\\20bar', domain='example.com')
        ujid = jid.unescape()
        self.assertEqual(ujid.local, 'blah\\foo\\20bar')
Ejemplo n.º 10
0
    def __init__(self, jid: JID, password: str, rooms: List[str]) -> None:
        if jid.resource:
            self.nick = jid.resource
        else:
            self.nick = jid.username
            jid.resource = "zulip"
        ClientXMPP.__init__(self, jid, password)
        self.rooms = set()  # type: Set[str]
        self.rooms_to_join = rooms
        self.add_event_handler("session_start", self.session_start)
        self.add_event_handler("message", self.message)
        self.zulip = None
        self.use_ipv6 = False

        self.register_plugin('xep_0045')  # Jabber chatrooms
        self.register_plugin('xep_0199')  # XMPP Ping
Ejemplo n.º 11
0
    def create_rooms(self, rooms, callback=None):
        """
        Creates or joins the given rooms

        :param rooms: A list of rooms to join / create
        :param callback: Method to call back when all rooms have been created
        :raise ValueError: No Multi-User Chat service available
        """
        # Look for the MUC service if necessary
        if not self.__muc_service:
            try:
                self.__muc_service = next(self.iter_services(FEATURE_MUC))
            except StopIteration:
                raise ValueError("No Multi-User Chat service on server")

        if callback is not None:
            # Prepare a callback
            self.__countdowns.add(
                _MarksCallback((JID(local=room, domain=self.__muc_service)
                                for room in rooms), callback))

        # Prepare the room creator
        creator = RoomCreator(self, "Herald-XMPP-RoomCreator")

        # Prepare rooms configuration
        rooms_config = {
            # ... no max users limit
            'muc#roomconfig_maxusers': '0',
            # ... accepted members only
            'muc#roomconfig_membersonly': '1',
            # ... every participant can send invites
            'muc#roomconfig_allowinvites': '1',
            # ... room can disappear
            'muc#roomconfig_persistentroom': '0',
            # ... OpenFire: Forbid nick changes
            'x-muc#roomconfig_canchangenick': '0'
        }

        # Create rooms
        for room in rooms:
            creator.create_room(room, self.__muc_service, self._nick,
                                rooms_config, self.__room_created,
                                self.__room_error)
Ejemplo n.º 12
0
 def testtransport_presence_event_handler_with_no_status(self):
     """
     Test to check the presence method with no valid status of the signal class.
     """
     sig_dict, signal = self.setup_vars_mocks()
     transport = XmppTransport.factory(
         "1", sig_dict["Signal"]["Overlays"]["A0FB389"], signal,
         signal._presence_publisher, None, None)
     presence = {
         "from": "raj",
         "to": "raj@ipop",
         "status": "ipop?#1234434323"
     }
     transport.boundjid = JID("raj@ipop/ipop")
     jid_cache = Mock()
     presence_publisher = Mock()
     transport._presence_publisher = presence_publisher
     transport._presence_publisher.post_update = MagicMock()
     transport._jid_cache = jid_cache
     transport._jid_cache.add_entry = MagicMock()
     transport._sig.sig_log = MagicMock()
     transport.presence_event_handler(presence)
     transport._sig.sig_log.assert_called_once()
     print("Passed : testtransport_presence_event_handler_with_uid")
Ejemplo n.º 13
0
    def join_muc(self, room: str) -> None:
        if room in self.rooms:
            return
        logging.debug("Joining " + room)
        self.rooms.add(room)
        muc_jid = JID(local=room, domain=options.conference_domain)
        xep0045 = self.plugin['xep_0045']
        try:
            xep0045.joinMUC(muc_jid, self.nick, wait=True)
        except InvalidJID:
            logging.error("Could not join room: " + str(muc_jid))
            return

        # Configure the room.  Really, we should only do this if the room is
        # newly created.
        form = None
        try:
            form = xep0045.getRoomConfig(muc_jid)
        except ValueError:
            pass
        if form:
            xep0045.configureRoom(muc_jid, form)
        else:
            logging.error("Could not configure room: " + str(muc_jid))
Ejemplo n.º 14
0
 def testJIDFromFull(self):
     """Test using JID of the form 'user@server/resource/with/slashes'."""
     self.check_jid(JID('user@someserver/some/resource'), 'user',
                    'someserver', 'some/resource', 'user@someserver',
                    'user@someserver/some/resource',
                    'user@someserver/some/resource')
Ejemplo n.º 15
0
 def testJIDBareNoUser(self):
     """Test setting the bare JID without a user."""
     j = JID('user@domain/resource')
     j.bare = 'otherdomain'
     self.check_jid(j, '', 'otherdomain', 'resource', 'otherdomain',
                    'otherdomain/resource', 'otherdomain/resource')
Ejemplo n.º 16
0
 def testJIDNoResource(self):
     """Test using JID of the form 'user@domain'."""
     self.check_jid(JID('user@someserver'), 'user', 'someserver', '',
                    'user@someserver', 'user@someserver', 'user@someserver')
Ejemplo n.º 17
0
 def testJIDNoUser(self):
     """Test JID of the form 'component.domain.tld'."""
     self.check_jid(JID('component.someserver'), '', 'component.someserver',
                    '', 'component.someserver', 'component.someserver',
                    'component.someserver')
Ejemplo n.º 18
0
 def test1023LengthDomain(self):
     domain = ('a.' * 509) + 'a.com'
     jid1 = JID(domain=domain)
     jid2 = JID('user@%s/resource' % domain)
Ejemplo n.º 19
0
 def nickname_to_jid(self, room: str, nick: str) -> JID:
     jid = self.plugin['xep_0045'].getJidProperty(room, nick, "jid")
     if (jid is None or jid == ''):
         return JID(local=nick.replace(' ', ''), domain=self.boundjid.domain)
     else:
         return jid
Ejemplo n.º 20
0
    def __on_message(self, msg):
        """
        An Herald Message received (fire & forget)
        """
        if msg['delay']['stamp'] is not None:
            # Delayed message: ignore
            return

        if msg['type'] in ('chat', 'normal'):
            # Check message source
            from_jid = msg['from']
            if from_jid.bare == self.boundjid.bare:
                # Loopback message
                return

            try:
                content = msg['body'].split(':', 2)
                if content[0] != 'invite':
                    # Not a request for invitation
                    self.__reply(msg, "Unhandled command: {0}", content[0])
                    return

                try:
                    # Convert the key in an integer and look for it
                    if content[1] != "42":
                        key = int(content[1], 16)
                        self.__keys.remove(key)
                except KeyError:
                    self.__reply(msg, "Unauthorized key")
                except (TypeError, ValueError):
                    self.__reply(msg, "Invalid key")
                else:
                    try:
                        # Authorized client: invite it to requested rooms
                        rooms = set(content[2].split(','))
                    except IndexError:
                        # No room specified
                        rooms = set()

                    # Also invite it in the main room, if any
                    if self.__main_room:
                        rooms.add(self.__main_room)

                    rooms_jids = set(
                        JID(local=room, domain=self.__muc_service)
                        for room in rooms)

                    def rooms_ready(successes, failures):
                        """
                        Invites the requester in the rooms it requested, as
                        soon as they are ready

                        :param successes: JIDs of the usable rooms
                        :param failures: JIDs of the rooms which
                        failed
                        """
                        for room_jid in rooms_jids.difference(failures):
                            # Invite to valid rooms (old and new ones)
                            self['xep_0045'].invite(room_jid, from_jid.full,
                                                    "Client accepted")

                    # Create rooms if necessary...
                    to_create = rooms.difference(self.__rooms)
                    if to_create:
                        # We'll have to wait for the rooms before inviting
                        # the sender
                        self.create_rooms(to_create, rooms_ready)
                    else:
                        # All rooms already exist
                        rooms_ready(rooms_jids, [])

            except IndexError:
                self.__reply(msg, "Bad command format")
Ejemplo n.º 21
0
 def testJIDInequality(self):
     jid1 = JID('user@domain/resource')
     jid2 = JID('otheruser@domain/resource')
     self.assertFalse(jid1 == jid2, "Same JIDs are not considered equal")
     self.assertTrue(jid1 != jid2, "Same JIDs are considered not equal")
Ejemplo n.º 22
0
 def testJIDEscape(self):
     jid = JID(local='here\'s_a_wild_&_/cr%zy/_address_for:<wv>("IMPS")',
               domain='example.com')
     self.assertEqual(jid.local, r'here\27s_a_wild_\26_\2fcr%zy\2f_address_for\3a\3cwv\3e(\22IMPS\22)')
Ejemplo n.º 23
0
 def test1023LengthLocalPart(self):
     local = 'a' * 1023
     jid1 = JID(local=local, domain='test.com')
     jid2 = JID('*****@*****.**' % local)
Ejemplo n.º 24
0
 def __init__(self, muc_jid, user_jid, presence_type, message):
     self.muc_jid = JID(muc_jid)
     self.user_jid = JID(user_jid)
     self.presence_type = presence_type
     self.message = message
Ejemplo n.º 25
0
 def testDomainIPv4(self):
     domain = '127.0.0.1'
     jid1 = JID(domain=domain)
     jid2 = JID('user@%s/resource' % domain)
Ejemplo n.º 26
0
 def test1023LengthResource(self):
     resource = 'r' * 1023
     jid1 = JID(domain='test.com', resource=resource)
     jid2 = JID('test.com/%s' % resource)
Ejemplo n.º 27
0
 def testDomainIPv6(self):
     domain = '[::1]'
     jid1 = JID(domain=domain)
     jid2 = JID('user@%s/resource' % domain)
Ejemplo n.º 28
0
 def testJIDEquality(self):
     """Test that JIDs with the same content are equal."""
     jid1 = JID('user@domain/resource')
     jid2 = JID('user@domain/resource')
     self.assertTrue(jid1 == jid2, "Same JIDs are not considered equal")
     self.assertFalse(jid1 != jid2, "Same JIDs are considered not equal")
Ejemplo n.º 29
0
    if options.mode not in ('public', 'personal'):
        config_error(
            "Bad value for --mode: must be one of 'public' or 'personal'")

    if None in (options.jid, options.jabber_password):
        config_error(
            "You must specify your Jabber JID and Jabber password either "
            "in the Zulip configuration file or on the commandline")

    zulipToJabber = ZulipToJabberBot(
        zulip.init_from_options(options, "JabberMirror/" + __version__))
    # This won't work for open realms that don't have a consistent domain
    options.zulip_domain = zulipToJabber.client.email.partition('@')[-1]

    try:
        jid = JID(options.jid)
    except InvalidJID as e:
        config_error("Bad JID: %s: %s" % (options.jid, e.message))

    if options.conference_domain is None:
        options.conference_domain = "conference.%s" % (jid.domain, )

    xmpp = JabberToZulipBot(jid, options.jabber_password,
                            get_rooms(zulipToJabber))

    address = None
    if options.jabber_server_address:
        address = (options.jabber_server_address, options.jabber_server_port)

    if not xmpp.connect(use_tls=not options.no_use_tls, address=address):
        sys.exit("Unable to connect to Jabber server")
Ejemplo n.º 30
0
 def testJIDEscapeExistingSequences(self):
     jid = JID(local='blah\\foo\\20bar', domain='example.com')
     self.assertEqual(jid.local, 'blah\\foo\\5c20bar')