- Update session id lookup logic to comply with MS-SMB2 spec
- Remove connection from global connection cache even if failing to close it
- Added
smbclient.liststreams
as a way to list the Alternate Data Streams in a file/directory - Added official support for Python 3.13
- Dropped support for Python 3.7
SMBDirEntryInformation.last_write_time
is now annotated asdatetime.datetime
. Previously, it wasdatetime.date
. #279
- Added the property
smb_info
onSMBDirEntry
which returns a named tupleSMBDirEntryInformation
containing metadata already retrieved in thescandir
operation.- This avoid having to call
stat()
to retrieve data like the file attributes or datetime fields that is already available
- This avoid having to call
- Ensure
DateTimeField
values are set toUTC
timezones as FILETIME values are in UTC - Stop using
datetime.datetime.utcfromtimestamp()
as it has been deprecated - Added default timeout for disconnect operations for 60 seconds to ensure the process doesn't hang forever when closing a broken connection
smbprotocol.connection.Connection.disconnect()
now waits (with a timeout) for the message processing threads to be stopped before returning.- Do not set the SMB SessionId and TreeId in the headers to
0xFFFFFFFF
for related compound requests
- Ensures the source file for
shutil.copyfile
is opened withshare_access="r"
for better compatibility with files already opened by something else - Remove endless authentication loop when the context is complete and no more input messages are needed
- Added the
DiskFull
error and message for the NTSTATUS code0xC000007F
- #245
- Fix up pre authenticated session id lookups that were failing with Linux ksmbd
- Removes
logging.NullHandler()
being set in the rootsmbprotocol
namespace - Adds basic support for remote to local and vice versa file operations with
smbclient.shutil.copytree
- Fixes DFS infinite recursion error when dealing with a file that does not exist on a DFS namespace
- Raise the original
BadNetworkName
error if the server doesn't indicate it supports DFS orFSDriverRequired
was raised trying to lookup the DFS information - #196 - Fix pre auth session id tracking if the intermediate token messages return 0 as the session id
- Require Python 3.7 or newer (dropped 3.6)
- Created PEP 517 compliant package
- Moved all setuptools configuration, except extension information, to
pyproject.toml
- Migrated project layout to a
src
based structure rather than including it in the project root - Allow
smbclient.copyfile
to copy files on the same server and not just the same share - Improve DFS opens by setting the DFS operation header flag when opening a file on a share marked as a DFS share
- Fix negotiate request padding when using a hostname with a length of 8 characters
- Fix connection cache reuse for some DFS referral requests
- Add
smbclient.path
to thesmbclient
import allowingimport smbclient; smbclient.path.func()
- Set
additional_information
field inSMB2SetInfoRequest
to a flags field rather than a single enum as per protocol docs
- Add missing
FileAttributes
enum values - Set messages with
FileAttributes
to be non-strict allowing unknown values in the future to be parsed without an error
- Raises
ObjectPathNotFound
if a DFS referral is required but not referrals are available (#149)
- Added support for 256bit keyed encryption ciphers
- Added support for signing with AES GCM
- Now sends the
SMB2_NETNAME_NEGOTIATE_CONTEXT_ID
with the negotiate request - Adds the Python requirement of pykrb5 for Kerberos support on non-Windows
- Fix unpacking security descriptor ACEs with extra data on the end - #143
- Set
index_number
inFileInternalInformation
to be an unsigned integer to match the other structures - Clear out expired DFS referrals to avoid memory leaks and stale DFS information - #136
- Improve connection health checks to reduce the occurances of an infinite deadlock
- Added more exception error classes
- Added
create_action
to theOpen
object that describes how the file was opened - Added
follow_symlinks
option toSMBDirEntry.from_path
to control whether the entry is based on the path or the link target (if there is one)
- Fix up cached credential logic when setting
domain_controller
in the initial config singleton
- Remove
print()
statement that was used during testing
- Dropped support for Python 2.7 and 3.5
- Add performance improvement on reads with large files
- Added the
require_signing
kwarg tosmbclient.register_session()
to allow the caller to control whether signing is required on the connection or not - Fix
OverflowError
when handling FILETIME values beyond the year 9999 - caps the value to9999-12-31
due to a Python limitation - Fix up credit charge calculation which causes a
STATUS_INVALID_PARAMETER
response for certain read/write lengths - Ensure responses with a failure are cleaned up from the outstanding request table to avoid memory leaks
- Unified DFS path handling when using any API that uses a transaction to open the file
- This includes
smbclient.rename
andsmbclient.replace
- This includes
- Fixed up
smbclient.rename
to work with directories smbclient.scandir
will continue to use the connection cache when getting stat information of a dir entrysmbclient.shutil.rmtree
will continue to use the connection cache when removing child entries
- Added
smbprotocol.exceptions.SMBConnectionClosed
that is raised when trying to send or receive data on a connection that has been closed - Added
smbprotocol.exceptions.WrongPassword
that is raised when some servers indicate the password is not correct or the account is locked out - Do not attempt to reuse any cached connections that have been closed in
smbclient
- Added a lock when writing to the socket, only 1 thread can write a message at a single point in time
- Revamped the SMB receiver code to simplify the logic and make it more durable
- Removed the TCP recv thread for each connection, now each connection uses just 1 thread instead of 2
- Be more defensive when reading data from a socket to ensure we get all the data we require
- Handled server side FIN packets that close the connection unexpectedly, any requests waiting for a response will raise
SMBConnectionClosed
- Fixed up secure negotiation logic when connecting to older SMB dialects
- Will attempt to perform secure negotiation even on older dialects that may not implement it properly
- Added
ClientConfig
optionrequire_secure_negotiate
to globally turn off secure negotiation if the client wishes - Fix explicit
ntlm
orkerberos
authentication when the server response with the initial SPNEGO mech list token
- Changed initial credit request from
256
to64
when creating the SMB session- This is done to avoid overloading the SMB server
- If
smbclient
requires more credits to perform an operation it will request it automatically
- Improve credit handling when reading and writing large amounts of data to reduce the number of requests being made
- Fixed up
write()
insmbclient.open_file()
to be able to write bytes greater than themax_write_size
- Fixed issue when receiving an unknown NtStatus error code from the server
- Added
PipeBusy
exception forSTATUS_PIPE_NOT_AVAILABLE 0xC00000AD
error responses - Fix credit granting calculation when receiving a compound response
- Original logic granted
len(responses) - 1
credits than what the server actually given causing errors when the client ran out of credits without it knowing
- Original logic granted
- Added
auth_protocol
toSession
,ClientConfig
, andregister_session()
to control what authentication protocol is used- This can be
negotiate
(default),kerberos
, orntlm
wherenegotiate
selectskerberos
orntlm
depending on what's available
- This can be
- Added experimental support for DFS shares when using
smbclient
function - Added
smbclient.ClientConfig()
to set global default options on new connections - Moved the SMB Header structures to
smbprotocol.header
- Added
null_terminated
option for aTextField
value - Fix broken pipe errors that occur on long running connections by sending a echo request for each connection session every 10 minutes
- Speed up logging statements for large messages like a read and write message
- Changed authentication dep to pyspnego that handles all the authentication work
- Fixed up authentication against hosts that don't present the initial GSSAPI token like Azure File Storage
- Added specific exception types for every
NtStatus
value to make it easier to catch only specific exceptions - Added the following exceptions to the list of known exception codes
STATUS_NETWORK_NAME_DELETED
STATUS_NOT_FOUND
STATUS_PATH_NOT_COVERED
STATUS_DFS_UNAVAILABLE
STATUS_SERVER_UNAVAILABLE
- Fix session key generation when creating a new session from an existing connection object
- Fix issue when reading a large file that exceeds 65KB and raises
STATUS_END_OF_FILE
. - Fix issue where
listdir
,scandir
,walk
would only enumerate a subset of entries in a directories with lots of sub files/folders
- Dropped support for Python 2.6 and Python 3.4
- Added the
smbclient
package that provides a higher level API for interactive with SMB servers - Deprecated
smbprotocol.query_info
in favour ofsmbprotocol.file_info
,query_info
will be removed in the next major release - Add automatic symlink resolver when a symlink is in the path being opened
- Fix issue when trying to connect to host with IPv6 address
- Fix response parsing for SMB2 Create Response Lease V1 and V2
- Added the ability to set the Oplock level when opening a file
- Revamped the socket listener and message processor to run in a separate thread for faster message resolving
- Added the
FileSystemWatcher
inchange_notify.py
to provider a way to watch for changes on the SMB filesystem - Added the
.cancel()
method onto a Request to cancel an SMB request on the server
- Fix issue where timeout was not being applied to the new connection
- Fix various deprecated regex escape patterns
- Added support for Windows Kerberos and implicit credential support through the optional extra library pywin32
- Simplified the fallback NTLM context object
- Fix initial negotiate message not setting connection timeout value
- Fix endless loop when running a compound message that failed
Initial release of smbprotocol, it contains the following features
- Support for Dialect 2.0.2 to 3.1.1
- Supports message encryption and signing
- Works with both NTLM and Kerberos auth (latter requiring a non-windows library)
- Open files, directories and pipes
- Open command with create_contexts to set extra attributes on an open
- Read/Write the files
- Send IOCTL commands
- Sending of multiple messages in one packet (compounding)