ReleaseNotes06  
pyftpdlib 0.6.x series release notes.

Version: 0.6.0 - Date: 2010-01-24

Enhancements

  • Issue 68: added full FTPS (FTP over SSL/TLS) support.
  • Issue 86: pyftpdlib now reports all ls and MDTM timestamps as GMT times, as recommended in RFC-3659. A FTPHandler.use_gmt_times attributed has been added and can be set to False in case local times are desired instead.
  • Issue 124: pyftpdlib now accepts command line options to configure a stand alone anonymous FTP server when running pyftpdlib with python's -m option.
  • Issue 127: added FTPHandler.masquerade_address_map option which allows you to define multiple 1 to 1 mappings in case you run a FTP server with multiple private IP addresses behind a NAT firewall with multiple public IP addresses.
  • Issue 128: files and directories owner and group names and os.readlink are now resolved via AbstractedFS methods instead of in format_list().
  • Issue 129: added 3 new callbacks to FTPHandler class: on_incomplete_file_sent(), on_incomplete_file_received() and on_login().
  • Issue 130: added UnixAuthorizer and WindowsAuthorizer classes defined in the new pyftpdlib.contrib.authorizers module.
  • Issue 131: pyftpdlib is now able to serve both IPv4 and IPv6 at the same time by using a single socket.
  • Issue 133: AbstractedFS constructor now accepts two argumets: root and cmd_channel breaking compatibility with previous version. Also, root and cwd attributes became properties. The previous bug consisting in re-setting the root from the ftp handler after user login has been fixed to ease the development of subclasses.
  • Issue 134: enabled TCP_NODELAY socket option for the FTP command channels resulting in pyftpdlib being twice faster.
  • Issue 135: Python 2.3 support has been removed.
  • Issue 137: added new pyftpdlib.contrib.filesystems module within UnixFilesystem class which permits the client to escape its home directory and navigate the real filesystem.
  • Issue 138: added DTPHandler.get_elapsed_time() method which returns the transfer elapsed time in seconds.

Bugfixes

  • Issue 120: an ActiveDTP instance is not garbage collected in case a client issuing PORT disconnects before establishing the data connection.
  • Issue 122: a wrong variable name was used in AbstractedFS.validpath method.
  • Issue 123: PORT command doesn't bind to correct address in case an alias is created for the local network interface.
  • Issue 140: pathnames returned in PWD response should have double-quotes '"' escaped.

API changes since 0.5.2

  • removed support for Python 2.3.
  • all classes are now new-style classes.
  • Added a new package in pyftpdlib namespace: "contrib". Modules (and classes) defined here:
    • pyftpdlib.contrib.handlers.py (TLS_FTPHandler, TLS_FTPHandlerFactory)
    • pyftpdlib.contrib.authorizers.py (UnixAuthorizer, WindowsAuthorizer)
    • pyftpdlib.contrib.filesystems (UnixFilesystem)
  • AbstractedFS class:
    • __init__ method now accepts two arguments: root and cmd_channel.
    • root and cwd attributes are now read-only properties.
    • 3 new methods have been added:
      • get_user_by_uid()
      • get_group_by_gid()
      • readlink()
  • FTPHandler class:
    • new class attributes:
      • use_gmt_times
      • tcp_no_delay
      • masquerade_address_map
    • new methods:
      • on_incomplete_file_sent()
      • on_incomplete_file_received()
      • on_login()
    • proto_cmds class attribute has been added. The FTPHandler class no longer relies on ftpserver.proto_cmds global dictionary but on ftpserver.FTPHandler.proto_cmds instead.
  • FTPServer class:
    • max_cons attribute defaults to 512 by default instead of 0 (unlimited).
  • DummyAuthorizer class:
    • ValueError exceptions are now raised instead of AuthorizerError
  • DTPHandler class:
    • get_elapsed_time() method has been added.

Migration notes

Some of the changes introduced in 0.6.0 break compatibility with previous 0.5.x serie. In particular you should be careful in case you're using a customized file system class defining an __init__ method since AbstractedFS constructor now expects two arguments.