From 81b3cfcba23af0cf8dd2c56558eb4663bc4eb96d Mon Sep 17 00:00:00 2001 From: nickvsnetworking Date: Sat, 4 May 2024 13:17:28 +0200 Subject: [PATCH 1/6] Possible fix for 306 reply where request has Username set --- lib/diameter.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/diameter.py b/lib/diameter.py index 3af84ce5..52515ba7 100755 --- a/lib/diameter.py +++ b/lib/diameter.py @@ -2751,17 +2751,20 @@ def Answer_16777217_306(self, packet_vars, avps): self.logTool.log(service='HSS', level='debug', message="Got raw MSISDN with value " + str(msisdn), redisClient=self.redisMessaging) msisdn = self.TBCD_decode(msisdn) self.logTool.log(service='HSS', level='debug', message="Got MSISDN with value " + str(msisdn), redisClient=self.redisMessaging) + subscriber_ims_details = self.database.Get_IMS_Subscriber(msisdn=msisdn) except: self.logTool.log(service='HSS', level='debug', message="No MSISDN", redisClient=self.redisMessaging) + try: username = self.get_avp_data(avps, 601)[0] + self.logTool.log(service='HSS', level='debug', message="Getting subscriber IMS info based on IMSI", redisClient=self.redisMessaging) + subscriber_ims_details = self.database.Get_IMS_Subscriber(imsi=imsi) except Exception as e: self.logTool.log(service='HSS', level='debug', message="No Username", redisClient=self.redisMessaging) - if msisdn is not None: - self.logTool.log(service='HSS', level='debug', message="Getting subscriber IMS info based on MSISDN", redisClient=self.redisMessaging) + if subscriber_ims_details is not None: + self.logTool.log(service='HSS', level='debug', message="Processing subscriber_ims_details from DB", redisClient=self.redisMessaging) try: - subscriber_ims_details = self.database.Get_IMS_Subscriber(msisdn=msisdn) self.logTool.log(service='HSS', level='debug', message="Got subscriber IMS details: " + str(subscriber_ims_details), redisClient=self.redisMessaging) self.logTool.log(service='HSS', level='debug', message="Getting subscriber info based on MSISDN", redisClient=self.redisMessaging) subscriber_details = self.database.Get_Subscriber(msisdn=msisdn) @@ -2796,10 +2799,7 @@ def Answer_16777217_306(self, packet_vars, avps): "event": "Unknown User", "imsi_prefix": str(username[0:6])}, metricHelp='Diameter Authentication related Counters', - metricExpiry=60, - usePrefix=True, - prefixHostname=self.hostname, - prefixServiceName='metric') + metricExpiry=60) result_code = 5001 #Experimental Result AVP avp_experimental_result = '' From c1bd0fb502e1ac50e2b0ac95057b23d28e33b140 Mon Sep 17 00:00:00 2001 From: nickvsnetworking Date: Sat, 4 May 2024 14:55:03 +0200 Subject: [PATCH 2/6] More logging --- lib/diameter.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/diameter.py b/lib/diameter.py index 52515ba7..137b6dd1 100755 --- a/lib/diameter.py +++ b/lib/diameter.py @@ -2747,15 +2747,16 @@ def Answer_16777217_306(self, packet_vars, avps): username = None try: user_identity_avp = self.get_avp_data(avps, 700)[0] - msisdn = self.get_avp_data(user_identity_avp, 701)[0] #Get MSISDN from AVP in request - self.logTool.log(service='HSS', level='debug', message="Got raw MSISDN with value " + str(msisdn), redisClient=self.redisMessaging) + msisdn = self.get_avp_data(user_identity_avp, 701)[0] #Get MSISDN from AVP in request + self.logTool.log(service='HSS', level='debug', message="Got raw MSISDN with value " + str(msisdn) + " from Sh-User-Data Request", redisClient=self.redisMessaging) msisdn = self.TBCD_decode(msisdn) self.logTool.log(service='HSS', level='debug', message="Got MSISDN with value " + str(msisdn), redisClient=self.redisMessaging) subscriber_ims_details = self.database.Get_IMS_Subscriber(msisdn=msisdn) except: - self.logTool.log(service='HSS', level='debug', message="No MSISDN", redisClient=self.redisMessaging) + self.logTool.log(service='HSS', level='debug', message="No MSISDN present in Sh-User-Data Request", redisClient=self.redisMessaging) try: + user_identity_avp = self.get_avp_data(avps, 700)[0] username = self.get_avp_data(avps, 601)[0] self.logTool.log(service='HSS', level='debug', message="Getting subscriber IMS info based on IMSI", redisClient=self.redisMessaging) subscriber_ims_details = self.database.Get_IMS_Subscriber(imsi=imsi) From a3ef9f3a0929a1880a19c00ffb93f750a4555363 Mon Sep 17 00:00:00 2001 From: nickvsnetworking Date: Sat, 4 May 2024 15:17:50 +0200 Subject: [PATCH 3/6] More debugging --- lib/diameter.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/diameter.py b/lib/diameter.py index 137b6dd1..ed389065 100755 --- a/lib/diameter.py +++ b/lib/diameter.py @@ -2745,6 +2745,9 @@ def Answer_16777217_306(self, packet_vars, avps): imsi = None scscf = None username = None + + self.logTool.log(service='HSS', level='debug', message="Got raw MSISDN with value " + str(msisdn) + " from Sh-User-Data Request with AVPs " + str(avps), redisClient=self.redisMessaging) + try: user_identity_avp = self.get_avp_data(avps, 700)[0] msisdn = self.get_avp_data(user_identity_avp, 701)[0] #Get MSISDN from AVP in request @@ -2757,8 +2760,9 @@ def Answer_16777217_306(self, packet_vars, avps): try: user_identity_avp = self.get_avp_data(avps, 700)[0] + self.logTool.log(service='HSS', level='debug', message="Getting subscriber IMS info based on user_identity " + str(user_identity_avp), redisClient=self.redisMessaging) username = self.get_avp_data(avps, 601)[0] - self.logTool.log(service='HSS', level='debug', message="Getting subscriber IMS info based on IMSI", redisClient=self.redisMessaging) + self.logTool.log(service='HSS', level='debug', message="Getting subscriber IMS info based on IMSI " + str(username), redisClient=self.redisMessaging) subscriber_ims_details = self.database.Get_IMS_Subscriber(imsi=imsi) except Exception as e: self.logTool.log(service='HSS', level='debug', message="No Username", redisClient=self.redisMessaging) From 53e86353e3e5163dcf47db85cd3581399f07bd0e Mon Sep 17 00:00:00 2001 From: nickvsnetworking Date: Sat, 4 May 2024 15:36:52 +0200 Subject: [PATCH 4/6] Stupid fix --- lib/diameter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/diameter.py b/lib/diameter.py index ed389065..cef535a8 100755 --- a/lib/diameter.py +++ b/lib/diameter.py @@ -2761,7 +2761,8 @@ def Answer_16777217_306(self, packet_vars, avps): try: user_identity_avp = self.get_avp_data(avps, 700)[0] self.logTool.log(service='HSS', level='debug', message="Getting subscriber IMS info based on user_identity " + str(user_identity_avp), redisClient=self.redisMessaging) - username = self.get_avp_data(avps, 601)[0] + imsi = self.get_avp_data(avps, 601)[0] + imsi = binascii.unhexlify(imsi).decode('utf-8') self.logTool.log(service='HSS', level='debug', message="Getting subscriber IMS info based on IMSI " + str(username), redisClient=self.redisMessaging) subscriber_ims_details = self.database.Get_IMS_Subscriber(imsi=imsi) except Exception as e: From 9a5ccb6d0979fd1bb5fe73455ff32a612f28fb00 Mon Sep 17 00:00:00 2001 From: nickvsnetworking Date: Sat, 4 May 2024 15:53:19 +0200 Subject: [PATCH 5/6] Simplify logic --- lib/diameter.py | 59 ++++++++++++++++++------------------------------- 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/lib/diameter.py b/lib/diameter.py index cef535a8..4d1df2da 100755 --- a/lib/diameter.py +++ b/lib/diameter.py @@ -2755,6 +2755,7 @@ def Answer_16777217_306(self, packet_vars, avps): msisdn = self.TBCD_decode(msisdn) self.logTool.log(service='HSS', level='debug', message="Got MSISDN with value " + str(msisdn), redisClient=self.redisMessaging) subscriber_ims_details = self.database.Get_IMS_Subscriber(msisdn=msisdn) + self.logTool.log(service='HSS', level='debug', message="subscriber_ims_details " + str(subscriber_ims_details), redisClient=self.redisMessaging) except: self.logTool.log(service='HSS', level='debug', message="No MSISDN present in Sh-User-Data Request", redisClient=self.redisMessaging) @@ -2765,47 +2766,27 @@ def Answer_16777217_306(self, packet_vars, avps): imsi = binascii.unhexlify(imsi).decode('utf-8') self.logTool.log(service='HSS', level='debug', message="Getting subscriber IMS info based on IMSI " + str(username), redisClient=self.redisMessaging) subscriber_ims_details = self.database.Get_IMS_Subscriber(imsi=imsi) + self.logTool.log(service='HSS', level='debug', message="subscriber_ims_details " + str(subscriber_ims_details), redisClient=self.redisMessaging) except Exception as e: self.logTool.log(service='HSS', level='debug', message="No Username", redisClient=self.redisMessaging) - if subscriber_ims_details is not None: - self.logTool.log(service='HSS', level='debug', message="Processing subscriber_ims_details from DB", redisClient=self.redisMessaging) - try: - self.logTool.log(service='HSS', level='debug', message="Got subscriber IMS details: " + str(subscriber_ims_details), redisClient=self.redisMessaging) - self.logTool.log(service='HSS', level='debug', message="Getting subscriber info based on MSISDN", redisClient=self.redisMessaging) - subscriber_details = self.database.Get_Subscriber(msisdn=msisdn) - imsi = subscriber_details.get('imsi', None) - scscf = subscriber_ims_details.get('scscf', None) - if scscf is not None: - imsUserState = 1 - else: - imsUserState = 0 - self.logTool.log(service='HSS', level='debug', message="Got subscriber details: " + str(subscriber_details), redisClient=self.redisMessaging) - subscriber_details = {**subscriber_details, **subscriber_ims_details, 'imsUserState': imsUserState} - self.logTool.log(service='HSS', level='debug', message="Merged subscriber details: " + str(subscriber_details), redisClient=self.redisMessaging) - except Exception as e: - self.logTool.log(service='HSS', level='debug', message=f"No subscriber found for MSISDN {msisdn}", redisClient=self.redisMessaging) - result_code = 5001 - #Experimental Result AVP - avp_experimental_result = '' - avp_experimental_result += self.generate_vendor_avp(266, 40, 10415, '') #AVP Vendor ID - avp_experimental_result += self.generate_avp(298, 40, self.int_to_hex(result_code, 4)) #AVP Experimental-Result-Code - avp += self.generate_avp(297, 40, avp_experimental_result) #AVP Experimental-Result(297) - response = self.generate_diameter_packet("01", "40", 306, 16777217, packet_vars['hop-by-hop-identifier'], packet_vars['end-to-end-identifier'], avp) #Generate Diameter packet - return response - else: - self.logTool.log(service='HSS', level='error', message="No MSISDN or IMSI in Sh User-Data-Answer input", redisClient=self.redisMessaging) - if username is not None: - self.redisMessaging.sendMetric(serviceName='diameter', metricName='prom_diam_auth_event_count', - metricType='counter', metricAction='inc', - metricValue=1.0, - metricLabels={ - "diameter_application_id": 16777216, - "diameter_cmd_code": 306, - "event": "Unknown User", - "imsi_prefix": str(username[0:6])}, - metricHelp='Diameter Authentication related Counters', - metricExpiry=60) + try: + subscriber_ims_details + self.logTool.log(service='HSS', level='debug', message="Processing subscriber_ims_details from DB", redisClient=self.redisMessaging) + self.logTool.log(service='HSS', level='debug', message="Got subscriber IMS details: " + str(subscriber_ims_details), redisClient=self.redisMessaging) + self.logTool.log(service='HSS', level='debug', message="Getting subscriber info based on MSISDN", redisClient=self.redisMessaging) + subscriber_details = self.database.Get_Subscriber(msisdn=msisdn) + imsi = subscriber_details.get('imsi', None) + scscf = subscriber_ims_details.get('scscf', None) + if scscf is not None: + imsUserState = 1 + else: + imsUserState = 0 + self.logTool.log(service='HSS', level='debug', message="Got subscriber details: " + str(subscriber_details), redisClient=self.redisMessaging) + subscriber_details = {**subscriber_details, **subscriber_ims_details, 'imsUserState': imsUserState} + self.logTool.log(service='HSS', level='debug', message="Merged subscriber details: " + str(subscriber_details), redisClient=self.redisMessaging) + except Exception as e: + self.logTool.log(service='HSS', level='debug', message=f"No subscriber found for MSISDN {msisdn}", redisClient=self.redisMessaging) result_code = 5001 #Experimental Result AVP avp_experimental_result = '' @@ -2815,6 +2796,8 @@ def Answer_16777217_306(self, packet_vars, avps): response = self.generate_diameter_packet("01", "40", 306, 16777217, packet_vars['hop-by-hop-identifier'], packet_vars['end-to-end-identifier'], avp) #Generate Diameter packet return response + #We only get here if our data back from the DB is good + session_id = self.get_avp_data(avps, 263)[0] #Get Session-ID avp += self.generate_avp(263, 40, session_id) #Set session ID to received session ID avp += self.generate_avp(264, 40, self.OriginHost) #Origin Host From 0b88d52cd6101d1d236571d18973b12d4c5b9668 Mon Sep 17 00:00:00 2001 From: nickvsnetworking Date: Sat, 4 May 2024 16:09:21 +0200 Subject: [PATCH 6/6] Stupid fixes --- lib/diameter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/diameter.py b/lib/diameter.py index 4d1df2da..29304807 100755 --- a/lib/diameter.py +++ b/lib/diameter.py @@ -2775,6 +2775,7 @@ def Answer_16777217_306(self, packet_vars, avps): self.logTool.log(service='HSS', level='debug', message="Processing subscriber_ims_details from DB", redisClient=self.redisMessaging) self.logTool.log(service='HSS', level='debug', message="Got subscriber IMS details: " + str(subscriber_ims_details), redisClient=self.redisMessaging) self.logTool.log(service='HSS', level='debug', message="Getting subscriber info based on MSISDN", redisClient=self.redisMessaging) + msisdn = subscriber_ims_details['msisdn'] subscriber_details = self.database.Get_Subscriber(msisdn=msisdn) imsi = subscriber_details.get('imsi', None) scscf = subscriber_ims_details.get('scscf', None)