paulb@271 | 1 | #!/usr/bin/env python |
paulb@271 | 2 | |
paul@353 | 3 | """ |
paul@353 | 4 | A test of XMPP support, providing a simple chat interface. |
paul@353 | 5 | """ |
paul@353 | 6 | |
paulb@271 | 7 | import libxml2dom.xmpp |
paul@353 | 8 | import os |
paulb@271 | 9 | import sys |
paulb@271 | 10 | |
paul@353 | 11 | try: |
paul@353 | 12 | username, domain, password, mode = sys.argv[1:5] |
paul@353 | 13 | except ValueError: |
paul@353 | 14 | print sys.argv[0], "<username> <domain> <password> <mode> [ <endpoint> ]" |
paul@353 | 15 | print |
paul@353 | 16 | print "For example:" |
paul@353 | 17 | print |
paul@353 | 18 | print sys.argv[0], "libxml2dom localhost jabber listen # to listen" |
paul@353 | 19 | print sys.argv[0], "libxml2dom localhost jabber contact 1234 # to contact a listener" |
paulb@271 | 20 | sys.exit(1) |
paulb@271 | 21 | |
paul@353 | 22 | receiving = mode == "listen" |
paul@353 | 23 | register = mode == "register" |
paul@353 | 24 | unregister = mode == "unregister" |
paul@353 | 25 | |
paul@353 | 26 | # Get a peer to send messages to. |
paul@353 | 27 | |
paul@353 | 28 | if not receiving and not register and not unregister: |
paul@353 | 29 | if len(sys.argv) > 5: |
paul@353 | 30 | peer = "%s@%s/%s" % (username, domain, sys.argv[5]) |
paul@353 | 31 | else: |
paul@353 | 32 | print "Need to specify a peer to send messages to." |
paul@353 | 33 | sys.exit(1) |
paul@353 | 34 | |
paul@353 | 35 | # Connect to the XMPP server. |
paulb@291 | 36 | |
paulb@271 | 37 | s = libxml2dom.xmpp.Session(("localhost", 5222)) |
paul@352 | 38 | d = s.connect("localhost") |
paul@353 | 39 | |
paul@353 | 40 | print "---- Connection ----" |
paul@353 | 41 | print d.toString(prettyprint=1) |
paul@353 | 42 | |
paul@353 | 43 | # Register if requested. |
paul@353 | 44 | |
paul@353 | 45 | if register: |
paul@353 | 46 | print "---- Register ----" |
paul@353 | 47 | iq = s.createIq() |
paul@353 | 48 | iq.makeQuery() |
paul@353 | 49 | print iq.toString(prettyprint=1) |
paul@353 | 50 | s.send(iq) |
paul@353 | 51 | |
paul@353 | 52 | print "---- Response ----" |
paul@353 | 53 | d = s.receive() |
paul@353 | 54 | print d.toString(prettyprint=1) |
paulb@271 | 55 | |
paul@353 | 56 | if not d.query.xpath("register:registered"): |
paul@353 | 57 | instructions = d.query.xpath("register:instructions") |
paul@353 | 58 | if instructions: |
paul@353 | 59 | print instructions[0].textContent |
paulb@271 | 60 | |
paul@353 | 61 | print "---- Completing form ----" |
paul@353 | 62 | iq = s.createIq() |
paul@353 | 63 | iq.makeRegistration() |
paul@353 | 64 | iq.registration["username"] = username |
paul@353 | 65 | iq.registration["password"] = password |
paul@353 | 66 | print iq.toString(prettyprint=1) |
paul@353 | 67 | s.send(iq) |
paul@353 | 68 | |
paul@353 | 69 | print "---- Response ----" |
paul@353 | 70 | d = s.receive() |
paul@353 | 71 | print d.toString(prettyprint=1) |
paul@353 | 72 | |
paul@352 | 73 | s.disconnect() |
paul@352 | 74 | sys.exit(1) |
paul@352 | 75 | |
paul@353 | 76 | print "---- Authentication ----" |
paul@353 | 77 | auth = s.createAuth() |
paul@353 | 78 | auth.mechanism = "PLAIN" |
paul@353 | 79 | auth.setCredentials(username, username, password) |
paul@353 | 80 | print auth.toString(prettyprint=1) |
paul@353 | 81 | s.send(auth) |
paul@353 | 82 | |
paul@353 | 83 | print "---- Response ----" |
paul@353 | 84 | d = s.receive() |
paul@353 | 85 | print d.toString(prettyprint=1) |
paul@353 | 86 | |
paul@353 | 87 | if d.localName == "failure": |
paul@353 | 88 | if d.reason == "not-authorized": |
paul@353 | 89 | print "Not authorized: perhaps register first!" |
paul@353 | 90 | s.disconnect() |
paul@353 | 91 | sys.exit(1) |
paul@353 | 92 | |
paul@353 | 93 | # Reconnect. |
paul@353 | 94 | |
paul@352 | 95 | d = s.connect("localhost") |
paulb@271 | 96 | |
paul@353 | 97 | print "---- Authenticated connection ----" |
paul@353 | 98 | print d.toString(prettyprint=1) |
paul@353 | 99 | |
paul@353 | 100 | print "---- Binding ----" |
paulb@271 | 101 | iq = s.createIq() |
paulb@271 | 102 | iq.makeBind() |
paul@353 | 103 | iq.bind.resource = str(os.getpid()) |
paul@353 | 104 | print iq.toString(prettyprint=1) |
paul@352 | 105 | s.send(iq) |
paul@353 | 106 | |
paul@353 | 107 | print "---- Response ----" |
paul@352 | 108 | d = s.receive() |
paul@353 | 109 | print d.toString(prettyprint=1) |
paulb@271 | 110 | |
paul@353 | 111 | print "---- Session ----" |
paulb@271 | 112 | iq = s.createIq() |
paul@352 | 113 | iq.makeSession("localhost") |
paul@353 | 114 | print iq.toString(prettyprint=1) |
paul@352 | 115 | s.send(iq) |
paul@353 | 116 | |
paul@353 | 117 | print "---- Response ----" |
paul@352 | 118 | d = s.receive() |
paul@353 | 119 | print d.toString(prettyprint=1) |
paul@353 | 120 | |
paul@353 | 121 | # Unregister if requested. |
paulb@271 | 122 | |
paul@353 | 123 | if unregister: |
paul@353 | 124 | print "---- Unregister ----" |
paul@353 | 125 | iq = s.createIq() |
paul@353 | 126 | iq.makeUnregistration() |
paul@353 | 127 | print iq.toString(prettyprint=1) |
paul@353 | 128 | s.send(iq) |
paul@353 | 129 | |
paul@353 | 130 | print "---- Response ----" |
paul@352 | 131 | d = s.receive() |
paul@353 | 132 | print d.toString(prettyprint=1) |
paulb@271 | 133 | |
paul@353 | 134 | s.disconnect() |
paul@353 | 135 | sys.exit(1) |
paul@353 | 136 | |
paul@353 | 137 | # Otherwise, enter chat mode. |
paul@353 | 138 | |
paul@353 | 139 | print "---- Chatting ----" |
paul@353 | 140 | try: |
paulb@291 | 141 | while 1: |
paul@353 | 142 | if not receiving: |
paul@353 | 143 | message = s.createMessage() |
paul@353 | 144 | message.from_ = "%s@%s/sender" % (username, domain) |
paul@353 | 145 | message.to = peer |
paul@353 | 146 | message.type = "chat" |
paul@353 | 147 | message.body = message.createBody() |
paul@353 | 148 | print "Enter message..." |
paul@353 | 149 | message_text = raw_input() |
paul@353 | 150 | text = message.ownerDocument.createTextNode(message_text) |
paul@353 | 151 | message.body.appendChild(text) |
paul@353 | 152 | print "Sending..." |
paul@353 | 153 | print message.toString(prettyprint=1) |
paul@353 | 154 | s.send(message) |
paul@353 | 155 | receiving = 1 |
paul@353 | 156 | |
paul@353 | 157 | if receiving: |
paul@353 | 158 | print "Listening as %s..." % os.getpid() |
paul@353 | 159 | d = s.receive() |
paul@353 | 160 | print d.toString(prettyprint=1) |
paul@353 | 161 | print |
paul@353 | 162 | print "From:", d.from_ |
paul@353 | 163 | print "To:", d.to |
paul@353 | 164 | print "Type:", d.type |
paul@353 | 165 | print |
paul@353 | 166 | if d.localName == "message": |
paul@353 | 167 | print "Message..." |
paul@353 | 168 | if d.type == "chat" and d.body: |
paul@353 | 169 | print d.body.textContent |
paul@353 | 170 | elif d.event: |
paul@353 | 171 | print "Composing?", d.event.composing |
paul@353 | 172 | print "Delivered?", d.event.delivered |
paul@353 | 173 | print "Displayed?", d.event.displayed |
paul@353 | 174 | print "Offline?", d.event.offline |
paul@353 | 175 | print "Id:", d.event.id |
paul@353 | 176 | elif d.localName == "presence": |
paul@353 | 177 | print "Presence..." |
paul@353 | 178 | if d.type == "subscribe": |
paul@353 | 179 | presence = s.createPresence() |
paul@353 | 180 | presence.type = "subscribed" |
paul@353 | 181 | presence.from_ = d.to |
paul@353 | 182 | presence.to = d.from_ |
paul@353 | 183 | print "Sending..." |
paul@353 | 184 | print presence.toString(prettyprint=1) |
paul@353 | 185 | s.send(presence) |
paul@353 | 186 | d = s.receive() |
paul@353 | 187 | print d.toString(prettyprint=1) |
paul@353 | 188 | print |
paul@353 | 189 | receiving = 0 |
paul@353 | 190 | peer = d.from_ |
paul@353 | 191 | |
paul@353 | 192 | finally: |
paul@353 | 193 | s.disconnect() |
paulb@291 | 194 | |
paulb@271 | 195 | # vim: tabstop=4 expandtab shiftwidth=4 |