Example #1
0
 def handleIncoming(self, data_in, address, server, rtime):
     if len(data_in) < 32:
         return
     data = data_in.decode()
     self.global_config['_sip_logger'].write(
         'RECEIVED message from %s:%d:\n' % address,
         data,
         ltime=rtime.realt)
     checksum = md5(data_in).digest()
     retrans = self.l1rcache.get(checksum, None)
     if retrans == None:
         retrans = self.l2rcache.get(checksum, None)
     if retrans != None:
         if retrans.data == None:
             return
         self.transmitData(retrans.userv, retrans.data, retrans.address, \
           lossemul = retrans.lossemul)
         return
     if data.startswith('SIP/2.0 '):
         try:
             resp = SipResponse(data)
             tid = resp.getTId(True, True)
         except Exception as exception:
             dump_exception('can\'t parse SIP response from %s:%d' %
                            (address[0], address[1]),
                            extra=data)
             self.l1rcache[checksum] = SipTMRetransmitO()
             return
         if resp.getSCode()[0] < 100 or resp.getSCode()[0] > 999:
             print(
                 datetime.now(),
                 'invalid status code in SIP response from %s:%d:' %
                 address)
             print(data)
             sys.stdout.flush()
             self.l1rcache[checksum] = SipTMRetransmitO()
             return
         resp.rtime = rtime
         if not tid in self.tclient:
             #print 'no transaction with tid of %s in progress' % str(tid)
             self.l1rcache[checksum] = SipTMRetransmitO()
             return
         t = self.tclient[tid]
         if self.nat_traversal and resp.countHFs(
                 'contact') > 0 and not check1918(t.address[0]):
             cbody = resp.getHFBody('contact')
             if not cbody.asterisk:
                 curl = cbody.getUrl()
                 if check1918(curl.host):
                     curl.host, curl.port = address
         resp.setSource(address)
         self.incomingResponse(resp, t, checksum)
     else:
         try:
             req = SipRequest(data)
             tids = req.getTIds()
         except Exception as exception:
             if isinstance(
                     exception,
                     ESipParseException) and exception.sip_response != None:
                 self.transmitMsg(server, exception.sip_response, address,
                                  checksum)
             dump_exception('can\'t parse SIP request from %s:%d' %
                            (address[0], address[1]),
                            extra=data)
             self.l1rcache[checksum] = SipTMRetransmitO()
             return
         req.rtime = rtime
         via0 = req.getHFBody('via')
         ahost, aport = via0.getAddr()
         rhost, rport = address
         if self.nat_traversal and rport != aport and check1918(ahost):
             req.nated = True
         if ahost != rhost:
             via0.params['received'] = rhost
         if 'rport' in via0.params or req.nated:
             via0.params['rport'] = str(rport)
         if self.nat_traversal and req.countHFs(
                 'contact') > 0 and req.countHFs('via') == 1:
             try:
                 cbody = req.getHFBody('contact')
             except Exception as exception:
                 dump_exception('can\'t parse SIP request from %s:%d: %s:' %
                                (address[0], address[1]),
                                extra=data)
                 self.l1rcache[checksum] = SipTMRetransmitO()
                 return
             if not cbody.asterisk:
                 curl = cbody.getUrl()
                 if check1918(
                         curl.host
                 ) or curl.port == 0 or curl.host == '255.255.255.255':
                     curl.host, curl.port = address
                     req.nated = True
         req.setSource(address)
         self.incomingRequest(req, checksum, tids, server)
Example #2
0
 def handleIncoming(self, data_in, address, server, rtime):
     if len(data_in) < 32:
         return
     data = data_in.decode()
     self.global_config['_sip_logger'].write('RECEIVED message from %s:%d:\n' % address, data, ltime = rtime.realt)
     checksum = md5(data_in).digest()
     retrans = self.l1rcache.get(checksum, None)
     if retrans == None:
         retrans = self.l2rcache.get(checksum, None)
     if retrans != None:
         if retrans.data == None:
             return
         self.transmitData(retrans.userv, retrans.data, retrans.address, \
           lossemul = retrans.lossemul)
         return
     if data.startswith('SIP/2.0 '):
         try:
             resp = SipResponse(data)
             tid = resp.getTId(True, True)
         except Exception as exception:
             dump_exception('can\'t parse SIP response from %s:%d' % (address[0], address[1]), extra = data)
             self.l1rcache[checksum] = SipTMRetransmitO()
             return
         if resp.getSCode()[0] < 100 or resp.getSCode()[0] > 999:
             print(datetime.now(), 'invalid status code in SIP response from %s:%d:' % address)
             print(data)
             sys.stdout.flush()
             self.l1rcache[checksum] = SipTMRetransmitO()
             return
         resp.rtime = rtime
         if not tid in self.tclient:
             #print 'no transaction with tid of %s in progress' % str(tid)
             self.l1rcache[checksum] = SipTMRetransmitO()
             return
         t = self.tclient[tid]
         if self.nat_traversal and resp.countHFs('contact') > 0 and not check1918(t.address[0]):
             cbody = resp.getHFBody('contact')
             if not cbody.asterisk:
                 curl = cbody.getUrl()
                 if check1918(curl.host):
                     curl.host, curl.port = address
         resp.setSource(address)
         self.incomingResponse(resp, t, checksum)
     else:
         try:
             req = SipRequest(data)
             tids = req.getTIds()
         except Exception as exception:
             if isinstance(exception, ESipParseException) and exception.sip_response != None:
                 self.transmitMsg(server, exception.sip_response, address, checksum)
             dump_exception('can\'t parse SIP request from %s:%d' % (address[0], address[1]), extra = data)
             self.l1rcache[checksum] = SipTMRetransmitO()
             return
         req.rtime = rtime
         via0 = req.getHFBody('via')
         ahost, aport = via0.getAddr()
         rhost, rport = address
         if self.nat_traversal and rport != aport and check1918(ahost):
             req.nated = True
         if ahost != rhost:
             via0.params['received'] = rhost
         if 'rport' in via0.params or req.nated:
             via0.params['rport'] = str(rport)
         if self.nat_traversal and req.countHFs('contact') > 0 and req.countHFs('via') == 1:
             try:
                 cbody = req.getHFBody('contact')
             except Exception as exception:
                 dump_exception('can\'t parse SIP request from %s:%d: %s:' % (address[0], address[1]), extra = data)
                 self.l1rcache[checksum] = SipTMRetransmitO()
                 return
             if not cbody.asterisk:
                 curl = cbody.getUrl()
                 if check1918(curl.host) or curl.port == 0 or curl.host == '255.255.255.255':
                     curl.host, curl.port = address
                     req.nated = True
         req.setSource(address)
         self.incomingRequest(req, checksum, tids, server)