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)
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)