pypcapkit 1.3.5.post6__cp313-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (466) hide show
  1. pcapkit/__init__.py +124 -0
  2. pcapkit/__main__.py +138 -0
  3. pcapkit/all.py +136 -0
  4. pcapkit/const/__init__.py +81 -0
  5. pcapkit/const/arp/__init__.py +25 -0
  6. pcapkit/const/arp/hardware.py +181 -0
  7. pcapkit/const/arp/operation.py +131 -0
  8. pcapkit/const/ftp/__init__.py +25 -0
  9. pcapkit/const/ftp/command.py +309 -0
  10. pcapkit/const/ftp/return_code.py +304 -0
  11. pcapkit/const/hip/__init__.py +94 -0
  12. pcapkit/const/hip/certificate.py +77 -0
  13. pcapkit/const/hip/cipher.py +65 -0
  14. pcapkit/const/hip/di.py +59 -0
  15. pcapkit/const/hip/ecdsa_curve.py +59 -0
  16. pcapkit/const/hip/ecdsa_low_curve.py +56 -0
  17. pcapkit/const/hip/eddsa_curve.py +65 -0
  18. pcapkit/const/hip/esp_transform_suite.py +98 -0
  19. pcapkit/const/hip/group.py +86 -0
  20. pcapkit/const/hip/hi_algorithm.py +86 -0
  21. pcapkit/const/hip/hit_suite.py +68 -0
  22. pcapkit/const/hip/nat_traversal.py +62 -0
  23. pcapkit/const/hip/notify_message.py +200 -0
  24. pcapkit/const/hip/packet.py +89 -0
  25. pcapkit/const/hip/parameter.py +377 -0
  26. pcapkit/const/hip/registration.py +68 -0
  27. pcapkit/const/hip/registration_failure.py +84 -0
  28. pcapkit/const/hip/suite.py +71 -0
  29. pcapkit/const/hip/transport.py +59 -0
  30. pcapkit/const/http/__init__.py +39 -0
  31. pcapkit/const/http/error_code.py +95 -0
  32. pcapkit/const/http/frame.py +95 -0
  33. pcapkit/const/http/method.py +184 -0
  34. pcapkit/const/http/setting.py +96 -0
  35. pcapkit/const/http/status_code.py +298 -0
  36. pcapkit/const/ipv4/__init__.py +57 -0
  37. pcapkit/const/ipv4/classification_level.py +64 -0
  38. pcapkit/const/ipv4/option_class.py +55 -0
  39. pcapkit/const/ipv4/option_number.py +137 -0
  40. pcapkit/const/ipv4/protection_authority.py +63 -0
  41. pcapkit/const/ipv4/qs_function.py +51 -0
  42. pcapkit/const/ipv4/router_alert.py +251 -0
  43. pcapkit/const/ipv4/tos_del.py +51 -0
  44. pcapkit/const/ipv4/tos_ecn.py +55 -0
  45. pcapkit/const/ipv4/tos_pre.py +63 -0
  46. pcapkit/const/ipv4/tos_rel.py +51 -0
  47. pcapkit/const/ipv4/tos_thr.py +51 -0
  48. pcapkit/const/ipv4/ts_flag.py +53 -0
  49. pcapkit/const/ipv6/__init__.py +53 -0
  50. pcapkit/const/ipv6/extension_header.py +69 -0
  51. pcapkit/const/ipv6/option.py +137 -0
  52. pcapkit/const/ipv6/option_action.py +55 -0
  53. pcapkit/const/ipv6/qs_function.py +51 -0
  54. pcapkit/const/ipv6/router_alert.py +266 -0
  55. pcapkit/const/ipv6/routing.py +80 -0
  56. pcapkit/const/ipv6/seed_id.py +55 -0
  57. pcapkit/const/ipv6/smf_dpd_mode.py +51 -0
  58. pcapkit/const/ipv6/tagger_id.py +62 -0
  59. pcapkit/const/ipx/__init__.py +27 -0
  60. pcapkit/const/ipx/packet.py +72 -0
  61. pcapkit/const/ipx/socket.py +104 -0
  62. pcapkit/const/l2tp/__init__.py +21 -0
  63. pcapkit/const/l2tp/type.py +51 -0
  64. pcapkit/const/mh/__init__.py +204 -0
  65. pcapkit/const/mh/access_type.py +92 -0
  66. pcapkit/const/mh/ack_status_code.py +71 -0
  67. pcapkit/const/mh/ani_suboption.py +74 -0
  68. pcapkit/const/mh/auth_subtype.py +53 -0
  69. pcapkit/const/mh/binding_ack_flag.py +66 -0
  70. pcapkit/const/mh/binding_error.py +51 -0
  71. pcapkit/const/mh/binding_revocation.py +59 -0
  72. pcapkit/const/mh/binding_update_flag.py +81 -0
  73. pcapkit/const/mh/cga_extension.py +66 -0
  74. pcapkit/const/mh/cga_sec.py +57 -0
  75. pcapkit/const/mh/cga_type.py +68 -0
  76. pcapkit/const/mh/dhcp_support_mode.py +53 -0
  77. pcapkit/const/mh/dns_status_code.py +65 -0
  78. pcapkit/const/mh/dsmip6_tls_packet.py +62 -0
  79. pcapkit/const/mh/dsmipv6_home_address.py +74 -0
  80. pcapkit/const/mh/enumerating_algorithm.py +56 -0
  81. pcapkit/const/mh/fb_ack_status.py +62 -0
  82. pcapkit/const/mh/fb_action.py +71 -0
  83. pcapkit/const/mh/fb_indication_trigger.py +65 -0
  84. pcapkit/const/mh/fb_type.py +59 -0
  85. pcapkit/const/mh/flow_id_status.py +77 -0
  86. pcapkit/const/mh/flow_id_suboption.py +71 -0
  87. pcapkit/const/mh/handoff_type.py +71 -0
  88. pcapkit/const/mh/handover_ack_flag.py +54 -0
  89. pcapkit/const/mh/handover_ack_status.py +92 -0
  90. pcapkit/const/mh/handover_initiate_flag.py +57 -0
  91. pcapkit/const/mh/handover_initiate_status.py +62 -0
  92. pcapkit/const/mh/home_address_reply.py +71 -0
  93. pcapkit/const/mh/lla_code.py +63 -0
  94. pcapkit/const/mh/lma_mag_suboption.py +59 -0
  95. pcapkit/const/mh/mn_group_id.py +59 -0
  96. pcapkit/const/mh/mn_id_subtype.py +77 -0
  97. pcapkit/const/mh/operator_id.py +63 -0
  98. pcapkit/const/mh/option.py +260 -0
  99. pcapkit/const/mh/packet.py +119 -0
  100. pcapkit/const/mh/qos_attribute.py +89 -0
  101. pcapkit/const/mh/revocation_status_code.py +83 -0
  102. pcapkit/const/mh/revocation_trigger.py +86 -0
  103. pcapkit/const/mh/status_code.py +232 -0
  104. pcapkit/const/mh/traffic_selector.py +62 -0
  105. pcapkit/const/mh/upa_status.py +71 -0
  106. pcapkit/const/mh/upn_reason.py +80 -0
  107. pcapkit/const/ospf/__init__.py +27 -0
  108. pcapkit/const/ospf/authentication.py +65 -0
  109. pcapkit/const/ospf/packet.py +71 -0
  110. pcapkit/const/pcapng/__init__.py +51 -0
  111. pcapkit/const/pcapng/block_type.py +152 -0
  112. pcapkit/const/pcapng/filter_type.py +48 -0
  113. pcapkit/const/pcapng/hash_algorithm.py +59 -0
  114. pcapkit/const/pcapng/option_type.py +233 -0
  115. pcapkit/const/pcapng/record_type.py +57 -0
  116. pcapkit/const/pcapng/secrets_type.py +56 -0
  117. pcapkit/const/pcapng/verdict_type.py +53 -0
  118. pcapkit/const/reg/__init__.py +34 -0
  119. pcapkit/const/reg/apptype.py +32728 -0
  120. pcapkit/const/reg/ethertype.py +714 -0
  121. pcapkit/const/reg/linktype.py +890 -0
  122. pcapkit/const/reg/transtype.py +526 -0
  123. pcapkit/const/tcp/__init__.py +35 -0
  124. pcapkit/const/tcp/checksum.py +55 -0
  125. pcapkit/const/tcp/flags.py +73 -0
  126. pcapkit/const/tcp/mp_tcp_option.py +80 -0
  127. pcapkit/const/tcp/option.py +198 -0
  128. pcapkit/const/vlan/__init__.py +23 -0
  129. pcapkit/const/vlan/priority_level.py +71 -0
  130. pcapkit/corekit/__init__.py +59 -0
  131. pcapkit/corekit/fields/__init__.py +45 -0
  132. pcapkit/corekit/fields/collections.py +282 -0
  133. pcapkit/corekit/fields/field.py +269 -0
  134. pcapkit/corekit/fields/ipaddress.py +274 -0
  135. pcapkit/corekit/fields/misc.py +722 -0
  136. pcapkit/corekit/fields/numbers.py +375 -0
  137. pcapkit/corekit/fields/strings.py +245 -0
  138. pcapkit/corekit/infoclass.py +394 -0
  139. pcapkit/corekit/io.py +506 -0
  140. pcapkit/corekit/module.py +39 -0
  141. pcapkit/corekit/multidict.py +626 -0
  142. pcapkit/corekit/protochain.py +263 -0
  143. pcapkit/corekit/version.py +33 -0
  144. pcapkit/dumpkit/__init__.py +15 -0
  145. pcapkit/dumpkit/common.py +199 -0
  146. pcapkit/dumpkit/null.py +77 -0
  147. pcapkit/dumpkit/pcap.py +144 -0
  148. pcapkit/foundation/__init__.py +45 -0
  149. pcapkit/foundation/engines/__init__.py +36 -0
  150. pcapkit/foundation/engines/dpkt.py +230 -0
  151. pcapkit/foundation/engines/engine.py +194 -0
  152. pcapkit/foundation/engines/pcap.py +188 -0
  153. pcapkit/foundation/engines/pcapng.py +310 -0
  154. pcapkit/foundation/engines/pyshark.py +166 -0
  155. pcapkit/foundation/engines/scapy.py +161 -0
  156. pcapkit/foundation/extraction.py +915 -0
  157. pcapkit/foundation/reassembly/__init__.py +49 -0
  158. pcapkit/foundation/reassembly/data/__init__.py +48 -0
  159. pcapkit/foundation/reassembly/data/ip.py +117 -0
  160. pcapkit/foundation/reassembly/data/tcp.py +145 -0
  161. pcapkit/foundation/reassembly/ip.py +192 -0
  162. pcapkit/foundation/reassembly/ipv4.py +50 -0
  163. pcapkit/foundation/reassembly/ipv6.py +50 -0
  164. pcapkit/foundation/reassembly/reassembly.py +389 -0
  165. pcapkit/foundation/reassembly/tcp.py +249 -0
  166. pcapkit/foundation/registry/__init__.py +41 -0
  167. pcapkit/foundation/registry/foundation.py +327 -0
  168. pcapkit/foundation/registry/protocols.py +885 -0
  169. pcapkit/foundation/traceflow/__init__.py +44 -0
  170. pcapkit/foundation/traceflow/data/__init__.py +30 -0
  171. pcapkit/foundation/traceflow/data/tcp.py +105 -0
  172. pcapkit/foundation/traceflow/tcp.py +159 -0
  173. pcapkit/foundation/traceflow/traceflow.py +390 -0
  174. pcapkit/interface/__init__.py +22 -0
  175. pcapkit/interface/core.py +185 -0
  176. pcapkit/interface/misc.py +120 -0
  177. pcapkit/protocols/__init__.py +85 -0
  178. pcapkit/protocols/application/NotImplemented/bgp.py +0 -0
  179. pcapkit/protocols/application/NotImplemented/dhcp.py +0 -0
  180. pcapkit/protocols/application/NotImplemented/dhcpv6.py +0 -0
  181. pcapkit/protocols/application/NotImplemented/dns.py +0 -0
  182. pcapkit/protocols/application/NotImplemented/imap.py +0 -0
  183. pcapkit/protocols/application/NotImplemented/ldap.py +0 -0
  184. pcapkit/protocols/application/NotImplemented/mqtt.py +0 -0
  185. pcapkit/protocols/application/NotImplemented/nntp.py +0 -0
  186. pcapkit/protocols/application/NotImplemented/ntp.py +0 -0
  187. pcapkit/protocols/application/NotImplemented/onc_rpc.py +0 -0
  188. pcapkit/protocols/application/NotImplemented/pop.py +0 -0
  189. pcapkit/protocols/application/NotImplemented/rip.py +0 -0
  190. pcapkit/protocols/application/NotImplemented/rtp.py +0 -0
  191. pcapkit/protocols/application/NotImplemented/sip.py +0 -0
  192. pcapkit/protocols/application/NotImplemented/smtp.py +0 -0
  193. pcapkit/protocols/application/NotImplemented/snmp.py +0 -0
  194. pcapkit/protocols/application/NotImplemented/ssh.py +0 -0
  195. pcapkit/protocols/application/NotImplemented/telnet.py +0 -0
  196. pcapkit/protocols/application/NotImplemented/tls.py +0 -0
  197. pcapkit/protocols/application/NotImplemented/xmpp.py +0 -0
  198. pcapkit/protocols/application/__init__.py +34 -0
  199. pcapkit/protocols/application/application.py +114 -0
  200. pcapkit/protocols/application/ftp.py +206 -0
  201. pcapkit/protocols/application/http.py +176 -0
  202. pcapkit/protocols/application/httpv1.py +320 -0
  203. pcapkit/protocols/application/httpv2.py +1255 -0
  204. pcapkit/protocols/data/__init__.py +192 -0
  205. pcapkit/protocols/data/application/__init__.py +57 -0
  206. pcapkit/protocols/data/application/ftp.py +59 -0
  207. pcapkit/protocols/data/application/httpv1.py +79 -0
  208. pcapkit/protocols/data/application/httpv2.py +293 -0
  209. pcapkit/protocols/data/data.py +25 -0
  210. pcapkit/protocols/data/internet/__init__.py +298 -0
  211. pcapkit/protocols/data/internet/ah.py +31 -0
  212. pcapkit/protocols/data/internet/hip.py +804 -0
  213. pcapkit/protocols/data/internet/hopopt.py +351 -0
  214. pcapkit/protocols/data/internet/ipv4.py +369 -0
  215. pcapkit/protocols/data/internet/ipv6.py +67 -0
  216. pcapkit/protocols/data/internet/ipv6_frag.py +29 -0
  217. pcapkit/protocols/data/internet/ipv6_opts.py +368 -0
  218. pcapkit/protocols/data/internet/ipv6_route.py +86 -0
  219. pcapkit/protocols/data/internet/ipx.py +56 -0
  220. pcapkit/protocols/data/internet/mh.py +509 -0
  221. pcapkit/protocols/data/link/__init__.py +33 -0
  222. pcapkit/protocols/data/link/arp.py +74 -0
  223. pcapkit/protocols/data/link/ethernet.py +28 -0
  224. pcapkit/protocols/data/link/l2tp.py +63 -0
  225. pcapkit/protocols/data/link/ospf.py +58 -0
  226. pcapkit/protocols/data/link/vlan.py +42 -0
  227. pcapkit/protocols/data/misc/__init__.py +109 -0
  228. pcapkit/protocols/data/misc/null.py +18 -0
  229. pcapkit/protocols/data/misc/pcap/__init__.py +18 -0
  230. pcapkit/protocols/data/misc/pcap/frame.py +56 -0
  231. pcapkit/protocols/data/misc/pcap/header.py +53 -0
  232. pcapkit/protocols/data/misc/pcapng.py +925 -0
  233. pcapkit/protocols/data/misc/raw.py +25 -0
  234. pcapkit/protocols/data/protocol.py +32 -0
  235. pcapkit/protocols/data/transport/__init__.py +71 -0
  236. pcapkit/protocols/data/transport/tcp.py +555 -0
  237. pcapkit/protocols/data/transport/udp.py +29 -0
  238. pcapkit/protocols/internet/NotImplemented/ecn.py +0 -0
  239. pcapkit/protocols/internet/NotImplemented/esp.py +97 -0
  240. pcapkit/protocols/internet/NotImplemented/icmp.py +0 -0
  241. pcapkit/protocols/internet/NotImplemented/icmpv6.py +0 -0
  242. pcapkit/protocols/internet/NotImplemented/igmp.py +0 -0
  243. pcapkit/protocols/internet/NotImplemented/shim6.py +0 -0
  244. pcapkit/protocols/internet/__init__.py +43 -0
  245. pcapkit/protocols/internet/ah.py +275 -0
  246. pcapkit/protocols/internet/hip.py +4727 -0
  247. pcapkit/protocols/internet/hopopt.py +1879 -0
  248. pcapkit/protocols/internet/internet.py +249 -0
  249. pcapkit/protocols/internet/ip.py +51 -0
  250. pcapkit/protocols/internet/ipsec.py +50 -0
  251. pcapkit/protocols/internet/ipv4.py +1782 -0
  252. pcapkit/protocols/internet/ipv6.py +412 -0
  253. pcapkit/protocols/internet/ipv6_frag.py +258 -0
  254. pcapkit/protocols/internet/ipv6_opts.py +1890 -0
  255. pcapkit/protocols/internet/ipv6_route.py +708 -0
  256. pcapkit/protocols/internet/ipx.py +230 -0
  257. pcapkit/protocols/internet/mh.py +2764 -0
  258. pcapkit/protocols/link/NotImplemented/dsl.py +0 -0
  259. pcapkit/protocols/link/NotImplemented/eapol.py +1 -0
  260. pcapkit/protocols/link/NotImplemented/fddi.py +0 -0
  261. pcapkit/protocols/link/NotImplemented/isdn.py +0 -0
  262. pcapkit/protocols/link/NotImplemented/ndp.py +0 -0
  263. pcapkit/protocols/link/NotImplemented/ppp.py +0 -0
  264. pcapkit/protocols/link/__init__.py +35 -0
  265. pcapkit/protocols/link/arp.py +421 -0
  266. pcapkit/protocols/link/ethernet.py +248 -0
  267. pcapkit/protocols/link/l2tp.py +267 -0
  268. pcapkit/protocols/link/link.py +140 -0
  269. pcapkit/protocols/link/ospf.py +342 -0
  270. pcapkit/protocols/link/rarp.py +82 -0
  271. pcapkit/protocols/link/vlan.py +225 -0
  272. pcapkit/protocols/misc/__init__.py +37 -0
  273. pcapkit/protocols/misc/null.py +129 -0
  274. pcapkit/protocols/misc/pcap/__init__.py +17 -0
  275. pcapkit/protocols/misc/pcap/frame.py +478 -0
  276. pcapkit/protocols/misc/pcap/header.py +358 -0
  277. pcapkit/protocols/misc/pcapng.py +5520 -0
  278. pcapkit/protocols/misc/raw.py +180 -0
  279. pcapkit/protocols/protocol.py +1216 -0
  280. pcapkit/protocols/schema/__init__.py +140 -0
  281. pcapkit/protocols/schema/application/__init__.py +40 -0
  282. pcapkit/protocols/schema/application/ftp.py +21 -0
  283. pcapkit/protocols/schema/application/httpv1.py +21 -0
  284. pcapkit/protocols/schema/application/httpv2.py +384 -0
  285. pcapkit/protocols/schema/internet/__init__.py +294 -0
  286. pcapkit/protocols/schema/internet/ah.py +40 -0
  287. pcapkit/protocols/schema/internet/hip.py +1184 -0
  288. pcapkit/protocols/schema/internet/hopopt.py +679 -0
  289. pcapkit/protocols/schema/internet/ipv4.py +576 -0
  290. pcapkit/protocols/schema/internet/ipv6.py +63 -0
  291. pcapkit/protocols/schema/internet/ipv6_frag.py +48 -0
  292. pcapkit/protocols/schema/internet/ipv6_opts.py +680 -0
  293. pcapkit/protocols/schema/internet/ipv6_route.py +197 -0
  294. pcapkit/protocols/schema/internet/ipx.py +40 -0
  295. pcapkit/protocols/schema/internet/mh.py +718 -0
  296. pcapkit/protocols/schema/link/__init__.py +19 -0
  297. pcapkit/protocols/schema/link/arp.py +39 -0
  298. pcapkit/protocols/schema/link/ethernet.py +51 -0
  299. pcapkit/protocols/schema/link/l2tp.py +88 -0
  300. pcapkit/protocols/schema/link/ospf.py +90 -0
  301. pcapkit/protocols/schema/link/vlan.py +69 -0
  302. pcapkit/protocols/schema/misc/__init__.py +108 -0
  303. pcapkit/protocols/schema/misc/null.py +18 -0
  304. pcapkit/protocols/schema/misc/pcap/__init__.py +10 -0
  305. pcapkit/protocols/schema/misc/pcap/frame.py +51 -0
  306. pcapkit/protocols/schema/misc/pcap/header.py +63 -0
  307. pcapkit/protocols/schema/misc/pcapng.py +1689 -0
  308. pcapkit/protocols/schema/misc/raw.py +24 -0
  309. pcapkit/protocols/schema/schema.py +809 -0
  310. pcapkit/protocols/schema/transport/__init__.py +69 -0
  311. pcapkit/protocols/schema/transport/tcp.py +928 -0
  312. pcapkit/protocols/schema/transport/udp.py +90 -0
  313. pcapkit/protocols/transport/NotImplemented/dccp.py +0 -0
  314. pcapkit/protocols/transport/NotImplemented/rsvp.py +0 -0
  315. pcapkit/protocols/transport/NotImplemented/sctp.py +0 -0
  316. pcapkit/protocols/transport/__init__.py +27 -0
  317. pcapkit/protocols/transport/tcp.py +3025 -0
  318. pcapkit/protocols/transport/transport.py +158 -0
  319. pcapkit/protocols/transport/udp.py +214 -0
  320. pcapkit/py.typed +0 -0
  321. pcapkit/toolkit/__init__.py +57 -0
  322. pcapkit/toolkit/dpkt.py +306 -0
  323. pcapkit/toolkit/pcap.py +212 -0
  324. pcapkit/toolkit/pcapng.py +251 -0
  325. pcapkit/toolkit/pyshark.py +99 -0
  326. pcapkit/toolkit/scapy.py +297 -0
  327. pcapkit/utilities/__init__.py +20 -0
  328. pcapkit/utilities/compat.py +196 -0
  329. pcapkit/utilities/decorators.py +197 -0
  330. pcapkit/utilities/exceptions.py +365 -0
  331. pcapkit/utilities/logging.py +55 -0
  332. pcapkit/utilities/warnings.py +185 -0
  333. pcapkit/vendor/__init__.py +105 -0
  334. pcapkit/vendor/__main__.py +92 -0
  335. pcapkit/vendor/arp/__init__.py +27 -0
  336. pcapkit/vendor/arp/hardware.py +29 -0
  337. pcapkit/vendor/arp/operation.py +29 -0
  338. pcapkit/vendor/default.py +474 -0
  339. pcapkit/vendor/ftp/__init__.py +27 -0
  340. pcapkit/vendor/ftp/command.py +244 -0
  341. pcapkit/vendor/ftp/return_code.py +256 -0
  342. pcapkit/vendor/hip/__init__.py +94 -0
  343. pcapkit/vendor/hip/certificate.py +29 -0
  344. pcapkit/vendor/hip/cipher.py +29 -0
  345. pcapkit/vendor/hip/di.py +29 -0
  346. pcapkit/vendor/hip/ecdsa_curve.py +29 -0
  347. pcapkit/vendor/hip/ecdsa_low_curve.py +29 -0
  348. pcapkit/vendor/hip/eddsa_curve.py +85 -0
  349. pcapkit/vendor/hip/esp_transform_suite.py +29 -0
  350. pcapkit/vendor/hip/group.py +87 -0
  351. pcapkit/vendor/hip/hi_algorithm.py +29 -0
  352. pcapkit/vendor/hip/hit_suite.py +29 -0
  353. pcapkit/vendor/hip/nat_traversal.py +29 -0
  354. pcapkit/vendor/hip/notify_message.py +29 -0
  355. pcapkit/vendor/hip/packet.py +88 -0
  356. pcapkit/vendor/hip/parameter.py +88 -0
  357. pcapkit/vendor/hip/registration.py +29 -0
  358. pcapkit/vendor/hip/registration_failure.py +29 -0
  359. pcapkit/vendor/hip/suite.py +29 -0
  360. pcapkit/vendor/hip/transport.py +29 -0
  361. pcapkit/vendor/http/__init__.py +39 -0
  362. pcapkit/vendor/http/error_code.py +95 -0
  363. pcapkit/vendor/http/frame.py +91 -0
  364. pcapkit/vendor/http/method.py +167 -0
  365. pcapkit/vendor/http/setting.py +93 -0
  366. pcapkit/vendor/http/status_code.py +185 -0
  367. pcapkit/vendor/ipv4/__init__.py +57 -0
  368. pcapkit/vendor/ipv4/classification_level.py +91 -0
  369. pcapkit/vendor/ipv4/option_class.py +80 -0
  370. pcapkit/vendor/ipv4/option_number.py +105 -0
  371. pcapkit/vendor/ipv4/protection_authority.py +84 -0
  372. pcapkit/vendor/ipv4/qs_function.py +78 -0
  373. pcapkit/vendor/ipv4/router_alert.py +93 -0
  374. pcapkit/vendor/ipv4/tos_del.py +78 -0
  375. pcapkit/vendor/ipv4/tos_ecn.py +95 -0
  376. pcapkit/vendor/ipv4/tos_pre.py +84 -0
  377. pcapkit/vendor/ipv4/tos_rel.py +78 -0
  378. pcapkit/vendor/ipv4/tos_thr.py +77 -0
  379. pcapkit/vendor/ipv4/ts_flag.py +79 -0
  380. pcapkit/vendor/ipv6/__init__.py +53 -0
  381. pcapkit/vendor/ipv6/extension_header.py +171 -0
  382. pcapkit/vendor/ipv6/option.py +104 -0
  383. pcapkit/vendor/ipv6/option_action.py +90 -0
  384. pcapkit/vendor/ipv6/qs_function.py +78 -0
  385. pcapkit/vendor/ipv6/router_alert.py +93 -0
  386. pcapkit/vendor/ipv6/routing.py +87 -0
  387. pcapkit/vendor/ipv6/seed_id.py +81 -0
  388. pcapkit/vendor/ipv6/smf_dpd_mode.py +78 -0
  389. pcapkit/vendor/ipv6/tagger_id.py +81 -0
  390. pcapkit/vendor/ipx/__init__.py +37 -0
  391. pcapkit/vendor/ipx/packet.py +123 -0
  392. pcapkit/vendor/ipx/socket.py +125 -0
  393. pcapkit/vendor/l2tp/__init__.py +21 -0
  394. pcapkit/vendor/l2tp/type.py +78 -0
  395. pcapkit/vendor/mh/__init__.py +204 -0
  396. pcapkit/vendor/mh/access_type.py +87 -0
  397. pcapkit/vendor/mh/ack_status_code.py +88 -0
  398. pcapkit/vendor/mh/ani_suboption.py +88 -0
  399. pcapkit/vendor/mh/auth_subtype.py +83 -0
  400. pcapkit/vendor/mh/binding_ack_flag.py +148 -0
  401. pcapkit/vendor/mh/binding_error.py +78 -0
  402. pcapkit/vendor/mh/binding_revocation.py +87 -0
  403. pcapkit/vendor/mh/binding_update_flag.py +147 -0
  404. pcapkit/vendor/mh/cga_extension.py +91 -0
  405. pcapkit/vendor/mh/cga_sec.py +91 -0
  406. pcapkit/vendor/mh/cga_type.py +74 -0
  407. pcapkit/vendor/mh/dhcp_support_mode.py +77 -0
  408. pcapkit/vendor/mh/dns_status_code.py +87 -0
  409. pcapkit/vendor/mh/dsmip6_tls_packet.py +87 -0
  410. pcapkit/vendor/mh/dsmipv6_home_address.py +87 -0
  411. pcapkit/vendor/mh/enumerating_algorithm.py +82 -0
  412. pcapkit/vendor/mh/fb_ack_status.py +87 -0
  413. pcapkit/vendor/mh/fb_action.py +88 -0
  414. pcapkit/vendor/mh/fb_indication_trigger.py +87 -0
  415. pcapkit/vendor/mh/fb_type.py +88 -0
  416. pcapkit/vendor/mh/flow_id_status.py +87 -0
  417. pcapkit/vendor/mh/flow_id_suboption.py +87 -0
  418. pcapkit/vendor/mh/handoff_type.py +87 -0
  419. pcapkit/vendor/mh/handover_ack_flag.py +143 -0
  420. pcapkit/vendor/mh/handover_ack_status.py +87 -0
  421. pcapkit/vendor/mh/handover_initiate_flag.py +143 -0
  422. pcapkit/vendor/mh/handover_initiate_status.py +87 -0
  423. pcapkit/vendor/mh/home_address_reply.py +87 -0
  424. pcapkit/vendor/mh/lla_code.py +97 -0
  425. pcapkit/vendor/mh/lma_mag_suboption.py +88 -0
  426. pcapkit/vendor/mh/mn_group_id.py +87 -0
  427. pcapkit/vendor/mh/mn_id_subtype.py +87 -0
  428. pcapkit/vendor/mh/operator_id.py +87 -0
  429. pcapkit/vendor/mh/option.py +83 -0
  430. pcapkit/vendor/mh/packet.py +82 -0
  431. pcapkit/vendor/mh/qos_attribute.py +87 -0
  432. pcapkit/vendor/mh/revocation_status_code.py +87 -0
  433. pcapkit/vendor/mh/revocation_trigger.py +87 -0
  434. pcapkit/vendor/mh/status_code.py +91 -0
  435. pcapkit/vendor/mh/traffic_selector.py +87 -0
  436. pcapkit/vendor/mh/upa_status.py +87 -0
  437. pcapkit/vendor/mh/upn_reason.py +87 -0
  438. pcapkit/vendor/ospf/__init__.py +27 -0
  439. pcapkit/vendor/ospf/authentication.py +29 -0
  440. pcapkit/vendor/ospf/packet.py +29 -0
  441. pcapkit/vendor/pcapng/__init__.py +51 -0
  442. pcapkit/vendor/pcapng/block_type.py +94 -0
  443. pcapkit/vendor/pcapng/filter_type.py +77 -0
  444. pcapkit/vendor/pcapng/hash_algorithm.py +82 -0
  445. pcapkit/vendor/pcapng/option_type.py +287 -0
  446. pcapkit/vendor/pcapng/record_type.py +81 -0
  447. pcapkit/vendor/pcapng/secrets_type.py +81 -0
  448. pcapkit/vendor/pcapng/verdict_type.py +79 -0
  449. pcapkit/vendor/reg/__init__.py +34 -0
  450. pcapkit/vendor/reg/apptype.py +338 -0
  451. pcapkit/vendor/reg/ethertype.py +121 -0
  452. pcapkit/vendor/reg/linktype.py +110 -0
  453. pcapkit/vendor/reg/transtype.py +111 -0
  454. pcapkit/vendor/tcp/__init__.py +35 -0
  455. pcapkit/vendor/tcp/checksum.py +80 -0
  456. pcapkit/vendor/tcp/flags.py +149 -0
  457. pcapkit/vendor/tcp/mp_tcp_option.py +90 -0
  458. pcapkit/vendor/tcp/option.py +103 -0
  459. pcapkit/vendor/vlan/__init__.py +23 -0
  460. pcapkit/vendor/vlan/priority_level.py +97 -0
  461. pypcapkit-1.3.5.post6.dist-info/LICENSE +29 -0
  462. pypcapkit-1.3.5.post6.dist-info/METADATA +238 -0
  463. pypcapkit-1.3.5.post6.dist-info/RECORD +466 -0
  464. pypcapkit-1.3.5.post6.dist-info/WHEEL +5 -0
  465. pypcapkit-1.3.5.post6.dist-info/entry_points.txt +3 -0
  466. pypcapkit-1.3.5.post6.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
@@ -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'