|
@@ -1,25 +1,25 @@
|
|
|
import datetime as datetime
|
|
|
-import configparser as configparser
|
|
|
-import os
|
|
|
from urllib.parse import urlparse
|
|
|
import webbrowser
|
|
|
from emailtool.emailer import Emailer
|
|
|
-from flask import Flask, render_template, request, redirect, url_for, jsonify, session
|
|
|
-from flask_httpauth import HTTPBasicAuth
|
|
|
+from flask import Flask, render_template, request, redirect, url_for, session, send_file
|
|
|
import configparser
|
|
|
from gevent.pywsgi import WSGIServer
|
|
|
import socket
|
|
|
import logging
|
|
|
-from peewee import Model, CharField, TextField, DateTimeField, SqliteDatabase, BooleanField
|
|
|
+from peewee import Model, CharField, DateTimeField, SqliteDatabase, BooleanField
|
|
|
import hashlib
|
|
|
+import os
|
|
|
+import csv
|
|
|
|
|
|
-db_name = 'users.db'
|
|
|
+db_name = 'app.db'
|
|
|
db = SqliteDatabase(db_name)
|
|
|
|
|
|
|
|
|
class User(Model):
|
|
|
username = CharField()
|
|
|
password = CharField()
|
|
|
+ date_created = DateTimeField(default=datetime.datetime.now)
|
|
|
logged_in = BooleanField(default=False)
|
|
|
|
|
|
class Meta:
|
|
@@ -97,6 +97,7 @@ def is_valid_url(url):
|
|
|
except:
|
|
|
return False
|
|
|
|
|
|
+
|
|
|
def requires_auth():
|
|
|
if 'username' in session:
|
|
|
username = session['username']
|
|
@@ -112,7 +113,8 @@ def requires_auth():
|
|
|
# Check for DB tables and create if they don't exist
|
|
|
if db.table_exists('user') is False:
|
|
|
db.create_tables([User, IlsUser])
|
|
|
- User.create(username='admin', password=encrypt_password('admin'))
|
|
|
+ User.create(username='admin', password=encrypt_password('admin'),
|
|
|
+ date_created=datetime.datetime.now(), logged_in=False).save()
|
|
|
|
|
|
if db.table_exists('ilsuser') is False:
|
|
|
db.create_tables([IlsUser])
|
|
@@ -122,6 +124,7 @@ db.close()
|
|
|
app = Flask(__name__)
|
|
|
app.secret_key = 'super secret key'
|
|
|
|
|
|
+
|
|
|
@app.before_request
|
|
|
def before_request():
|
|
|
db.connect()
|
|
@@ -179,7 +182,7 @@ def index():
|
|
|
|
|
|
|
|
|
# Create a route for admin page
|
|
|
-@app.route('/admin')
|
|
|
+@app.route('/admin/')
|
|
|
def admin():
|
|
|
# Check to see if user is logged in
|
|
|
if not requires_auth():
|
|
@@ -188,6 +191,177 @@ def admin():
|
|
|
return render_template('admin.html')
|
|
|
|
|
|
|
|
|
+@app.route('/admin/users/', methods=['GET', 'POST'])
|
|
|
+def admin_users():
|
|
|
+ # Check to see if user is logged in
|
|
|
+ if not requires_auth():
|
|
|
+ return redirect(url_for('login'))
|
|
|
+ message = None
|
|
|
+ if request.method == 'POST':
|
|
|
+ username = request.form.get('username')
|
|
|
+ password = request.form.get('password')
|
|
|
+ confirm_password = request.form.get('confirm_password')
|
|
|
+
|
|
|
+ # Check to see if username already exists
|
|
|
+ try:
|
|
|
+ user = User.filter(User.username == username).first()
|
|
|
+ except Exception as e:
|
|
|
+ print(e)
|
|
|
+ user = None
|
|
|
+
|
|
|
+ if user:
|
|
|
+ message = 'Username already exists'
|
|
|
+ else:
|
|
|
+ if password == confirm_password:
|
|
|
+ User.create(username=username, password=encrypt_password(password),
|
|
|
+ date_created=datetime.datetime.now(), logged_in=False).save()
|
|
|
+ message = 'User created successfully'
|
|
|
+ else:
|
|
|
+ message = 'Passwords do not match'
|
|
|
+
|
|
|
+ # Get all admin users from the DB
|
|
|
+ users = User.select().execute()
|
|
|
+
|
|
|
+ context = {
|
|
|
+ 'users': users,
|
|
|
+ 'message': message,
|
|
|
+ }
|
|
|
+
|
|
|
+ return render_template('admin_users.html', context=context)
|
|
|
+
|
|
|
+
|
|
|
+@app.route('/admin/users/delete/<int:id>', methods=['GET', 'POST'])
|
|
|
+def admin_users_delete(id):
|
|
|
+ # Check to see if user is logged in
|
|
|
+ if not requires_auth():
|
|
|
+ return redirect(url_for('login'))
|
|
|
+
|
|
|
+ # Get the user from the DB
|
|
|
+ user = User.get(User.id == id)
|
|
|
+
|
|
|
+ if user.username != 'admin':
|
|
|
+ # Unset session variable if the user is deleting their own account
|
|
|
+ if user.username == session['username']:
|
|
|
+ session.pop('username', None)
|
|
|
+ user.delete_instance()
|
|
|
+
|
|
|
+ return redirect(url_for('admin_users'))
|
|
|
+
|
|
|
+
|
|
|
+@app.route('/admin/users/ils', methods=['GET', 'POST'])
|
|
|
+def admin_ils_users():
|
|
|
+ # Check to see if user is logged in
|
|
|
+ if not requires_auth():
|
|
|
+ return redirect(url_for('login'))
|
|
|
+ message = None
|
|
|
+ if request.method == 'POST':
|
|
|
+ username = request.form.get('username')
|
|
|
+ email = request.form.get('email')
|
|
|
+
|
|
|
+ # Check to see if username already exists
|
|
|
+ try:
|
|
|
+ user = IlsUser.filter(IlsUser.username == username).first()
|
|
|
+ except Exception as e:
|
|
|
+ print(e)
|
|
|
+ user = None
|
|
|
+
|
|
|
+ if user:
|
|
|
+ message = 'Username already exists'
|
|
|
+ else:
|
|
|
+
|
|
|
+ IlsUser.create(username=username, email=email, reset_datetime=datetime.datetime.now()).save()
|
|
|
+ message = 'User created successfully'
|
|
|
+
|
|
|
+ # Get all admin users from the DB
|
|
|
+ users = IlsUser.select().execute()
|
|
|
+
|
|
|
+ context = {
|
|
|
+ 'users': users,
|
|
|
+ 'message': message,
|
|
|
+ }
|
|
|
+
|
|
|
+ return render_template('admin_ils_users.html', context=context)
|
|
|
+
|
|
|
+
|
|
|
+@app.route('/admin/users/ils/delete/<int:id>', methods=['GET', 'POST'])
|
|
|
+def admin_ils_users_delete(id):
|
|
|
+ # Check to see if user is logged in
|
|
|
+ if not requires_auth():
|
|
|
+ return redirect(url_for('login'))
|
|
|
+
|
|
|
+ # Get the user from the DB
|
|
|
+ user = IlsUser.get(IlsUser.id == id)
|
|
|
+ user.delete_instance()
|
|
|
+
|
|
|
+ return redirect(url_for('admin_ils_users'))
|
|
|
+
|
|
|
+
|
|
|
+# create a route for generating a CSV file for download
|
|
|
+@app.route('/admin/users/ils/csv/download', methods=['GET', 'POST'])
|
|
|
+def admin_ils_users_csv_download():
|
|
|
+ # Check to see if user is logged in
|
|
|
+ if not requires_auth():
|
|
|
+ return redirect(url_for('login'))
|
|
|
+ # Create a CSV file with the users and don't add a blank line between rows
|
|
|
+ with open('users.csv', 'w', newline='') as f:
|
|
|
+ writer = csv.writer(f)
|
|
|
+ writer.writerow(['username', 'email'])
|
|
|
+ users = IlsUser.select().execute()
|
|
|
+ for user in users:
|
|
|
+ writer.writerow([user.username, user.email])
|
|
|
+
|
|
|
+ # return the CSV file to the user
|
|
|
+ return send_file('users.csv', as_attachment=True)
|
|
|
+
|
|
|
+
|
|
|
+@app.route('/admin/users/ils/csv/import', methods=['GET', 'POST'])
|
|
|
+def admin_ils_users_csv_import():
|
|
|
+ # Check to see if user is logged in
|
|
|
+ if not requires_auth():
|
|
|
+ return redirect(url_for('login'))
|
|
|
+ message = None
|
|
|
+ if request.method == 'POST':
|
|
|
+ csv_file = request.files['csv']
|
|
|
+ if csv_file.filename != '':
|
|
|
+ csv_file.save(os.path.join('uploads', csv_file.filename))
|
|
|
+ with open(os.path.join('uploads', csv_file.filename), 'r') as f:
|
|
|
+ reader = csv.reader(f)
|
|
|
+ for row in reader:
|
|
|
+ username = row[0]
|
|
|
+ email = row[1]
|
|
|
+
|
|
|
+ # ignore the header row
|
|
|
+ if username == 'username':
|
|
|
+ continue
|
|
|
+
|
|
|
+ # ignore blank rows
|
|
|
+ if username == '':
|
|
|
+ continue
|
|
|
+
|
|
|
+ # Check if user already exists and if it does update the entry
|
|
|
+ try:
|
|
|
+ user = IlsUser.filter(IlsUser.username == username).first()
|
|
|
+ except Exception as e:
|
|
|
+ print(e)
|
|
|
+ user = None
|
|
|
+
|
|
|
+ if user:
|
|
|
+ user.email = email
|
|
|
+ user.reset_datetime = datetime.datetime.now()
|
|
|
+ user.save()
|
|
|
+ else:
|
|
|
+ IlsUser.create(username=username, email=email, reset_datetime=datetime.datetime.now()).save()
|
|
|
+ # Delete the uploaded file
|
|
|
+ os.remove(os.path.join('uploads', csv_file.filename))
|
|
|
+ return redirect(url_for('admin_ils_users'))
|
|
|
+
|
|
|
+ context = {
|
|
|
+ 'message': message,
|
|
|
+ }
|
|
|
+
|
|
|
+ return render_template('csv.html', context=context)
|
|
|
+
|
|
|
+
|
|
|
@app.route('/logout')
|
|
|
def logout():
|
|
|
if 'username' in session:
|
|
@@ -237,7 +411,6 @@ def login():
|
|
|
#@app.teardown_appcontext
|
|
|
|
|
|
|
|
|
-
|
|
|
if __name__ == "__main__":
|
|
|
print("------------------------- Start up -----------------------------")
|
|
|
print("Starting HTTP Service on port %s..." % http_settings['port'])
|