diff --git a/ase-receiver/ase-receiver/FtpCsvReceiver.py b/ase-receiver/ase-receiver/FtpCsvReceiver.py index f9dc214..96536c8 100755 --- a/ase-receiver/ase-receiver/FtpCsvReceiver.py +++ b/ase-receiver/ase-receiver/FtpCsvReceiver.py @@ -19,7 +19,7 @@ from utils.time import timestamp_fmt as ts from utils.time import date_refmt as df from utils.config import set_config as setting -from pyftpdlib.handlers import FTPHandler +from pyftpdlib.handlers import FTPHandler, TLS_FTPHandler from pyftpdlib.servers import FTPServer from pyftpdlib.authorizers import DummyAuthorizer, AuthenticationFailed @@ -96,9 +96,23 @@ class mq: class DummyMD5Authorizer(DummyAuthorizer): + def __init__(self, cfg): + super().__init__() + self.add_user( + cfg.adminuser[0], cfg.adminuser[1], cfg.adminuser[2], perm=cfg.adminuser[3]) + + con = sqlite3.connect(cfg.virtusersdb) + cur = con.cursor() + cur.execute( + '''CREATE TABLE IF NOT EXISTS virtusers (user text, hash text, virtpath text, perm text)''') + cur.execute( + '''CREATE INDEX IF NOT EXISTS user_idx on virtusers(user)''') + + for row in cur.execute('SELECT * FROM virtusers'): + self.add_user(row[0], row[1], row[2], perm=row[3]) + con.close() + def validate_authentication(self, username, password, handler): - # if sys.version_info >= (3, 0): - # password = md5(password.encode("latin1")) hash = md5(password.encode("UTF-8")).hexdigest() try: if self.user_table[username]["pwd"] != hash: @@ -109,6 +123,22 @@ class DummyMD5Authorizer(DummyAuthorizer): class ASEHandler(FTPHandler): + def __init__(self, conn, server, ioloop=None): + super().__init__(conn, server, ioloop) + self.proto_cmds = FTPHandler.proto_cmds.copy() + self.proto_cmds.update( + {'SITE ADDU': dict(perm='M', auth=True, arg=True, + help='Syntax: SITE ADDU USERNAME PASSWORD (add virtual user).')} + ) + self.proto_cmds.update( + {'SITE DELU': dict(perm='M', auth=True, arg=True, + help='Syntax: SITE DELU USERNAME (remove virtual user).')} + ) + self.proto_cmds.update( + {'SITE LSTU': dict(perm='M', auth=True, arg=None, + help='Syntax: SITE LSTU (list virtual users).')} + ) + def on_file_received(self, file): unitType = "" unitName = "" @@ -286,11 +316,16 @@ class ASEHandler(FTPHandler): (user, hash, cfg.virtpath + user, 'elmw')) con.commit() con.close() + logging.info( + "PID {:>5} >> User {} created.".format( + os.getpid(), user + ) + ) self.respond('200 SITE ADDU successful.') except: - self.respond('501 Invalid SITE ADDU format.') + self.respond('501 SITE ADDU failed.') - def ftp_SITE_REMU(self, line): + def ftp_SITE_DELU(self, line): """ remove virtual user and save virtuser cfg file """ @@ -304,10 +339,15 @@ class ASEHandler(FTPHandler): cur.execute("DELETE FROM virtusers WHERE user = ?", (user,)) con.commit() con.close() - self.respond('200 SITE REMU successful.') + logging.info( + "PID {:>5} >> User {} deleted.".format( + os.getpid(), user + ) + ) + self.respond('200 SITE DELU successful.') except: - self.respond('501 Invalid SITE REMU format.') + self.respond('501 SITE DELU failed.') def ftp_SITE_LSTU(self, line): """ @@ -334,37 +374,8 @@ def main(): cfg = setting.config() try: - proto_cmds = FTPHandler.proto_cmds.copy() - proto_cmds.update( - {'SITE ADDU': dict(perm='M', auth=True, arg=True, - help='Syntax: SITE ADDU USERNAME PASSWORD (add virtual user).')} - ) - proto_cmds.update( - {'SITE REMU': dict(perm='M', auth=True, arg=True, - help='Syntax: SITE REMU USERNAME (remove virtual user).')} - ) - proto_cmds.update( - {'SITE LSTU': dict(perm='M', auth=True, arg=None, - help='Syntax: SITE LSTU (list virtual users).')} - ) - - authorizer = DummyMD5Authorizer() - authorizer.add_user( - cfg.adminuser[0], cfg.adminuser[1], cfg.adminuser[2], perm=cfg.adminuser[3]) - - con = sqlite3.connect(cfg.virtusersdb) - cur = con.cursor() - cur.execute( - '''CREATE TABLE IF NOT EXISTS virtusers (user text, hash text, virtpath text, perm text)''') - cur.execute( - '''CREATE INDEX IF NOT EXISTS user_idx on virtusers(user)''') - - for row in cur.execute('SELECT * FROM virtusers'): - authorizer.add_user(row[0], row[1], row[2], perm=row[3]) - con.close() - + authorizer = DummyMD5Authorizer(cfg) handler = ASEHandler - handler.proto_cmds = proto_cmds handler.cfg = cfg handler.authorizer = authorizer handler.masquerade_address = cfg.proxyaddr diff --git a/ase-receiver/ase-receiver/ftpcsvreceiver.ini b/ase-receiver/ase-receiver/ftpcsvreceiver.ini index 0897d1b..6ca77b5 100644 --- a/ase-receiver/ase-receiver/ftpcsvreceiver.ini +++ b/ase-receiver/ase-receiver/ftpcsvreceiver.ini @@ -6,6 +6,8 @@ virtusersdb = /home/aseftp/virtusers.db virtpath = /home/aseftp/ adminuser = admin|c8cf955bd8b8a78419013b831e627eb2|/home/aseftp/|elradfmwMT + servertype = FTPHandler + #servertype = FTPHandler/TLS_FTPHandler [mailserver] diff --git a/ase-receiver/ase-receiver/utils/config/set_config.py b/ase-receiver/ase-receiver/utils/config/set_config.py index da0ab2b..dc33ded 100644 --- a/ase-receiver/ase-receiver/utils/config/set_config.py +++ b/ase-receiver/ase-receiver/utils/config/set_config.py @@ -16,6 +16,7 @@ class config: self.virtusersdb = c.get("ftpserver", "virtusersdb") self.virtpath = c.get("ftpserver", "virtpath") self.adminuser = c.get("ftpserver", "adminuser").split("|") + self.servertype = c.get("ftpserver", "servertype") # MAIL setting self.smtphost = c.get("mailserver", "hostname") self.smtpport = c.getint("mailserver", "port")