diff --git a/sippy/Network_server.py b/sippy/Network_server.py index c752cfcf8..9e104f178 100644 --- a/sippy/Network_server.py +++ b/sippy/Network_server.py @@ -31,6 +31,17 @@ from sippy.Core.Exceptions import dump_exception from sippy.Time.MonoTime import MonoTime +class Remote_address(): + address: Tuple[str, int] + received: str + + def __init__(self, address:Tuple[str, int]): + self.address = address + self.received = address[0] + + def __str__(self): + return f'{self.address[0]}:{self.address[1]}' + class Network_server_opts(): laddress: Optional[Tuple[str, int]] = None data_callback: Optional[callable] = None @@ -55,6 +66,9 @@ def getCopy(self) -> 'Network_server_opts': def getSIPaddr(self) -> Tuple[str, int]: return self.laddress + def isWildCard(self) -> bool: + return False + class Network_server(ABC): uopts: Network_server_opts sendqueue: Queue[Tuple[bytes, Tuple[str, int]]] @@ -77,7 +91,7 @@ def send_to(self, data:Union[bytes, str], address:object, delayed:bool = False): return self.sendqueue.put((data, address)) - def handle_read(self, data:bytes, address:object, rtime:MonoTime, delayed:bool = False): + def handle_read(self, data:bytes, address:Remote_address, rtime:MonoTime, delayed:bool = False): if len(data) > 0 and self.uopts.data_callback != None: self.stats[2] += 1 if self.uopts.ploss_in_rate > 0.0 and not delayed: diff --git a/sippy/SipTransactionManager.py b/sippy/SipTransactionManager.py index 64bebe97a..e5e1b09de 100644 --- a/sippy/SipTransactionManager.py +++ b/sippy/SipTransactionManager.py @@ -36,6 +36,7 @@ from sippy.Exceptions.SipParseError import SipParseError, SdpParseError from sippy.Exceptions.RtpProxyError import RtpProxyError from sippy.Udp_server import Udp_server, Udp_server_opts +from sippy.Network_server import Remote_address from datetime import datetime from hashlib import md5 from traceback import print_exc @@ -259,10 +260,10 @@ def __init__(self, global_config, req_cb = None): self.req_consumers = {} Timeout(self.rCachePurge, 32, -1) - def handleIncoming(self, data_in, address, server, rtime): + def handleIncoming(self, data_in, ra:Remote_address, server, rtime): if len(data_in) < 32: return - self.global_config['_sip_logger'].write('RECEIVED message from %s:%d:\n' % address, \ + self.global_config['_sip_logger'].write(f'RECEIVED message from {ra}:\n', \ data_in.decode(errors = 'backslashreplace'), ltime = rtime.realt) data = data_in.decode() checksum = md5(data_in).digest() @@ -280,11 +281,11 @@ def handleIncoming(self, data_in, address, server, rtime): 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) + dump_exception(f'can\'t parse SIP response from {ra}', 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(datetime.now(), f'invalid status code in SIP response from {ra}:') print(data) sys.stdout.flush() self.l1rcache[checksum] = SipTMRetransmitO() @@ -300,8 +301,8 @@ def handleIncoming(self, data_in, address, server, rtime): if not cbody.asterisk: curl = cbody.getUrl() if check1918(curl.host): - curl.host, curl.port = address - resp.setSource(address) + curl.host, curl.port = ra.address + resp.setSource(ra.address) self.incomingResponse(resp, t, checksum) else: try: @@ -311,33 +312,33 @@ def handleIncoming(self, data_in, address, server, rtime): if isinstance(exception, SipParseError): resp = exception.getResponse() if resp is not None: - self.transmitMsg(server, resp, address, checksum) - dump_exception('can\'t parse SIP request from %s:%d' % (address[0], address[1]), extra = data) + self.transmitMsg(server, resp, ra.address, checksum) + dump_exception(f'can\'t parse SIP request from {ra}', extra = data) self.l1rcache[checksum] = SipTMRetransmitO() return req.rtime = rtime via0 = req.getHFBody('via') ahost, aport = via0.getAddr() - rhost, rport = address + rhost, rport = ra.address if self.nat_traversal and rport != aport and (check1918(ahost) or check7118(ahost)): req.nated = True if ahost != rhost: - via0.params['received'] = rhost + via0.params['received'] = ra.received 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) + dump_exception(f'can\'t parse SIP request from {ra}', 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 + curl.host, curl.port = ra.address req.nated = True - req.setSource(address) + req.setSource(ra.address) try: self.incomingRequest(req, checksum, tids, server) except RtpProxyError as ex: diff --git a/sippy/Udp_server.py b/sippy/Udp_server.py index e8c7e98f0..8516d289b 100755 --- a/sippy/Udp_server.py +++ b/sippy/Udp_server.py @@ -41,7 +41,7 @@ class BrokenPipeError(Exception): from sippy.Core.EventDispatcher import ED2 from sippy.Core.Exceptions import dump_exception -from sippy.Network_server import Network_server_opts, Network_server +from sippy.Network_server import Network_server_opts, Network_server, Remote_address from sippy.Time.Timeout import Timeout from sippy.Time.MonoTime import MonoTime from sippy.SipConf import MyPort @@ -121,6 +121,7 @@ def run(self): continue if self.userv.uopts.family == socket.AF_INET6: address = ('[%s]' % address[0], address[1]) + address = Remote_address(address) if not self.userv.uopts.direct_dispatch: ED2.callFromThread(self.userv.handle_read, data, address, rtime) else: @@ -246,30 +247,30 @@ class self_test(object): pong_raddr = None pong_raddr6 = None - def ping_received(self, data, address, udp_server, rtime): + def ping_received(self, data, ra, udp_server, rtime): if udp_server.uopts.family == socket.AF_INET: print('ping_received') - if data != self.ping_data or address != self.pong_raddr: - print(data, address, self.ping_data, self.pong_raddr) + if data != self.ping_data or ra.address != self.pong_raddr: + print(data, ra.address, self.ping_data, self.pong_raddr) exit(1) - udp_server.send_to(self.pong_data, address) + udp_server.send_to(self.pong_data, ra.address) else: print('ping_received6') - if data != self.ping_data6 or address != self.pong_raddr6: - print(data, address, self.ping_data6, self.pong_raddr6) + if data != self.ping_data6 or ra.address != self.pong_raddr6: + print(data, ra.address, self.ping_data6, self.pong_raddr6) exit(1) - udp_server.send_to(self.pong_data6, address) + udp_server.send_to(self.pong_data6, ra.address) - def pong_received(self, data, address, udp_server, rtime): + def pong_received(self, data, ra, udp_server, rtime): if udp_server.uopts.family == socket.AF_INET: print('pong_received') - if data != self.pong_data or address != self.ping_raddr: - print(data, address, self.pong_data, self.ping_raddr) + if data != self.pong_data or ra.address != self.ping_raddr: + print(data, ra.address, self.pong_data, self.ping_raddr) exit(1) else: print('pong_received6') - if data != self.pong_data6 or address != self.ping_raddr6: - print(data, address, self.pong_data6, self.ping_raddr6) + if data != self.pong_data6 or ra.address != self.ping_raddr6: + print(data, ra.address, self.pong_data6, self.ping_raddr6) exit(1) self.npongs -= 1 if self.npongs == 0: