Files
Polyboard/src/web.py
T

187 lines
5.3 KiB
Python
Raw Normal View History

2024-01-05 08:59:40 -07:00
import os
import src.utils as utils
import multiprocessing as mupr
from flask import Flask, render_template, Response
from flask import request, redirect, url_for, make_response
import src.jsonpack as jsonpack
2024-01-22 17:04:09 -07:00
import src.packets as packets
2024-01-05 08:59:40 -07:00
import src.auth as auth
webroot = utils.getRoot('html/')
app = Flask(__name__,
static_url_path=webroot,
static_folder=webroot,
template_folder=webroot)
class webtab():
def __init__(self):
self.name = None
self.pages = []
self.defaultPage = ''
self.html = ''
2024-02-09 18:52:05 -07:00
def compileHtml(self, permGroups):
2024-01-05 08:59:40 -07:00
html = ''
2024-02-09 18:52:05 -07:00
for page in self.pages:
html += page.compileHtml(self.name, permGroups)
2024-01-05 08:59:40 -07:00
return html
def addPage(self, page):
self.pages.append(page)
class webpagefolder():
def __init__(self):
self.name = None
self.pages = []
2024-02-09 18:52:05 -07:00
def compileHtml(self, tabname, permGroups):
html = '<details><summary>' + self.name + '</summary><ul>'
for page in self.pages:
html += page.compileHtml(tabname, permGroups)
html += '</ul></details>'
return html
2024-01-05 08:59:40 -07:00
class webpage():
def __init__(self):
self.name = None
2024-02-09 18:52:05 -07:00
self.requiredPermGroup = ''
2024-01-05 08:59:40 -07:00
self.location = None
2024-02-09 18:52:05 -07:00
def compileHtml(self, tabname, permGroups):
html = '<li'
if self.requiredPermGroup == '' or (self.requiredPermGroup in permGroups):
html += f' onclick=\'window.location="/{tabname}/{self.name}"\'>' +\
self.name
else:
html += f'><del>{self.name}</del>'
return html + '</li>'
2024-01-05 08:59:40 -07:00
@app.route('/')
def index():
2024-01-22 17:04:09 -07:00
isValid = app.webserv.authServer.cookieLogin(request)
2024-01-05 08:59:40 -07:00
if not isValid:
return redirect("/login", code=302)
else:
2024-01-22 17:04:09 -07:00
return redirect(f'/{app.webserv.defaultTab}/{app.webserv.defaultPage}', code=302)
2024-01-05 08:59:40 -07:00
@app.route('/login')
def loginPage():
2024-01-22 17:04:09 -07:00
isValid = app.webserv.authServer.cookieLogin(request)
2024-01-05 08:59:40 -07:00
if isValid:
2024-01-22 17:04:09 -07:00
return redirect(f'/{app.webserv.defaultTab}/{app.webserv.defaultPage}', code=302)
2024-01-05 08:59:40 -07:00
return make_response(open(f'{webroot}nav.html', 'r').read()
.replace('<!--Place body here!!!-->', open(f'{webroot}login.html', 'r').read())
.replace('<!--Place tabs here!!!-->', '<a href="/login" role="button" class="outline topnav-button text-white">Login</a>')
2024-01-22 17:04:09 -07:00
.replace('<!--Place title here!!!-->', app.webserv.title)
2024-01-05 08:59:40 -07:00
.replace('<!--Place defaultPage here!!!-->', '/login'))
2024-02-09 18:52:05 -07:00
def recursivePageFinder(pagename, objs):
2024-01-05 08:59:40 -07:00
returnVal = None
for obj in objs:
if isinstance(obj, webpagefolder):
2024-02-09 18:52:05 -07:00
tmp = recursivePageFinder(pagename, obj.pages)
2024-01-05 08:59:40 -07:00
if tmp != None:
returnVal = tmp
else:
if obj.name == pagename:
2024-02-09 18:52:05 -07:00
returnVal = obj
2024-01-05 08:59:40 -07:00
return returnVal
@app.route('/<tabname>/<pagename>')
def page(tabname, pagename):
2024-01-22 17:04:09 -07:00
isValid = app.webserv.authServer.cookieLogin(request)
2024-01-05 08:59:40 -07:00
if not isValid:
return redirect("/login", code=302)
try:
2024-01-22 17:04:09 -07:00
tab = utils.getatribinarr(app.webserv.webtabs, 'name', tabname)
2024-02-09 18:52:05 -07:00
page = recursivePageFinder(pagename, tab.pages)
# print(page.requiredPermGroup)
isValid, permGroups = app.webserv.authServer.validPermGroup(page.requiredPermGroup, request)
if not isValid:
return redirect(f'/{tab.name}/{tab.defaultPage}', code=302)
2024-01-05 08:59:40 -07:00
return make_response(open(utils.getRoot('html/nav.html'), 'r').read()
2024-02-09 18:52:05 -07:00
.replace('<!--Place body here!!!-->', open(utils.getRoot(page.location), 'r').read())
2024-01-22 17:04:09 -07:00
.replace('<!--Place tabs here!!!-->', app.webserv.tabHtml)
2024-02-09 18:52:05 -07:00
.replace('<!--Place pages here!!!-->', tab.compileHtml(permGroups))
2024-01-22 17:04:09 -07:00
.replace('<!--Place title here!!!-->', app.webserv.title)
.replace('<!--Place defaultPage here!!!-->', f'/{app.webserv.defaultTab}/{app.webserv.defaultPage}'))
2024-01-05 08:59:40 -07:00
except:
2024-02-09 18:52:05 -07:00
return redirect("/", code=302)
2024-01-05 08:59:40 -07:00
@app.route('/src/<file>')
def src(file):
return app.send_static_file(f'src/{file}')
@app.errorhandler(404)
def err404(err):
return redirect("/", code=302)
2024-01-22 17:04:09 -07:00
2024-01-05 08:59:40 -07:00
class webserv():
def __init__(self):
self.title = 'Modulator'
self.port = 443
self.host = '0.0.0.0'
self.verbose = False
self.secure = True
self.tabHtml = ''
self.webtabs = []
self.defaultTab = 'main'
self.defaultPage = ''
self.app = None
2024-01-22 17:04:09 -07:00
def init(self):
2024-01-05 08:59:40 -07:00
if not self.verbose:
import logging
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)
if self.secure:
dataroot = utils.getRoot("data/")
2024-02-09 18:52:05 -07:00
sslcontext = (f'{dataroot}ssl.crt', f'{dataroot}ssl.key')
2024-01-05 08:59:40 -07:00
else:
sslcontext = None
def tabHtml(path, name):
return f'<a href="{path}" role="button" class="outline topnav-button text-white">{name}</a>'
for tab in self.webtabs:
if tab.name == self.defaultTab:
2024-02-09 18:52:05 -07:00
self.tabHtml = tabHtml(f'/{tab.name}/{tab.defaultPage}', tab.name) + self.tabHtml
2024-01-05 08:59:40 -07:00
self.defaultPage = tab.defaultPage
2024-02-09 18:52:05 -07:00
else:
self.tabHtml += tabHtml(f'/{tab.name}/{tab.defaultPage}', tab.name)
2024-01-05 08:59:40 -07:00
2024-01-22 17:04:09 -07:00
app.webserv = self
2024-01-05 08:59:40 -07:00
self.app = app
2024-01-22 17:04:09 -07:00
self.rawServer = packets.startRawListener(self)
self.authServer = auth.authServer(self)
self.proc = mupr.Process(target=app.run, kwargs=dict(debug=self.verbose, port=self.port, host=self.host, ssl_context=sslcontext))
def start(self):
2024-01-05 08:59:40 -07:00
self.proc.start()
2024-01-22 17:04:09 -07:00
# return self.rawServer
2024-01-05 08:59:40 -07:00
def stop(self):
self.proc.terminate()
# def sendfatal(self, err):
# self.rawServer.broadcast(jsonpack.pack({
# 'type': 'error',
# 'severity': 'fatal',
# 'error': err
# }))