mirror of
https://github.com/Astatin3/Polyboard.git
synced 2026-06-08 16:18:03 -06:00
"Finish" Working on backend
This commit is contained in:
+9
-7
@@ -26,12 +26,12 @@ export function authClient(rawClient) {
|
||||
}
|
||||
|
||||
this.clidata = (data)=>{
|
||||
// const session = utils.getCookie('session')
|
||||
// if(session != ''){
|
||||
// this.rawClient.send('reauth', {
|
||||
// session: session
|
||||
// })
|
||||
// }
|
||||
const session = utils.getCookie('session')
|
||||
if(session != ''){
|
||||
this.rawClient.send('reauth', {
|
||||
session: session
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
this.loginSuccess = (data)=>{
|
||||
@@ -45,7 +45,9 @@ export function authClient(rawClient) {
|
||||
}
|
||||
|
||||
this.reauth = (data)=>{
|
||||
utils.popupSuccess('Connection', 'Successfully logged in!')
|
||||
if(window.location.pathname == "/login"){
|
||||
utils.popupSuccess('Connection', 'Successfully logged in!')
|
||||
}
|
||||
utils.iconauth()
|
||||
}
|
||||
|
||||
|
||||
+21
-1
@@ -21,4 +21,24 @@ window.authClient = client
|
||||
window.authLogin = client.login
|
||||
window.sendAuth = client.send
|
||||
window.sendRaw = rawClient.send
|
||||
window.addRawTypeListener = rawClient.addRawTypeListener
|
||||
window.addListener = rawClient.addRawTypeListener
|
||||
|
||||
window.addListener('popupInfo', (data)=>{
|
||||
window.utils.popupInfo(data.data.title, data.data.msg)
|
||||
})
|
||||
|
||||
window.addListener('popupSuccess', (data)=>{
|
||||
window.utils.popupSuccess(data.data.title, data.data.msg)
|
||||
})
|
||||
|
||||
window.addListener('popupWarning', (data)=>{
|
||||
window.utils.popupWarning(data.data.title, data.data.msg)
|
||||
})
|
||||
|
||||
window.addListener('popupError', (data)=>{
|
||||
window.utils.popupError(data.data.title, data.data.msg)
|
||||
})
|
||||
|
||||
window.addListener('popupColor', (data)=>{
|
||||
window.utils.addPopup(data.data.color, data.data.isDark, data.data.title, data.data.msg)
|
||||
})
|
||||
@@ -11,6 +11,7 @@ function getErrorDesc(error){
|
||||
case 'invalidLogin':
|
||||
return 'Invalid username or password'
|
||||
case 'invalidLoginRequest':
|
||||
utils.setCookie('session', '')
|
||||
return 'Some part of the login request is invalid, please try again'
|
||||
case 'prelogin':
|
||||
return 'You are already logged in'
|
||||
|
||||
@@ -202,6 +202,7 @@ li::marker {
|
||||
|
||||
width: var(--popupBoxWidth);
|
||||
height: calc(100% - var(--topnavheight) - 10px);
|
||||
pointer-events:none;
|
||||
bottom: 0;
|
||||
right: 20px;
|
||||
overflow: auto;
|
||||
@@ -224,6 +225,8 @@ li::marker {
|
||||
padding: 0;
|
||||
background-color: inherit;
|
||||
|
||||
pointer-events:all;
|
||||
|
||||
left: 0;
|
||||
margin: 0;
|
||||
margin-bottom: 20px;
|
||||
|
||||
+2
-1
@@ -64,7 +64,7 @@ export function iconauth() {
|
||||
|
||||
// }
|
||||
|
||||
function addPopup(bgcolor, isDark, title, content) {
|
||||
export function addPopup(bgcolor, isDark, title, content) {
|
||||
const elem = document.getElementById('popupBox')
|
||||
let header
|
||||
let textColor
|
||||
@@ -105,6 +105,7 @@ export function popupError(title, text){
|
||||
addPopup('#500000', true, title, text)
|
||||
}
|
||||
|
||||
|
||||
export function getUnixTime() {
|
||||
return (+ new Date())
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ from sys import argv
|
||||
webserv = web.webserv()
|
||||
moduleMaster = modules.moduleMaster()
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
if not utils.pathExists('data'):
|
||||
@@ -24,8 +25,9 @@ def main():
|
||||
if not utils.pathExists('data/selfsign.crt'):
|
||||
utils.genCert(utils.getRoot('data/'))
|
||||
|
||||
moduleMaster.addModules(webserv)
|
||||
webserv.init()
|
||||
moduleMaster.initModules(webserv)
|
||||
|
||||
webserv.start()
|
||||
moduleMaster.runModules()
|
||||
|
||||
|
||||
+11
-7
@@ -1,10 +1,14 @@
|
||||
from modules.main import test as test
|
||||
|
||||
def test1(ac, data):
|
||||
print(ac)
|
||||
print(data)
|
||||
mm = None
|
||||
|
||||
def main(mm):
|
||||
# mm.addAuthEventListener('test1', test1)
|
||||
print(mm.rawServer.addEventListener('test1', test1))
|
||||
#mm.rawServer.addEventListener('login', test1)
|
||||
def test1(ac, data):
|
||||
mm.sendPopupColor(ac.rawClient, 'test!', 'test!', '#600060', True)
|
||||
|
||||
def init(moduleMaster):
|
||||
global mm
|
||||
mm = moduleMaster
|
||||
mm.addAuthEventListener('test1', test1)
|
||||
|
||||
def main():
|
||||
pass
|
||||
+23
-28
@@ -29,12 +29,18 @@ class authClient:
|
||||
self.rawClient.send(type, data)
|
||||
|
||||
class authServer:
|
||||
def __init__(self):
|
||||
def __init__(self, webserv):
|
||||
self.rawServer = None
|
||||
self.app = None
|
||||
self.clients = []
|
||||
self.users = []
|
||||
|
||||
self.webserv = webserv
|
||||
|
||||
self.reloadUsers()
|
||||
self.rawServer = webserv.rawServer
|
||||
self.initRawServer()
|
||||
|
||||
def login(self, c, data):
|
||||
if c.clientid != data['cid']:
|
||||
c.send('error', 'invalidLoginRequest')
|
||||
@@ -69,7 +75,7 @@ class authServer:
|
||||
c.send('loginSuccess', {
|
||||
'username': ac.username,
|
||||
'session': ac.session,
|
||||
'redir': f'/{self.app.defaultTab}/{self.app.defaultPage}',
|
||||
'redir': f'/{self.webserv.defaultTab}/{self.webserv.defaultPage}',
|
||||
'timeout': ac.timeout
|
||||
})
|
||||
|
||||
@@ -78,17 +84,22 @@ class authServer:
|
||||
c.send('error', 'invalidLogin')
|
||||
return
|
||||
|
||||
def validAc(self, ac):
|
||||
if ac == None:
|
||||
return False
|
||||
if ac.rawClient.address != request.remote_addr:
|
||||
return False
|
||||
if utils.getUnixTime() > ac.timeout:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def reauth(self, c, data):
|
||||
session = data['data']['session']
|
||||
|
||||
ac = utils.getatribinarr(self.clients, 'session', session)
|
||||
|
||||
if ac == None:
|
||||
c.send('error', 'invalidLoginRequest')
|
||||
return
|
||||
if ac.rawClient.address != request.remote_addr:
|
||||
c.send('error', 'invalidLoginRequest')
|
||||
return
|
||||
if utils.getUnixTime() > ac.timeout:
|
||||
if not self.validAc(ac):
|
||||
c.send('error', 'invalidLoginRequest')
|
||||
return
|
||||
|
||||
@@ -106,18 +117,12 @@ class authServer:
|
||||
|
||||
ac = utils.getatribinarr(self.clients, 'session', session)
|
||||
|
||||
if ac == None:
|
||||
return False
|
||||
if ac.rawClient.address != request.remote_addr:
|
||||
return False
|
||||
if utils.getUnixTime() > ac.timeout:
|
||||
return False
|
||||
return self.validAc(ac)
|
||||
|
||||
return True
|
||||
|
||||
def initRawServer(self):
|
||||
self.app.rawServer.addEventListener('login', self.login)
|
||||
self.app.rawServer.addEventListener('reauth', self.reauth)
|
||||
self.rawServer.addEventListener('login', self.login)
|
||||
self.rawServer.addEventListener('reauth', self.reauth)
|
||||
|
||||
def reloadUsers(self):
|
||||
data = json.loads(utils.readFile(utils.getRoot('data/')+'creds.json'))
|
||||
@@ -130,13 +135,3 @@ class authServer:
|
||||
user.sha256passwordhash = acc['sha256passwordhash']
|
||||
user.permGroups = acc['permGroups']
|
||||
self.users.append(user)
|
||||
|
||||
def startAuthListener(app):
|
||||
global authServer
|
||||
authServer = authServer()
|
||||
authServer.app = app
|
||||
authServer.reloadUsers()
|
||||
packets.startRawListener(app)
|
||||
authServer.initRawServer()
|
||||
|
||||
return authServer
|
||||
|
||||
+76
-15
@@ -12,25 +12,30 @@ class module():
|
||||
self.rootdir = None
|
||||
self.tabs = []
|
||||
|
||||
def initSelf(self):
|
||||
def add(self):
|
||||
spec = importlib.util.spec_from_file_location(self.name, utils.getRoot(self.entrypoint))
|
||||
module = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(module)
|
||||
self.module = module
|
||||
|
||||
def run(self, moduleMaster):
|
||||
self.module.main(moduleMaster)
|
||||
def init(self, moduleMaster):
|
||||
self.module.init(moduleMaster)
|
||||
|
||||
def run(self):
|
||||
self.module.main()
|
||||
|
||||
|
||||
class moduleMaster():
|
||||
def __init__(self):
|
||||
self.modules = []
|
||||
self.webserv = None
|
||||
|
||||
self.webserv = None
|
||||
self.app = None
|
||||
self.rawServer = None
|
||||
self.authServer = None
|
||||
# self.addRawEventListener('test1', test1)
|
||||
|
||||
def initModules(self, webserv):
|
||||
def addModules(self, webserv):
|
||||
self.webserv = webserv
|
||||
|
||||
mdirs = utils.listSubdirs(utils.getRoot('modules/'))
|
||||
@@ -75,37 +80,93 @@ class moduleMaster():
|
||||
|
||||
self.webserv.webtabs.append(mtab)
|
||||
|
||||
m.initSelf()
|
||||
m.add()
|
||||
self.modules.append(m)
|
||||
|
||||
for tab in webserv.webtabs:
|
||||
tab.addHtml()
|
||||
|
||||
def runModules(self):
|
||||
self.app = self.webserv.app
|
||||
self.rawServer = self.app.rawServer
|
||||
self.authServer = self.app.authServer
|
||||
|
||||
|
||||
def initModules(self, webserv):
|
||||
self.webserv = webserv
|
||||
self.app = webserv.app
|
||||
self.rawServer = webserv.rawServer
|
||||
self.authServer = webserv.authServer
|
||||
|
||||
for module in self.modules:
|
||||
module.run(self)
|
||||
module.init(self)
|
||||
|
||||
def runModules(self):
|
||||
for module in self.modules:
|
||||
module.run()
|
||||
|
||||
|
||||
|
||||
|
||||
def getRawClients(self):
|
||||
return self.rawServer.clients
|
||||
|
||||
def addRawEventListener(self, eventName, func):
|
||||
self.rawServer.addEventListener(eventName, func)
|
||||
|
||||
def getAuthClients(self):
|
||||
return self.authServer.clients
|
||||
|
||||
def addRawEventListener(self, eventName, func):
|
||||
self.rawServer.eventListeners.append({
|
||||
'type': eventName,
|
||||
'func': func
|
||||
})
|
||||
|
||||
def addAuthEventListener(self, eventName, func):
|
||||
def tmpfunc(self, c, data):
|
||||
def tmpfunc(c, data):
|
||||
if not c in self.rawServer.clients:
|
||||
return
|
||||
ac = utils.getatribinarr(self.authServer.clients, 'rawClient', c)
|
||||
if ac == None:
|
||||
return
|
||||
if not self.authServer.validAc(ac):
|
||||
return
|
||||
|
||||
func(ac, data)
|
||||
|
||||
self.rawServer.addEventListener(eventName, tmpfunc)
|
||||
|
||||
def getRawClientByID(self, ID):
|
||||
return utils.getatribinarr(self.rawServer.clients, 'clientid', ID)
|
||||
|
||||
def getAuthClientByID(self, ID):
|
||||
c = utils.getatribinarr(self.rawServer.clients, 'clientid', ID)
|
||||
if c == None:
|
||||
return None
|
||||
return utils.getatribinarr(self.authServer.clients, 'rawClient', c)
|
||||
|
||||
def sendPopupInfo(self, c, title, msg):
|
||||
c.send('popupInfo', {
|
||||
'title': title,
|
||||
'msg': msg
|
||||
})
|
||||
|
||||
def sendPopupSuccess(self, c, title, msg):
|
||||
c.send('popupSuccess', {
|
||||
'title': title,
|
||||
'msg': msg
|
||||
})
|
||||
|
||||
def sendPopupWarning(self, c, title, msg):
|
||||
c.send('popupWarning', {
|
||||
'title': title,
|
||||
'msg': msg
|
||||
})
|
||||
|
||||
def sendPopupError(self, c, title, msg):
|
||||
c.send('popupError', {
|
||||
'title': title,
|
||||
'msg': msg
|
||||
})
|
||||
|
||||
def sendPopupColor(self, c, title, msg, color, isDark):
|
||||
c.send('popupColor', {
|
||||
'title': title,
|
||||
'msg': msg,
|
||||
'color': color,
|
||||
'isDark': isDark
|
||||
})
|
||||
+18
-17
@@ -10,13 +10,13 @@ import src.utils as utils
|
||||
import queue
|
||||
|
||||
class rawClient:
|
||||
def __init__(self, app):
|
||||
def __init__(self, rawServer):
|
||||
self.clientid = utils.randID(32)
|
||||
self.messages = queue.Queue()
|
||||
self.app = app
|
||||
self.rawServer = rawServer
|
||||
self.address = None
|
||||
def send(self, type, msg):
|
||||
self.app.rawServer.sendClient(self, jsonpack.pack({
|
||||
self.rawServer.sendClient(self, jsonpack.pack({
|
||||
'type': type,
|
||||
'data': msg,
|
||||
'cid': self.clientid
|
||||
@@ -25,14 +25,15 @@ class rawClient:
|
||||
#Credit to https://github.com/MaxHalford/flask-sse-no-deps
|
||||
class rawServer:
|
||||
|
||||
def __init__(self, app):
|
||||
def __init__(self, webserv):
|
||||
self.eventListeners = []
|
||||
self.clients = []
|
||||
self.app = app
|
||||
app.rawServer = self.app
|
||||
self.webserv = webserv
|
||||
self.app = webserv.app
|
||||
# self.app = app
|
||||
|
||||
def listen(self):
|
||||
c = rawClient(self.app)
|
||||
c = rawClient(self)
|
||||
self.clients.append(c)
|
||||
return self.clients[-1]
|
||||
|
||||
@@ -60,11 +61,10 @@ class rawServer:
|
||||
|
||||
def addEventListener(self, eventName, func):
|
||||
self.eventListeners.append({
|
||||
'name': eventName,
|
||||
'type': eventName,
|
||||
'func': func
|
||||
})
|
||||
|
||||
|
||||
def format_sse(data: str, event=None) -> str:
|
||||
#Formats a string and an event name in order to follow the event stream convention.
|
||||
msg = f'data: {data}\n\n'
|
||||
@@ -73,15 +73,16 @@ def format_sse(data: str, event=None) -> str:
|
||||
return msg
|
||||
|
||||
|
||||
def startRawListener(app):
|
||||
app.rawServer = rawServer(app)
|
||||
def startRawListener(webserv):
|
||||
server = rawServer(webserv)
|
||||
# app.rawServer = server
|
||||
|
||||
@app.route('/listen', methods=['GET', 'POST'])
|
||||
@webserv.app.route('/listen', methods=['GET', 'POST'])
|
||||
def listen():
|
||||
|
||||
if request.method == 'GET':
|
||||
|
||||
c = app.rawServer.listen() # returns a queue.Queue
|
||||
c = server.listen() # returns a queue.Queue
|
||||
c.address = request.remote_addr
|
||||
c.send('clidata', {
|
||||
'cid': c.clientid
|
||||
@@ -99,14 +100,14 @@ def startRawListener(app):
|
||||
|
||||
if data['cid'] == None:
|
||||
return {}, 400
|
||||
c = utils.getatribinarr(app.rawServer.clients, 'clientid', data['cid'])
|
||||
c = utils.getatribinarr(server.clients, 'clientid', data['cid'])
|
||||
if c == None:
|
||||
return {}, 400
|
||||
|
||||
for event in app.rawServer.eventListeners:
|
||||
if event['name'] == data['type']:
|
||||
for event in server.eventListeners:
|
||||
if event['type'] == data['type']:
|
||||
event['func'](c, data)
|
||||
|
||||
return {}, 200
|
||||
|
||||
#return rawServer
|
||||
return server
|
||||
+25
-19
@@ -6,6 +6,7 @@ from flask import Flask, render_template, Response
|
||||
from flask import request, redirect, url_for, make_response
|
||||
|
||||
import src.jsonpack as jsonpack
|
||||
import src.packets as packets
|
||||
import src.auth as auth
|
||||
|
||||
webroot = utils.getRoot('html/')
|
||||
@@ -55,22 +56,22 @@ class webpage():
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
isValid = app.authServer.cookieLogin(request)
|
||||
isValid = app.webserv.authServer.cookieLogin(request)
|
||||
if not isValid:
|
||||
return redirect("/login", code=302)
|
||||
else:
|
||||
return redirect(f'/{app.defaultTab}/{app.defaultPage}', code=302)
|
||||
return redirect(f'/{app.webserv.defaultTab}/{app.webserv.defaultPage}', code=302)
|
||||
|
||||
@app.route('/login')
|
||||
def loginPage():
|
||||
isValid = app.authServer.cookieLogin(request)
|
||||
isValid = app.webserv.authServer.cookieLogin(request)
|
||||
if isValid:
|
||||
return redirect(f'/{app.defaultTab}/{app.defaultPage}', code=302)
|
||||
return redirect(f'/{app.webserv.defaultTab}/{app.webserv.defaultPage}', code=302)
|
||||
|
||||
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>')
|
||||
.replace('<!--Place title here!!!-->', app.title)
|
||||
.replace('<!--Place title here!!!-->', app.webserv.title)
|
||||
.replace('<!--Place defaultPage here!!!-->', '/login'))
|
||||
|
||||
def recursivePageLocationFinder(pagename, objs):
|
||||
@@ -88,21 +89,21 @@ def recursivePageLocationFinder(pagename, objs):
|
||||
@app.route('/<tabname>/<pagename>')
|
||||
def page(tabname, pagename):
|
||||
|
||||
isValid = app.authServer.cookieLogin(request)
|
||||
isValid = app.webserv.authServer.cookieLogin(request)
|
||||
if not isValid:
|
||||
return redirect("/login", code=302)
|
||||
|
||||
try:
|
||||
|
||||
tab = utils.getatribinarr(app.webtabs, 'name', tabname)
|
||||
tab = utils.getatribinarr(app.webserv.webtabs, 'name', tabname)
|
||||
pageloc = recursivePageLocationFinder(pagename, tab.pages)
|
||||
|
||||
return make_response(open(utils.getRoot('html/nav.html'), 'r').read()
|
||||
.replace('<!--Place body here!!!-->', open(utils.getRoot(pageloc), 'r').read())
|
||||
.replace('<!--Place tabs here!!!-->', app.tabHtml)
|
||||
.replace('<!--Place tabs here!!!-->', app.webserv.tabHtml)
|
||||
.replace('<!--Place pages here!!!-->', tab.html)
|
||||
.replace('<!--Place title here!!!-->', app.title)
|
||||
.replace('<!--Place defaultPage here!!!-->', f'/{app.defaultTab}/{app.defaultPage}'))
|
||||
.replace('<!--Place title here!!!-->', app.webserv.title)
|
||||
.replace('<!--Place defaultPage here!!!-->', f'/{app.webserv.defaultTab}/{app.webserv.defaultPage}'))
|
||||
except:
|
||||
return redirect("/login", code=302)
|
||||
|
||||
@@ -114,6 +115,7 @@ def src(file):
|
||||
def err404(err):
|
||||
return redirect("/", code=302)
|
||||
|
||||
|
||||
class webserv():
|
||||
def __init__(self):
|
||||
self.title = 'Modulator'
|
||||
@@ -128,7 +130,7 @@ class webserv():
|
||||
|
||||
self.app = None
|
||||
|
||||
def start(self):
|
||||
def init(self):
|
||||
if not self.verbose:
|
||||
import logging
|
||||
log = logging.getLogger('werkzeug')
|
||||
@@ -140,8 +142,6 @@ class webserv():
|
||||
else:
|
||||
sslcontext = None
|
||||
|
||||
self.proc = mupr.Process(target=app.run, kwargs=dict(debug=self.verbose, port=self.port, host=self.host, ssl_context=sslcontext))
|
||||
|
||||
def tabHtml(path, name):
|
||||
return f'<a href="{path}" role="button" class="outline topnav-button text-white">{name}</a>'
|
||||
|
||||
@@ -150,17 +150,23 @@ class webserv():
|
||||
if tab.name == self.defaultTab:
|
||||
self.defaultPage = tab.defaultPage
|
||||
|
||||
app.authServer = auth.startAuthListener(app)
|
||||
def testfunc1(ac, data):
|
||||
print(ac)
|
||||
print(data)
|
||||
|
||||
app.defaultTab = self.defaultTab
|
||||
app.defaultPage = self.defaultPage
|
||||
app.webtabs = self.webtabs
|
||||
app.tabHtml = self.tabHtml
|
||||
|
||||
app.title = self.title
|
||||
app.webserv = self
|
||||
self.app = app
|
||||
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):
|
||||
self.proc.start()
|
||||
|
||||
# return self.rawServer
|
||||
|
||||
def stop(self):
|
||||
self.proc.terminate()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user