1
# Copyright (c) 2008 Twisted Matrix Laboratories.
2
# See LICENSE for details.
5
An example FTP server with minimal user authentication.
8
from twisted.protocols.ftp import FTPFactory, FTPRealm
9
from twisted.cred.portal import Portal
10
from twisted.cred.checkers import AllowAnonymousAccess, FilePasswordDB
11
from twisted.internet import reactor
14
# First, set up a portal (twisted.cred.portal.Portal). This will be used
15
# to authenticate user logins, including anonymous logins.
17
# Part of this will be to establish the "realm" of the server - the most
18
# important task in this case is to establish where anonymous users will
19
# have default access to. In a real world scenario this would typically
20
# point to something like '/pub' but for this example it is pointed at the
21
# current working directory.
23
# The other important part of the portal setup is to point it to a list of
24
# credential checkers. In this case, the first of these is used to grant
25
# access to anonymous users and is relatively simple; the second is a very
26
# primitive password checker. This example uses a plain text password file
27
# that has one username:password pair per line. This checker *does* provide
28
# a hashing interface, and one would normally want to use it instead of
29
# plain text storage for anything remotely resembling a 'live' network. In
30
# this case, the file "pass.dat" is used, and stored in the same directory
33
# Create a pass.dat file which looks like this:
35
# =====================
38
# =====================
40
p = Portal(FTPRealm('./'),
41
[AllowAnonymousAccess(), FilePasswordDB("pass.dat")])
44
# Once the portal is set up, start up the FTPFactory and pass the portal to
45
# it on startup. FTPFactory will start up a twisted.protocols.ftp.FTP()
46
# handler for each incoming OPEN request. Business as usual in Twisted land.
51
# You know this part. Point the reactor to port 21 coupled with the above factory,
52
# and start the event loop.
54
reactor.listenTCP(21, f)