From e3e24ea45cf55064a421d2e77d6cf58a29212a88 Mon Sep 17 00:00:00 2001 From: Jordan Borean Date: Fri, 17 Oct 2025 11:58:48 +1000 Subject: [PATCH] Update CI and build information --- .github/workflows/ci.yml | 53 +++-------------- .pre-commit-config.yaml | 4 +- CHANGELOG.md | 4 ++ README.md | 2 +- build_helpers/lib.sh | 8 +-- pyproject.toml | 11 ++-- requirements-dev.txt | 4 +- src/smbclient/_pool.py | 2 +- src/smbclient/shutil.py | 8 ++- src/smbprotocol/create_contexts.py | 6 +- tests/conftest.py | 96 +++++++++++++++--------------- tests/test_connection.py | 14 ++--- tests/test_dfs.py | 40 ++++++------- tests/test_file_info.py | 56 ++++++++--------- tests/test_open.py | 52 ++++++++-------- tests/test_structure.py | 4 +- 16 files changed, 164 insertions(+), 200 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68197e30..61e4f367 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: steps: - name: Check out code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Build smbprotocol run: | @@ -52,60 +52,23 @@ jobs: os: - ubuntu-latest - macOS-latest - - windows-2019 - - windows-2022 + - windows-latest python-version: - - 3.8 - 3.9 - '3.10' - '3.11' - '3.12' - '3.13' - python-arch: - - x86 - - x64 - - arm64 - - exclude: - # Exclude OS and arch combinations that are not supported - - os: ubuntu-latest - python-arch: x86 - - os: ubuntu-latest - python-arch: arm64 - - os: windows-2019 - python-arch: x86 - - os: windows-2019 - python-arch: arm64 - - os: windows-2022 - python-arch: arm64 - - os: macOS-latest - python-arch: x86 - - os: macOS-latest - python-arch: x64 - - # macOS arm64 is supported from 3.9 - - os: macOS-latest - python-version: 3.8 - - os: windows-2019 - python-version: 3.8 - - os: windows-2019 - python-version: 3.9 - - os: windows-2019 - python-version: '3.10' - - os: windows-2019 - python-version: '3.11' - - os: windows-2019 - python-version: '3.12' + - '3.14' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} - architecture: ${{ matrix.python-arch }} - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: artifact path: ./dist @@ -145,7 +108,7 @@ jobs: - name: Upload Coverage to codecov if: always() - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: files: ./coverage.xml flags: ${{ steps.os.outputs.name }},py${{ matrix.python-version }},${{ matrix.python-arch }} @@ -161,7 +124,7 @@ jobs: id-token: write steps: - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: artifact path: ./dist diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3c6e3f04..4da67c00 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,10 +1,10 @@ repos: - repo: https://github.com/psf/black - rev: 24.8.0 + rev: 25.9.0 hooks: - id: black - repo: https://github.com/PyCQA/isort - rev: 5.13.2 + rev: 6.1.0 hooks: - id: isort diff --git a/CHANGELOG.md b/CHANGELOG.md index deaedad6..91b4c5be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 1.16.0 - TBD + +* Drop support for Python 3.8, minimum version is now 3.9 + ## 1.15.0 - 2024-11-12 * Update session id lookup logic to comply with MS-SMB2 spec diff --git a/README.md b/README.md index 4d90fe37..739ee245 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ backlog for features that would be nice to have in this library. ## Requirements -* Python 3.7+ +* Python 3.9+ * For Kerberos auth on Linux * [python-gssapi](https://github.com/pythongssapi/python-gssapi) * [pykrb5](https://github.com/jborean93/pykrb5) diff --git a/build_helpers/lib.sh b/build_helpers/lib.sh index 2ae81b2d..7acb9c17 100755 --- a/build_helpers/lib.sh +++ b/build_helpers/lib.sh @@ -59,14 +59,8 @@ lib::setup::python_requirements() { python -m pip install build PACKAGE_VERSION="$( python -c "import build.util; print(build.util.project_wheel_metadata('.').get('Version'))" )" - if [ "$(expr substr $(uname -s) 1 5)" == "MINGW" ]; then - DIST_LINK_PATH="$( echo "${PWD}/dist" | sed -e 's/^\///' -e 's/\//\\/g' -e 's/^./\0:/' )" - else - DIST_LINK_PATH="${PWD}/dist" - fi - python -m pip install smbprotocol=="${PACKAGE_VERSION}" \ - --find-links "file://${DIST_LINK_PATH}" \ + --find-links ./dist \ --verbose echo "Installing dev dependencies" diff --git a/pyproject.toml b/pyproject.toml index e1e7886b..548887e1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [build-system] requires = [ - "setuptools >= 61.0.0", # Support for setuptools config in pyproject.toml + "setuptools >= 77.0.0", # Support for SPDX license expressions ] build-backend = "setuptools.build_meta" @@ -9,22 +9,21 @@ name = "smbprotocol" version = "1.16.0" description = "Interact with a server using the SMB 2/3 Protocol" readme = "README.md" -requires-python = ">=3.8" -license = {file = "LICENSE"} +requires-python = ">=3.9" +license = "MIT" authors = [ { name = "Jordan Borean", email = "jborean93@gmail.com" } ] keywords = ["smb", "smb2", "smb3", "cifs", "python"] classifiers = [ "Development Status :: 4 - Beta", - "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13" + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ] dependencies = [ "cryptography >= 2.0", diff --git a/requirements-dev.txt b/requirements-dev.txt index f32c5d26..f688b420 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,7 +1,7 @@ -black == 24.8.0 +black == 25.9.0 build cryptography >= 2.0 -isort == 5.13.2 +isort == 6.1.0 pre-commit pyspnego pytest diff --git a/src/smbclient/_pool.py b/src/smbclient/_pool.py index dfe79d27..f9c62284 100644 --- a/src/smbclient/_pool.py +++ b/src/smbclient/_pool.py @@ -194,7 +194,7 @@ def dfs_request(tree: TreeConnect, path: str) -> DFSReferralResponse: ioctl_req = SMB2IOCTLRequest() ioctl_req["ctl_code"] = CtlCode.FSCTL_DFS_GET_REFERRALS - ioctl_req["file_id"] = b"\xFF" * 16 + ioctl_req["file_id"] = b"\xff" * 16 ioctl_req["max_output_response"] = 56 * 1024 ioctl_req["flags"] = IOCTLFlags.SMB2_0_IOCTL_IS_FSCTL ioctl_req["buffer"] = dfs_referral diff --git a/src/smbclient/shutil.py b/src/smbclient/shutil.py index 833d51ec..1e67fca3 100644 --- a/src/smbclient/shutil.py +++ b/src/smbclient/shutil.py @@ -10,7 +10,9 @@ import sys from smbclient._io import SMBFileTransaction, SMBRawIO, query_info, set_info -from smbclient._os import SMBDirEntry +from smbclient._os import ( + SMBDirEntry, +) from smbclient._os import copyfile as smbclient_copyfile from smbclient._os import ( is_remote_path, @@ -22,7 +24,9 @@ scandir, ) from smbclient._os import stat as smbclient_stat -from smbclient._os import symlink +from smbclient._os import ( + symlink, +) from smbclient.path import isdir, islink, samefile from smbprotocol import MAX_PAYLOAD_SIZE from smbprotocol.file_info import FileAttributes, FileBasicInformation diff --git a/src/smbprotocol/create_contexts.py b/src/smbprotocol/create_contexts.py index d6426edd..ac19b55d 100644 --- a/src/smbprotocol/create_contexts.py +++ b/src/smbprotocol/create_contexts.py @@ -38,9 +38,9 @@ class CreateContextName: SMB2_CREATE_REQUEST_LEASE_V2 = b"\x52\x71\x4c\x73" SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 = b"\x44\x48\x32\x51" SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2 = b"\x44\x48\x32\x43" - SMB2_CREATE_APP_INSTANCE_ID = b"\x45\xBC\xA6\x6A\xEF\xA7\xF7\x4A" b"\x90\x08\xFA\x46\x2E\x14\x4D\x74" - SMB2_CREATE_APP_INSTANCE_VERSION = b"\xB9\x82\xD0\xB7\x3B\x56\x07\x4F" b"\xA0\x7B\x52\x4A\x81\x16\xA0\x10" - SVHDX_OPEN_DEVICE_CONTEXT = b"\x9C\xCB\xCF\x9E\x04\xC1\xE6\x43" b"\x98\x0E\x15\x8D\xA1\xF6\xEC\x83" + SMB2_CREATE_APP_INSTANCE_ID = b"\x45\xbc\xa6\x6a\xef\xa7\xf7\x4a" b"\x90\x08\xfa\x46\x2e\x14\x4d\x74" + SMB2_CREATE_APP_INSTANCE_VERSION = b"\xb9\x82\xd0\xb7\x3b\x56\x07\x4f" b"\xa0\x7b\x52\x4a\x81\x16\xa0\x10" + SVHDX_OPEN_DEVICE_CONTEXT = b"\x9c\xcb\xcf\x9e\x04\xc1\xe6\x43" b"\x98\x0e\x15\x8d\xa1\xf6\xec\x83" @staticmethod def get_response_structure(name, size=None): diff --git a/tests/conftest.py b/tests/conftest.py index ffa2f34b..bf635011 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -32,10 +32,10 @@ b"\x22\x00" b"\x00\x00" b"\x00\x00" - b"\x5C\x00\x44\x00\x4F\x00\x4D\x00" - b"\x41\x00\x49\x00\x4E\x00\x00\x00" - b"\x5C\x00\x64\x00\x6F\x00\x6D\x00" - b"\x61\x00\x69\x00\x6E\x00\x2E\x00" + b"\x5c\x00\x44\x00\x4f\x00\x4d\x00" + b"\x41\x00\x49\x00\x4e\x00\x00\x00" + b"\x5c\x00\x64\x00\x6f\x00\x6d\x00" + b"\x61\x00\x69\x00\x6e\x00\x2e\x00" b"\x74\x00\x65\x00\x73\x00\x74\x00" b"\x00\x00" ) @@ -52,20 +52,20 @@ b"\x58\x02\x00\x00" b"\x12\x00" b"\x02\x00" - b"\x2C\x00" - b"\x5C\x00\x64\x00\x6F\x00\x6D\x00" - b"\x61\x00\x69\x00\x6E\x00\x2E\x00" + b"\x2c\x00" + b"\x5c\x00\x64\x00\x6f\x00\x6d\x00" + b"\x61\x00\x69\x00\x6e\x00\x2e\x00" b"\x74\x00\x65\x00\x73\x00\x74\x00" b"\x00\x00" - b"\x5C\x00\x44\x00\x43\x00\x30\x00" - b"\x31\x00\x2E\x00\x64\x00\x6F\x00" - b"\x6D\x00\x61\x00\x69\x00\x6E\x00" - b"\x2E\x00\x74\x00\x65\x00\x73\x00" + b"\x5c\x00\x44\x00\x43\x00\x30\x00" + b"\x31\x00\x2e\x00\x64\x00\x6f\x00" + b"\x6d\x00\x61\x00\x69\x00\x6e\x00" + b"\x2e\x00\x74\x00\x65\x00\x73\x00" b"\x74\x00\x00\x00" - b"\x5C\x00\x44\x00\x43\x00\x30\x00" - b"\x31\x00\x2E\x00\x64\x00\x6F\x00" - b"\x6D\x00\x61\x00\x69\x00\x6E\x00" - b"\x2E\x00\x74\x00\x65\x00\x73\x00" + b"\x5c\x00\x44\x00\x43\x00\x30\x00" + b"\x31\x00\x2e\x00\x64\x00\x6f\x00" + b"\x6d\x00\x61\x00\x69\x00\x6e\x00" + b"\x2e\x00\x74\x00\x65\x00\x73\x00" b"\x74\x00\x32\x00\x00\x00" ) @@ -79,27 +79,27 @@ b"\x22\x00" b"\x01\x00" b"\x04\x00" - b"\x2C\x01\x00\x00" + b"\x2c\x01\x00\x00" b"\x22\x00" b"\x44\x00" b"\x66\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x5C\x00\x64\x00\x6F\x00\x6D\x00" - b"\x61\x00\x69\x00\x6E\x00\x2E\x00" + b"\x5c\x00\x64\x00\x6f\x00\x6d\x00" + b"\x61\x00\x69\x00\x6e\x00\x2e\x00" b"\x74\x00\x65\x00\x73\x00\x74\x00" - b"\x5C\x00\x64\x00\x66\x00\x73\x00" - b"\x00\x00\x5C\x00\x64\x00\x6F\x00" - b"\x6D\x00\x61\x00\x69\x00\x6E\x00" - b"\x2E\x00\x74\x00\x65\x00\x73\x00" - b"\x74\x00\x5C\x00\x64\x00\x66\x00" - b"\x73\x00\x00\x00\x5C\x00\x53\x00" + b"\x5c\x00\x64\x00\x66\x00\x73\x00" + b"\x00\x00\x5c\x00\x64\x00\x6f\x00" + b"\x6d\x00\x61\x00\x69\x00\x6e\x00" + b"\x2e\x00\x74\x00\x65\x00\x73\x00" + b"\x74\x00\x5c\x00\x64\x00\x66\x00" + b"\x73\x00\x00\x00\x5c\x00\x53\x00" b"\x45\x00\x52\x00\x56\x00\x45\x00" b"\x52\x00\x32\x00\x30\x00\x31\x00" - b"\x32\x00\x52\x00\x32\x00\x2E\x00" - b"\x44\x00\x4F\x00\x4D\x00\x41\x00" - b"\x49\x00\x4E\x00\x2E\x00\x54\x00" - b"\x45\x00\x53\x00\x54\x00\x5C\x00" + b"\x32\x00\x52\x00\x32\x00\x2e\x00" + b"\x44\x00\x4f\x00\x4d\x00\x41\x00" + b"\x49\x00\x4e\x00\x2e\x00\x54\x00" + b"\x45\x00\x53\x00\x54\x00\x5c\x00" b"\x64\x00\x66\x00\x73\x00\x00\x00" ) @@ -115,7 +115,7 @@ b"\x04\x00" b"\x08\x07\x00\x00" b"\x44\x00" - b"\x6C\x00" + b"\x6c\x00" b"\x94\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" @@ -125,32 +125,32 @@ b"\x00\x00" b"\x08\x07\x00\x00" b"\x22\x00" - b"\x4A\x00" - b"\x9C\x00" + b"\x4a\x00" + b"\x9c\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x5C\x00\x64\x00\x6F\x00\x6D\x00" - b"\x61\x00\x69\x00\x6E\x00\x2E\x00" + b"\x5c\x00\x64\x00\x6f\x00\x6d\x00" + b"\x61\x00\x69\x00\x6e\x00\x2e\x00" b"\x74\x00\x65\x00\x73\x00\x74\x00" - b"\x5C\x00\x64\x00\x66\x00\x73\x00" - b"\x5C\x00\x64\x00\x63\x00\x00\x00" - b"\x5C\x00\x64\x00\x6F\x00\x6D\x00" - b"\x61\x00\x69\x00\x6E\x00\x2E\x00" + b"\x5c\x00\x64\x00\x66\x00\x73\x00" + b"\x5c\x00\x64\x00\x63\x00\x00\x00" + b"\x5c\x00\x64\x00\x6f\x00\x6d\x00" + b"\x61\x00\x69\x00\x6e\x00\x2e\x00" b"\x74\x00\x65\x00\x73\x00\x74\x00" - b"\x5C\x00\x64\x00\x66\x00\x73\x00" - b"\x5C\x00\x64\x00\x63\x00\x00\x00" - b"\x5C\x00\x64\x00\x63\x00\x30\x00" - b"\x31\x00\x2E\x00\x64\x00\x6F\x00" - b"\x6D\x00\x61\x00\x69\x00\x6E\x00" - b"\x2E\x00\x74\x00\x65\x00\x73\x00" - b"\x74\x00\x5C\x00\x63\x00\x24\x00" - b"\x00\x00\x5C\x00\x73\x00\x65\x00" + b"\x5c\x00\x64\x00\x66\x00\x73\x00" + b"\x5c\x00\x64\x00\x63\x00\x00\x00" + b"\x5c\x00\x64\x00\x63\x00\x30\x00" + b"\x31\x00\x2e\x00\x64\x00\x6f\x00" + b"\x6d\x00\x61\x00\x69\x00\x6e\x00" + b"\x2e\x00\x74\x00\x65\x00\x73\x00" + b"\x74\x00\x5c\x00\x63\x00\x24\x00" + b"\x00\x00\x5c\x00\x73\x00\x65\x00" b"\x72\x00\x76\x00\x65\x00\x72\x00" b"\x32\x00\x30\x00\x31\x00\x39\x00" - b"\x2E\x00\x64\x00\x6F\x00\x6D\x00" - b"\x61\x00\x69\x00\x6E\x00\x2E\x00" + b"\x2e\x00\x64\x00\x6f\x00\x6d\x00" + b"\x61\x00\x69\x00\x6e\x00\x2e\x00" b"\x74\x00\x65\x00\x73\x00\x74\x00" - b"\x5C\x00\x63\x00\x24\x00\x00\x00" + b"\x5c\x00\x63\x00\x24\x00\x00\x00" ) diff --git a/tests/test_connection.py b/tests/test_connection.py index 47e32027..08bd6dd8 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -455,7 +455,7 @@ def test_parse_message(self): def test_parse_message_invalid_context_type(self): actual = SMB2NegotiateContextRequest() - data = b"\xFF\xFF" b"\x04\x00" b"\x00\x00\x00\x00" b"\x01\x00" b"\x02\x00" + data = b"\xff\xff" b"\x04\x00" b"\x00\x00\x00\x00" b"\x01\x00" b"\x02\x00" with pytest.raises(Exception) as exc: actual.unpack(data) assert ( @@ -512,14 +512,14 @@ class TestSMB2NetnameNegotiateContextId: def test_create_message(self): message = SMB2NetnameNegotiateContextId() message["net_name"] = "hostname" - expected = b"\x68\x00\x6F\x00\x73\x00\x74\x00" b"\x6E\x00\x61\x00\x6D\x00\x65\x00" + expected = b"\x68\x00\x6f\x00\x73\x00\x74\x00" b"\x6e\x00\x61\x00\x6d\x00\x65\x00" actual = message.pack() assert len(message) == 16 assert actual == expected def test_parse_message(self): actual = SMB2NetnameNegotiateContextId() - data = b"\x68\x00\x6F\x00\x73\x00\x74\x00" b"\x6E\x00\x61\x00\x6D\x00\x65\x00" + data = b"\x68\x00\x6f\x00\x73\x00\x74\x00" b"\x6e\x00\x61\x00\x6d\x00\x65\x00" actual.unpack(data) assert len(actual) == 16 assert actual["net_name"].get_value() == "hostname" @@ -1225,8 +1225,8 @@ def test_connection_echo(self, smb_real): ( b"\xff" * 32, Ciphers.AES_256_CCM, - b"\x3E\xFB\x47\x97\x51\x8A\xAB\x05\xC5\x48\xA7\xFC\x20\x74\xF5\x93", - b"\x2F\x58\x41\xD7", + b"\x3e\xfb\x47\x97\x51\x8a\xab\x05\xc5\x48\xa7\xfc\x20\x74\xf5\x93", + b"\x2f\x58\x41\xd7", ), ], ids=["AES128_CCM", "AES256_CCM"], @@ -1268,8 +1268,8 @@ def mockurandom(length): ( b"\xff" * 32, Ciphers.AES_256_GCM, - b"\x45\xE5\xB7\x23\x05\x2E\xCA\xD0\x1E\xEF\xAD\x6F\x04\x87\xE3\x2D", - b"\xBC\x39\xBD\x81", + b"\x45\xe5\xb7\x23\x05\x2e\xca\xd0\x1e\xef\xad\x6f\x04\x87\xe3\x2d", + b"\xbc\x39\xbd\x81", ), ], ids=["AES128_CCM", "AES256_CCM"], diff --git a/tests/test_dfs.py b/tests/test_dfs.py index 1476130a..e3e23a58 100644 --- a/tests/test_dfs.py +++ b/tests/test_dfs.py @@ -22,7 +22,7 @@ from .conftest import DC_REFERRAL, DOMAIN_REFERRAL, ROOT_REFERRAL, TARGET_REFERRAL # 'MUSICAL SYMBOL G CLEF' https://www.fileformat.info/info/unicode/char/1d11e/index.htm -UNICODE_TEXT = "ÜseӜ" + to_text(b"\xF0\x9D\x84\x9E") +UNICODE_TEXT = "ÜseӜ" + to_text(b"\xf0\x9d\x84\x9e") class TestDomainEntry: @@ -122,12 +122,12 @@ def test_create_message(self): message["request_file_name"] = share expected = ( b"\x04\x00" - b"\x5C\x00\x5C\x00\x73\x00\x65\x00" + b"\x5c\x00\x5c\x00\x73\x00\x65\x00" b"\x72\x00\x76\x00\x65\x00\x72\x00" - b"\x5C\x00\x73\x00\x68\x00\x61\x00" - b"\x72\x00\x65\x00\x73\x00\x5C\x00" + b"\x5c\x00\x73\x00\x68\x00\x61\x00" + b"\x72\x00\x65\x00\x73\x00\x5c\x00" b"\x55\x00\x08\x03\x73\x00\x65\x00" - b"\xDC\x04\x34\xD8\x1E\xDD\x00\x00" + b"\xdc\x04\x34\xd8\x1e\xdd\x00\x00" ) actual = message.pack() @@ -142,12 +142,12 @@ def test_parse_message(self, leftover): actual = DFSReferralRequest() data = ( b"\x04\x00" - b"\x5C\x00\x5C\x00\x73\x00\x65\x00" + b"\x5c\x00\x5c\x00\x73\x00\x65\x00" b"\x72\x00\x76\x00\x65\x00\x72\x00" - b"\x5C\x00\x73\x00\x68\x00\x61\x00" - b"\x72\x00\x65\x00\x73\x00\x5C\x00" + b"\x5c\x00\x73\x00\x68\x00\x61\x00" + b"\x72\x00\x65\x00\x73\x00\x5c\x00" b"\x55\x00\x08\x03\x73\x00\x65\x00" - b"\xDC\x04\x34\xD8\x1E\xDD\x00\x00" + b"\xdc\x04\x34\xd8\x1e\xdd\x00\x00" ) data += leftover data = actual.unpack(data) @@ -173,15 +173,15 @@ def test_create_message(self): b"\x01\x00" b"\x44\x00\x00\x00" b"\x30\x00" - b"\x5C\x00\x5C\x00\x73\x00\x65\x00" + b"\x5c\x00\x5c\x00\x73\x00\x65\x00" b"\x72\x00\x76\x00\x65\x00\x72\x00" - b"\x5C\x00\x73\x00\x68\x00\x61\x00" - b"\x72\x00\x65\x00\x73\x00\x5C\x00" + b"\x5c\x00\x73\x00\x68\x00\x61\x00" + b"\x72\x00\x65\x00\x73\x00\x5c\x00" b"\x55\x00\x08\x03\x73\x00\x65\x00" - b"\xDC\x04\x34\xD8\x1E\xDD\x00\x00" + b"\xdc\x04\x34\xd8\x1e\xdd\x00\x00" b"\x10\x00" b"\x55\x00\x08\x03\x73\x00\x65\x00" - b"\xDC\x04\x34\xD8\x1E\xDD\x00\x00" + b"\xdc\x04\x34\xd8\x1e\xdd\x00\x00" ) actual = message.pack() @@ -200,15 +200,15 @@ def test_parse_message(self, leftover): b"\x01\x00" b"\x44\x00\x00\x00" b"\x30\x00" - b"\x5C\x00\x5C\x00\x73\x00\x65\x00" + b"\x5c\x00\x5c\x00\x73\x00\x65\x00" b"\x72\x00\x76\x00\x65\x00\x72\x00" - b"\x5C\x00\x73\x00\x68\x00\x61\x00" - b"\x72\x00\x65\x00\x73\x00\x5C\x00" + b"\x5c\x00\x73\x00\x68\x00\x61\x00" + b"\x72\x00\x65\x00\x73\x00\x5c\x00" b"\x55\x00\x08\x03\x73\x00\x65\x00" - b"\xDC\x04\x34\xD8\x1E\xDD\x00\x00" + b"\xdc\x04\x34\xd8\x1e\xdd\x00\x00" b"\x10\x00" b"\x55\x00\x08\x03\x73\x00\x65\x00" - b"\xDC\x04\x34\xD8\x1E\xDD\x00\x00" + b"\xdc\x04\x34\xd8\x1e\xdd\x00\x00" ) data += leftover data = actual.unpack(data) @@ -282,7 +282,7 @@ def test_parse_message_v2(self): b"\x00\x00" b"\x00\x00\x00\x00" b"\x58\x02\x00\x00" - b"\x2C\x00" + b"\x2c\x00" b"\x00\x00" b"\x00\x00" b"\x02\x00" diff --git a/tests/test_file_info.py b/tests/test_file_info.py index 390ee12c..f3bc12a7 100644 --- a/tests/test_file_info.py +++ b/tests/test_file_info.py @@ -187,8 +187,8 @@ def test_create_message(self): b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x66\x00\x69\x00\x6C\x00\x65\x00" - b"\x31\x00\x2E\x00\x74\x00\x78\x00" + b"\x66\x00\x69\x00\x6c\x00\x65\x00" + b"\x31\x00\x2e\x00\x74\x00\x78\x00" b"\x74\x00" ) actual = message.pack() @@ -214,8 +214,8 @@ def test_parse_message(self): b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" - b"\x66\x00\x69\x00\x6C\x00\x65\x00" - b"\x31\x00\x2E\x00\x74\x00\x78\x00" + b"\x66\x00\x69\x00\x6c\x00\x65\x00" + b"\x31\x00\x2e\x00\x74\x00\x78\x00" b"\x74\x00" ) data = actual.unpack(data) @@ -262,8 +262,8 @@ def test_create_message(self): b"\x00\x00\x10\x00\x00\x00\x00\x00" b"\x20\x00\x00\x00" b"\x12\x00\x00\x00" - b"\x66\x00\x69\x00\x6C\x00\x65\x00" - b"\x31\x00\x2E\x00\x74\x00\x78\x00" + b"\x66\x00\x69\x00\x6c\x00\x65\x00" + b"\x31\x00\x2e\x00\x74\x00\x78\x00" b"\x74\x00" ) actual = message.pack() @@ -283,8 +283,8 @@ def test_parse_message(self): b"\x00\x00\x10\x00\x00\x00\x00\x00" b"\x20\x00\x00\x00" b"\x12\x00\x00\x00" - b"\x66\x00\x69\x00\x6C\x00\x65\x00" - b"\x31\x00\x2E\x00\x74\x00\x78\x00" + b"\x66\x00\x69\x00\x6c\x00\x65\x00" + b"\x31\x00\x2e\x00\x74\x00\x78\x00" b"\x74\x00" ) data = actual.unpack(data) @@ -368,8 +368,8 @@ def test_create_message(self): b"\x20\x00\x00\x00" b"\x12\x00\x00\x00" b"\x00\x00\x00\x00" - b"\x66\x00\x69\x00\x6C\x00\x65\x00" - b"\x31\x00\x2E\x00\x74\x00\x78\x00" + b"\x66\x00\x69\x00\x6c\x00\x65\x00" + b"\x31\x00\x2e\x00\x74\x00\x78\x00" b"\x74\x00" ) actual = message.pack() @@ -390,8 +390,8 @@ def test_parse_message(self): b"\x20\x00\x00\x00" b"\x12\x00\x00\x00" b"\x00\x00\x00\x00" - b"\x66\x00\x69\x00\x6C\x00\x65\x00" - b"\x31\x00\x2E\x00\x74\x00\x78\x00" + b"\x66\x00\x69\x00\x6c\x00\x65\x00" + b"\x31\x00\x2e\x00\x74\x00\x78\x00" b"\x74\x00" ) data = actual.unpack(data) @@ -496,9 +496,9 @@ def test_create_message(self): b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00" - b"\xB8\x2F\x04\x00\x01\x08\x00\x00" - b"\x66\x00\x69\x00\x6C\x00\x65\x00" - b"\x31\x00\x2E\x00\x74\x00\x78\x00" + b"\xb8\x2f\x04\x00\x01\x08\x00\x00" + b"\x66\x00\x69\x00\x6c\x00\x65\x00" + b"\x31\x00\x2e\x00\x74\x00\x78\x00" b"\x74\x00" ) actual = message.pack() @@ -525,9 +525,9 @@ def test_parse_message(self): b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00" - b"\xB8\x2F\x04\x00\x01\x08\x00\x00" - b"\x66\x00\x69\x00\x6C\x00\x65\x00" - b"\x31\x00\x2E\x00\x74\x00\x78\x00" + b"\xb8\x2f\x04\x00\x01\x08\x00\x00" + b"\x66\x00\x69\x00\x6c\x00\x65\x00" + b"\x31\x00\x2e\x00\x74\x00\x78\x00" b"\x74\x00" ) data = actual.unpack(data) @@ -579,9 +579,9 @@ def test_create_message(self): b"\x12\x00\x00\x00" b"\x00\x00\x00\x00" b"\x00\x00\x00\x00" - b"\xB8\x2F\x04\x00\x01\x08\x00\x00" - b"\x66\x00\x69\x00\x6C\x00\x65\x00" - b"\x31\x00\x2E\x00\x74\x00\x78\x00" + b"\xb8\x2f\x04\x00\x01\x08\x00\x00" + b"\x66\x00\x69\x00\x6c\x00\x65\x00" + b"\x31\x00\x2e\x00\x74\x00\x78\x00" b"\x74\x00" ) actual = message.pack() @@ -603,9 +603,9 @@ def test_parse_message(self): b"\x12\x00\x00\x00" b"\x00\x00\x00\x00" b"\x00\x00\x00\x00" - b"\xB8\x2F\x04\x00\x01\x08\x00\x00" - b"\x66\x00\x69\x00\x6C\x00\x65\x00" - b"\x31\x00\x2E\x00\x74\x00\x78\x00" + b"\xb8\x2f\x04\x00\x01\x08\x00\x00" + b"\x66\x00\x69\x00\x6c\x00\x65\x00" + b"\x31\x00\x2e\x00\x74\x00\x78\x00" b"\x74\x00" ) data = actual.unpack(data) @@ -664,8 +664,8 @@ def test_create_message(self): b"\x00\x00\x00\x00" b"\x00\x00\x00\x00" b"\x12\x00\x00\x00" - b"\x66\x00\x69\x00\x6C\x00\x65\x00" - b"\x31\x00\x2E\x00\x74\x00\x78\x00" + b"\x66\x00\x69\x00\x6c\x00\x65\x00" + b"\x31\x00\x2e\x00\x74\x00\x78\x00" b"\x74\x00" ) actual = message.pack() @@ -678,8 +678,8 @@ def test_parse_message(self): b"\x00\x00\x00\x00" b"\x00\x00\x00\x00" b"\x12\x00\x00\x00" - b"\x66\x00\x69\x00\x6C\x00\x65\x00" - b"\x31\x00\x2E\x00\x74\x00\x78\x00" + b"\x66\x00\x69\x00\x6c\x00\x65\x00" + b"\x31\x00\x2e\x00\x74\x00\x78\x00" b"\x74\x00" ) data = actual.unpack(data) diff --git a/tests/test_open.py b/tests/test_open.py index 7de7719a..858f1338 100644 --- a/tests/test_open.py +++ b/tests/test_open.py @@ -106,7 +106,7 @@ def test_create_message(self): b"\x20\x00\x00\x00" b"\x5c\x00\x5c\x00\x73\x00\x65\x00" b"\x72\x00\x76\x00\x65\x00\x72\x00" - b"\x5C\x00\x73\x00\x68\x00\x61\x00" + b"\x5c\x00\x73\x00\x68\x00\x61\x00" b"\x72\x00\x65\x00" b"\x00\x00\x00\x00" b"\x00\x00\x00\x00" @@ -150,7 +150,7 @@ def test_create_message_no_contexts(self): b"\x00\x00\x00\x00" b"\x5c\x00\x5c\x00\x73\x00\x65\x00" b"\x72\x00\x76\x00\x65\x00\x72\x00" - b"\x5C\x00\x73\x00\x68\x00\x61\x00" + b"\x5c\x00\x73\x00\x68\x00\x61\x00" b"\x72\x00\x65\x00" ) actual = message.pack() @@ -177,7 +177,7 @@ def test_parse_message(self): b"\x20\x00\x00\x00" b"\x5c\x00\x5c\x00\x73\x00\x65\x00" b"\x72\x00\x76\x00\x65\x00\x72\x00" - b"\x5C\x00\x73\x00\x68\x00\x61\x00" + b"\x5c\x00\x73\x00\x68\x00\x61\x00" b"\x72\x00\x65\x00" b"\x00\x00\x00\x00" b"\x00\x00\x00\x00" @@ -245,7 +245,7 @@ def test_parse_message_no_contexts(self): b"\x00\x00\x00\x00" b"\x5c\x00\x5c\x00\x73\x00\x65\x00" b"\x72\x00\x76\x00\x65\x00\x72\x00" - b"\x5C\x00\x73\x00\x68\x00\x61\x00" + b"\x5c\x00\x73\x00\x68\x00\x61\x00" b"\x72\x00\x65\x00" ) data = actual.unpack(data) @@ -503,10 +503,10 @@ def test_create_message(self): b"\x3c\x00" b"\x00\x00" b"\x00\x00\x00\x00" - b"\x00\x80\x3E\xD5\xDE\xB1\x9D\x01" - b"\x00\x80\x3E\xD5\xDE\xB1\x9D\x01" - b"\x00\x80\x3E\xD5\xDE\xB1\x9D\x01" - b"\x00\x80\x3E\xD5\xDE\xB1\x9D\x01" + b"\x00\x80\x3e\xd5\xde\xb1\x9d\x01" + b"\x00\x80\x3e\xd5\xde\xb1\x9d\x01" + b"\x00\x80\x3e\xd5\xde\xb1\x9d\x01" + b"\x00\x80\x3e\xd5\xde\xb1\x9d\x01" b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00" @@ -521,10 +521,10 @@ def test_parse_message(self): b"\x3c\x00" b"\x00\x00" b"\x00\x00\x00\x00" - b"\x00\x80\x3E\xD5\xDE\xB1\x9D\x01" - b"\x00\x80\x3E\xD5\xDE\xB1\x9D\x01" - b"\x00\x80\x3E\xD5\xDE\xB1\x9D\x01" - b"\x00\x80\x3E\xD5\xDE\xB1\x9D\x01" + b"\x00\x80\x3e\xd5\xde\xb1\x9d\x01" + b"\x00\x80\x3e\xd5\xde\xb1\x9d\x01" + b"\x00\x80\x3e\xd5\xde\xb1\x9d\x01" + b"\x00\x80\x3e\xd5\xde\xb1\x9d\x01" b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x00\x00\x00\x00" @@ -892,20 +892,20 @@ class TestSMB2QueryDirectoryRequest: def test_create_message(self): message = SMB2QueryDirectoryRequest() message["file_information_class"] = FileInformationClass.FILE_NAMES_INFORMATION - message["file_id"] = b"\xB6\x73\xE4\x65\x00\x00\x00\x00" b"\x68\xBD\xA1\xCE\x00\x00\x00\x00" + message["file_id"] = b"\xb6\x73\xe4\x65\x00\x00\x00\x00" b"\x68\xbd\xa1\xce\x00\x00\x00\x00" message["output_buffer_length"] = 65536 message["buffer"] = "*".encode("utf-16-le") expected = ( b"\x21\x00" - b"\x0C" + b"\x0c" b"\x00" b"\x00\x00\x00\x00" - b"\xB6\x73\xE4\x65\x00\x00\x00\x00" - b"\x68\xBD\xA1\xCE\x00\x00\x00\x00" + b"\xb6\x73\xe4\x65\x00\x00\x00\x00" + b"\x68\xbd\xa1\xce\x00\x00\x00\x00" b"\x60\x00" b"\x02\x00" b"\x00\x00\x01\x00" - b"\x2A\x00" + b"\x2a\x00" ) actual = message.pack() assert len(message) == 34 @@ -915,15 +915,15 @@ def test_parse_message(self): actual = SMB2QueryDirectoryRequest() data = ( b"\x21\x00" - b"\x0C" + b"\x0c" b"\x00" b"\x00\x00\x00\x00" - b"\xB6\x73\xE4\x65\x00\x00\x00\x00" - b"\x68\xBD\xA1\xCE\x00\x00\x00\x00" + b"\xb6\x73\xe4\x65\x00\x00\x00\x00" + b"\x68\xbd\xa1\xce\x00\x00\x00\x00" b"\x60\x00" b"\x02\x00" b"\x00\x00\x01\x00" - b"\x2A\x00" + b"\x2a\x00" ) data = actual.unpack(data) assert len(actual) == 34 @@ -932,7 +932,7 @@ def test_parse_message(self): assert actual["file_information_class"].get_value() == FileInformationClass.FILE_NAMES_INFORMATION assert actual["flags"].get_value() == 0 assert actual["file_index"].get_value() == 0 - assert actual["file_id"].get_value() == b"\xB6\x73\xE4\x65\x00\x00\x00\x00" b"\x68\xBD\xA1\xCE\x00\x00\x00\x00" + assert actual["file_id"].get_value() == b"\xb6\x73\xe4\x65\x00\x00\x00\x00" b"\x68\xbd\xa1\xce\x00\x00\x00\x00" assert actual["file_name_offset"].get_value() == 96 assert actual["file_name_length"].get_value() == 2 assert actual["output_buffer_length"].get_value() == 65536 @@ -942,13 +942,13 @@ def test_parse_message(self): class TestSMB2QueryDirectoryResponse: def test_create_message(self): message = SMB2QueryDirectoryResponse() - message["buffer"] = b"\x10\x00\x00\x00\x00\x00\x00\x00" b"\x02\x00\x00\x00\x2E\x00\x00\x00" + message["buffer"] = b"\x10\x00\x00\x00\x00\x00\x00\x00" b"\x02\x00\x00\x00\x2e\x00\x00\x00" expected = ( b"\x09\x00" b"\x48\x00" b"\x10\x00\x00\x00" b"\x10\x00\x00\x00\x00\x00\x00\x00" - b"\x02\x00\x00\x00\x2E\x00\x00\x00" + b"\x02\x00\x00\x00\x2e\x00\x00\x00" ) actual = message.pack() assert len(message) == 24 @@ -961,7 +961,7 @@ def test_parse_message(self): b"\x48\x00" b"\x10\x00\x00\x00" b"\x10\x00\x00\x00\x00\x00\x00\x00" - b"\x02\x00\x00\x00\x2E\x00\x00\x00" + b"\x02\x00\x00\x00\x2e\x00\x00\x00" ) data = actual.unpack(data) assert len(actual) == 24 @@ -969,7 +969,7 @@ def test_parse_message(self): assert actual["structure_size"].get_value() == 9 assert actual["output_buffer_offset"].get_value() == 72 assert actual["output_buffer_length"].get_value() == 16 - assert actual["buffer"].get_value() == b"\x10\x00\x00\x00\x00\x00\x00\x00" b"\x02\x00\x00\x00\x2E\x00\x00\x00" + assert actual["buffer"].get_value() == b"\x10\x00\x00\x00\x00\x00\x00\x00" b"\x02\x00\x00\x00\x2e\x00\x00\x00" class TestSMB2QueryInfoRequest: diff --git a/tests/test_structure.py b/tests/test_structure.py index b7234787..7d25a83e 100644 --- a/tests/test_structure.py +++ b/tests/test_structure.py @@ -1050,9 +1050,9 @@ def __init__(self): b"\x00\x00\x00\x00\x00\x00\x00\x00", ), ( - b"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", + b"\xff\xff\xff\xff\xff\xff\xff\xff", datetime(9999, 12, 31, 23, 59, 59, 999999), - b"\xF6\x3F\xC0\xD1\x5E\x5A\xC8\x24", + b"\xf6\x3f\xc0\xd1\x5e\x5a\xc8\x24", ), ], ids=["origin", "end"],