def test_amoralRPort(self): """ rport is allowed without a value, apparently because server implementors might be too stupid to check the received port against 5060 and see if they're equal, and because client implementors might be too stupid to bind to port 5060, or set a value on the rport parameter they send if they bind to another port. """ p = self.clientPort.getHost().port r = sip.Request("REGISTER", "sip:bell.example.com") r.addHeader("to", "sip:[email protected]") r.addHeader("contact", "sip:[email protected]:%d" % p) r.addHeader("via", sip.Via("127.0.0.1", port=p, rport=True).toString()) warnings = self.flushWarnings( offendingFunctions=[self.test_amoralRPort]) self.assertEqual(len(warnings), 1) self.assertEqual(warnings[0]['message'], 'rport=True is deprecated since Twisted 9.0.') self.assertEqual(warnings[0]['category'], DeprecationWarning) self.client.sendMessage( sip.URL(host="127.0.0.1", port=self.serverAddress[1]), r) d = self.client.deferred def check(received): self.assertEqual(len(received), 1) r = received[0] self.assertEqual(r.code, 200) d.addCallback(check) return d
def deliverResponse(self, responseMessage): """Deliver response. Destination is based on topmost Via header.""" destVia = sip.parseViaHeader(responseMessage.headers["via"][0]) # XXX we don't do multicast yet host = destVia.received or destVia.host port = destVia.rport or destVia.port or self.PORT destAddr = sip.URL(host=host, port=port) print str(datetime.now()), responseMessage.toString() self.sendMessage(destAddr, responseMessage)
def testRegister(self): p = self.clientPort.getHost().port r = sip.Request("REGISTER", "sip:bell.example.com") r.addHeader("to", "sip:[email protected]") r.addHeader("contact", "sip:[email protected]:%d" % p) r.addHeader("via", sip.Via("127.0.0.1", port=p).toString()) self.client.sendMessage( sip.URL(host="127.0.0.1", port=self.serverAddress[1]), r) spinUntil(lambda: len(self.client.received)) self.assertEquals(len(self.client.received), 1) r = self.client.received[0] self.assertEquals(r.code, 200)
def testRegister(self): p = self.clientPort.getHost().port r = sip.Request("REGISTER", "sip:bell.example.com") r.addHeader("to", "sip:[email protected]") r.addHeader("contact", "sip:[email protected]:%d" % p) r.addHeader("via", sip.Via("127.0.0.1", port=p).toString()) self.client.sendMessage( sip.URL(host="127.0.0.1", port=self.serverAddress[1]), r) d = self.client.deferred def check(received): self.assertEqual(len(received), 1) r = received[0] self.assertEqual(r.code, 200) d.addCallback(check) return d
def testRegister(self): self.register() dest, m = self.sent[0] self.assertEquals((dest.host, dest.port), ("client.com", 5060)) self.assertEquals(m.code, 200) self.assertEquals(m.headers["via"], ["SIP/2.0/UDP client.com:5060"]) self.assertEquals(m.headers["to"], ["sip:[email protected]"]) self.assertEquals(m.headers["contact"], ["sip:[email protected]:5060"]) self.failUnless(int(m.headers["expires"][0]) in (3600, 3601, 3599, 3598)) self.assertEquals(len(self.registry.users), 1) dc, uri = self.registry.users["joe"] self.assertEquals(uri.toString(), "sip:[email protected]:5060") d = self.proxy.locator.getAddress(sip.URL(username="******", host="bell.example.com")) d.addCallback(lambda desturl : (desturl.host, desturl.port)) d.addCallback(self.assertEquals, ('client.com', 5060)) return d
def handle_response(self, rsp, addr): print "Received SIP response from %s:%d:" % addr print rsp.toString() # Strip the top via rsp.headers["via"].pop(0) # Determine the next hop from the next via via = sip.parseViaHeader(rsp.headers["via"][0]) # rport handling is a bit mysterious - rport should be filled # in by Twisted, but apparently it's not. This seems to work # for now, though, presumably by defaulting to port 5060. uri = sip.URL(host=via.received or via.host, port=via.rportValue if via.rportRequested else self.PORT) print "Sending SIP response to %s:" % uri print rsp.toString() print "===============================================================================" # Send the message on self.sendMessage(uri, rsp)
def testAmoralRPort(self): # rport is allowed without a value, apparently because server # implementors might be too stupid to check the received port # against 5060 and see if they're equal, and because client # implementors might be too stupid to bind to port 5060, or set a # value on the rport parameter they send if they bind to another # port. p = self.clientPort.getHost().port r = sip.Request("REGISTER", "sip:bell.example.com") r.addHeader("to", "sip:[email protected]") r.addHeader("contact", "sip:[email protected]:%d" % p) r.addHeader("via", sip.Via("127.0.0.1", port=p, rport=True).toString()) self.client.sendMessage( sip.URL(host="127.0.0.1", port=self.serverAddress[1]), r) spinUntil(lambda: len(self.client.received)) self.assertEquals(len(self.client.received), 1) r = self.client.received[0] self.assertEquals(r.code, 200)
def startProtocol(self): """On startup, send a REGISTER message to sipauthserve. Explicitly use less fields than OpenBTS: want to enforce the right to: field. """ r = Request("REGISTER", "sip:%s@%s:%s" % (self.user, self.other_ip, SIP_REG_PORT)) r.addHeader( "Via", "SIP/2.0/UDP %s:%s;branch=%s;received=%s;rport=%s" % (self.self_ip, self.port, genTag(22), self.self_ip, self.port)) r.addHeader( "From", "<sip:%s@%s:%s>;tag=%s" % (self.user, self.self_ip, self.port, genTag(13))) r.addHeader("To", "<sip:%s@%s:%s>" % (self.user, self.other_ip, self.port)) r.addHeader("Contact", "<sip:%s:%s>" % (self.self_ip, self.port)) r.addHeader("User-Agent", "Endaga-test") self.sendMessage(sip.URL(host=self.other_ip, port=SIP_REG_PORT), r)
def sendSMS(self, dest, content): content = sms_utilities.SMS_Submit.gen_msg(str(dest), content, False) r = Request("MESSAGE", "sip:smsc@%s:%s" % (self.other_ip, SIP_PORT)) r.addHeader( "Via", "SIP/2.0/UDP %s:%s;branch=%s;received=%s;rport=%s" % (self.self_ip, self.port, genTag(22), self.self_ip, self.port)) r.addHeader("Max-Forwards", "70") r.addHeader( "From", "<sip:%s@%s:%s>;tag=%s" % (self.user, self.self_ip, self.port, genTag(13))) r.addHeader("To", "<sip:smsc@%s:%s>" % (self.other_ip, self.port)) r.addHeader("Call-ID", genCallId()) r.addHeader("CSeq", "1 MESSAGE") r.addHeader("Contact", "<sip:%s:%s>" % (self.self_ip, SIP_PORT)) r.addHeader("User-Agent", "Endaga-test") r.addHeader("Content-Type", "application/vnd.3gpp.sms") r.addHeader("Content-Length", str(len(content))) r.body = content self.sendMessage(sip.URL(host=self.other_ip, port=SIP_PORT), r)
def testRegister(self): self.register() dest, m = self.sent[0] self.assertEqual((dest.host, dest.port), ("client.com", 5060)) self.assertEqual(m.code, 200) self.assertEqual(m.headers["via"], ["SIP/2.0/UDP client.com:5060"]) self.assertEqual(m.headers["to"], ["sip:[email protected]"]) self.assertEqual(m.headers["contact"], ["sip:[email protected]:5060"]) # # XX: See http://tm.tl/8886 # if type(reactor) != AsyncioSelectorReactor: self.assertTrue( int(m.headers["expires"][0]) in (3600, 3601, 3599, 3598)) self.assertEqual(len(self.registry.users), 1) dc, uri = self.registry.users["joe"] self.assertEqual(uri.toString(), "sip:[email protected]:5060") d = self.proxy.locator.getAddress( sip.URL(username="******", host="bell.example.com")) d.addCallback(lambda desturl: (desturl.host, desturl.port)) d.addCallback(self.assertEqual, ('client.com', 5060)) return d
def handle_request(self, req, addr): print "Received SIP request from %s:%d:" % addr print req.toString() # Add a via header for us via = self.getVia() if not via.branch: # Twisted SIP is still not compliant with RFC3261 s16.11. # Work around this, assuming our caller *is* compliant. topVia = sip.parseViaHeader(req.headers["via"][0]) via.branch = topVia.branch + "-AS-059" # chosen by fair random.org. guaranteed to be random. req.headers["via"].insert(0, via.toString()) # Determine the next hop - use the route headers if present, else the request URI uri = req.uri if "route" in req.headers: # If we're the first route header, strip it _, route, _ = sip.parseAddress(req.headers["route"][0]) if route.host == self.host: req.headers["route"].pop(0) # Now find the next hop if len(req.headers["route"]) > 0: _, uri, _ = sip.parseAddress(req.headers["route"][0]) # Insert a record-route header to keep us in the path req.headers.setdefault("record-route", []).insert( 0, sip.URL(host=self.host, port=self.port, other=["transport=UDP", "lr"])) # Assert that we're authorized. Workaround pending sto131 completion. if "authorization" not in req.headers: req.addHeader( "authorization", 'Digest username="******", realm="cw-ngv.com", nonce="0000000000000000", uri="sip:cw-ngv.com", response="00000000000000000000000000000000", algorithm=md5, opaque="0000000000000000",integrity-protected="yes"' ) print "Sending SIP request to %s:" % uri print req.toString() print "===============================================================================" # Send the message on self.sendMessage(uri, req)
def testNoContactLookup(self): self.register() url = sip.URL(username="******", host="bell.example.com") d = self.proxy.locator.getAddress(url) self.assertFailure(d, LookupError) return d
def testWrongDomainLookup(self): self.register() url = sip.URL(username="******", host="foo.com") d = self.proxy.locator.getAddress(url) self.assertFailure(d, LookupError) return d
def getAddress(self, logicalURL): return defer.succeed(sip.URL("server.com", port=5060))