pypcapkit 1.3.3.post1__cp313-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.
- pcapkit/__init__.py +126 -0
- pcapkit/__main__.py +138 -0
- pcapkit/all.py +136 -0
- pcapkit/const/__init__.py +81 -0
- pcapkit/const/arp/__init__.py +25 -0
- pcapkit/const/arp/hardware.py +181 -0
- pcapkit/const/arp/operation.py +131 -0
- pcapkit/const/ftp/__init__.py +25 -0
- pcapkit/const/ftp/command.py +309 -0
- pcapkit/const/ftp/return_code.py +304 -0
- pcapkit/const/hip/__init__.py +94 -0
- pcapkit/const/hip/certificate.py +77 -0
- pcapkit/const/hip/cipher.py +65 -0
- pcapkit/const/hip/di.py +59 -0
- pcapkit/const/hip/ecdsa_curve.py +59 -0
- pcapkit/const/hip/ecdsa_low_curve.py +56 -0
- pcapkit/const/hip/eddsa_curve.py +65 -0
- pcapkit/const/hip/esp_transform_suite.py +98 -0
- pcapkit/const/hip/group.py +86 -0
- pcapkit/const/hip/hi_algorithm.py +86 -0
- pcapkit/const/hip/hit_suite.py +68 -0
- pcapkit/const/hip/nat_traversal.py +62 -0
- pcapkit/const/hip/notify_message.py +200 -0
- pcapkit/const/hip/packet.py +89 -0
- pcapkit/const/hip/parameter.py +377 -0
- pcapkit/const/hip/registration.py +68 -0
- pcapkit/const/hip/registration_failure.py +84 -0
- pcapkit/const/hip/suite.py +71 -0
- pcapkit/const/hip/transport.py +59 -0
- pcapkit/const/http/__init__.py +39 -0
- pcapkit/const/http/error_code.py +95 -0
- pcapkit/const/http/frame.py +95 -0
- pcapkit/const/http/method.py +184 -0
- pcapkit/const/http/setting.py +96 -0
- pcapkit/const/http/status_code.py +294 -0
- pcapkit/const/ipv4/__init__.py +57 -0
- pcapkit/const/ipv4/classification_level.py +64 -0
- pcapkit/const/ipv4/option_class.py +55 -0
- pcapkit/const/ipv4/option_number.py +137 -0
- pcapkit/const/ipv4/protection_authority.py +63 -0
- pcapkit/const/ipv4/qs_function.py +51 -0
- pcapkit/const/ipv4/router_alert.py +251 -0
- pcapkit/const/ipv4/tos_del.py +51 -0
- pcapkit/const/ipv4/tos_ecn.py +55 -0
- pcapkit/const/ipv4/tos_pre.py +63 -0
- pcapkit/const/ipv4/tos_rel.py +51 -0
- pcapkit/const/ipv4/tos_thr.py +51 -0
- pcapkit/const/ipv4/ts_flag.py +53 -0
- pcapkit/const/ipv6/__init__.py +53 -0
- pcapkit/const/ipv6/extension_header.py +66 -0
- pcapkit/const/ipv6/option.py +137 -0
- pcapkit/const/ipv6/option_action.py +55 -0
- pcapkit/const/ipv6/qs_function.py +51 -0
- pcapkit/const/ipv6/router_alert.py +266 -0
- pcapkit/const/ipv6/routing.py +80 -0
- pcapkit/const/ipv6/seed_id.py +55 -0
- pcapkit/const/ipv6/smf_dpd_mode.py +51 -0
- pcapkit/const/ipv6/tagger_id.py +62 -0
- pcapkit/const/ipx/__init__.py +27 -0
- pcapkit/const/ipx/packet.py +72 -0
- pcapkit/const/ipx/socket.py +104 -0
- pcapkit/const/l2tp/__init__.py +21 -0
- pcapkit/const/l2tp/type.py +51 -0
- pcapkit/const/mh/__init__.py +204 -0
- pcapkit/const/mh/access_type.py +92 -0
- pcapkit/const/mh/ack_status_code.py +71 -0
- pcapkit/const/mh/ani_suboption.py +74 -0
- pcapkit/const/mh/auth_subtype.py +53 -0
- pcapkit/const/mh/binding_ack_flag.py +66 -0
- pcapkit/const/mh/binding_error.py +51 -0
- pcapkit/const/mh/binding_revocation.py +59 -0
- pcapkit/const/mh/binding_update_flag.py +81 -0
- pcapkit/const/mh/cga_extension.py +66 -0
- pcapkit/const/mh/cga_sec.py +57 -0
- pcapkit/const/mh/cga_type.py +68 -0
- pcapkit/const/mh/dhcp_support_mode.py +53 -0
- pcapkit/const/mh/dns_status_code.py +65 -0
- pcapkit/const/mh/dsmip6_tls_packet.py +62 -0
- pcapkit/const/mh/dsmipv6_home_address.py +74 -0
- pcapkit/const/mh/enumerating_algorithm.py +56 -0
- pcapkit/const/mh/fb_ack_status.py +62 -0
- pcapkit/const/mh/fb_action.py +71 -0
- pcapkit/const/mh/fb_indication_trigger.py +65 -0
- pcapkit/const/mh/fb_type.py +59 -0
- pcapkit/const/mh/flow_id_status.py +77 -0
- pcapkit/const/mh/flow_id_suboption.py +71 -0
- pcapkit/const/mh/handoff_type.py +71 -0
- pcapkit/const/mh/handover_ack_flag.py +54 -0
- pcapkit/const/mh/handover_ack_status.py +92 -0
- pcapkit/const/mh/handover_initiate_flag.py +57 -0
- pcapkit/const/mh/handover_initiate_status.py +62 -0
- pcapkit/const/mh/home_address_reply.py +71 -0
- pcapkit/const/mh/lla_code.py +63 -0
- pcapkit/const/mh/lma_mag_suboption.py +59 -0
- pcapkit/const/mh/mn_group_id.py +59 -0
- pcapkit/const/mh/mn_id_subtype.py +77 -0
- pcapkit/const/mh/operator_id.py +63 -0
- pcapkit/const/mh/option.py +260 -0
- pcapkit/const/mh/packet.py +119 -0
- pcapkit/const/mh/qos_attribute.py +89 -0
- pcapkit/const/mh/revocation_status_code.py +83 -0
- pcapkit/const/mh/revocation_trigger.py +86 -0
- pcapkit/const/mh/status_code.py +232 -0
- pcapkit/const/mh/traffic_selector.py +62 -0
- pcapkit/const/mh/upa_status.py +71 -0
- pcapkit/const/mh/upn_reason.py +80 -0
- pcapkit/const/ospf/__init__.py +27 -0
- pcapkit/const/ospf/authentication.py +65 -0
- pcapkit/const/ospf/packet.py +71 -0
- pcapkit/const/pcapng/__init__.py +51 -0
- pcapkit/const/pcapng/block_type.py +152 -0
- pcapkit/const/pcapng/filter_type.py +48 -0
- pcapkit/const/pcapng/hash_algorithm.py +59 -0
- pcapkit/const/pcapng/option_type.py +233 -0
- pcapkit/const/pcapng/record_type.py +57 -0
- pcapkit/const/pcapng/secrets_type.py +56 -0
- pcapkit/const/pcapng/verdict_type.py +53 -0
- pcapkit/const/reg/__init__.py +34 -0
- pcapkit/const/reg/apptype.py +32702 -0
- pcapkit/const/reg/ethertype.py +714 -0
- pcapkit/const/reg/linktype.py +902 -0
- pcapkit/const/reg/transtype.py +523 -0
- pcapkit/const/tcp/__init__.py +35 -0
- pcapkit/const/tcp/checksum.py +55 -0
- pcapkit/const/tcp/flags.py +73 -0
- pcapkit/const/tcp/mp_tcp_option.py +80 -0
- pcapkit/const/tcp/option.py +198 -0
- pcapkit/const/vlan/__init__.py +23 -0
- pcapkit/const/vlan/priority_level.py +71 -0
- pcapkit/corekit/__init__.py +59 -0
- pcapkit/corekit/fields/__init__.py +45 -0
- pcapkit/corekit/fields/collections.py +282 -0
- pcapkit/corekit/fields/field.py +269 -0
- pcapkit/corekit/fields/ipaddress.py +274 -0
- pcapkit/corekit/fields/misc.py +722 -0
- pcapkit/corekit/fields/numbers.py +375 -0
- pcapkit/corekit/fields/strings.py +245 -0
- pcapkit/corekit/infoclass.py +394 -0
- pcapkit/corekit/io.py +506 -0
- pcapkit/corekit/module.py +39 -0
- pcapkit/corekit/multidict.py +626 -0
- pcapkit/corekit/protochain.py +263 -0
- pcapkit/corekit/version.py +33 -0
- pcapkit/dumpkit/__init__.py +15 -0
- pcapkit/dumpkit/common.py +199 -0
- pcapkit/dumpkit/null.py +77 -0
- pcapkit/dumpkit/pcap.py +144 -0
- pcapkit/foundation/__init__.py +45 -0
- pcapkit/foundation/engines/__init__.py +36 -0
- pcapkit/foundation/engines/dpkt.py +230 -0
- pcapkit/foundation/engines/engine.py +194 -0
- pcapkit/foundation/engines/pcap.py +188 -0
- pcapkit/foundation/engines/pcapng.py +310 -0
- pcapkit/foundation/engines/pyshark.py +166 -0
- pcapkit/foundation/engines/scapy.py +161 -0
- pcapkit/foundation/extraction.py +915 -0
- pcapkit/foundation/reassembly/__init__.py +49 -0
- pcapkit/foundation/reassembly/data/__init__.py +48 -0
- pcapkit/foundation/reassembly/data/ip.py +117 -0
- pcapkit/foundation/reassembly/data/tcp.py +145 -0
- pcapkit/foundation/reassembly/ip.py +192 -0
- pcapkit/foundation/reassembly/ipv4.py +50 -0
- pcapkit/foundation/reassembly/ipv6.py +50 -0
- pcapkit/foundation/reassembly/reassembly.py +389 -0
- pcapkit/foundation/reassembly/tcp.py +249 -0
- pcapkit/foundation/registry/__init__.py +41 -0
- pcapkit/foundation/registry/foundation.py +327 -0
- pcapkit/foundation/registry/protocols.py +885 -0
- pcapkit/foundation/traceflow/__init__.py +44 -0
- pcapkit/foundation/traceflow/data/__init__.py +30 -0
- pcapkit/foundation/traceflow/data/tcp.py +105 -0
- pcapkit/foundation/traceflow/tcp.py +159 -0
- pcapkit/foundation/traceflow/traceflow.py +390 -0
- pcapkit/interface/__init__.py +22 -0
- pcapkit/interface/core.py +185 -0
- pcapkit/interface/misc.py +120 -0
- pcapkit/protocols/__init__.py +85 -0
- pcapkit/protocols/application/NotImplemented/bgp.py +0 -0
- pcapkit/protocols/application/NotImplemented/dhcp.py +0 -0
- pcapkit/protocols/application/NotImplemented/dhcpv6.py +0 -0
- pcapkit/protocols/application/NotImplemented/dns.py +0 -0
- pcapkit/protocols/application/NotImplemented/imap.py +0 -0
- pcapkit/protocols/application/NotImplemented/ldap.py +0 -0
- pcapkit/protocols/application/NotImplemented/mqtt.py +0 -0
- pcapkit/protocols/application/NotImplemented/nntp.py +0 -0
- pcapkit/protocols/application/NotImplemented/ntp.py +0 -0
- pcapkit/protocols/application/NotImplemented/onc_rpc.py +0 -0
- pcapkit/protocols/application/NotImplemented/pop.py +0 -0
- pcapkit/protocols/application/NotImplemented/rip.py +0 -0
- pcapkit/protocols/application/NotImplemented/rtp.py +0 -0
- pcapkit/protocols/application/NotImplemented/sip.py +0 -0
- pcapkit/protocols/application/NotImplemented/smtp.py +0 -0
- pcapkit/protocols/application/NotImplemented/snmp.py +0 -0
- pcapkit/protocols/application/NotImplemented/ssh.py +0 -0
- pcapkit/protocols/application/NotImplemented/telnet.py +0 -0
- pcapkit/protocols/application/NotImplemented/tls.py +0 -0
- pcapkit/protocols/application/NotImplemented/xmpp.py +0 -0
- pcapkit/protocols/application/__init__.py +34 -0
- pcapkit/protocols/application/application.py +114 -0
- pcapkit/protocols/application/ftp.py +206 -0
- pcapkit/protocols/application/http.py +176 -0
- pcapkit/protocols/application/httpv1.py +320 -0
- pcapkit/protocols/application/httpv2.py +1255 -0
- pcapkit/protocols/data/__init__.py +192 -0
- pcapkit/protocols/data/application/__init__.py +57 -0
- pcapkit/protocols/data/application/ftp.py +59 -0
- pcapkit/protocols/data/application/httpv1.py +79 -0
- pcapkit/protocols/data/application/httpv2.py +293 -0
- pcapkit/protocols/data/data.py +25 -0
- pcapkit/protocols/data/internet/__init__.py +298 -0
- pcapkit/protocols/data/internet/ah.py +31 -0
- pcapkit/protocols/data/internet/hip.py +804 -0
- pcapkit/protocols/data/internet/hopopt.py +351 -0
- pcapkit/protocols/data/internet/ipv4.py +369 -0
- pcapkit/protocols/data/internet/ipv6.py +67 -0
- pcapkit/protocols/data/internet/ipv6_frag.py +29 -0
- pcapkit/protocols/data/internet/ipv6_opts.py +368 -0
- pcapkit/protocols/data/internet/ipv6_route.py +86 -0
- pcapkit/protocols/data/internet/ipx.py +56 -0
- pcapkit/protocols/data/internet/mh.py +509 -0
- pcapkit/protocols/data/link/__init__.py +33 -0
- pcapkit/protocols/data/link/arp.py +74 -0
- pcapkit/protocols/data/link/ethernet.py +28 -0
- pcapkit/protocols/data/link/l2tp.py +63 -0
- pcapkit/protocols/data/link/ospf.py +58 -0
- pcapkit/protocols/data/link/vlan.py +42 -0
- pcapkit/protocols/data/misc/__init__.py +109 -0
- pcapkit/protocols/data/misc/null.py +18 -0
- pcapkit/protocols/data/misc/pcap/__init__.py +18 -0
- pcapkit/protocols/data/misc/pcap/frame.py +56 -0
- pcapkit/protocols/data/misc/pcap/header.py +53 -0
- pcapkit/protocols/data/misc/pcapng.py +925 -0
- pcapkit/protocols/data/misc/raw.py +25 -0
- pcapkit/protocols/data/protocol.py +32 -0
- pcapkit/protocols/data/transport/__init__.py +71 -0
- pcapkit/protocols/data/transport/tcp.py +555 -0
- pcapkit/protocols/data/transport/udp.py +29 -0
- pcapkit/protocols/internet/NotImplemented/ecn.py +0 -0
- pcapkit/protocols/internet/NotImplemented/esp.py +97 -0
- pcapkit/protocols/internet/NotImplemented/icmp.py +0 -0
- pcapkit/protocols/internet/NotImplemented/icmpv6.py +0 -0
- pcapkit/protocols/internet/NotImplemented/igmp.py +0 -0
- pcapkit/protocols/internet/NotImplemented/shim6.py +0 -0
- pcapkit/protocols/internet/__init__.py +43 -0
- pcapkit/protocols/internet/ah.py +275 -0
- pcapkit/protocols/internet/hip.py +4727 -0
- pcapkit/protocols/internet/hopopt.py +1879 -0
- pcapkit/protocols/internet/internet.py +240 -0
- pcapkit/protocols/internet/ip.py +51 -0
- pcapkit/protocols/internet/ipsec.py +50 -0
- pcapkit/protocols/internet/ipv4.py +1782 -0
- pcapkit/protocols/internet/ipv6.py +361 -0
- pcapkit/protocols/internet/ipv6_frag.py +258 -0
- pcapkit/protocols/internet/ipv6_opts.py +1890 -0
- pcapkit/protocols/internet/ipv6_route.py +710 -0
- pcapkit/protocols/internet/ipx.py +230 -0
- pcapkit/protocols/internet/mh.py +2764 -0
- pcapkit/protocols/link/NotImplemented/dsl.py +0 -0
- pcapkit/protocols/link/NotImplemented/eapol.py +1 -0
- pcapkit/protocols/link/NotImplemented/fddi.py +0 -0
- pcapkit/protocols/link/NotImplemented/isdn.py +0 -0
- pcapkit/protocols/link/NotImplemented/ndp.py +0 -0
- pcapkit/protocols/link/NotImplemented/ppp.py +0 -0
- pcapkit/protocols/link/__init__.py +35 -0
- pcapkit/protocols/link/arp.py +421 -0
- pcapkit/protocols/link/ethernet.py +248 -0
- pcapkit/protocols/link/l2tp.py +267 -0
- pcapkit/protocols/link/link.py +140 -0
- pcapkit/protocols/link/ospf.py +342 -0
- pcapkit/protocols/link/rarp.py +82 -0
- pcapkit/protocols/link/vlan.py +225 -0
- pcapkit/protocols/misc/__init__.py +37 -0
- pcapkit/protocols/misc/null.py +129 -0
- pcapkit/protocols/misc/pcap/__init__.py +17 -0
- pcapkit/protocols/misc/pcap/frame.py +478 -0
- pcapkit/protocols/misc/pcap/header.py +358 -0
- pcapkit/protocols/misc/pcapng.py +5520 -0
- pcapkit/protocols/misc/raw.py +180 -0
- pcapkit/protocols/protocol.py +1216 -0
- pcapkit/protocols/schema/__init__.py +140 -0
- pcapkit/protocols/schema/application/__init__.py +40 -0
- pcapkit/protocols/schema/application/ftp.py +21 -0
- pcapkit/protocols/schema/application/httpv1.py +21 -0
- pcapkit/protocols/schema/application/httpv2.py +384 -0
- pcapkit/protocols/schema/internet/__init__.py +294 -0
- pcapkit/protocols/schema/internet/ah.py +40 -0
- pcapkit/protocols/schema/internet/hip.py +1184 -0
- pcapkit/protocols/schema/internet/hopopt.py +679 -0
- pcapkit/protocols/schema/internet/ipv4.py +576 -0
- pcapkit/protocols/schema/internet/ipv6.py +63 -0
- pcapkit/protocols/schema/internet/ipv6_frag.py +48 -0
- pcapkit/protocols/schema/internet/ipv6_opts.py +680 -0
- pcapkit/protocols/schema/internet/ipv6_route.py +198 -0
- pcapkit/protocols/schema/internet/ipx.py +40 -0
- pcapkit/protocols/schema/internet/mh.py +718 -0
- pcapkit/protocols/schema/link/__init__.py +19 -0
- pcapkit/protocols/schema/link/arp.py +39 -0
- pcapkit/protocols/schema/link/ethernet.py +51 -0
- pcapkit/protocols/schema/link/l2tp.py +88 -0
- pcapkit/protocols/schema/link/ospf.py +90 -0
- pcapkit/protocols/schema/link/vlan.py +69 -0
- pcapkit/protocols/schema/misc/__init__.py +108 -0
- pcapkit/protocols/schema/misc/null.py +18 -0
- pcapkit/protocols/schema/misc/pcap/__init__.py +10 -0
- pcapkit/protocols/schema/misc/pcap/frame.py +51 -0
- pcapkit/protocols/schema/misc/pcap/header.py +63 -0
- pcapkit/protocols/schema/misc/pcapng.py +1689 -0
- pcapkit/protocols/schema/misc/raw.py +24 -0
- pcapkit/protocols/schema/schema.py +809 -0
- pcapkit/protocols/schema/transport/__init__.py +69 -0
- pcapkit/protocols/schema/transport/tcp.py +928 -0
- pcapkit/protocols/schema/transport/udp.py +90 -0
- pcapkit/protocols/transport/NotImplemented/dccp.py +0 -0
- pcapkit/protocols/transport/NotImplemented/rsvp.py +0 -0
- pcapkit/protocols/transport/NotImplemented/sctp.py +0 -0
- pcapkit/protocols/transport/__init__.py +27 -0
- pcapkit/protocols/transport/tcp.py +3025 -0
- pcapkit/protocols/transport/transport.py +158 -0
- pcapkit/protocols/transport/udp.py +214 -0
- pcapkit/py.typed +0 -0
- pcapkit/toolkit/__init__.py +57 -0
- pcapkit/toolkit/dpkt.py +306 -0
- pcapkit/toolkit/pcap.py +212 -0
- pcapkit/toolkit/pcapng.py +251 -0
- pcapkit/toolkit/pyshark.py +99 -0
- pcapkit/toolkit/scapy.py +297 -0
- pcapkit/utilities/__init__.py +20 -0
- pcapkit/utilities/compat.py +196 -0
- pcapkit/utilities/decorators.py +192 -0
- pcapkit/utilities/exceptions.py +365 -0
- pcapkit/utilities/logging.py +55 -0
- pcapkit/utilities/warnings.py +185 -0
- pcapkit/vendor/__init__.py +105 -0
- pcapkit/vendor/__main__.py +92 -0
- pcapkit/vendor/arp/__init__.py +27 -0
- pcapkit/vendor/arp/hardware.py +29 -0
- pcapkit/vendor/arp/operation.py +29 -0
- pcapkit/vendor/default.py +474 -0
- pcapkit/vendor/ftp/__init__.py +27 -0
- pcapkit/vendor/ftp/command.py +244 -0
- pcapkit/vendor/ftp/return_code.py +256 -0
- pcapkit/vendor/hip/__init__.py +94 -0
- pcapkit/vendor/hip/certificate.py +29 -0
- pcapkit/vendor/hip/cipher.py +29 -0
- pcapkit/vendor/hip/di.py +29 -0
- pcapkit/vendor/hip/ecdsa_curve.py +29 -0
- pcapkit/vendor/hip/ecdsa_low_curve.py +29 -0
- pcapkit/vendor/hip/eddsa_curve.py +85 -0
- pcapkit/vendor/hip/esp_transform_suite.py +29 -0
- pcapkit/vendor/hip/group.py +87 -0
- pcapkit/vendor/hip/hi_algorithm.py +29 -0
- pcapkit/vendor/hip/hit_suite.py +29 -0
- pcapkit/vendor/hip/nat_traversal.py +29 -0
- pcapkit/vendor/hip/notify_message.py +29 -0
- pcapkit/vendor/hip/packet.py +88 -0
- pcapkit/vendor/hip/parameter.py +88 -0
- pcapkit/vendor/hip/registration.py +29 -0
- pcapkit/vendor/hip/registration_failure.py +29 -0
- pcapkit/vendor/hip/suite.py +29 -0
- pcapkit/vendor/hip/transport.py +29 -0
- pcapkit/vendor/http/__init__.py +39 -0
- pcapkit/vendor/http/error_code.py +95 -0
- pcapkit/vendor/http/frame.py +91 -0
- pcapkit/vendor/http/method.py +167 -0
- pcapkit/vendor/http/setting.py +93 -0
- pcapkit/vendor/http/status_code.py +185 -0
- pcapkit/vendor/ipv4/__init__.py +57 -0
- pcapkit/vendor/ipv4/classification_level.py +91 -0
- pcapkit/vendor/ipv4/option_class.py +80 -0
- pcapkit/vendor/ipv4/option_number.py +105 -0
- pcapkit/vendor/ipv4/protection_authority.py +84 -0
- pcapkit/vendor/ipv4/qs_function.py +78 -0
- pcapkit/vendor/ipv4/router_alert.py +93 -0
- pcapkit/vendor/ipv4/tos_del.py +78 -0
- pcapkit/vendor/ipv4/tos_ecn.py +95 -0
- pcapkit/vendor/ipv4/tos_pre.py +84 -0
- pcapkit/vendor/ipv4/tos_rel.py +78 -0
- pcapkit/vendor/ipv4/tos_thr.py +77 -0
- pcapkit/vendor/ipv4/ts_flag.py +79 -0
- pcapkit/vendor/ipv6/__init__.py +53 -0
- pcapkit/vendor/ipv6/extension_header.py +171 -0
- pcapkit/vendor/ipv6/option.py +104 -0
- pcapkit/vendor/ipv6/option_action.py +90 -0
- pcapkit/vendor/ipv6/qs_function.py +78 -0
- pcapkit/vendor/ipv6/router_alert.py +93 -0
- pcapkit/vendor/ipv6/routing.py +87 -0
- pcapkit/vendor/ipv6/seed_id.py +81 -0
- pcapkit/vendor/ipv6/smf_dpd_mode.py +78 -0
- pcapkit/vendor/ipv6/tagger_id.py +81 -0
- pcapkit/vendor/ipx/__init__.py +37 -0
- pcapkit/vendor/ipx/packet.py +123 -0
- pcapkit/vendor/ipx/socket.py +125 -0
- pcapkit/vendor/l2tp/__init__.py +21 -0
- pcapkit/vendor/l2tp/type.py +78 -0
- pcapkit/vendor/mh/__init__.py +204 -0
- pcapkit/vendor/mh/access_type.py +87 -0
- pcapkit/vendor/mh/ack_status_code.py +88 -0
- pcapkit/vendor/mh/ani_suboption.py +88 -0
- pcapkit/vendor/mh/auth_subtype.py +83 -0
- pcapkit/vendor/mh/binding_ack_flag.py +148 -0
- pcapkit/vendor/mh/binding_error.py +78 -0
- pcapkit/vendor/mh/binding_revocation.py +87 -0
- pcapkit/vendor/mh/binding_update_flag.py +147 -0
- pcapkit/vendor/mh/cga_extension.py +91 -0
- pcapkit/vendor/mh/cga_sec.py +91 -0
- pcapkit/vendor/mh/cga_type.py +74 -0
- pcapkit/vendor/mh/dhcp_support_mode.py +77 -0
- pcapkit/vendor/mh/dns_status_code.py +87 -0
- pcapkit/vendor/mh/dsmip6_tls_packet.py +87 -0
- pcapkit/vendor/mh/dsmipv6_home_address.py +87 -0
- pcapkit/vendor/mh/enumerating_algorithm.py +82 -0
- pcapkit/vendor/mh/fb_ack_status.py +87 -0
- pcapkit/vendor/mh/fb_action.py +88 -0
- pcapkit/vendor/mh/fb_indication_trigger.py +87 -0
- pcapkit/vendor/mh/fb_type.py +88 -0
- pcapkit/vendor/mh/flow_id_status.py +87 -0
- pcapkit/vendor/mh/flow_id_suboption.py +87 -0
- pcapkit/vendor/mh/handoff_type.py +87 -0
- pcapkit/vendor/mh/handover_ack_flag.py +143 -0
- pcapkit/vendor/mh/handover_ack_status.py +87 -0
- pcapkit/vendor/mh/handover_initiate_flag.py +143 -0
- pcapkit/vendor/mh/handover_initiate_status.py +87 -0
- pcapkit/vendor/mh/home_address_reply.py +87 -0
- pcapkit/vendor/mh/lla_code.py +97 -0
- pcapkit/vendor/mh/lma_mag_suboption.py +88 -0
- pcapkit/vendor/mh/mn_group_id.py +87 -0
- pcapkit/vendor/mh/mn_id_subtype.py +87 -0
- pcapkit/vendor/mh/operator_id.py +87 -0
- pcapkit/vendor/mh/option.py +83 -0
- pcapkit/vendor/mh/packet.py +82 -0
- pcapkit/vendor/mh/qos_attribute.py +87 -0
- pcapkit/vendor/mh/revocation_status_code.py +87 -0
- pcapkit/vendor/mh/revocation_trigger.py +87 -0
- pcapkit/vendor/mh/status_code.py +91 -0
- pcapkit/vendor/mh/traffic_selector.py +87 -0
- pcapkit/vendor/mh/upa_status.py +87 -0
- pcapkit/vendor/mh/upn_reason.py +87 -0
- pcapkit/vendor/ospf/__init__.py +27 -0
- pcapkit/vendor/ospf/authentication.py +29 -0
- pcapkit/vendor/ospf/packet.py +29 -0
- pcapkit/vendor/pcapng/__init__.py +51 -0
- pcapkit/vendor/pcapng/block_type.py +94 -0
- pcapkit/vendor/pcapng/filter_type.py +77 -0
- pcapkit/vendor/pcapng/hash_algorithm.py +82 -0
- pcapkit/vendor/pcapng/option_type.py +287 -0
- pcapkit/vendor/pcapng/record_type.py +81 -0
- pcapkit/vendor/pcapng/secrets_type.py +81 -0
- pcapkit/vendor/pcapng/verdict_type.py +79 -0
- pcapkit/vendor/reg/__init__.py +34 -0
- pcapkit/vendor/reg/apptype.py +338 -0
- pcapkit/vendor/reg/ethertype.py +121 -0
- pcapkit/vendor/reg/linktype.py +110 -0
- pcapkit/vendor/reg/transtype.py +111 -0
- pcapkit/vendor/tcp/__init__.py +35 -0
- pcapkit/vendor/tcp/checksum.py +80 -0
- pcapkit/vendor/tcp/flags.py +149 -0
- pcapkit/vendor/tcp/mp_tcp_option.py +90 -0
- pcapkit/vendor/tcp/option.py +103 -0
- pcapkit/vendor/vlan/__init__.py +23 -0
- pcapkit/vendor/vlan/priority_level.py +97 -0
- pypcapkit-1.3.3.post1.dist-info/LICENSE +29 -0
- pypcapkit-1.3.3.post1.dist-info/METADATA +236 -0
- pypcapkit-1.3.3.post1.dist-info/RECORD +466 -0
- pypcapkit-1.3.3.post1.dist-info/WHEEL +5 -0
- pypcapkit-1.3.3.post1.dist-info/entry_points.txt +3 -0
- pypcapkit-1.3.3.post1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,120 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Auxiliary Interface
|
3
|
+
=========================
|
4
|
+
|
5
|
+
.. module:: pcapkit.interface.misc
|
6
|
+
|
7
|
+
:mod:`pcapkit.interface.misc` contains miscellaneous
|
8
|
+
user interface functions, classes, etc., which are
|
9
|
+
generally provided per user's requests.
|
10
|
+
|
11
|
+
"""
|
12
|
+
import sys
|
13
|
+
from typing import TYPE_CHECKING
|
14
|
+
|
15
|
+
from pcapkit.corekit.infoclass import Info, info_final
|
16
|
+
from pcapkit.foundation.extraction import Extractor
|
17
|
+
from pcapkit.foundation.reassembly.tcp import TCP as TCP_Reassembly
|
18
|
+
from pcapkit.utilities.exceptions import stacklevel
|
19
|
+
from pcapkit.utilities.warnings import EngineWarning, warn
|
20
|
+
|
21
|
+
if TYPE_CHECKING:
|
22
|
+
from typing import Optional
|
23
|
+
|
24
|
+
from typing_extensions import Literal
|
25
|
+
|
26
|
+
from pcapkit.foundation.extraction import Packet
|
27
|
+
|
28
|
+
ByteOrder = Literal['little', 'big']
|
29
|
+
Formats = Literal['pcap', 'json', 'tree', 'plist']
|
30
|
+
Engines = Literal['default', 'pcapkit', 'dpkt', 'scapy', 'pyshark']
|
31
|
+
|
32
|
+
__all__ = ['follow_tcp_stream']
|
33
|
+
|
34
|
+
###############################################################################
|
35
|
+
# Follow TCP Stream
|
36
|
+
###############################################################################
|
37
|
+
|
38
|
+
|
39
|
+
@info_final
|
40
|
+
class Stream(Info):
|
41
|
+
"""Data model for TCP streams."""
|
42
|
+
|
43
|
+
#: Output filename.
|
44
|
+
filename: 'Optional[str]'
|
45
|
+
#: Packet list.
|
46
|
+
packets: 'tuple[Packet, ...]'
|
47
|
+
#: TCP conversation.
|
48
|
+
conversations: 'tuple[bytes | tuple[bytes, ...], ...]'
|
49
|
+
|
50
|
+
if TYPE_CHECKING:
|
51
|
+
def __init__(self, filename: 'Optional[str]', packets: 'tuple[Packet, ...]', conversations: 'tuple[bytes | tuple[bytes, ...], ...]') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long
|
52
|
+
|
53
|
+
|
54
|
+
def follow_tcp_stream(fin: 'Optional[str]' = None, verbose: 'bool' = False, # Extrator options
|
55
|
+
extension: 'bool' = True, engine: 'Optional[Engines]' = None,
|
56
|
+
fout: 'Optional[str]' = None, format: 'Optional[Formats]' = None, # TraceFlow options # pylint: disable=redefined-builtin
|
57
|
+
byteorder: 'ByteOrder' = sys.byteorder, nanosecond: 'bool' = False) -> 'tuple[Stream, ...]':
|
58
|
+
"""Follow TCP streams.
|
59
|
+
|
60
|
+
Arguments:
|
61
|
+
fin: file name to be read; if file not exist, raise :exc:`FileNotFound`
|
62
|
+
extension: if check and append extensions to output file
|
63
|
+
verbose: if print verbose output information
|
64
|
+
engine: extraction engine to be used
|
65
|
+
|
66
|
+
fout: path name for flow tracer if necessary
|
67
|
+
format: output file format of flow tracer
|
68
|
+
byteorder: output file byte order
|
69
|
+
nanosecond: output nanosecond-resolution file flag
|
70
|
+
|
71
|
+
Returns:
|
72
|
+
List of extracted TCP streams.
|
73
|
+
|
74
|
+
"""
|
75
|
+
if engine is not None and engine.lower() == 'pyshark':
|
76
|
+
warn(f'unsupported extraction engine: {engine}; fallback to default engine',
|
77
|
+
EngineWarning, stacklevel=stacklevel())
|
78
|
+
engine = None
|
79
|
+
|
80
|
+
extraction = Extractor(fin=fin, fout=None, format=None, auto=True, extension=extension,
|
81
|
+
store=True, files=False, nofile=True, verbose=verbose, engine=engine,
|
82
|
+
layer=None, protocol=None, ip=False, ipv4=False, ipv6=False, tcp=True,
|
83
|
+
reassembly=False, trace=True, trace_fout=fout, trace_format=format,
|
84
|
+
trace_byteorder=byteorder, trace_nanosecond=nanosecond) # type: ignore[var-annotated]
|
85
|
+
|
86
|
+
fallback = False
|
87
|
+
if extraction.engine == 'dpkt': # type: ignore[comparison-overlap]
|
88
|
+
from pcapkit.toolkit.dpkt import tcp_reassembly # pylint: disable=import-outside-toplevel
|
89
|
+
elif extraction.engine == 'scapy': # type: ignore[comparison-overlap]
|
90
|
+
from pcapkit.toolkit.scapy import tcp_reassembly # isort: skip # pylint: disable=import-outside-toplevel
|
91
|
+
else:
|
92
|
+
from pcapkit.toolkit.pcap import tcp_reassembly # type: ignore[assignment] # isort: skip # pylint: disable=import-outside-toplevel
|
93
|
+
fallback = True
|
94
|
+
|
95
|
+
streams = [] # type: list[Stream]
|
96
|
+
frames = extraction.frame
|
97
|
+
for stream in extraction.trace.tcp:
|
98
|
+
reassembly = TCP_Reassembly(strict=False)
|
99
|
+
|
100
|
+
packets = [] # type: list[Packet]
|
101
|
+
for index in stream.index:
|
102
|
+
frame = frames[index-1]
|
103
|
+
packets.append(frame)
|
104
|
+
|
105
|
+
if fallback:
|
106
|
+
data = tcp_reassembly(frame)
|
107
|
+
else:
|
108
|
+
data = tcp_reassembly(frame, count=index)
|
109
|
+
|
110
|
+
if data is not None:
|
111
|
+
reassembly(data)
|
112
|
+
|
113
|
+
streams.append(Stream(
|
114
|
+
filename=stream.fpout,
|
115
|
+
packets=tuple(packets),
|
116
|
+
conversations=tuple(datagram.payload for datagram in sorted(
|
117
|
+
reassembly.datagram, key=lambda datagram: datagram.index # make sure the converstations are in order
|
118
|
+
)),
|
119
|
+
))
|
120
|
+
return tuple(streams)
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# pylint: disable=unused-import,unused-wildcard-import,fixme
|
3
|
+
"""Protocol Family
|
4
|
+
=====================
|
5
|
+
|
6
|
+
.. module:: pcapkit.protocols
|
7
|
+
|
8
|
+
:mod:`pcapkit.protocols` is collection of all protocol families,
|
9
|
+
with detailed implementation and methods.
|
10
|
+
|
11
|
+
"""
|
12
|
+
from typing import TYPE_CHECKING
|
13
|
+
|
14
|
+
# Base Class for Protocols
|
15
|
+
from pcapkit.protocols.protocol import Protocol
|
16
|
+
|
17
|
+
# Utility Classes for Protocols
|
18
|
+
from pcapkit.protocols.misc import *
|
19
|
+
|
20
|
+
# Protocols & Macros
|
21
|
+
from pcapkit.protocols.link import *
|
22
|
+
from pcapkit.protocols.internet import *
|
23
|
+
from pcapkit.protocols.transport import *
|
24
|
+
from pcapkit.protocols.application import *
|
25
|
+
|
26
|
+
# Protocol Data
|
27
|
+
from pcapkit.protocols import data
|
28
|
+
from pcapkit.protocols.data.data import Data
|
29
|
+
|
30
|
+
# Protocol Schema
|
31
|
+
from pcapkit.protocols import schema
|
32
|
+
from pcapkit.protocols.schema.schema import Schema
|
33
|
+
|
34
|
+
if TYPE_CHECKING:
|
35
|
+
from typing import Type
|
36
|
+
|
37
|
+
from pcapkit.protocols.protocol import ProtocolBase
|
38
|
+
|
39
|
+
__all__ = [
|
40
|
+
# PCAP Headers
|
41
|
+
'Header', 'Frame',
|
42
|
+
|
43
|
+
# PCAPNG Format
|
44
|
+
'PCAPNG',
|
45
|
+
|
46
|
+
# No Payload
|
47
|
+
'NoPayload',
|
48
|
+
|
49
|
+
# Raw Packet
|
50
|
+
'Raw',
|
51
|
+
|
52
|
+
# Link Layer
|
53
|
+
'ARP', 'DRARP', 'Ethernet', 'InARP', 'L2TP',
|
54
|
+
'OSPF', 'RARP', 'VLAN',
|
55
|
+
|
56
|
+
# Internet Layer
|
57
|
+
'AH', 'IP', 'IPsec', 'IPv4', 'IPv6', 'IPX',
|
58
|
+
|
59
|
+
# IPv6 Extension Header
|
60
|
+
'HIP', 'HOPOPT', 'IPv6_Frag', 'IPv6_Opts',
|
61
|
+
'IPv6_Route', 'MH',
|
62
|
+
|
63
|
+
# Transport Layer
|
64
|
+
'TCP', 'UDP',
|
65
|
+
|
66
|
+
# Application Layer
|
67
|
+
'FTP', 'FTP_DATA',
|
68
|
+
'HTTP', 'HTTPv1', 'HTTPv2',
|
69
|
+
]
|
70
|
+
|
71
|
+
#: dict[str, Type[Protocol]]: Protocol registry.
|
72
|
+
__proto__ = {} # type: dict[str, Type[ProtocolBase]]
|
73
|
+
for name in __all__:
|
74
|
+
__proto__[name.upper()] = globals()[name]
|
75
|
+
|
76
|
+
__all__.extend((
|
77
|
+
# Protocol Numbers
|
78
|
+
'LINKTYPE', 'ETHERTYPE', 'TRANSTYPE', 'APPTYPE',
|
79
|
+
|
80
|
+
# Protocol Data
|
81
|
+
'Data', 'data',
|
82
|
+
|
83
|
+
# Protocol Schema
|
84
|
+
'Schema', 'schema',
|
85
|
+
))
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# pylint: disable=unused-import,fixme
|
3
|
+
"""Application Layer Protocols
|
4
|
+
=================================
|
5
|
+
|
6
|
+
.. module:: pcapkit.protocols.application
|
7
|
+
|
8
|
+
:mod:`pcapkit.protocols.application` is collection of all protocols in
|
9
|
+
application layer, with detailed implementation and methods.
|
10
|
+
|
11
|
+
"""
|
12
|
+
# TODO: Implements BGP, DHCP, DHCPv6, DNS, IMAP, LDAP, MQTT,
|
13
|
+
# NNTP, NTP, ONC:RPC, POP, RIP, RTP, SIP, SMTP, SNMP,
|
14
|
+
# SSH, TELNET, TLS/SSL, XMPP.
|
15
|
+
|
16
|
+
# Base Class for Internet Layer
|
17
|
+
from pcapkit.protocols.application.application import Application
|
18
|
+
|
19
|
+
# Utility Classes for Protocols
|
20
|
+
from pcapkit.protocols.application.ftp import FTP, FTP_DATA
|
21
|
+
from pcapkit.protocols.application.httpv1 import HTTP as HTTPv1
|
22
|
+
from pcapkit.protocols.application.httpv2 import HTTP as HTTPv2
|
23
|
+
|
24
|
+
# Deprecated / Base Classes
|
25
|
+
from pcapkit.protocols.application.http import HTTP
|
26
|
+
|
27
|
+
# Transport Layer Protocol Numbers
|
28
|
+
from pcapkit.const.reg.apptype import AppType as APPTYPE
|
29
|
+
|
30
|
+
__all__ = [
|
31
|
+
'APPTYPE',
|
32
|
+
'FTP', 'FTP_DATA',
|
33
|
+
'HTTP', 'HTTPv1', 'HTTPv2',
|
34
|
+
]
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Base Protocol
|
3
|
+
===================
|
4
|
+
|
5
|
+
.. module:: pcapkit.protocols.application.application
|
6
|
+
|
7
|
+
:mod:`pcapkit.protocols.application.application` contains only
|
8
|
+
:class:`~pcapkit.protocols.application.application.Application`,
|
9
|
+
which is a base class for application layer protocols, eg.
|
10
|
+
:class:`HTTP/1.* <pcapkit.protocols.application.application.httpv1>`,
|
11
|
+
:class:`HTTP/2 <pcapkit.protocols.application.application.httpv2>`
|
12
|
+
and etc.
|
13
|
+
|
14
|
+
"""
|
15
|
+
from typing import TYPE_CHECKING, Generic, overload
|
16
|
+
|
17
|
+
from pcapkit.corekit.protochain import ProtoChain
|
18
|
+
from pcapkit.protocols.misc.null import NoPayload
|
19
|
+
from pcapkit.protocols.protocol import _PT, _ST
|
20
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
21
|
+
from pcapkit.utilities.exceptions import IntError, UnsupportedCall
|
22
|
+
|
23
|
+
if TYPE_CHECKING:
|
24
|
+
from typing import IO, Any, NoReturn, Optional
|
25
|
+
|
26
|
+
from typing_extensions import Literal
|
27
|
+
|
28
|
+
__all__ = ['Application']
|
29
|
+
|
30
|
+
|
31
|
+
class Application(Protocol[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstract-method
|
32
|
+
"""Abstract base class for transport layer protocol family."""
|
33
|
+
|
34
|
+
##########################################################################
|
35
|
+
# Defaults.
|
36
|
+
##########################################################################
|
37
|
+
|
38
|
+
#: Layer of protocol.
|
39
|
+
__layer__ = 'Application' # type: Literal['Application']
|
40
|
+
|
41
|
+
##########################################################################
|
42
|
+
# Properties.
|
43
|
+
##########################################################################
|
44
|
+
|
45
|
+
# protocol layer
|
46
|
+
@property
|
47
|
+
def layer(self) -> 'Literal["Application"]':
|
48
|
+
"""Protocol layer."""
|
49
|
+
return self.__layer__
|
50
|
+
|
51
|
+
##########################################################################
|
52
|
+
# Data models.
|
53
|
+
##########################################################################
|
54
|
+
|
55
|
+
@overload
|
56
|
+
def __post_init__(self, file: 'IO[bytes] | bytes', length: 'Optional[int]' = ..., **kwargs: 'Any') -> 'None': ...
|
57
|
+
@overload
|
58
|
+
def __post_init__(self, **kwargs: 'Any') -> 'None': ...
|
59
|
+
|
60
|
+
def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None,
|
61
|
+
length: 'Optional[int]' = None, **kwargs: 'Any') -> 'None':
|
62
|
+
"""Post initialisation hook.
|
63
|
+
|
64
|
+
Args:
|
65
|
+
file: Source packet stream.
|
66
|
+
length: Length of packet data.
|
67
|
+
**kwargs: Arbitrary keyword arguments.
|
68
|
+
|
69
|
+
See Also:
|
70
|
+
For construction arguments, please refer to
|
71
|
+
:meth:`self.make <pcapkit.protocols.protocol.Protocol.make>`.
|
72
|
+
|
73
|
+
"""
|
74
|
+
# call super post-init
|
75
|
+
super().__post_init__(file, length, **kwargs) # type: ignore[arg-type]
|
76
|
+
|
77
|
+
#: pcapkit.protocols.null.NoPayload: Payload of current instance.
|
78
|
+
self._next = NoPayload()
|
79
|
+
#: pcapkit.corekit.protochain.ProtoChain: Protocol chain of current instance.
|
80
|
+
self._protos = ProtoChain(self.__class__, self.alias)
|
81
|
+
|
82
|
+
@classmethod
|
83
|
+
def __index__(cls) -> 'NoReturn': # pylint: disable=invalid-index-returned
|
84
|
+
"""Numeral registry index of the protocol.
|
85
|
+
|
86
|
+
Raises:
|
87
|
+
IntError: This protocol doesn't support :meth:`__index__`.
|
88
|
+
|
89
|
+
"""
|
90
|
+
raise IntError(f'{cls.__name__!r} object cannot be interpreted as an integer')
|
91
|
+
|
92
|
+
##########################################################################
|
93
|
+
# Utilities.
|
94
|
+
##########################################################################
|
95
|
+
|
96
|
+
def _decode_next_layer(self, dict_: '_PT', proto: 'Optional[int]' = None, length: 'Optional[int]' = None, *,
|
97
|
+
packet: 'Optional[dict[str, Any]]' = None) -> 'NoReturn':
|
98
|
+
"""Decode next layer protocol.
|
99
|
+
|
100
|
+
Raises:
|
101
|
+
UnsupportedCall: This protocol doesn't support :meth:`_decode_next_layer`.
|
102
|
+
|
103
|
+
"""
|
104
|
+
raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute '_decode_next_layer'")
|
105
|
+
|
106
|
+
def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # type: ignore[override]
|
107
|
+
packet: 'Optional[dict[str, Any]]' = None) -> 'NoReturn':
|
108
|
+
"""Import next layer extractor.
|
109
|
+
|
110
|
+
Raises:
|
111
|
+
UnsupportedCall: This protocol doesn't support :meth:`_import_next_layer`.
|
112
|
+
|
113
|
+
"""
|
114
|
+
raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute '_import_next_layer'")
|
@@ -0,0 +1,206 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""file transfer protocol
|
3
|
+
|
4
|
+
.. module:: pcapkit.protocols.application.ftp
|
5
|
+
|
6
|
+
:mod:`pcapkit.protocols.application.ftp` contains
|
7
|
+
:class:`~pcapkit.protocols.application.ftp.FTP` only,
|
8
|
+
which implements extractor for File Transfer Protocol
|
9
|
+
(FTP) [*]_.
|
10
|
+
|
11
|
+
.. [*] https://en.wikipedia.org/wiki/File_Transfer_Protocol
|
12
|
+
|
13
|
+
"""
|
14
|
+
import re
|
15
|
+
from typing import TYPE_CHECKING
|
16
|
+
|
17
|
+
from pcapkit.const.ftp.command import Command as Enum_Command
|
18
|
+
from pcapkit.const.ftp.return_code import ReturnCode as Enum_ReturnCode
|
19
|
+
from pcapkit.protocols.application.application import Application
|
20
|
+
from pcapkit.protocols.data.application.ftp import FTP as Data_FTP
|
21
|
+
from pcapkit.protocols.data.application.ftp import Request as Data_Request
|
22
|
+
from pcapkit.protocols.data.application.ftp import Response as Data_Response
|
23
|
+
from pcapkit.protocols.misc.raw import Raw
|
24
|
+
from pcapkit.protocols.schema.application.ftp import FTP as Schema_FTP
|
25
|
+
from pcapkit.utilities.compat import StrEnum
|
26
|
+
from pcapkit.utilities.exceptions import ProtocolError, UnsupportedCall
|
27
|
+
|
28
|
+
if TYPE_CHECKING:
|
29
|
+
from typing import Any, NoReturn, Optional
|
30
|
+
|
31
|
+
from typing_extensions import Literal
|
32
|
+
|
33
|
+
__all__ = ['FTP', 'FTP_DATA']
|
34
|
+
|
35
|
+
# regex for FTP
|
36
|
+
FTP_REQUEST = re.compile(rb'^(?P<cmmd>[A-Z]{3,4})( +(?P<args>.*))?\r\n$', re.I)
|
37
|
+
FTP_RESPONSE = re.compile(rb'^(?P<code>[0-9]{3})(?P<more>\-)?( +(?P<args>.*))?\r\n$', re.I)
|
38
|
+
|
39
|
+
|
40
|
+
class Type(StrEnum):
|
41
|
+
"""FTP packet type."""
|
42
|
+
|
43
|
+
#: Request packet.
|
44
|
+
REQUEST = 'request'
|
45
|
+
#: Response packet.
|
46
|
+
RESPONSE = 'response'
|
47
|
+
|
48
|
+
|
49
|
+
class FTP(Application[Data_FTP, Schema_FTP],
|
50
|
+
data=Data_FTP, schema=Schema_FTP):
|
51
|
+
"""This class implements File Transfer Protocol."""
|
52
|
+
|
53
|
+
##########################################################################
|
54
|
+
# Properties.
|
55
|
+
##########################################################################
|
56
|
+
|
57
|
+
@property
|
58
|
+
def name(self) -> 'Literal["File Transfer Protocol"]':
|
59
|
+
"""Name of current protocol."""
|
60
|
+
return 'File Transfer Protocol'
|
61
|
+
|
62
|
+
@property
|
63
|
+
def length(self) -> 'NoReturn':
|
64
|
+
"""Header length of current protocol.
|
65
|
+
|
66
|
+
Raises:
|
67
|
+
UnsupportedCall: This protocol doesn't support :attr:`length`.
|
68
|
+
|
69
|
+
"""
|
70
|
+
raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute 'length'")
|
71
|
+
|
72
|
+
##########################################################################
|
73
|
+
# Methods.
|
74
|
+
##########################################################################
|
75
|
+
|
76
|
+
def read(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_FTP': # pylint: disable=unused-argument
|
77
|
+
"""Read File Transfer Protocol (FTP).
|
78
|
+
|
79
|
+
Args:
|
80
|
+
length: Length of packet data.
|
81
|
+
**kwargs: Arbitrary keyword arguments.
|
82
|
+
|
83
|
+
Returns:
|
84
|
+
Parsed packet data.
|
85
|
+
|
86
|
+
Raises:
|
87
|
+
ProtocolError: If the packet is malformed.
|
88
|
+
|
89
|
+
"""
|
90
|
+
if length is None:
|
91
|
+
length = len(self)
|
92
|
+
schema = self.__header__
|
93
|
+
|
94
|
+
data = schema.data
|
95
|
+
if (match := FTP_REQUEST.match(data)) is not None:
|
96
|
+
cmmd = match.group('cmmd').decode()
|
97
|
+
args = match.group('args')
|
98
|
+
|
99
|
+
cmmd_val = Enum_Command.get(cmmd)
|
100
|
+
args_val = self.decode(args)
|
101
|
+
|
102
|
+
ftp = Data_Request(
|
103
|
+
type=Type.REQUEST,
|
104
|
+
cmmd=cmmd_val,
|
105
|
+
args=args_val,
|
106
|
+
) # type: Data_FTP
|
107
|
+
elif (match := FTP_RESPONSE.match(data)) is not None:
|
108
|
+
code = int(match.group('code'))
|
109
|
+
more = bool(match.group('more'))
|
110
|
+
args = match.group('args')
|
111
|
+
|
112
|
+
code_val = Enum_ReturnCode.get(code)
|
113
|
+
args_val = self.decode(args)
|
114
|
+
|
115
|
+
ftp = Data_Response(
|
116
|
+
type=Type.RESPONSE,
|
117
|
+
code=code_val,
|
118
|
+
more=more,
|
119
|
+
args=args_val,
|
120
|
+
)
|
121
|
+
else:
|
122
|
+
raise ProtocolError('FTP: invalid packet format')
|
123
|
+
return ftp
|
124
|
+
|
125
|
+
def make(self,
|
126
|
+
cmmd: 'Optional[Enum_Command | str | bytes]' = None,
|
127
|
+
code: 'Optional[Enum_ReturnCode | int | str | bytes]' = None,
|
128
|
+
args: 'Optional[str | bytes]' = None,
|
129
|
+
more: 'bool' = False,
|
130
|
+
**kwargs: 'Any') -> 'Schema_FTP':
|
131
|
+
"""Make (construct) packet data.
|
132
|
+
|
133
|
+
Args:
|
134
|
+
cmmd: FTP command.
|
135
|
+
code: FTP status code.
|
136
|
+
args: Optional FTP command arguments and/or status messages.
|
137
|
+
more: More status messages to follow for response packets.
|
138
|
+
**kwargs: Arbitrary keyword arguments.
|
139
|
+
|
140
|
+
Returns:
|
141
|
+
Constructed packet data.
|
142
|
+
|
143
|
+
"""
|
144
|
+
if cmmd is not None and code is None:
|
145
|
+
if isinstance(cmmd, bytes):
|
146
|
+
prefix = cmmd
|
147
|
+
elif isinstance(cmmd, str):
|
148
|
+
prefix = cmmd.encode()
|
149
|
+
else:
|
150
|
+
prefix = cmmd.value
|
151
|
+
|
152
|
+
mf = b''
|
153
|
+
elif cmmd is None and code is not None:
|
154
|
+
code_val = int(code)
|
155
|
+
prefix = str(code_val).encode()
|
156
|
+
|
157
|
+
mf = b'-' if more else b''
|
158
|
+
else:
|
159
|
+
raise ProtocolError('FTP: invalid packet type')
|
160
|
+
|
161
|
+
if args is None:
|
162
|
+
suffix = b''
|
163
|
+
elif isinstance(args, bytes):
|
164
|
+
suffix = args
|
165
|
+
else:
|
166
|
+
suffix = args.encode()
|
167
|
+
|
168
|
+
return Schema_FTP(
|
169
|
+
data=b'%s%s %s' % (prefix, mf, suffix),
|
170
|
+
)
|
171
|
+
|
172
|
+
##########################################################################
|
173
|
+
# Utilities.
|
174
|
+
##########################################################################
|
175
|
+
|
176
|
+
@classmethod
|
177
|
+
def _make_data(cls, data: 'Data_FTP') -> 'dict[str, Any]': # type: ignore[override]
|
178
|
+
"""Create key-value pairs from ``data`` for protocol construction.
|
179
|
+
|
180
|
+
Args:
|
181
|
+
data: protocol data
|
182
|
+
|
183
|
+
Returns:
|
184
|
+
Key-value pairs for protocol construction.
|
185
|
+
|
186
|
+
"""
|
187
|
+
return {
|
188
|
+
'cmmd': getattr(data, 'cmmd', None),
|
189
|
+
'code': getattr(data, 'code', None),
|
190
|
+
'args': getattr(data, 'args', None),
|
191
|
+
'more': getattr(data, 'more', False),
|
192
|
+
}
|
193
|
+
|
194
|
+
|
195
|
+
class FTP_DATA(Raw):
|
196
|
+
"""This class implements FTP data channel transmission."""
|
197
|
+
|
198
|
+
##########################################################################
|
199
|
+
# Properties.
|
200
|
+
##########################################################################
|
201
|
+
|
202
|
+
# name of current protocol
|
203
|
+
@property
|
204
|
+
def name(self) -> 'Literal["FTP_DATA"]': # type: ignore[override]
|
205
|
+
"""Name of current protocol."""
|
206
|
+
return 'FTP_DATA'
|