From 923d329612a142d9eb8bd9f29f820b535170154a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 13 Aug 2026 04:12:13 +0000 Subject: [PATCH 1/4] Initial plan From 4b7746687bfc26ac28f0c978cf25d53018367c74 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 13 Aug 2026 04:14:09 +0000 Subject: [PATCH 2/4] fix: restrict create-release tag job permissions Co-authored-by: JarryShaw <15666417+JarryShaw@users.noreply.github.com> --- .github/workflows/create-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index ed78b67eb5..c403cf65b1 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -83,6 +83,7 @@ jobs: tag: name: Conda Tag runs-on: ubuntu-latest + permissions: {} needs: [ version_check ] if: ${{ startsWith(github.ref_name, 'v') || needs.version_check.outputs.PCAPKIT_TAG_EXISTS == 'false' }} steps: From d24cf2cb4b6fe2a0a23f9565d97544001e4dd1ec Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 13 Sep 2026 19:58:54 +0000 Subject: [PATCH 3/4] fix: resolve workflow merge conflict Co-authored-by: JarryShaw <15666417+JarryShaw@users.noreply.github.com> --- docs/source/pcapkit/foundation/reassembly/tcp.rst | 2 +- pcapkit/foundation/reassembly/data/__init__.py | 3 ++- pcapkit/foundation/reassembly/data/tcp.py | 11 +++++++---- pcapkit/foundation/reassembly/tcp.py | 8 ++++---- tests/foundation/reassembly/data/test_models.py | 8 +++++--- tests/foundation/reassembly/test_tcp.py | 14 +++++++------- 6 files changed, 26 insertions(+), 20 deletions(-) diff --git a/docs/source/pcapkit/foundation/reassembly/tcp.rst b/docs/source/pcapkit/foundation/reassembly/tcp.rst index 067bcf7aea..63045e47c8 100644 --- a/docs/source/pcapkit/foundation/reassembly/tcp.rst +++ b/docs/source/pcapkit/foundation/reassembly/tcp.rst @@ -253,7 +253,7 @@ Data Models :members: :show-inheritance: -.. autoclass:: pcapkit.foundation.reassembly.data.tcp.HoleDiscriptor +.. autoclass:: pcapkit.foundation.reassembly.data.tcp.HoleDescriptor :members: :show-inheritance: diff --git a/pcapkit/foundation/reassembly/data/__init__.py b/pcapkit/foundation/reassembly/data/__init__.py index bb30076136..f05a9549e2 100644 --- a/pcapkit/foundation/reassembly/data/__init__.py +++ b/pcapkit/foundation/reassembly/data/__init__.py @@ -14,6 +14,7 @@ from pcapkit.foundation.reassembly.data.tcp import Datagram as TCP_Datagram from pcapkit.foundation.reassembly.data.tcp import DatagramID as TCP_DatagramID from pcapkit.foundation.reassembly.data.tcp import Fragment as TCP_Fragment +from pcapkit.foundation.reassembly.data.tcp import HoleDescriptor as TCP_HoleDescriptor from pcapkit.foundation.reassembly.data.tcp import HoleDiscriptor as TCP_HoleDiscriptor from pcapkit.foundation.reassembly.data.tcp import Packet as TCP_Packet @@ -22,7 +23,7 @@ 'IP_BufferID', 'TCP_Packet', 'TCP_DatagramID', 'TCP_Datagram', 'TCP_Buffer', - 'TCP_Fragment', 'TCP_HoleDiscriptor', 'TCP_BufferID', + 'TCP_Fragment', 'TCP_HoleDescriptor', 'TCP_HoleDiscriptor', 'TCP_BufferID', ] from typing import TYPE_CHECKING diff --git a/pcapkit/foundation/reassembly/data/tcp.py b/pcapkit/foundation/reassembly/data/tcp.py index 42dc6eafc7..7c8673ac69 100644 --- a/pcapkit/foundation/reassembly/data/tcp.py +++ b/pcapkit/foundation/reassembly/data/tcp.py @@ -7,7 +7,7 @@ from pcapkit.utilities.compat import Tuple __all__ = [ - 'Packet', 'DatagramID', 'Datagram', 'HoleDiscriptor', + 'Packet', 'DatagramID', 'Datagram', 'HoleDescriptor', 'HoleDiscriptor', 'Fragment', 'Buffer', 'BufferID', ] @@ -101,7 +101,7 @@ def __init__(self, completed: 'bool', id: 'DatagramID[_AT]', index: 'tuple[int, @info_final -class HoleDiscriptor(Info): +class HoleDescriptor(Info): """Data model for :term:`TCP ` hole descriptor.""" #: Start of hole. @@ -113,6 +113,9 @@ class HoleDiscriptor(Info): def __init__(self, first: 'int', last: 'int') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin +HoleDiscriptor = HoleDescriptor + + @info_final class Fragment(Info): """Data model for :term:`TCP ` ACK list fragment item.""" @@ -135,11 +138,11 @@ class Buffer(Info): """Data model for :term:`TCP ` buffer entry.""" #: Hole descriptor list. - hdl: 'list[HoleDiscriptor]' + hdl: 'list[HoleDescriptor]' #: Initial TCP header. hdr: 'bytes' #: ACK list. ack: 'dict[int, Fragment]' if TYPE_CHECKING: - def __init__(self, hdl: 'list[HoleDiscriptor]', hdr: 'bytes', ack: 'dict[int, Fragment]') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin + def __init__(self, hdl: 'list[HoleDescriptor]', hdr: 'bytes', ack: 'dict[int, Fragment]') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin diff --git a/pcapkit/foundation/reassembly/tcp.py b/pcapkit/foundation/reassembly/tcp.py index 9f334b5e45..2134ade52f 100644 --- a/pcapkit/foundation/reassembly/tcp.py +++ b/pcapkit/foundation/reassembly/tcp.py @@ -13,7 +13,7 @@ from typing import TYPE_CHECKING from pcapkit.foundation.reassembly.data.tcp import (Buffer, BufferID, Datagram, DatagramID, - Fragment, HoleDiscriptor, Packet) + Fragment, HoleDescriptor, Packet) from pcapkit.foundation.reassembly.reassembly import ReassemblyBase as Reassembly from pcapkit.protocols.transport.tcp import TCP as TCP_Protocol @@ -87,7 +87,7 @@ def reassembly(self, info: 'Packet') -> 'None': if BUFID not in self._buffer: self._buffer[BUFID] = Buffer( hdl=[ - HoleDiscriptor( + HoleDescriptor( first=info.len, last=sys.maxsize, ), @@ -159,14 +159,14 @@ def reassembly(self, info: 'Packet') -> 'None': continue del HDL[index] # step four if info.first > hole.first: # step five - new_hole = HoleDiscriptor( + new_hole = HoleDescriptor( first=hole.first, last=info.first - 1, ) HDL.insert(index, new_hole) index += 1 if info.last < hole.last and not FIN and not RST: # step six - new_hole = HoleDiscriptor( + new_hole = HoleDescriptor( first=info.last + 1, last=hole.last ) diff --git a/tests/foundation/reassembly/data/test_models.py b/tests/foundation/reassembly/data/test_models.py index 8d2a709d90..4148141cf7 100644 --- a/tests/foundation/reassembly/data/test_models.py +++ b/tests/foundation/reassembly/data/test_models.py @@ -48,10 +48,10 @@ def test_ip_data_models_and_package_aliases(self) -> None: def test_tcp_data_models_and_package_aliases(self) -> None: from pcapkit.foundation.reassembly.data import (TCP_Buffer, TCP_Datagram, TCP_DatagramID, - TCP_Fragment, TCP_HoleDiscriptor, + TCP_Fragment, TCP_HoleDescriptor, TCP_HoleDiscriptor, TCP_Packet) from pcapkit.foundation.reassembly.data.tcp import (Buffer, Datagram, DatagramID, - Fragment, HoleDiscriptor, Packet) + Fragment, HoleDescriptor, HoleDiscriptor, Packet) src = ip_address('192.0.2.10') dst = ip_address('198.51.100.20') @@ -69,9 +69,11 @@ def test_tcp_data_models_and_package_aliases(self) -> None: self.assertIsInstance(datagram, TCP_Datagram) self.assertTrue(datagram.completed) - hole = HoleDiscriptor(5, 10) + hole = HoleDescriptor(5, 10) fragment = Fragment([3], 100, 5, bytearray(b'hello')) buffer = Buffer([hole], b'tcp-header', {200: fragment}) + self.assertIs(HoleDiscriptor, HoleDescriptor) + self.assertIsInstance(hole, TCP_HoleDescriptor) self.assertIsInstance(hole, TCP_HoleDiscriptor) self.assertIsInstance(fragment, TCP_Fragment) self.assertIsInstance(buffer, TCP_Buffer) diff --git a/tests/foundation/reassembly/test_tcp.py b/tests/foundation/reassembly/test_tcp.py index 6e161882ea..42d2b0f784 100644 --- a/tests/foundation/reassembly/test_tcp.py +++ b/tests/foundation/reassembly/test_tcp.py @@ -80,7 +80,7 @@ class TestTCP(TCP): self.assertEqual(reasm._buffer[self._bufid()].hdr, b'new-header') def test_fragment_merging_covers_gaps_overlaps_new_acks_and_holes(self) -> None: - from pcapkit.foundation.reassembly.data.tcp import Buffer, Fragment, HoleDiscriptor + from pcapkit.foundation.reassembly.data.tcp import Buffer, Fragment, HoleDescriptor from pcapkit.foundation.reassembly.tcp import TCP class Analyzer: @@ -94,7 +94,7 @@ class TestTCP(TCP): reasm = TestTCP() bufid = self._bufid() reasm._buffer[bufid] = Buffer( - [HoleDiscriptor(0, 4), HoleDiscriptor(20, 30), HoleDiscriptor(40, sys.maxsize)], + [HoleDescriptor(0, 4), HoleDescriptor(20, 30), HoleDescriptor(40, sys.maxsize)], b'', { 500: Fragment([1], 10, 10, bytearray(b'0123456789')), @@ -120,7 +120,7 @@ class TestTCP(TCP): before_gap = TestTCP() before_gap._buffer[bufid] = Buffer( - [HoleDiscriptor(50, sys.maxsize)], + [HoleDescriptor(50, sys.maxsize)], b'', {500: Fragment([1], 10, 5, bytearray(b'world'))}, ) @@ -129,7 +129,7 @@ class TestTCP(TCP): bytearray(b'hello\x00\x00\x00\x00\x00world')) def test_submit_incomplete_strict_complete_strict_false_and_empty_buffers(self) -> None: - from pcapkit.foundation.reassembly.data.tcp import Buffer, Fragment, HoleDiscriptor + from pcapkit.foundation.reassembly.data.tcp import Buffer, Fragment, HoleDescriptor from pcapkit.foundation.reassembly.tcp import TCP class Analyzer: @@ -147,7 +147,7 @@ class TestTCP(TCP): strict = TestTCP() incomplete = strict.submit( Buffer( - [HoleDiscriptor(2, 3), HoleDiscriptor(7, 8), HoleDiscriptor(99, 100)], + [HoleDescriptor(2, 3), HoleDescriptor(7, 8), HoleDescriptor(99, 100)], b'tcp-header', {500: Fragment([1, 2], 0, 10, bytearray(b'abcdefghij'))}, ), @@ -160,7 +160,7 @@ class TestTCP(TCP): mixed = strict.submit( Buffer( - [HoleDiscriptor(0, 0), HoleDiscriptor(4, 5), HoleDiscriptor(7, 7)], + [HoleDescriptor(0, 0), HoleDescriptor(4, 5), HoleDescriptor(7, 7)], b'tcp-header', { 500: Fragment([], 0, 0, bytearray()), @@ -175,7 +175,7 @@ class TestTCP(TCP): loose = TestTCP(strict=False) completed = loose.submit( Buffer( - [HoleDiscriptor(2, 3), HoleDiscriptor(7, 8), HoleDiscriptor(99, 100)], + [HoleDescriptor(2, 3), HoleDescriptor(7, 8), HoleDescriptor(99, 100)], b'tcp-header', {500: Fragment([3], 0, 3, bytearray(b'abc'))}, ), From 1dd16c7902c17c73460e30da3c61fd3d1317ee47 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 13 Sep 2026 23:57:42 +0000 Subject: [PATCH 4/4] fix: drop unrelated TCP hole descriptor changes Co-authored-by: JarryShaw <15666417+JarryShaw@users.noreply.github.com> --- docs/source/pcapkit/foundation/reassembly/tcp.rst | 2 +- pcapkit/foundation/reassembly/data/__init__.py | 3 +-- pcapkit/foundation/reassembly/data/tcp.py | 11 ++++------- pcapkit/foundation/reassembly/tcp.py | 8 ++++---- tests/foundation/reassembly/data/test_models.py | 8 +++----- tests/foundation/reassembly/test_tcp.py | 14 +++++++------- 6 files changed, 20 insertions(+), 26 deletions(-) diff --git a/docs/source/pcapkit/foundation/reassembly/tcp.rst b/docs/source/pcapkit/foundation/reassembly/tcp.rst index 63045e47c8..067bcf7aea 100644 --- a/docs/source/pcapkit/foundation/reassembly/tcp.rst +++ b/docs/source/pcapkit/foundation/reassembly/tcp.rst @@ -253,7 +253,7 @@ Data Models :members: :show-inheritance: -.. autoclass:: pcapkit.foundation.reassembly.data.tcp.HoleDescriptor +.. autoclass:: pcapkit.foundation.reassembly.data.tcp.HoleDiscriptor :members: :show-inheritance: diff --git a/pcapkit/foundation/reassembly/data/__init__.py b/pcapkit/foundation/reassembly/data/__init__.py index f05a9549e2..bb30076136 100644 --- a/pcapkit/foundation/reassembly/data/__init__.py +++ b/pcapkit/foundation/reassembly/data/__init__.py @@ -14,7 +14,6 @@ from pcapkit.foundation.reassembly.data.tcp import Datagram as TCP_Datagram from pcapkit.foundation.reassembly.data.tcp import DatagramID as TCP_DatagramID from pcapkit.foundation.reassembly.data.tcp import Fragment as TCP_Fragment -from pcapkit.foundation.reassembly.data.tcp import HoleDescriptor as TCP_HoleDescriptor from pcapkit.foundation.reassembly.data.tcp import HoleDiscriptor as TCP_HoleDiscriptor from pcapkit.foundation.reassembly.data.tcp import Packet as TCP_Packet @@ -23,7 +22,7 @@ 'IP_BufferID', 'TCP_Packet', 'TCP_DatagramID', 'TCP_Datagram', 'TCP_Buffer', - 'TCP_Fragment', 'TCP_HoleDescriptor', 'TCP_HoleDiscriptor', 'TCP_BufferID', + 'TCP_Fragment', 'TCP_HoleDiscriptor', 'TCP_BufferID', ] from typing import TYPE_CHECKING diff --git a/pcapkit/foundation/reassembly/data/tcp.py b/pcapkit/foundation/reassembly/data/tcp.py index 7c8673ac69..42dc6eafc7 100644 --- a/pcapkit/foundation/reassembly/data/tcp.py +++ b/pcapkit/foundation/reassembly/data/tcp.py @@ -7,7 +7,7 @@ from pcapkit.utilities.compat import Tuple __all__ = [ - 'Packet', 'DatagramID', 'Datagram', 'HoleDescriptor', 'HoleDiscriptor', + 'Packet', 'DatagramID', 'Datagram', 'HoleDiscriptor', 'Fragment', 'Buffer', 'BufferID', ] @@ -101,7 +101,7 @@ def __init__(self, completed: 'bool', id: 'DatagramID[_AT]', index: 'tuple[int, @info_final -class HoleDescriptor(Info): +class HoleDiscriptor(Info): """Data model for :term:`TCP ` hole descriptor.""" #: Start of hole. @@ -113,9 +113,6 @@ class HoleDescriptor(Info): def __init__(self, first: 'int', last: 'int') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin -HoleDiscriptor = HoleDescriptor - - @info_final class Fragment(Info): """Data model for :term:`TCP ` ACK list fragment item.""" @@ -138,11 +135,11 @@ class Buffer(Info): """Data model for :term:`TCP ` buffer entry.""" #: Hole descriptor list. - hdl: 'list[HoleDescriptor]' + hdl: 'list[HoleDiscriptor]' #: Initial TCP header. hdr: 'bytes' #: ACK list. ack: 'dict[int, Fragment]' if TYPE_CHECKING: - def __init__(self, hdl: 'list[HoleDescriptor]', hdr: 'bytes', ack: 'dict[int, Fragment]') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin + def __init__(self, hdl: 'list[HoleDiscriptor]', hdr: 'bytes', ack: 'dict[int, Fragment]') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long,redefined-builtin diff --git a/pcapkit/foundation/reassembly/tcp.py b/pcapkit/foundation/reassembly/tcp.py index 2134ade52f..9f334b5e45 100644 --- a/pcapkit/foundation/reassembly/tcp.py +++ b/pcapkit/foundation/reassembly/tcp.py @@ -13,7 +13,7 @@ from typing import TYPE_CHECKING from pcapkit.foundation.reassembly.data.tcp import (Buffer, BufferID, Datagram, DatagramID, - Fragment, HoleDescriptor, Packet) + Fragment, HoleDiscriptor, Packet) from pcapkit.foundation.reassembly.reassembly import ReassemblyBase as Reassembly from pcapkit.protocols.transport.tcp import TCP as TCP_Protocol @@ -87,7 +87,7 @@ def reassembly(self, info: 'Packet') -> 'None': if BUFID not in self._buffer: self._buffer[BUFID] = Buffer( hdl=[ - HoleDescriptor( + HoleDiscriptor( first=info.len, last=sys.maxsize, ), @@ -159,14 +159,14 @@ def reassembly(self, info: 'Packet') -> 'None': continue del HDL[index] # step four if info.first > hole.first: # step five - new_hole = HoleDescriptor( + new_hole = HoleDiscriptor( first=hole.first, last=info.first - 1, ) HDL.insert(index, new_hole) index += 1 if info.last < hole.last and not FIN and not RST: # step six - new_hole = HoleDescriptor( + new_hole = HoleDiscriptor( first=info.last + 1, last=hole.last ) diff --git a/tests/foundation/reassembly/data/test_models.py b/tests/foundation/reassembly/data/test_models.py index 4148141cf7..8d2a709d90 100644 --- a/tests/foundation/reassembly/data/test_models.py +++ b/tests/foundation/reassembly/data/test_models.py @@ -48,10 +48,10 @@ def test_ip_data_models_and_package_aliases(self) -> None: def test_tcp_data_models_and_package_aliases(self) -> None: from pcapkit.foundation.reassembly.data import (TCP_Buffer, TCP_Datagram, TCP_DatagramID, - TCP_Fragment, TCP_HoleDescriptor, TCP_HoleDiscriptor, + TCP_Fragment, TCP_HoleDiscriptor, TCP_Packet) from pcapkit.foundation.reassembly.data.tcp import (Buffer, Datagram, DatagramID, - Fragment, HoleDescriptor, HoleDiscriptor, Packet) + Fragment, HoleDiscriptor, Packet) src = ip_address('192.0.2.10') dst = ip_address('198.51.100.20') @@ -69,11 +69,9 @@ def test_tcp_data_models_and_package_aliases(self) -> None: self.assertIsInstance(datagram, TCP_Datagram) self.assertTrue(datagram.completed) - hole = HoleDescriptor(5, 10) + hole = HoleDiscriptor(5, 10) fragment = Fragment([3], 100, 5, bytearray(b'hello')) buffer = Buffer([hole], b'tcp-header', {200: fragment}) - self.assertIs(HoleDiscriptor, HoleDescriptor) - self.assertIsInstance(hole, TCP_HoleDescriptor) self.assertIsInstance(hole, TCP_HoleDiscriptor) self.assertIsInstance(fragment, TCP_Fragment) self.assertIsInstance(buffer, TCP_Buffer) diff --git a/tests/foundation/reassembly/test_tcp.py b/tests/foundation/reassembly/test_tcp.py index 42d2b0f784..6e161882ea 100644 --- a/tests/foundation/reassembly/test_tcp.py +++ b/tests/foundation/reassembly/test_tcp.py @@ -80,7 +80,7 @@ class TestTCP(TCP): self.assertEqual(reasm._buffer[self._bufid()].hdr, b'new-header') def test_fragment_merging_covers_gaps_overlaps_new_acks_and_holes(self) -> None: - from pcapkit.foundation.reassembly.data.tcp import Buffer, Fragment, HoleDescriptor + from pcapkit.foundation.reassembly.data.tcp import Buffer, Fragment, HoleDiscriptor from pcapkit.foundation.reassembly.tcp import TCP class Analyzer: @@ -94,7 +94,7 @@ class TestTCP(TCP): reasm = TestTCP() bufid = self._bufid() reasm._buffer[bufid] = Buffer( - [HoleDescriptor(0, 4), HoleDescriptor(20, 30), HoleDescriptor(40, sys.maxsize)], + [HoleDiscriptor(0, 4), HoleDiscriptor(20, 30), HoleDiscriptor(40, sys.maxsize)], b'', { 500: Fragment([1], 10, 10, bytearray(b'0123456789')), @@ -120,7 +120,7 @@ class TestTCP(TCP): before_gap = TestTCP() before_gap._buffer[bufid] = Buffer( - [HoleDescriptor(50, sys.maxsize)], + [HoleDiscriptor(50, sys.maxsize)], b'', {500: Fragment([1], 10, 5, bytearray(b'world'))}, ) @@ -129,7 +129,7 @@ class TestTCP(TCP): bytearray(b'hello\x00\x00\x00\x00\x00world')) def test_submit_incomplete_strict_complete_strict_false_and_empty_buffers(self) -> None: - from pcapkit.foundation.reassembly.data.tcp import Buffer, Fragment, HoleDescriptor + from pcapkit.foundation.reassembly.data.tcp import Buffer, Fragment, HoleDiscriptor from pcapkit.foundation.reassembly.tcp import TCP class Analyzer: @@ -147,7 +147,7 @@ class TestTCP(TCP): strict = TestTCP() incomplete = strict.submit( Buffer( - [HoleDescriptor(2, 3), HoleDescriptor(7, 8), HoleDescriptor(99, 100)], + [HoleDiscriptor(2, 3), HoleDiscriptor(7, 8), HoleDiscriptor(99, 100)], b'tcp-header', {500: Fragment([1, 2], 0, 10, bytearray(b'abcdefghij'))}, ), @@ -160,7 +160,7 @@ class TestTCP(TCP): mixed = strict.submit( Buffer( - [HoleDescriptor(0, 0), HoleDescriptor(4, 5), HoleDescriptor(7, 7)], + [HoleDiscriptor(0, 0), HoleDiscriptor(4, 5), HoleDiscriptor(7, 7)], b'tcp-header', { 500: Fragment([], 0, 0, bytearray()), @@ -175,7 +175,7 @@ class TestTCP(TCP): loose = TestTCP(strict=False) completed = loose.submit( Buffer( - [HoleDescriptor(2, 3), HoleDescriptor(7, 8), HoleDescriptor(99, 100)], + [HoleDiscriptor(2, 3), HoleDiscriptor(7, 8), HoleDiscriptor(99, 100)], b'tcp-header', {500: Fragment([3], 0, 3, bytearray(b'abc'))}, ),