postgres fix
This commit is contained in:
@@ -2,27 +2,27 @@
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import shutil
|
|
||||||
# import ssl
|
# import ssl
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
import psycopg2
|
import psycopg2
|
||||||
|
from psycopg2 import sql
|
||||||
|
|
||||||
from hashlib import md5
|
from hashlib import sha256
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
from utils.time import timestamp_fmt as ts
|
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 utils.config import set_config as setting
|
||||||
|
|
||||||
from pyftpdlib.handlers import FTPHandler, TLS_FTPHandler
|
from pyftpdlib.handlers import FTPHandler, TLS_FTPHandler
|
||||||
from pyftpdlib.servers import FTPServer
|
from pyftpdlib.servers import FTPServer
|
||||||
from pyftpdlib.authorizers import DummyAuthorizer, AuthenticationFailed
|
from pyftpdlib.authorizers import DummyAuthorizer, AuthenticationFailed
|
||||||
|
|
||||||
class DummyMD5Authorizer(DummyAuthorizer):
|
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):
|
def __init__(self, cfg):
|
||||||
# Initialize the DummyAuthorizer and add the admin user
|
# Initialize the DummyAuthorizer and add the admin user
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@@ -30,17 +30,11 @@ class DummyMD5Authorizer(DummyAuthorizer):
|
|||||||
cfg.adminuser[0], cfg.adminuser[1], cfg.adminuser[2], perm=cfg.adminuser[3])
|
cfg.adminuser[0], cfg.adminuser[1], cfg.adminuser[2], perm=cfg.adminuser[3])
|
||||||
|
|
||||||
# Definisci la connessione al database
|
# Definisci la connessione al database
|
||||||
conn = psycopg2.connect(
|
conn = conn_db(cfg)
|
||||||
dbname=cfg.dbname,
|
|
||||||
user=cfg.dbuser,
|
|
||||||
password=cfg.dbpass,
|
|
||||||
host=cfg.dbhost,
|
|
||||||
port=cfg.dbport
|
|
||||||
)
|
|
||||||
|
|
||||||
# Crea un cursore
|
# Crea un cursore
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
cur.execute("SELECT ftpuser, hash, virtpath, perm FROM virtusers")
|
cur.execute(f'SELECT ftpuser, hash, virtpath, perm FROM {cfg.dbschema}.{cfg.dbtable}')
|
||||||
|
|
||||||
for ftpuser, hash, virtpath, perm in cur.fetchall():
|
for ftpuser, hash, virtpath, perm in cur.fetchall():
|
||||||
self.add_user(ftpuser, hash, virtpath, perm)
|
self.add_user(ftpuser, hash, virtpath, perm)
|
||||||
@@ -51,7 +45,7 @@ class DummyMD5Authorizer(DummyAuthorizer):
|
|||||||
|
|
||||||
def validate_authentication(self, username, password, handler):
|
def validate_authentication(self, username, password, handler):
|
||||||
# Validate the user's password against the stored hash
|
# Validate the user's password against the stored hash
|
||||||
hash = md5(password.encode("UTF-8")).hexdigest()
|
hash = sha256(password.encode("UTF-8")).hexdigest()
|
||||||
try:
|
try:
|
||||||
if self.user_table[username]["pwd"] != hash:
|
if self.user_table[username]["pwd"] != hash:
|
||||||
raise KeyError
|
raise KeyError
|
||||||
@@ -90,16 +84,9 @@ class ASEHandler(FTPHandler):
|
|||||||
if (fileExtension.upper() in (cfg.fileext)):
|
if (fileExtension.upper() in (cfg.fileext)):
|
||||||
with open(file, 'r') as csvfile:
|
with open(file, 'r') as csvfile:
|
||||||
lines = csvfile.readlines()
|
lines = csvfile.readlines()
|
||||||
conn = psycopg2.connect(
|
conn = conn_db(cfg)
|
||||||
dbname=cfg.dbname,
|
|
||||||
user=cfg.dbuser,
|
|
||||||
password=cfg.dbpass,
|
|
||||||
host=cfg.dbhost,
|
|
||||||
port=cfg.dbport
|
|
||||||
)
|
|
||||||
|
|
||||||
# Crea un cursore
|
# Crea un cursore
|
||||||
print(file, lines)
|
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
try:
|
try:
|
||||||
cur.execute("INSERT INTO received (filename, content) VALUES (%s,%s)" , (filename, lines))
|
cur.execute("INSERT INTO received (filename, content) VALUES (%s,%s)" , (filename, lines))
|
||||||
@@ -125,7 +112,7 @@ class ASEHandler(FTPHandler):
|
|||||||
parms = line.split()
|
parms = line.split()
|
||||||
user = os.path.basename(parms[0]) # Extract the username
|
user = os.path.basename(parms[0]) # Extract the username
|
||||||
password = parms[1] # Get the password
|
password = parms[1] # Get the password
|
||||||
hash = md5(password.encode("UTF-8")).hexdigest() # Hash the password
|
hash = sha256(password.encode("UTF-8")).hexdigest() # Hash the password
|
||||||
except:
|
except:
|
||||||
self.respond('501 SITE ADDU failed. Command needs 2 arguments')
|
self.respond('501 SITE ADDU failed. Command needs 2 arguments')
|
||||||
else:
|
else:
|
||||||
@@ -138,20 +125,14 @@ class ASEHandler(FTPHandler):
|
|||||||
try:
|
try:
|
||||||
# Add the user to the authorizer
|
# Add the user to the authorizer
|
||||||
self.authorizer.add_user(str(user),
|
self.authorizer.add_user(str(user),
|
||||||
hash, cfg.virtpath + "/" + user, perm="lmw")
|
hash, cfg.virtpath + "/" + user, perm=cfg.defperm)
|
||||||
# Save the user to the SQLite database
|
# Save the user to the database
|
||||||
# Definisci la connessione al database
|
# Definisci la connessione al database
|
||||||
conn = psycopg2.connect(
|
conn = conn_db(cfg)
|
||||||
dbname=cfg.dbname,
|
|
||||||
user=cfg.dbuser,
|
|
||||||
password=cfg.dbpass,
|
|
||||||
host=cfg.dbhost,
|
|
||||||
port=cfg.dbport
|
|
||||||
)
|
|
||||||
|
|
||||||
# Crea un cursore
|
# Crea un cursore
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
cur.execute("INSERT INTO virtusers (ftpuser, hash, virtpath, perm) VALUES (%s,%s,%s,%s)" , (user, hash, cfg.virtpath + user, 'elmw'))
|
cur.execute(f"INSERT INTO {cfg.dbschema}.{cfg.dbtable} (ftpuser, hash, virtpath, perm) VALUES ('{user}', '{hash}', '{cfg.virtpath + user}', '{cfg.defperm}')")
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
logging.info("User {} created.".format(user))
|
logging.info("User {} created.".format(user))
|
||||||
@@ -169,26 +150,19 @@ class ASEHandler(FTPHandler):
|
|||||||
try:
|
try:
|
||||||
# Remove the user from the authorizer
|
# Remove the user from the authorizer
|
||||||
self.authorizer.remove_user(str(user))
|
self.authorizer.remove_user(str(user))
|
||||||
# Delete the user from the SQLite database
|
# Delete the user from database
|
||||||
|
conn = conn_db(cfg)
|
||||||
conn = psycopg2.connect(
|
|
||||||
dbname=cfg.dbname,
|
|
||||||
user=cfg.dbuser,
|
|
||||||
password=cfg.dbpass,
|
|
||||||
host=cfg.dbhost,
|
|
||||||
port=cfg.dbport
|
|
||||||
)
|
|
||||||
|
|
||||||
# Crea un cursore
|
# Crea un cursore
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
cur.execute("DELETE FROM virtusers WHERE ftpuser = %s", (user, ))
|
cur.execute(f"DELETE FROM {cfg.dbschema}.{cfg.dbtable} WHERE ftpuser = '{user}'")
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
logging.info("User {} deleted.".format(user))
|
logging.info("User {} deleted.".format(user))
|
||||||
self.respond('200 SITE DELU successful.')
|
self.respond('200 SITE DELU successful.')
|
||||||
|
|
||||||
except:
|
except Exception as e:
|
||||||
self.respond('501 SITE DELU failed.')
|
self.respond('501 SITE DELU failed.')
|
||||||
|
|
||||||
def ftp_SITE_LSTU(self, line):
|
def ftp_SITE_LSTU(self, line):
|
||||||
@@ -199,18 +173,12 @@ class ASEHandler(FTPHandler):
|
|||||||
users_list = []
|
users_list = []
|
||||||
try:
|
try:
|
||||||
# Connect to the SQLite database to fetch users
|
# Connect to the SQLite database to fetch users
|
||||||
conn = psycopg2.connect(
|
conn = conn_db(cfg)
|
||||||
dbname=cfg.dbname,
|
|
||||||
user=cfg.dbuser,
|
|
||||||
password=cfg.dbpass,
|
|
||||||
host=cfg.dbhost,
|
|
||||||
port=cfg.dbport
|
|
||||||
)
|
|
||||||
|
|
||||||
# Crea un cursore
|
# Crea un cursore
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
self.push("214-The following virtual users are defined:\r\n")
|
self.push("214-The following virtual users are defined:\r\n")
|
||||||
cur.execute("SELECT ftpuser, perm FROM virtusers")
|
cur.execute(f'SELECT ftpuser, perm FROM {cfg.dbschema}.{cfg.dbtable}')
|
||||||
[users_list.append(f'Username: {ftpuser}\tPerms: {perm}\r\n') for ftpuser, perm in cur.fetchall()]
|
[users_list.append(f'Username: {ftpuser}\tPerms: {perm}\r\n') for ftpuser, perm in cur.fetchall()]
|
||||||
self.push(''.join(users_list))
|
self.push(''.join(users_list))
|
||||||
self.respond("214 LSTU SITE command successful.")
|
self.respond("214 LSTU SITE command successful.")
|
||||||
@@ -224,7 +192,7 @@ def main():
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# Initialize the authorizer and handler
|
# Initialize the authorizer and handler
|
||||||
authorizer = DummyMD5Authorizer(cfg)
|
authorizer = DummySha256Authorizer(cfg)
|
||||||
handler = ASEHandler
|
handler = ASEHandler
|
||||||
handler.cfg = cfg
|
handler.cfg = cfg
|
||||||
handler.authorizer = authorizer
|
handler.authorizer = authorizer
|
||||||
@@ -247,6 +215,7 @@ def main():
|
|||||||
logging.info(
|
logging.info(
|
||||||
"Info: {}.".format("Shutdown requested...exiting")
|
"Info: {}.".format("Shutdown requested...exiting")
|
||||||
)
|
)
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
print(
|
print(
|
||||||
"{} - PID {:>5} >> Error: {}.".format(
|
"{} - PID {:>5} >> Error: {}.".format(
|
||||||
|
|||||||
@@ -6,10 +6,11 @@
|
|||||||
proxyAddr = 0.0.0.0
|
proxyAddr = 0.0.0.0
|
||||||
portRangeWidth = 500
|
portRangeWidth = 500
|
||||||
virtpath = /home/alex/aseftp/
|
virtpath = /home/alex/aseftp/
|
||||||
adminuser = admin|c8cf955bd8b8a78419013b831e627eb2|/home/alex/aseftp/|elradfmwMT
|
adminuser = admin|83e61ecb0e9871aff37a12491aa848f884f5657ddbfd46454878e28afbecfc20|/home/alex/aseftp/|elradfmwMT
|
||||||
servertype = FTPHandler
|
servertype = FTPHandler
|
||||||
certfile = /home/alex/aseftp/keycert.pem
|
certfile = /home/alex/aseftp/keycert.pem
|
||||||
fileext = .CSV|.TXT
|
fileext = .CSV|.TXT
|
||||||
|
defaultUserPerm = elmw
|
||||||
#servertype = FTPHandler/TLS_FTPHandler
|
#servertype = FTPHandler/TLS_FTPHandler
|
||||||
|
|
||||||
[csvfs]
|
[csvfs]
|
||||||
@@ -24,4 +25,6 @@
|
|||||||
user = asepg
|
user = asepg
|
||||||
password = batt1l0
|
password = batt1l0
|
||||||
dbName = asedb
|
dbName = asedb
|
||||||
tableName = virtusers
|
dbSchema = public
|
||||||
|
tableName = virtusers
|
||||||
|
defaultPerm = elmw
|
||||||
@@ -19,6 +19,7 @@ class config:
|
|||||||
self.servertype = c.get("ftpserver", "servertype")
|
self.servertype = c.get("ftpserver", "servertype")
|
||||||
self.certfile = c.get("ftpserver", "certfile")
|
self.certfile = c.get("ftpserver", "certfile")
|
||||||
self.fileext = c.get("ftpserver", "fileext").upper().split("|")
|
self.fileext = c.get("ftpserver", "fileext").upper().split("|")
|
||||||
|
self.defperm = c.get("ftpserver", "defaultUserPerm")
|
||||||
|
|
||||||
# CSV FILE setting
|
# CSV FILE setting
|
||||||
self.csvfs = c.get("csvfs", "path")
|
self.csvfs = c.get("csvfs", "path")
|
||||||
@@ -32,4 +33,5 @@ class config:
|
|||||||
self.dbuser = c.get("db", "user")
|
self.dbuser = c.get("db", "user")
|
||||||
self.dbpass = c.get("db", "password")
|
self.dbpass = c.get("db", "password")
|
||||||
self.dbname = c.get("db", "dbName")
|
self.dbname = c.get("db", "dbName")
|
||||||
|
self.dbschema = c.get("db", "dbSchema")
|
||||||
self.dbtable = c.get("db", "tableName")
|
self.dbtable = c.get("db", "tableName")
|
||||||
|
|||||||
Reference in New Issue
Block a user