[Python-modules-commits] [python-pyftpdlib] 01/04: Import python-pyftpdlib_1.5.1.orig.tar.gz
Wolfgang Borgert
debacle at moszumanska.debian.org
Tue Oct 11 23:59:53 UTC 2016
This is an automated email from the git hooks/post-receive script.
debacle pushed a commit to branch master
in repository python-pyftpdlib.
commit 333ae10df2adecae4973ce28485c822850c9bb13
Author: W. Martin Borgert <debacle at debian.org>
Date: Mon Oct 10 23:29:39 2016 +0000
Import python-pyftpdlib_1.5.1.orig.tar.gz
---
.git-pre-commit | 47 +
.travis.yml | 20 -
HISTORY.rst | 53 +
LICENSE | 2 +-
MANIFEST.in | 14 +-
Makefile | 55 +-
PKG-INFO | 287 ++++
README.rst | 7 +-
demo/anti_flood_ftpd.py | 33 +-
demo/basic_ftpd.py | 31 +-
demo/md5_ftpd.py | 51 +-
demo/multi_proc_ftp.py | 33 +-
demo/multi_thread_ftp.py | 33 +-
demo/throttled_ftpd.py | 39 +-
demo/tls_ftpd.py | 35 +-
demo/unix_daemon.py | 72 +-
demo/unix_ftpd.py | 35 +-
demo/winnt_ftpd.py | 33 +-
docs/Makefile | 177 ---
docs/README.rst | 15 -
docs/_static/copybutton.js | 57 -
docs/_static/favicon.ico | Bin 15086 -> 0 bytes
docs/_static/logo.png | Bin 13008 -> 0 bytes
docs/_static/sidebar.js | 161 --
docs/_template/globaltoc.html | 12 -
docs/_template/indexcontent.html | 4 -
docs/_template/indexsidebar.html | 8 -
docs/_template/page.html | 66 -
docs/_themes/pydoctheme/static/pydoctheme.css | 187 ---
docs/_themes/pydoctheme/theme.conf | 23 -
docs/adoptions.rst | 340 ----
docs/api.rst | 615 -------
docs/benchmarks.rst | 274 ----
docs/conf.py | 262 ---
docs/faqs.rst | 385 -----
docs/index.rst | 27 -
docs/install.rst | 43 -
docs/make.bat | 242 ---
docs/rfc-compliance.rst | 296 ----
docs/tutorial.rst | 536 -------
make.bat | 10 +-
pyftpdlib.egg-info/PKG-INFO | 287 ++++
pyftpdlib.egg-info/SOURCES.txt | 45 +
pyftpdlib.egg-info/dependency_links.txt | 1 +
pyftpdlib.egg-info/requires.txt | 6 +
pyftpdlib.egg-info/top_level.txt | 1 +
pyftpdlib/__init__.py | 49 +-
pyftpdlib/__main__.py | 52 +-
pyftpdlib/_compat.py | 70 +-
pyftpdlib/authorizers.py | 89 +-
pyftpdlib/contrib/__init__.py | 3 -
pyftpdlib/contrib/authorizers.py | 47 -
pyftpdlib/contrib/filesystems.py | 40 -
pyftpdlib/contrib/handlers.py | 40 -
pyftpdlib/filesystems.py | 40 +-
pyftpdlib/ftpserver.py | 89 --
pyftpdlib/handlers.py | 791 +++++----
pyftpdlib/ioloop.py | 512 +++---
pyftpdlib/log.py | 80 +-
pyftpdlib/servers.py | 152 +-
pyftpdlib/test/README | 5 +
pyftpdlib/test/__init__.py | 282 ++++
{test => pyftpdlib/test}/keycert.pem | 0
pyftpdlib/test/runner.py | 33 +
pyftpdlib/test/test_authorizers.py | 554 +++++++
pyftpdlib/test/test_filesystems.py | 219 +++
.../test/test_functional.py | 1674 ++++++--------------
pyftpdlib/test/test_functional_ssl.py | 373 +++++
pyftpdlib/test/test_ioloop.py | 291 ++++
pyftpdlib/test/test_servers.py | 223 +++
test/bench.py => scripts/ftpbench | 434 ++---
setup.cfg | 5 +
setup.py | 94 +-
test/test_contrib.py | 963 -----------
tox.ini | 29 -
75 files changed, 4477 insertions(+), 7716 deletions(-)
diff --git a/.git-pre-commit b/.git-pre-commit
new file mode 100755
index 0000000..0b838d4
--- /dev/null
+++ b/.git-pre-commit
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+
+# This gets executed on 'git commit' and rejects the commit in case the
+# submitted code does not pass validation.
+# Install it with "make install-git-hooks"
+
+import os
+import subprocess
+import sys
+
+
+def main():
+ out = subprocess.check_output("git diff --cached --name-only", shell=True)
+ files = [x for x in out.split('\n') if x.endswith('.py') and
+ os.path.exists(x)]
+
+ for path in files:
+ with open(path) as f:
+ data = f.read()
+
+ # pdb
+ if "pdb.set_trace" in data:
+ for lineno, line in enumerate(data.split('\n'), 1):
+ line = line.rstrip()
+ if "pdb.set_trace" in line:
+ print("%s: %s" % (lineno, line))
+ sys.exit(
+ "commit aborted: you forgot a pdb in your python code")
+
+ # bare except clause
+ if "except:" in data:
+ for lineno, line in enumerate(data.split('\n'), 1):
+ line = line.rstrip()
+ if "except:" in line and not line.endswith("# NOQA"):
+ print("%s: %s" % (lineno, line))
+ sys.exit("commit aborted: bare except clause")
+
+ # flake8
+ failed = False
+ for path in files:
+ ret = subprocess.call("python -m flake8 %s" % path, shell=True)
+ if ret != 0:
+ failed = True
+ if failed:
+ sys.exit("commit aborted: python code is not flake8-compliant")
+
+main()
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 544db06..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-language: python
-python:
- - 2.6
- - 2.7
- - 3.2
- - 3.3
- - 3.4
- - pypy
-install:
- - if [[ $TRAVIS_PYTHON_VERSION == '2.6' ]]; then pip install unittest2; fi
-script:
- - pip install flake8
- - python setup.py install
- - python test/test_ftpd.py
- - python test/test_contrib.py
- - make flake8
-os:
- - linux
- - osx
-
diff --git a/HISTORY.rst b/HISTORY.rst
index 4165aa1..3e9b6b2 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -1,5 +1,58 @@
Bug tracker at https://github.com/giampaolo/pyftpdlib/issues
+Version: 1.5.1 - 2016-05-02
+===========================
+
+**Bug fixes**
+
+- #381: an extraneous file was accidentally added to the tarball, causing
+ issues with Python 3.
+
+
+Version: 1.5.0 - 2015-12-13
+===========================
+
+**Enhancements**
+
+- #304: remove deprecated items from 1.0.0 which were left in place for
+ backward compatibility
+- #324: FTPHandler.started attribute, to figure out when client connected.
+- #340: dropped python 2.4 and 2.5 support.
+- #344: bench.py script --ssl option.
+- #346: provide more debugging info.
+- #348: FTPHandler has a new "auth_failed_timeout" class attribute (previously
+ this was called _auth_failed_timeout).
+- #350: tests now live in pyftpdlib module namespace.
+- #351: fallback on using plain send() if sendfile() fails and no data has been
+ transmitted yet.
+- #356: sendfile() is now used in case we're using SSL but data connection is
+ in clear text.
+- #361: benchmark script now allows to benchmark downloads and uploads only
+ (instead of both).
+- #362: 'ftpbench' script is now installed as a system script on 'setup.py
+ install'.
+- #365: TLS FTP server is now 25% faster when dealing with clear-text
+ connections.
+
+**Bug fixes**
+
+- #302: setup.py should not require pysendfile on Python >= 3.3.
+- #313: configuring root logger has no effect on pyftpdlib logging.
+- #329: IOLoop throws OSError on Linux.
+- #337: MultiprocessFTPServer and ThreadedFTPServer do not accept backlog
+ argument.
+- #338: benchmark script uses old psutil API.
+- #343: recv() does not handle EBUSY.
+- #347: SSL WantReadError and WantWriteError errors are not properly taken into
+ account.
+- #357: python -m pyftpdlib --verbose option doesn't work
+
+**Incompatible API changes**
+
+- FTPHandler._auth_failed_timeout has been renamed to
+ FTPHandler.auth_failed_timeout.
+
+
Version: 1.4.0 - Date: 2014-06-03
=================================
diff --git a/LICENSE b/LICENSE
index a4d4cca..8e518f1 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,5 +1,5 @@
======================================================================
-Copyright (C) 2007-2012 Giampaolo Rodola' <g.rodola at gmail.com>
+Copyright (C) 2007-2016 Giampaolo Rodola' <g.rodola at gmail.com>
All Rights Reserved
diff --git a/MANIFEST.in b/MANIFEST.in
index 3609251..3a23451 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,15 +1,13 @@
# Tells "python setup.py sdist" what files to include in the tarball.
-# Note: make sure everything is in place with "svn list -R".
+include .git-pre-commit
include CREDITS
-include HISTORY
-include INSTALL
+include HISTORY.rst
include LICENSE
include make.bat
include Makefile
include MANIFEST.in
-include README
-include setup.py
-recursive-include demo *.py *.pem
-recursive-include pyftpdlib *.py
-recursive-include test *.py *.pem
+include README.rst
+recursive-include demo *.py *.pem *README*
+recursive-include pyftpdlib *.py *.pem *README*
+recursive-include scripts *
diff --git a/Makefile b/Makefile
index 55225cd..1072dce 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
# $ make install PYTHON=python3.3
PYTHON=python
-TSCRIPT=test/test_ftpd.py
+TSCRIPT=pyftpdlib/test/runner.py
FLAGS=
all: test
@@ -25,22 +25,49 @@ build: clean
$(PYTHON) setup.py build
install: build
- if test $(PYTHON) = python2.4; then \
- $(PYTHON) setup.py install; \
- elif test $(PYTHON) = python2.5; then \
- $(PYTHON) setup.py install; \
- else \
- $(PYTHON) setup.py install --user; \
- fi
+ $(PYTHON) setup.py install --user;
uninstall:
- pip-`$(PYTHON) -c "import sys; sys.stdout.write('.'.join(map(str, sys.version_info)[:2]))"` uninstall -y -v pyftpdlib
+ pip-`$(PYTHON) -c "import sys; sys.stdout.write('.'.join(list(map(str, sys.version_info))[:2]))"` uninstall -y -v pyftpdlib
+
+# useful deps which are nice to have while developing / testing
+setup-dev-env: install-git-hooks
+ python -c "import urllib2, ssl; \
+ context = ssl._create_unverified_context() if hasattr(ssl, '_create_unverified_context') else None; \
+ kw = dict(context=context) if context else {}; \
+ r = urllib2.urlopen('https://bootstrap.pypa.io/get-pip.py', **kw); \
+ open('/tmp/get-pip.py', 'w').write(r.read());"
+ $(PYTHON) /tmp/get-pip.py --user
+ rm /tmp/get-pip.py
+ $(PYTHON) -m pip install --user --upgrade pip
+ $(PYTHON) -m pip install --user --upgrade \
+ coverage \
+ flake8 \
+ ipdb \
+ mock==1.0.1 \
+ nose \
+ pep8 \
+ pyflakes \
+ pyopenssl \
+ pysendfile \
+ sphinx \
+ sphinx-pypi-upload \
+ unittest2 \
test: install
$(PYTHON) $(TSCRIPT)
-test-contrib: install
- $(PYTHON) test/test_contrib.py
+test-functional: install
+ $(PYTHON) pyftpdlib/test/test_functional.py
+
+test-functional-ssl: install
+ $(PYTHON) pyftpdlib/test/test_functional_ssl.py
+
+# Run a specific test by name; e.g. "make test-by-name retr" will run
+# all test methods containing "retr" in their name.
+# Requires "pip install nose".
+test-by-name:
+ @$(PYTHON) -m nose pyftpdlib/test/test_*.py --nocapture -v -m $(filter-out $@,$(MAKECMDGOALS))
nosetest: install
# $ make nosetest FLAGS=test_name
@@ -69,3 +96,9 @@ upload-docs:
# git-tag a new release
git-tag-release:
git tag -a release-`python -c "import setup; print(setup.VERSION)"` -m `git rev-list HEAD --count`:`git rev-parse --short HEAD`
+ @echo "now run 'git push --tags'"
+
+# install GIT pre-commit hook
+install-git-hooks:
+ ln -sf ../../.git-pre-commit .git/hooks/pre-commit
+ chmod +x .git/hooks/pre-commit
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..1d1b0e0
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,287 @@
+Metadata-Version: 1.1
+Name: pyftpdlib
+Version: 1.5.1
+Summary: Very fast asynchronous FTP server library
+Home-page: https://github.com/giampaolo/pyftpdlib/
+Author: Giampaolo Rodola'
+Author-email: g.rodola at gmail.com
+License: MIT
+Description: .. image:: https://pypip.in/d/pyftpdlib/badge.png
+ :target: https://crate.io/packages/pyftpdlib/
+ :alt: Download this month
+
+ .. image:: https://pypip.in/v/pyftpdlib/badge.png
+ :target: https://pypi.python.org/pypi/pyftpdlib/
+ :alt: Latest version
+
+ .. image:: https://pypip.in/license/pyftpdlib/badge.png
+ :target: https://pypi.python.org/pypi/pyftpdlib/
+ :alt: License
+
+ .. image:: https://api.travis-ci.org/giampaolo/pyftpdlib.png?branch=master
+ :target: https://travis-ci.org/giampaolo/pyftpdlib
+ :alt: Travis
+
+ Quick links
+ ===========
+
+ - `Home <https://github.com/giampaolo/pyftpdlib>`__
+ - `Documentation <http://pythonhosted.org/pyftpdlib/>`__
+ - `Download <https://pypi.python.org/pypi/pyftpdlib/>`__
+ - `Blog <http://grodola.blogspot.com/search/label/pyftpdlib>`__
+ - `Mailing list <http://groups.google.com/group/pyftpdlib/topics>`__
+ - `What's new <https://github.com/giampaolo/pyftpdlib/blob/master/HISTORY.rst>`__
+
+ About
+ =====
+
+ Python FTP server library provides a high-level portable interface to easily
+ write very efficient, scalable and asynchronous FTP servers with Python. It is
+ the most complete `RFC-959 <http://www.faqs.org/rfcs/rfc959.html>`__ FTP server
+ implementation available for `Python <http://www.python.org/>`__ programming
+ language and it's used in projects like
+ `Google Chromium <http://www.code.google.com/chromium/>`__ and
+ `Bazaar <http://bazaar-vcs.org/>`__ and included in
+ `Debian <http://packages.debian.org/sid/python-pyftpdlib>`__,
+ `Fedora <https://admin.fedoraproject.org/pkgdb/packages/name/pyftpdlib>`__ and
+ `FreeBSD <http://www.freshports.org/ftp/py-pyftpdlib/>`__ package repositories.
+
+ Features
+ ========
+
+ - Extremely **lightweight**, **fast** and **scalable** (see
+ `why <https://github.com/giampaolo/pyftpdlib/issues/203>`__ and
+ `benchmarks <http://pythonhosted.org/pyftpdlib/benchmarks.html>`__).
+ - Uses **sendfile(2)** (see `pysendfile <https://github.com/giampaolo/pysendfile>`__)
+ system call for uploads.
+ - Uses epoll() / kqueue() / select() to handle concurrency asynchronously.
+ - ...But can optionally skip to a
+ `multiple thread / process <http://pythonhosted.org/pyftpdlib/tutorial.html#changing-the-concurrency-model>`__
+ model (as in: you'll be free to block or use slow filesystems).
+ - Portable: entirely written in pure Python; works with Python from **2.6** to
+ **3.5** by using a single code base.
+ - Supports **FTPS** (`RFC-4217 <http://tools.ietf.org/html/rfc4217>`__),
+ **IPv6** (`RFC-2428 <ftp://ftp.rfc-editor.org/in-notes/rfc2428.txt>`__),
+ **Unicode** file names (`RFC-2640 <http://tools.ietf.org/html/rfc2640>`__),
+ **MLSD/MLST** commands (`RFC-3659 <ftp://ftp.rfc-editor.org/in-notes/rfc3659.txt>`__).
+ - Support for virtual users and virtual filesystem.
+ - Extremely flexible system of "authorizers" able to manage both "virtual" and
+ "real" users on on both
+ `UNIX <http://pythonhosted.org/pyftpdlib/tutorial.html#unix-ftp-server>`__
+ and
+ `Windows <http://pythonhosted.org/pyftpdlib/tutorial.html#windows-ftp-server>`__.
+ - `Test coverage <https://github.com/giampaolo/pyftpdlib/blob/master/pyftpdlib/test/>`__
+ close to 100%.
+
+ Performances
+ ============
+
+ Depite being written in an intepreted language, pyftpdlib has transfer rates
+ superior to most common UNIX FTP servers. It also scales better since whereas
+ vsftpd and proftpd use multiple processes to achieve concurrency, pyftpdlib
+ will only use one process and handle concurrency asynchronously (see
+ `the C10K problem <http://www.kegel.com/c10k.html>`__). Here are some
+ `benchmarks <https://github.com/giampaolo/pyftpdlib/blob/master/test/bench.py>`__
+ made against my Linux 3.0.0 box, Intel core-duo 3.1 Ghz:
+
+ pyftpdlib vs. proftpd 1.3.4
+ ---------------------------
+
+ +-----------------------------------------+----------------+----------------+-------------+
+ | **benchmark type** | **pyftpdlib** | **proftpd** | **speedup** |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | STOR (client -> server) | 585.90 MB/sec | 600.49 MB/sec | -0.02x |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | RETR (server -> client) | 1652.72 MB/sec | 1524.05 MB/sec | **+0.08** |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | 300 concurrent clients (connect, login) | 0.19 secs | 9.98 secs | **+51x** |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | STOR (1 file with 300 idle clients) | 585.59 MB/sec | 518.55 MB/sec | **+0.1x** |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | RETR (1 file with 300 idle clients) | 1497.58 MB/sec | 1478.19 MB/sec | 0x |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | 300 concurrent clients (RETR 10M file) | 3.41 secs | 3.60 secs | **+0.05x** |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | 300 concurrent clients (STOR 10M file) | 8.60 secs | 11.56 secs | **+0.3x** |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | 300 concurrent clients (QUIT) | 0.03 secs | 0.39 secs | **+12x** |
+ +-----------------------------------------+----------------+----------------+-------------+
+
+ pyftpdlib vs. vsftpd 2.3.5
+ --------------------------
+
+ +-----------------------------------------+----------------+----------------+-------------+
+ | **benchmark type** | **pyftpdlib** | **proftpd** | **speedup** |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | STOR (client -> server) | 585.90 MB/sec | 611.73 MB/sec | -0.04x |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | RETR (server -> client) | 1652.72 MB/sec | 1512.92 MB/sec | **+0.09** |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | 300 concurrent clients (connect, login) | 0.19 secs | 20.39 secs | **+106x** |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | STOR (1 file with 300 idle clients) | 585.59 MB/sec | 610.23 MB/sec | -0.04x |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | RETR (1 file with 300 idle clients) | 1497.58 MB/sec | 1493.01 MB/sec | 0x |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | 300 concurrent clients (RETR 10M file) | 3.41 secs | 3.67 secs | **+0.07x** |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | 300 concurrent clients (STOR 10M file) | 8.60 secs | 9.82 secs | **+0.07x** |
+ +-----------------------------------------+----------------+----------------+-------------+
+ | 300 concurrent clients (QUIT) | 0.03 secs | 0.01 secs | +0.14x |
+ +-----------------------------------------+----------------+----------------+-------------+
+
+ For more benchmarks see `here <http://pythonhosted.org/pyftpdlib/benchmarks.html>`__.
+
+ Quick start
+ ===========
+
+ .. code-block:: python
+
+ >>> from pyftpdlib.authorizers import DummyAuthorizer
+ >>> from pyftpdlib.handlers import FTPHandler
+ >>> from pyftpdlib.servers import FTPServer
+ >>>
+ >>> authorizer = DummyAuthorizer()
+ >>> authorizer.add_user("user", "12345", "/home/giampaolo", perm="elradfmw")
+ >>> authorizer.add_anonymous("/home/nobody")
+ >>>
+ >>> handler = FTPHandler
+ >>> handler.authorizer = authorizer
+ >>>
+ >>> server = FTPServer(("127.0.0.1", 21), handler)
+ >>> server.serve_forever()
+ [I 13-02-19 10:55:42] >>> starting FTP server on 127.0.0.1:21 <<<
+ [I 13-02-19 10:55:42] poller: <class 'pyftpdlib.ioloop.Epoll'>
+ [I 13-02-19 10:55:42] masquerade (NAT) address: None
+ [I 13-02-19 10:55:42] passive ports: None
+ [I 13-02-19 10:55:42] use sendfile(2): True
+ [I 13-02-19 10:55:45] 127.0.0.1:34178-[] FTP session opened (connect)
+ [I 13-02-19 10:55:48] 127.0.0.1:34178-[user] USER 'user' logged in.
+ [I 13-02-19 10:56:27] 127.0.0.1:34179-[user] RETR /home/giampaolo/.vimrc completed=1 bytes=1700 seconds=0.001
+ [I 13-02-19 10:56:39] 127.0.0.1:34179-[user] FTP session closed (disconnect).
+
+ `other code samples <http://pythonhosted.org/pyftpdlib/tutorial.html>`__
+
+ Donate
+ ======
+
+ A lot of time and effort went into making pyftpdlib as it is right now.
+ If you feel pyftpdlib is useful to you or your business and want to support its
+ future development please consider donating me
+ (`Giampaolo Rodola' <http://grodola.blogspot.com/p/about.html>`_) some money.
+ I only ask for a small donation, but of course I appreciate any amount.
+
+ .. image:: https://www.paypal.com/en_US/i/btn/btn_donateCC_LG.gif
+ :target: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZSSF7G42VA2XE
+ :alt: Donate via PayPal
+
+ Don't want to donate money? Then maybe you could
+ `write me a recommendation on Linkedin <http://www.linkedin.com/in/grodola>`_.
+ In case you're using pyftpdlib into a software of yours
+ `mail me <http://grodola.blogspot.com/p/about.html>`_ and I'll add your
+ software to the
+ `adoptions list <http://pythonhosted.org/pyftpdlib/adoptions.html>`__.
+
+ Timeline
+ ========
+
+ - 2015-12-13: version `1.5.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.0.tar.gz>`__ released.
+ - 2014-06-03: version `1.4.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.4.0.tar.gz>`__ released.
+ - 2014-04-12: version `1.3.1 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.3.1.tar.gz>`__ released.
+ - 2013-11-07: version `1.3.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.3.0.tar.gz>`__ released.
+ - 2013-04-22: version `1.2.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.2.0.tar.gz>`__ released.
+ - 2013-04-09: version `1.1.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.1.0.tar.gz>`__ released.
+ - 2013-02-22: version `1.0.1 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.0.1.tar.gz>`__ released.
+ - 2013-02-19: version `1.0.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.0.0.tar.gz>`__ released.
+ - 2012-05-14: pyftpdlib included in `ftp-cloudfs <https://github.com/chmouel/ftp-cloudfs/>`__ project.
+ - 2012-01-25: version `0.7.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.7.0.tar.gz>`__ released.
+ - 2011-12-01: pyftpdlib included in `feitp-server <http://code.google.com/p/feitp-server/>`__ project.
+ - 2011-09-26: pyftpdlib included in `ftpmaster <https://github.com/MarkLIC/ftpmaster>`__ project.
+ - 2011-07-09: pyftpdlib included in `bftpd <http://bftpd.sourceforge.net/>`__ project.
+ - 2011-07-09: pyftpdlib included in `fastersync <http://code.google.com/p/fastersync/>`__ project.
+ - 2011-01-31: pyftpdlib included in `put.io FTP connector project <http://code.google.com/p/pyftpdlib/wiki/Adoptions?ts=1296442469&updated=Adoptions#put.io*FTP*connector>`__.
+ - 2011-01-24: version `0.6.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.6.0.tar.gz>`__ released.
+ - 2010-12-14: added `donations <http://code.google.com/p/pyftpdlib/wiki/Donate>`__.
+ - 2010-08-24: pyftpdlib included in `peerscape <http://www.peerscape.org/>`__ project.
+ - 2010-07-15: pyftpdlib included in `Faetus <http://tomatohater.com/faetus/>`__ project.
+ - 2010-07-11: pyftpdlib included in `Pyfilesystem <http://code.google.com/p/pyfilesystem>`__ project.
+ - 2010-06-28: pyftpdlib has been `packaged for Debian <http://packages.debian.org/sid/python-pyftpdlib>`__
+ - 2010-04-28: pyftpdlib included in `sierramodulepos <http://forge.openbravo.com/plugins/mwiki/index.php/MobilePOS>`__ project.
+ - 2010-03-20: `http://www.smartfile.com <http://www.smartfile.com>`__ uses pyftpdlib.
+ - 2010-01-13: pyftpdlib included in `zenftp <http://code.irondojo.com/>`__ project.
+ - 2009-12-26: pyftpdlib included in `Symbian Python FTP server <http://code.google.com/p/sypftp>`__ project.
+ - 2009-11-04: `www.netplay.it <http://www.netplay.it>`__ uses pyftpdlib.
+ - 2009-11-04: `www.adcast.tv <http://www.adcast.tv>`__ uses pyftpdlib.
+ - 2009-11-04: `www.bitsontherun.com <http://www.bitsontherun.com>`__ uses pyftpdlib.
+ - 2009-11-02: pyftpdlib included in `ftp-cloudfs <http://github.com/chmouel/ftp-cloudfs>`__ project.
+ - 2009-09-14: version `0.5.2 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.5.2.tar.gz>`__ released.
+ - 2009-08-10: pyftpdlib included in `Imgserve <http://github.com/wuzhe/imgserve/tree/master>`__ project.
+ - 2009-07-22: pyftpdlib included in `Plumi <http://plumi.org/wiki>`__ project.
+ - 2009-04-02: pyftpdlib RPM-packaged and ported on `Fedora <https://admin.fedoraproject.org/pkgdb/packages/name/pyftpdlib>`__ to make users can easily install on it via *yum install pyftpdlib*.
+ - 2009-03-28: pyftpdlib included in `Bazaar <http://bazaar-vcs.org/>`__ project.
+ - 2009-02-23: pyftpdlib included in `ShareFTP <http://git.logfish.net/shareftp.git/>`__ project.
+ - 2009-01-21: version `0.5.1 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.5.1.tar.gz>`__ released.
+ - 2008-12-27: pyftpdlib included in `Google Chromium <http://code.google.com/intl/it-IT/chromium/>`__, the open source project behind `Google Chrome <http://www.google.com/chrome>`__.
+ - 2008-12-27: pyftpdlib ported on `GNU Darwin <http://www.gnu-darwin.org/>`__ systems to make users can easily install on it.
+ - 2008-11-26: pyftpdlib included in `OpenERP <http://openerp.com>`__.
+ - 2008-10-26: pyftpdlib included in `Python for OpenVMS <http://www.vmspython.org/>`__ as standard package.
+ - 2008-10-09: pyftpdlib included in `Shareme <http://bbs.archlinux.org/viewtopic.php?pid=431474>`__ project.
+ - 2008-09-20: version `0.5.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.5.0.tar.gz>`__ released.
+ - 2008-08-10: pyftpdlib included in `Manent <http://trac.manent-backup.com/>`__ project.
+ - 2008-05-16: version `0.4.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.4.0.tar.gz>`__ released.
+ - 2008-04-09: pyftpdlib used as backend for `gpftpd <http://arkadiusz-wahlig.blogspot.com/2008/04/hosting-files-on-google.html>`__, an FTP server for managing files hosted on `Google Pages <http://-ages.google.com>`__.
+ - 2008-01-17: version `0.3.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.3.0.tar.gz>`__ released.
+ - 2007-10-14: pyftpdlib included in `Aksy <http://walco.n--tree.net/projects/aksy/wiki>`__ project.
+ - 2007-09-17: version `0.2.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-0.2.0.tar.gz>`__ released.
+ - 2007-09-08: pyftpdlib included as `FarManager <http://farmanager.com/>`__ `plug-in <http://www.farmanager.com/enforum/viewtopic.php?t=640&highlight=&sid=12d4d90f27f421243bcf7a0e3c516efb>`__.
+ - 2007-03-06: pyftpdlib `ported on FreeBSD <http://www.freshports.org/ftp/py-pyftpdlib/>`__ systems to make users can easily install on it.
+ - 2007-03-07: version `0.1.1 <http://pyftpdlib.googlecode.com/files/pyftpdlib*0.1.1.tar.gz>`__ released.
+ - 2007-02-26: version `0.1.0 <http://pyftpdlib.googlecode.com/files/pyftpdlib*0.1.tar.gz>`__ released.
+ - 2006-09-26: initial clunky thread-based progenitor `link <http://billiejoex.altervista.org/Prj*pftpd.htm>`__.
+
+ Trademarks
+ ==========
+
+ Some famous trademarks which adopted pyftpdlib (`complete list <http://pythonhosted.org/pyftpdlib/adoptions.html>`__).
+
+ .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/chrome.jpg
+ :target: http://www.google.com/chrome
+ .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/debian.png
+ :target: http://www.debian.org
+ .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/fedora.png
+ :target: http://fedoraproject.org/
+ .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/freebsd.gif
+ :target: http://www.freebsd.org
+ .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/openerp.jpg
+ :target: http://openerp.com
+ .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/bazaar.jpg
+ :target: http://bazaar-vcs.org
+ .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/bitsontherun.png
+ :target: http://www.bitsontherun.com
+ .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/openvms.png
+ :target: http://www.openvms.org/
+ .. image:: http://pyftpdlib.googlecode.com/svn-history/wiki/images/smartfile.jpg
+ :target: http://www.openvms.org/
+
+Keywords: ftp,ftps,server,ftpd,daemon,python,ssl,sendfile,asynchronous,nonblocking,eventdriven,rfc959,rfc1123,rfc2228,rfc2428,rfc2640,rfc3659
+Platform: Platform Independent
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Console
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: File Transfer Protocol (FTP)
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: System :: Filesystems
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.0
+Classifier: Programming Language :: Python :: 3.1
+Classifier: Programming Language :: Python :: 3.2
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
diff --git a/README.rst b/README.rst
index c56b58d..7b1a972 100644
--- a/README.rst
+++ b/README.rst
@@ -50,8 +50,8 @@ Features
- ...But can optionally skip to a
`multiple thread / process <http://pythonhosted.org/pyftpdlib/tutorial.html#changing-the-concurrency-model>`__
model (as in: you'll be free to block or use slow filesystems).
-- Portable: entirely written in pure Python; works with Python from **2.4** to
- **3.4** (by using a single code base).
+- Portable: entirely written in pure Python; works with Python from **2.6** to
+ **3.5** by using a single code base.
- Supports **FTPS** (`RFC-4217 <http://tools.ietf.org/html/rfc4217>`__),
**IPv6** (`RFC-2428 <ftp://ftp.rfc-editor.org/in-notes/rfc2428.txt>`__),
**Unicode** file names (`RFC-2640 <http://tools.ietf.org/html/rfc2640>`__),
@@ -62,7 +62,7 @@ Features
`UNIX <http://pythonhosted.org/pyftpdlib/tutorial.html#unix-ftp-server>`__
and
`Windows <http://pythonhosted.org/pyftpdlib/tutorial.html#windows-ftp-server>`__.
-- `Test coverage <https://github.com/giampaolo/pyftpdlib/blob/master/test/test_ftpd.py>`__
+- `Test coverage <https://github.com/giampaolo/pyftpdlib/blob/master/pyftpdlib/test/>`__
close to 100%.
Performances
@@ -177,6 +177,7 @@ software to the
Timeline
========
+- 2015-12-13: version `1.5.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.5.0.tar.gz>`__ released.
- 2014-06-03: version `1.4.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.4.0.tar.gz>`__ released.
- 2014-04-12: version `1.3.1 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.3.1.tar.gz>`__ released.
- 2013-11-07: version `1.3.0 <https://pypi.python.org/packages/source/p/pyftpdlib/pyftpdlib-1.3.0.tar.gz>`__ released.
diff --git a/demo/anti_flood_ftpd.py b/demo/anti_flood_ftpd.py
index c12befe..864fedd 100755
--- a/demo/anti_flood_ftpd.py
+++ b/demo/anti_flood_ftpd.py
@@ -1,33 +1,8 @@
#!/usr/bin/env python
-# pyftpdlib is released under the MIT license, reproduced below:
-# ======================================================================
-# Copyright (C) 2007-2014 Giampaolo Rodola' <g.rodola at gmail.com>
-#
-# All Rights Reserved
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-# ======================================================================
+# Copyright (C) 2007-2016 Giampaolo Rodola' <g.rodola at gmail.com>.
+# Use of this source code is governed by MIT license that can be
+# found in the LICENSE file.
"""
A FTP server banning clients in case of commands flood.
@@ -36,9 +11,9 @@ If client sends more than 300 requests per-second it will be
disconnected and won't be able to re-connect for 1 hour.
"""
+from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
-from pyftpdlib.authorizers import DummyAuthorizer
class AntiFloodHandler(FTPHandler):
diff --git a/demo/basic_ftpd.py b/demo/basic_ftpd.py
index c1ebc4a..88512ab 100755
--- a/demo/basic_ftpd.py
+++ b/demo/basic_ftpd.py
@@ -1,33 +1,8 @@
#!/usr/bin/env python
-# pyftpdlib is released under the MIT license, reproduced below:
-# ======================================================================
-# Copyright (C) 2007-2014 Giampaolo Rodola' <g.rodola at gmail.com>
-#
-# All Rights Reserved
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-# ======================================================================
+# Copyright (C) 2007-2016 Giampaolo Rodola' <g.rodola at gmail.com>.
+# Use of this source code is governed by MIT license that can be
+# found in the LICENSE file.
"""A basic FTP server which uses a DummyAuthorizer for managing 'virtual
users', setting a limit for incoming connections.
diff --git a/demo/md5_ftpd.py b/demo/md5_ftpd.py
index 547c444..c2653bd 100755
--- a/demo/md5_ftpd.py
+++ b/demo/md5_ftpd.py
@@ -1,54 +1,29 @@
#!/usr/bin/env python
-# pyftpdlib is released under the MIT license, reproduced below:
-# ======================================================================
-# Copyright (C) 2007-2014 Giampaolo Rodola' <g.rodola at gmail.com>
-#
-# All Rights Reserved
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-# ======================================================================
+# Copyright (C) 2007-2016 Giampaolo Rodola' <g.rodola at gmail.com>.
+# Use of this source code is governed by MIT license that can be
+# found in the LICENSE file.
-"""A basic ftpd storing passwords as hash digests (platform independent).
+"""
+A basic ftpd storing passwords as hash digests (platform independent).
"""
+from hashlib import md5
import os
-try:
- from hashlib import md5
-except ImportError:
- # backward compatibility with Python < 2.5
- from md5 import new as md5
+import sys
+from pyftpdlib.authorizers import AuthenticationFailed
+from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
-from pyftpdlib.authorizers import DummyAuthorizer, AuthenticationFailed
-from pyftpdlib._compat import b
class DummyMD5Authorizer(DummyAuthorizer):
def validate_authentication(self, username, password, handler):
- hash = md5(b(password)).hexdigest()
+ if sys.version_info >= (3, 0):
+ password = md5(password.encode('latin1'))
+ hash = md5(password).hexdigest()
try:
if self.user_table[username]['pwd'] != hash:
raise KeyError
@@ -58,7 +33,7 @@ class DummyMD5Authorizer(DummyAuthorizer):
def main():
# get a hash digest from a clear-text password
- hash = md5(b('12345')).hexdigest()
+ hash = md5(b'12345').hexdigest()
authorizer = DummyMD5Authorizer()
authorizer.add_user('user', hash, os.getcwd(), perm='elradfmw')
authorizer.add_anonymous(os.getcwd())
diff --git a/demo/multi_proc_ftp.py b/demo/multi_proc_ftp.py
index 49e95eb..ccd03d9 100755
--- a/demo/multi_proc_ftp.py
+++ b/demo/multi_proc_ftp.py
@@ -1,33 +1,8 @@
#!/usr/bin/env python
-# pyftpdlib is released under the MIT license, reproduced below:
-# ======================================================================
-# Copyright (C) 2007-2014 Giampaolo Rodola' <g.rodola at gmail.com>
-#
-# All Rights Reserved
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-# ======================================================================
+# Copyright (C) 2007-2016 Giampaolo Rodola' <g.rodola at gmail.com>.
+# Use of this source code is governed by MIT license that can be
+# found in the LICENSE file.
"""
A FTP server which handles every connection in a separate process.
@@ -37,9 +12,9 @@ filesystem is too slow.
POSIX only; requires python >= 2.6.
"""
+from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import MultiprocessFTPServer
-from pyftpdlib.authorizers import DummyAuthorizer
def main():
diff --git a/demo/multi_thread_ftp.py b/demo/multi_thread_ftp.py
index ddbc3a4..c6161af 100755
--- a/demo/multi_thread_ftp.py
+++ b/demo/multi_thread_ftp.py
@@ -1,33 +1,8 @@
#!/usr/bin/env python
-# pyftpdlib is released under the MIT license, reproduced below:
-# ======================================================================
-# Copyright (C) 2007-2014 Giampaolo Rodola' <g.rodola at gmail.com>
-#
-# All Rights Reserved
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-# ======================================================================
+# Copyright (C) 2007-2016 Giampaolo Rodola' <g.rodola at gmail.com>.
+# Use of this source code is governed by MIT license that can be
+# found in the LICENSE file.
"""
A FTP server which handles every connection in a separate thread.
@@ -35,9 +10,9 @@ Useful if your handler class contains blocking calls or your
filesystem is too slow.
"""
+from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import ThreadedFTPServer
-from pyftpdlib.authorizers import DummyAuthorizer
def main():
diff --git a/demo/throttled_ftpd.py b/demo/throttled_ftpd.py
index 6de4e9b..a7464f4 100755
--- a/demo/throttled_ftpd.py
+++ b/demo/throttled_ftpd.py
@@ -1,42 +1,19 @@
#!/usr/bin/env python
-# pyftpdlib is released under the MIT license, reproduced below:
-# ======================================================================
-# Copyright (C) 2007-2014 Giampaolo Rodola' <g.rodola at gmail.com>
-#
-# All Rights Reserved
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-# ======================================================================
-
-"""An FTP server which uses the ThrottledDTPHandler class for limiting the
+# Copyright (C) 2007-2016 Giampaolo Rodola' <g.rodola at gmail.com>.
+# Use of this source code is governed by MIT license that can be
+# found in the LICENSE file.
+
+"""
+An FTP server which uses the ThrottledDTPHandler class for limiting the
speed of downloads and uploads.
"""
import os
from pyftpdlib.authorizers import DummyAuthorizer
-from pyftpdlib.handlers import FTPHandler, ThrottledDTPHandler
+from pyftpdlib.handlers import FTPHandler
+from pyftpdlib.handlers import ThrottledDTPHandler
from pyftpdlib.servers import FTPServer
... 14211 lines suppressed ...
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-pyftpdlib.git
More information about the Python-modules-commits
mailing list