From c808e50c34de0f228202c1996692bc0a9ae47edb Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 22 Nov 2024 19:30:04 +0100 Subject: [PATCH] cancellazione user virtuale --- ftpReceiver/FtpCsvReceiver.py | 47 +++++++++++++++++++++++++++++++--- ftpReceiver/ftpcsvreceiver.ini | 2 +- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/ftpReceiver/FtpCsvReceiver.py b/ftpReceiver/FtpCsvReceiver.py index 0f4b3bc..73ccd43 100755 --- a/ftpReceiver/FtpCsvReceiver.py +++ b/ftpReceiver/FtpCsvReceiver.py @@ -22,6 +22,7 @@ from pyftpdlib.authorizers import DummyAuthorizer, AuthenticationFailed def conn_db(cfg): return psycopg2.connect(dbname=cfg.dbname, user=cfg.dbuser, password=cfg.dbpass, host=cfg.dbhost, port=cfg.dbport ) + class DummySha256Authorizer(DummyAuthorizer): def __init__(self, cfg): # Initialize the DummyAuthorizer and add the admin user @@ -34,7 +35,7 @@ class DummySha256Authorizer(DummyAuthorizer): # Crea un cursore cur = conn.cursor() - cur.execute(f'SELECT ftpuser, hash, virtpath, perm FROM {cfg.dbschema}.{cfg.dbtable}') + cur.execute(f'SELECT ftpuser, hash, virtpath, perm FROM {cfg.dbschema}.{cfg.dbtable} WHERE deleted_at IS NULL') for ftpuser, hash, virtpath, perm in cur.fetchall(): self.add_user(ftpuser, hash, virtpath, perm) @@ -52,7 +53,6 @@ class DummySha256Authorizer(DummyAuthorizer): except KeyError: raise AuthenticationFailed - class ASEHandler(FTPHandler): def __init__(self, conn, server, ioloop=None): @@ -68,6 +68,10 @@ class ASEHandler(FTPHandler): {'SITE DELU': dict(perm='M', auth=True, arg=True, help='Syntax: SITE DELU USERNAME (remove virtual user).')} ) + self.proto_cmds.update( + {'SITE RESU': dict(perm='M', auth=True, arg=True, + help='Syntax: SITE RESU USERNAME (restore virtual user).')} + ) self.proto_cmds.update( {'SITE LSTU': dict(perm='M', auth=True, arg=None, help='Syntax: SITE LSTU (list virtual users).')} @@ -155,7 +159,7 @@ class ASEHandler(FTPHandler): # Crea un cursore cur = conn.cursor() - cur.execute(f"DELETE FROM {cfg.dbschema}.{cfg.dbtable} WHERE ftpuser = '{user}'") + cur.execute(f"UPDATE {cfg.dbschema}.{cfg.dbtable} SET deleted_at = now() WHERE ftpuser = '{user}'") conn.commit() conn.close() @@ -164,6 +168,41 @@ class ASEHandler(FTPHandler): except Exception as e: self.respond('501 SITE DELU failed.') + print(e) + + def ftp_SITE_RESU(self, line): + """ + Restore a virtual user and save the virtuser configuration file. + """ + cfg = self.cfg + parms = line.split() + user = os.path.basename(parms[0]) # Extract the username + try: + # Restore the user into database + conn = conn_db(cfg) + + # Crea un cursore + cur = conn.cursor() + cur.execute(f"UPDATE {cfg.dbschema}.{cfg.dbtable} SET deleted_at = null WHERE ftpuser = '{user}'") + conn.commit() + + cur.execute(f"SELECT ftpuser, hash, virtpath, perm FROM {cfg.dbschema}.{cfg.dbtable} WHERE ftpuser = '{user}'") + + ftpuser, hash, virtpath, perm = cur.fetchone() + self.authorizer.add_user(ftpuser, hash, virtpath, perm) + try: + Path(cfg.virtpath + ftpuser).mkdir(parents=True, exist_ok=True) + except: + self.responde('551 Error in create virtual user path.') + + conn.close() + + logging.info("User {} restored.".format(user)) + self.respond('200 SITE RESU successful.') + + except Exception as e: + self.respond('501 SITE RESU failed.') + print(e) def ftp_SITE_LSTU(self, line): """ @@ -178,7 +217,7 @@ class ASEHandler(FTPHandler): # Crea un cursore cur = conn.cursor() self.push("214-The following virtual users are defined:\r\n") - cur.execute(f'SELECT ftpuser, perm FROM {cfg.dbschema}.{cfg.dbtable}') + cur.execute(f'SELECT ftpuser, perm FROM {cfg.dbschema}.{cfg.dbtable} WHERE deleted_at IS NULL ') [users_list.append(f'Username: {ftpuser}\tPerms: {perm}\r\n') for ftpuser, perm in cur.fetchall()] self.push(''.join(users_list)) self.respond("214 LSTU SITE command successful.") diff --git a/ftpReceiver/ftpcsvreceiver.ini b/ftpReceiver/ftpcsvreceiver.ini index ef2c205..0b5901e 100644 --- a/ftpReceiver/ftpcsvreceiver.ini +++ b/ftpReceiver/ftpcsvreceiver.ini @@ -1,5 +1,5 @@ # to generete adminuser password hash: -# python3 -c 'from hashlib import md5;print(md5("????admin-password???".encode("UTF-8")).hexdigest())' +# python3 -c 'from hashlib import md5;print(md5("????password???".encode("UTF-8")).hexdigest())' [ftpserver] firstPort = 40000 logFilename = ./ftppylog.log