nopasaran 0.2.91__py3-none-any.whl → 0.2.93__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,6 @@ import random
3
3
  import string
4
4
  import logging
5
5
  from nopasaran.decorators import parsing_decorator
6
- from scapy.layers.dns import dnsqtypes
7
6
 
8
7
 
9
8
  class DNSPrimitives:
@@ -837,15 +836,10 @@ class DNSPrimitives:
837
836
  48: "DNSKEY", 255: "ANY"
838
837
  }
839
838
 
840
- dnsqtypes = dnsatypes # if you meant dnsatypes to cover both
841
-
842
839
  dns_layer = None
843
840
 
844
- # Try to get DNS layer from packet
845
841
  if hasattr(packet, 'haslayer') and packet.haslayer(DNS):
846
842
  dns_layer = packet.getlayer(DNS)
847
-
848
- # Try to parse DNS from Raw if not directly available
849
843
  elif hasattr(packet, 'haslayer') and packet.haslayer('Raw'):
850
844
  try:
851
845
  dns_layer = DNS(packet['Raw'].load)
@@ -869,33 +863,36 @@ class DNSPrimitives:
869
863
  "answers": []
870
864
  }
871
865
 
872
- # Handle DNS question
866
+ # Handle DNS questions
873
867
  if getattr(dns_layer, "qdcount", 0) > 0 and getattr(dns_layer, "qd", None):
874
868
  try:
875
869
  question = dns_layer.qd
876
870
  formatted_response["questions"].append({
877
871
  "qname": question.qname.decode() if isinstance(question.qname, bytes) else question.qname,
878
872
  "qtype": question.qtype,
879
- "qtype_name": dnsqtypes.get(question.qtype, f"Unknown({question.qtype})"),
873
+ "qtype_name": dnsatypes.get(question.qtype, f"Unknown({question.qtype})"),
880
874
  "qclass": question.qclass
881
875
  })
882
876
  except Exception as e:
883
877
  logging.error(f"[Parsing] Failed to parse DNS question: {e}")
884
878
 
885
- # Handle DNS answers
879
+ # Handle DNS answers (support for lists and chained payloads)
886
880
  try:
887
- ans = dns_layer.an if getattr(dns_layer, "ancount", 0) > 0 else None
888
- while ans and isinstance(ans, DNSRR):
881
+ ans = dns_layer.an
882
+ for _ in range(getattr(dns_layer, "ancount", 0)):
883
+ if not isinstance(ans, DNSRR):
884
+ break
889
885
  answer_info = {
890
886
  "rrname": ans.rrname.decode() if isinstance(ans.rrname, bytes) else ans.rrname,
891
887
  "type": ans.type,
892
888
  "type_name": dnsatypes.get(ans.type, f"Unknown({ans.type})"),
893
889
  "rclass": ans.rclass,
894
890
  "ttl": ans.ttl,
895
- "rdata": str(ans.rdata),
891
+ "rdata": ans.rdata.decode() if isinstance(ans.rdata, bytes) else str(ans.rdata),
892
+ "rdlen": getattr(ans, "rdlen", None)
896
893
  }
897
894
  formatted_response["answers"].append(answer_info)
898
- ans = ans.payload if isinstance(ans.payload, DNSRR) else None
895
+ ans = ans.payload
899
896
  except Exception as e:
900
897
  logging.error(f"[Parsing] Failed to parse DNS answers: {e}")
901
898
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nopasaran
3
- Version: 0.2.91
3
+ Version: 0.2.93
4
4
  Summary: NoPASARAN is an advanced network tool designed to detect, fingerprint, and locate network middleboxes in a unified framework.
5
5
  Home-page: https://github.com/BenIlies/NoPASARAN
6
6
  Author: Ilies Benhabbour
@@ -34,7 +34,7 @@ nopasaran/primitives/action_primitives/client_echo_primitives.py,sha256=2Qupem0N
34
34
  nopasaran/primitives/action_primitives/control_channel_primitives.py,sha256=_OMgxLLtaK0vvobwhPvSAJhYCOgn4optcGhXOdgh1Q4,11281
35
35
  nopasaran/primitives/action_primitives/data_channel_primitives.py,sha256=gDnjw76kFeMtDD4Mnv31vsx6xQsxvavsbYr4yhRH_hg,4557
36
36
  nopasaran/primitives/action_primitives/data_manipulation.py,sha256=mt-BNOEIxyvXzHTwRO1ch1DzzYHQK1AduhRs11TOKH4,15450
37
- nopasaran/primitives/action_primitives/dns_primitives.py,sha256=7j-U47Ni4iUL1349Hc8DbgZeVuiX2BOukTG62XJJIS8,33390
37
+ nopasaran/primitives/action_primitives/dns_primitives.py,sha256=lkL2fgBpFpuj2YmrbBQi-GnGyp4aq9lQYx1UBqCN76I,33332
38
38
  nopasaran/primitives/action_primitives/event_primitives.py,sha256=V2FurvbeRy6nAcDne3Xm4Y86bvo5UYpEeUJFos842tY,2699
39
39
  nopasaran/primitives/action_primitives/http_1_request_primitives.py,sha256=ov4OLXyNiWNjJYS0GjHwuRFkS5DLQaAh6P6ETy1r5ng,14562
40
40
  nopasaran/primitives/action_primitives/http_1_response_primitives.py,sha256=0wS61tl1KSAlIkYkPXMjbbnY5LqKzl9UtuoK56S4IHQ,7947
@@ -73,9 +73,9 @@ nopasaran/tools/http_2_socket_client.py,sha256=5mmc8FuT2dNVAihbMdvyytVwME_xSc7me
73
73
  nopasaran/tools/http_2_socket_server.py,sha256=8W-bxmdoGyK5moxpC87V1EGuZ9jJpIKhokvZrDV84kk,5551
74
74
  nopasaran/tools/https_1_socket_server.py,sha256=0mJ_0zCC-7rtvyjehTnm1QJxWx8R4YHkAWRHm2msvL4,9217
75
75
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
- nopasaran-0.2.91.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
77
- nopasaran-0.2.91.dist-info/METADATA,sha256=3Ed9icI0ZKY3nZrUcGe4acdjf5oeTqs2nktVf81U_2o,5474
78
- nopasaran-0.2.91.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
79
- nopasaran-0.2.91.dist-info/entry_points.txt,sha256=LaOz5GlWuMLjzg4KOEB5OVTattCXVW6a4nSW-WQajCw,55
80
- nopasaran-0.2.91.dist-info/top_level.txt,sha256=60R1FzpprzU8iiJ1cBMNOA0F083_lYoctFo7pzOpMwY,16
81
- nopasaran-0.2.91.dist-info/RECORD,,
76
+ nopasaran-0.2.93.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
77
+ nopasaran-0.2.93.dist-info/METADATA,sha256=wG1DQZBCDCrZsGPc1XTuzLt0UTRW-xCMSBPCniTIWt0,5474
78
+ nopasaran-0.2.93.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
79
+ nopasaran-0.2.93.dist-info/entry_points.txt,sha256=LaOz5GlWuMLjzg4KOEB5OVTattCXVW6a4nSW-WQajCw,55
80
+ nopasaran-0.2.93.dist-info/top_level.txt,sha256=60R1FzpprzU8iiJ1cBMNOA0F083_lYoctFo7pzOpMwY,16
81
+ nopasaran-0.2.93.dist-info/RECORD,,