|
|
@@ -2,13 +2,29 @@ import glob |
|
|
|
import json |
|
|
|
from flask import Flask, redirect, url_for, render_template, request |
|
|
|
|
|
|
|
# lyadmin |
|
|
|
# scripts and web form for a tilde / PAUS instance |
|
|
|
# |
|
|
|
# gashapwn |
|
|
|
# Nov 2020 |
|
|
|
# |
|
|
|
# https://git.lain.church/gashapwn/lyadmin |
|
|
|
# gashapwn@protonmail.com |
|
|
|
# or |
|
|
|
# gasahwpn on irc.lainchan.org |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app=Flask(__name__) |
|
|
|
|
|
|
|
# Paths for conf file, |
|
|
|
# user list, |
|
|
|
# directory containing |
|
|
|
# account request files... |
|
|
|
WORKING_DIR = "/home/gashapwn/lyadmin/"; |
|
|
|
ACCOUNT_DIR = "test/"; |
|
|
|
|
|
|
|
FULL_PATH = str(WORKING_DIR) + str(ACCOUNT_DIR) |
|
|
|
|
|
|
|
CONF_PATH = str(WORKING_DIR) + "lyadmin.conf.json" |
|
|
|
|
|
|
|
# Account requests are given ID numbers |
|
|
@@ -16,13 +32,17 @@ CONF_PATH = str(WORKING_DIR) + "lyadmin.conf.json" |
|
|
|
# id number |
|
|
|
INIT_REQ_ID = "00000" |
|
|
|
|
|
|
|
# Slurp the conf file |
|
|
|
with open(CONF_PATH) as c: conf_json_str = c.read() |
|
|
|
conf_obj = json.loads(conf_json_str) |
|
|
|
|
|
|
|
# The main home page |
|
|
|
@app.route("/") |
|
|
|
def home(): |
|
|
|
app.route('/') |
|
|
|
|
|
|
|
# Load the list of tilde users |
|
|
|
# to generate links for |
|
|
|
u_list = []; |
|
|
|
with open("user_list.txt") as u_file: |
|
|
|
for line in u_file.readlines(): |
|
|
@@ -31,20 +51,25 @@ def home(): |
|
|
|
return render_template("index.html", u_list=u_list, page_name="home") |
|
|
|
|
|
|
|
|
|
|
|
# The page with rules |
|
|
|
def rules(): |
|
|
|
return render_template("rules.html") |
|
|
|
|
|
|
|
# this is a weird way to do this |
|
|
|
# right? |
|
|
|
# Generate HTML for a form widget |
|
|
|
def widg_fun(widg): |
|
|
|
if(widg.w_type == "input"): |
|
|
|
# Return HTML for a single line input |
|
|
|
return "input id=id_%s name=%s type=text></input"%(widg.w_name, widg.w_name) |
|
|
|
elif(widg.w_type == "textarea"): |
|
|
|
# Return HTML for a big text input box |
|
|
|
return "textarea cols=40 id=id_%s name=%s rows=10 required=\"\""%(widg.w_name, widg.w_name) |
|
|
|
elif(widg.w_type == "check"): |
|
|
|
# Return HTML for a check box |
|
|
|
return "input id=id_%s name=%s type=checkbox required=\"\""%(widg.w_name, widg.w_name) |
|
|
|
return widg.w_type; |
|
|
|
|
|
|
|
# Generate HTML for request form |
|
|
|
# probably a strange way to do this... |
|
|
|
def req(): |
|
|
|
app.route('/req') |
|
|
|
class Widg: |
|
|
@@ -52,7 +77,8 @@ def req(): |
|
|
|
self.w_name = w_name |
|
|
|
self.w_type = w_type |
|
|
|
self.w_opt = w_opt |
|
|
|
|
|
|
|
|
|
|
|
# Configuration for our request form |
|
|
|
rt = { |
|
|
|
"username": Widg("username", "input", None), |
|
|
|
"email for account lockout / registration confirmation (optional)": Widg("email", "input", None), |
|
|
@@ -60,13 +86,14 @@ def req(): |
|
|
|
"shell of choice": Widg("shell", "choice", map(lambda k : (k, conf_obj["shell"][k]), list(conf_obj["shell"].keys()))), |
|
|
|
"have you read the rules?": Widg("rule_read", "check", None) |
|
|
|
}; |
|
|
|
|
|
|
|
# uhhh is this how you're supposed to do this? |
|
|
|
return render_template("req.html", req_tab = rt, widg_fun = widg_fun, page_name="req") |
|
|
|
|
|
|
|
# Process input from the /req page |
|
|
|
def signup(): |
|
|
|
app.route('/req/signup') |
|
|
|
|
|
|
|
# Get all the params from the POST |
|
|
|
# request |
|
|
|
username = request.form["username"] |
|
|
|
email = request.form["email"] |
|
|
|
shell = request.form["shell"] |
|
|
@@ -74,14 +101,23 @@ def signup(): |
|
|
|
|
|
|
|
is_email_user = False; |
|
|
|
|
|
|
|
# If a user didnt read the rules |
|
|
|
# send them back |
|
|
|
# Browser validations should |
|
|
|
# prevent this.... |
|
|
|
if(rule_read != "on"): |
|
|
|
return redirect(url_for('req')) |
|
|
|
|
|
|
|
# Set placeholder if user didnt send an email |
|
|
|
if(len(email) > 1): |
|
|
|
is_email_user = True |
|
|
|
else: |
|
|
|
email = "NO_EMAIL" |
|
|
|
|
|
|
|
# All users requests have a sequential ID |
|
|
|
# this checks how many requests we have |
|
|
|
# and gives us a free ID so we can save |
|
|
|
# our request |
|
|
|
if(len(glob.glob("./test/[0-9]*ident*")) == 0): |
|
|
|
new_id = int(INIT_REQ_ID) |
|
|
|
new_id_str = INIT_REQ_ID |
|
|
@@ -91,8 +127,8 @@ def signup(): |
|
|
|
new_id = int(max_id)+1 |
|
|
|
new_id_str = str(new_id).zfill(zpad) |
|
|
|
|
|
|
|
# write the request to disk |
|
|
|
fn1 = str(FULL_PATH) + str(new_id_str) + ".ident" |
|
|
|
|
|
|
|
with open(fn1, "w") as ident_file: |
|
|
|
ident_file.write(str(username) + "\n") |
|
|
|
ident_file.write(str(email) + "\n") |
|
|
@@ -115,5 +151,4 @@ if __name__=="__main__": |
|
|
|
app.add_url_rule('/login', 'login', login, methods = ['POST', 'GET']) |
|
|
|
app.add_url_rule('/req', 'req', req, methods = ['POST', 'GET']) |
|
|
|
app.add_url_rule('/req/signup', 'signup', signup, methods = ['POST']) |
|
|
|
# app.run(host="104.248.118.130",debug=True) |
|
|
|
app.run(host=conf_obj["listen_ip"],debug=True) |