This commit is contained in:
Yannik Schmidt
2021-08-29 18:00:18 +02:00
commit a9e59b3d9e
5 changed files with 105 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
js/
css/
__pycache__/
*.bak
*.swp
*.sqlite

17
README.md Normal file
View File

@@ -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

3
app.py Normal file
View File

@@ -0,0 +1,3 @@
import server
def createApp(envivorment=None, start_response=None):
return server.app

3
scripts/create_user.sh Normal file
View File

@@ -0,0 +1,3 @@
#!/bin/bash
useradd -m -p ${1} ${2}

76
server.py Executable file
View File

@@ -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)