рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдлрд╝рдЯреАрдкреА рд╕рд░реНрд╡рд░

рдЫрд╡рд┐



рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдХрдИ рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдПрдлрд╝рдЯреАрдкреА рд╕рд░реНрд╡рд░ рд╣реИрдВред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдПрдлрд╝рдЯреАрдкреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдПрдлрд╝рдЯреАрдкреА рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреЛрд░реНрдЯ рдкрд░ рдЙрдард╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдпрд╣ рдкреВрдЫрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдкрд╛рдпрдерди рдЯреВрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЦреЛрдЬ рдиреЗ рдЬрд▓реНрдж рд╣реА pyFTPd рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реМрдЯрд╛ рджреАред





рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рддреИрдпрд╛рд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рджреЛ рдорд┐рдирдЯ рдореЗрдВ рдЕрдкрдиреЗ рдПрдлрд╝рдЯреАрдкреА рд╕рд░реНрд╡рд░ рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдПред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдкрде рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдиреЗ рдФрд░ рдЗрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдФрд░ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдЙрдкрд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдлрд╝рдЯреАрдкреА рд╕рд░реНрд╡рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ :)



рдбреЗрдЯрд╛рдмреЗрд╕



рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдЬрдЯрд┐рд▓ рд╕реЗ рдкрд░реЗ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

рдПрд╕рдХреНрдпреВрдПрд▓:

CREATE TABLE ` users ` (

` id ` int ( 11 ) NOT NULL auto_increment,

` username ` varchar ( 255 ) NOT NULL ,

` password ` varchar ( 32 ) NOT NULL ,

` path ` varchar ( 255 ) NOT NULL ,

` perm ` varchar ( 8 ) default NULL ,

PRIMARY KEY ( ` id ` ),

KEY ` username ` ( ` username ` )

)









рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореБрдЦреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЙрдЧрд┐рди, рдкрд╛рд╕рд╡рд░реНрдб, рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░ рдФрд░ рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдкрде рд╣реИ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред



рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди



рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рддреБрд░рдВрдд рдХреА рдЧрдИ рдереА рд╡рд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╡рд░реНрдЧ рдЖрд╡рд░рдг рдерд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛, рдЖрдк MySQL рдХреЛ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред



class DB :



init = None

db = None

def __init__ ( self ,init_db):

""" Constructor """

self . init = init_db

self . db = self . init()



def doSql ( self ,sql):

""" Handle SQL """

try :

self . db . execute(sql)

except :

try :

self . db = self . init()

self . db . execute(sql)

except :

print "error:" + sql



def getDB ( self ):

""" """

return self . db



def getLastId ( self ):

"""Get last insert ID"""

sql = "select LAST_INSERT_ID() as `id`"

self . doSql(sql)

data = self . db . fetchone()

if 'id' in data:

return data[ 'id' ]

else :

return None









рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдФрд░ рд╕реНрд╡рдпрдВ рд╕рд░реНрд╡рд░ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рддрд░реАрдХреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА рдЧрдИ рдЬреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ рдФрд░ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рд╕реНрдерд╛рди рдЪреБрдирдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред

рд╕рд░реНрд╡рд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╡рд┐рдзрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

. . .

def starterver ( self ):

"""Run server"""

authorizer = self . ftpserver . DummyAuthorizer()



authorizer . validate_authentication = self . my_validate_authentication

authorizer . get_home_dir = self . my_get_home_dir

authorizer . get_perms = self . my_get_perms

authorizer . get_msg_login = self . my_get_msg_login

authorizer . get_msg_quit = self . my_get_msg_quit



authorizer . has_perm = self . my_has_perms

authorizer . has_user = self . my_has_user



# Instantiate FTP handler class

ftp_handler = ftpserver . FTPHandler

ftp_handler . authorizer = authorizer

ftp_handler . passive_ports = range ( 63000 , 63500 )

# Define a customized banner (string returned when client connects)

ftp_handler . banner = "pyftpdlib %s based ftpd ready." % ftpserver . __ver__



address = ( '127.0.0.1' , 23 )

ftpd = ftpserver . FTPServer(address, ftp_handler)



# set a limit for connections

ftpd . max_cons = 256

ftpd . max_cons_per_ip = 5



# start ftp server

ftpd . serve_forever()

. . .









рдореБрдЦреНрдп рд╡рд┐рдзрд┐рдпрд╛рдВ рдЬрд┐рдиреНрд╣реЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ





validate_authentication - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ред

get_home_dir - рд╡рд╣ рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред

get_perms - рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдЕрдиреБрдорддрд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

has_perm - рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣реБрдБрдЪ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛

has_user - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ



рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

from db import DB

from config import init_db

class User :



def __init__ ( self ):

"""Init"""



def auth ( self ,username,password):

"""Make auth"""

sql = "select * from `users` where `username`=' %s ' and `password`=' %s '" % (username,password)

db = DB(init_db)

db . doSql(sql)

res = db . getDB() . fetchone()

if res:

return 1

else :

return None



def getPath ( self ,username):

"""Return path by username"""

sql = "select `path` from `users` where `username`=' %s '" % username

db = DB(init_db)

db . doSql(sql)

uparam = db . getDB() . fetchone()

if uparam:

return uparam[ 'path' ]

else :

return None



def getPerm ( self ,username):

"""Return permission by username"""

sql = "select `perm` from `users` where `username`=' %s '" % username

db = DB(init_db)

db . doSql(sql)

uparam = db . getDB() . fetchone()

if uparam:

return uparam[ 'perm' ]

else :

return ''



def hasUser ( self ,username):

"""Checj user into DB"""

sql = "select `id` from `users` where `username`=' %s '" % (username)

db = DB(init_db)

db . doSql(sql)

uparam = db . getDB() . fetchone()

if uparam:

return 1

else :

return 0









рд╣рдо рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЗ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ:

def my_validate_authentication ( self ,username,password):

return User() . auth(username, password)



def my_get_home_dir ( self ,username):

return User() . getPath(username)



def my_get_perms ( self ,username):

return User() . getPerm(username)



def my_get_msg_login ( self ,username):

return 'hello msg login'



def my_get_msg_quit ( self ,username):

return 'byu msg quit'



def my_has_user ( self ,username):

return User() . hasUser(username)



def my_has_perms ( self ,username, perm, path = None ):

return 1









рдкрд░рд┐рдгрд╛рдо



рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред



рдХреНрдпрд╛ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ



рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЙрд▓ рдХреЛ рдСрдлрд╝рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, memcacheред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:





рд╕реНрд░реЛрдд рдХреЛрдб



рд╕реЛрд░реНрд╕ рдХреЛрдб рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред



рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ



http://en.wikipedia.org/wiki/File_Transfer_Protocol

http://code.google.com/p/pyftpdlib/



All Articles