commit a9e59b3d9e5159399530abe0be65389208135d98 Author: Yannik Schmidt Date: Sun Aug 29 18:00:18 2021 +0200 Initial diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8a335e7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +js/ +css/ +__pycache__/ +*.bak +*.swp +*.sqlite diff --git a/README.md b/README.md new file mode 100644 index 0000000..5d48bf9 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# OS Requirements + +- vsftpd +- python3 +- pip + +# Python Requirements + +- flask + +# Initial Setup + + mkdir /var/ftp/ + +# Add a User + + /etc/vsftp.conf: write_enable=YES diff --git a/app.py b/app.py new file mode 100644 index 0000000..6a108a0 --- /dev/null +++ b/app.py @@ -0,0 +1,3 @@ +import server +def createApp(envivorment=None, start_response=None): + return server.app diff --git a/scripts/create_user.sh b/scripts/create_user.sh new file mode 100644 index 0000000..aadfe56 --- /dev/null +++ b/scripts/create_user.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +useradd -m -p ${1} ${2} diff --git a/server.py b/server.py new file mode 100755 index 0000000..7554fe8 --- /dev/null +++ b/server.py @@ -0,0 +1,76 @@ +#!/usr/bin/python3 +import flask +import sys +import argparse +import os +import subprocess +import crypt + +from sqlalchemy import Column, Integer, String, Boolean, or_, and_ +from sqlalchemy.orm import sessionmaker +from sqlalchemy.exc import IntegrityError +from sqlalchemy.sql import func + +from flask_sqlalchemy import SQLAlchemy + +app = flask.Flask("Flask-VSFTP-User-Tool") +HTTP_FORBIDDEN = 401 +HTTP_NOT_FOUND = 404 +HTTP_UNPROCESSABLE = 422 +HTTP_INTERNAL_ERR = 500 + +@app.route('/') +def index(): + return flask.render_template("index.html") + +@app.route('/create-user', methods=["POST"]) +def createUser(): + createUser(flask.request.form) + return ("Success", 200) + +@app.route('/delete-user', methods=["POST"]) +def createUser(): + deleteUser(user=flask.request.get('user') + return ("Success", 200) + +@app.route('/list-user') +def listUsers(''): + users = db.session.query(FTPUser) + return flask.render_template("list_users.html", users=users) + +def createUser(webform): + + # command line useradd requires a pre-encrypted password + cryptPass = crypt.crypt(password, webform.password) + subprocess.run(["./scripts/create_user.sh", cryptPass, webform.username]) + + # track added users to prevent deletion of other users and listing # + db.session.add(FTPUser(webform.username)) + db.session.commit() + + +def executeScript(scriptName): + path = os.path.expanduser(scriptName) + subprocess.Popen(path) + +class FTPUser(db.Model): + + __tablename__ = 'users' + username = Column(String, primary_key=True) + +@app.before_first_request +def init(): + + app.config["DB"] = db + db.create_all() + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser(description="Flask-VSFTP-User-Tool", \ + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument("-i", "--interface", default="0.0.0.0", help="Interface to listen on") + parser.add_argument("-p", "--port", default="5000", help="Port to listen on") + args = parser.parse_args() + app.run(host=args.interface, port=args.port)