diff --git a/handler.py b/handler.py index a9ad568..2e6889c 100644 --- a/handler.py +++ b/handler.py @@ -14,6 +14,10 @@ import templates.plain.main as template_public import templates.postcard.main as template_email import modules.public.home as public_home +import modules.public.register as public_register +import modules.public.notme as public_notme +import modules.public.verify as public_verify +import modules.public.login as public_login import modules.api.auth as api_auth @@ -28,6 +32,43 @@ def index(): } return public_home.main().html(params) +@app.route('/register/') +def index(roles): + params = { + "roles" :roles, + "mako" :{ + "website" : template_public.main(directory.page["public"], "register") + } + } + return public_register.register().html(params) + +@app.route('/notme', method='GET') +def index(): + params = { + "mako" : { + "website" : template_public.main(directory.page["public"], "notme") + } + } + return public_notme.notme().html(params) + +@app.route('/verify', method='GET') +def index(): + params = { + "mako" : { + "website" : template_public.main(directory.page["public"], "verify") + } + } + return public_verify.verify().html(params) + +@app.route('/login') +def index(): + params = { + "mako" : { + "website" : template_public.main(directory.page["public"], "login") + } + } + return public_login.login().html(params) + @app.route('/api/auth/register/', method=['OPTIONS', 'POST']) def index(roles): try: diff --git a/modules/public/login.py b/modules/public/login.py new file mode 100644 index 0000000..492bb11 --- /dev/null +++ b/modules/public/login.py @@ -0,0 +1,35 @@ +from mako.template import Template +from config import globalvar +from scripts import loggorilla + +import procedure.validation as procedure_validation + +class login: + + def __init__(self): + pass + + def html(self, params): + APIADDR = "/login" + + loggorilla.prcss(APIADDR, "Define page parameters") + active_page = "Login" + allowed_roles = [0] + + loggorilla.prcss(APIADDR, "Account validation") + user_validation = procedure_validation.validation().account(APIADDR, allowed_roles) + user = user_validation['data'] + + return Template(params["mako"]["website"]['index']).render( + title = globalvar.title, + header = globalvar.header, + navbar = Template(params["mako"]["website"]['navbar']).render( + menu = globalvar.menu['public']['navbar'], + user_roles = user['profile']['roles'], + active_page = active_page + ), + footer = Template(params["mako"]["website"]['footer']).render( + copyright = globalvar.copyright, + ), + container = Template(params["mako"]["website"]['container']).render() + ) diff --git a/modules/public/notme.py b/modules/public/notme.py new file mode 100644 index 0000000..49a4b77 --- /dev/null +++ b/modules/public/notme.py @@ -0,0 +1,37 @@ +from mako.template import Template +from config import globalvar +from scripts import loggorilla + +import procedure.validation as procedure_validation + +class notme: + + def __init__(self): + pass + + def html(self, params): + APIADDR = "/notme" + + loggorilla.prcss(APIADDR, "Define page parameters") + active_page = "Not Me" + allowed_roles = [0,1,2,3] + + loggorilla.prcss(APIADDR, "Account validation") + user_validation = procedure_validation.validation().account(APIADDR, allowed_roles) + user = user_validation['data'] + + return Template(params["mako"]["website"]['index']).render( + title = globalvar.title, + header = globalvar.header, + navbar = Template(params["mako"]["website"]['navbar']).render( + menu = globalvar.menu['public']['navbar'], + user_roles = user['profile']['roles'], + active_page = active_page + ), + footer = Template(params["mako"]["website"]['footer']).render( + copyright = globalvar.copyright, + ), + container = Template(params["mako"]["website"]['container']).render( + title = globalvar.title + ) + ) diff --git a/modules/public/register.py b/modules/public/register.py new file mode 100644 index 0000000..6f441ee --- /dev/null +++ b/modules/public/register.py @@ -0,0 +1,41 @@ +from mako.template import Template +from config import globalvar +from scripts import loggorilla + +import procedure.validation as procedure_validation + +class register: + + def __init__(self): + pass + + def html(self, params): + APIADDR = "/register" + + loggorilla.prcss(APIADDR, "Define page parameters") + active_page = "Register" + allowed_roles = [0] + roles = params["roles"] + + loggorilla.prcss(APIADDR, "Account validation") + user_validation = procedure_validation.validation().account(APIADDR, allowed_roles) + user = user_validation['data'] + + return Template(params["mako"]["website"]['index']).render( + title = globalvar.title, + header = globalvar.header, + navbar = Template(params["mako"]["website"]['navbar']).render( + menu = globalvar.menu['public']['navbar'], + user_roles = user['profile']['roles'], + active_page = active_page + ), + footer = Template(params["mako"]["website"]['footer']).render( + copyright = globalvar.copyright, + ), + container = Template(params["mako"]["website"]['container']).render( + title = globalvar.title, + reCAPTCHA_client = globalvar.reCAPTCHA['client'], + roles = roles, + production = globalvar.production + ) + ) diff --git a/modules/public/verify.py b/modules/public/verify.py new file mode 100644 index 0000000..6757347 --- /dev/null +++ b/modules/public/verify.py @@ -0,0 +1,35 @@ +from mako.template import Template +from config import globalvar +from scripts import loggorilla + +import procedure.validation as procedure_validation + +class verify: + + def __init__(self): + pass + + def html(self, params): + APIADDR = "/verify" + + loggorilla.prcss(APIADDR, "Define page parameters") + active_page = "Verify" + allowed_roles = [0] + + loggorilla.prcss(APIADDR, "Account validation") + user_validation = procedure_validation.validation().account(APIADDR, allowed_roles) + user = user_validation['data'] + + return Template(params["mako"]["website"]['index']).render( + title = globalvar.title, + header = globalvar.header, + navbar = Template(params["mako"]["website"]['navbar']).render( + menu = globalvar.menu['public']['navbar'], + user_roles = user['profile']['roles'], + active_page = active_page + ), + footer = Template(params["mako"]["website"]['footer']).render( + copyright = globalvar.copyright, + ), + container = Template(params["mako"]["website"]['container']).render() + ) diff --git a/pages/public/login.html b/pages/public/login.html new file mode 100644 index 0000000..71aa682 --- /dev/null +++ b/pages/public/login.html @@ -0,0 +1,15 @@ +

Login

+ + + +
+
+
+ +Forgot password + + + + diff --git a/pages/public/notme.html b/pages/public/notme.html new file mode 100644 index 0000000..cc86dc4 --- /dev/null +++ b/pages/public/notme.html @@ -0,0 +1,14 @@ +

Not me

+ + + +

I hereby declare that I have never registered with ${title} and will delete the data that uses my email

+ + + + + diff --git a/pages/public/register.html b/pages/public/register.html new file mode 100644 index 0000000..fe0aea3 --- /dev/null +++ b/pages/public/register.html @@ -0,0 +1,32 @@ +

Register

+ +% if production: + +% endif + + + + +
+
+
+ +% if production: + +% else: + +% endif + + + + + +
+ + +

Message here

+
+ + diff --git a/pages/public/verify.html b/pages/public/verify.html new file mode 100644 index 0000000..40ec7ab --- /dev/null +++ b/pages/public/verify.html @@ -0,0 +1,9 @@ +

Verify

+ + + + + + diff --git a/static/js/auth/login.js b/static/js/auth/login.js new file mode 100644 index 0000000..e37efe0 --- /dev/null +++ b/static/js/auth/login.js @@ -0,0 +1,83 @@ +function flushResponse() { + document.getElementById("alert-response" ).style.display = 'none'; + document.getElementById("alert-response" ).classList.remove('alert-success' ); + document.getElementById("alert-response" ).classList.remove('alert-danger' ); + document.getElementById("alert-response" ).classList.remove('alert-primary' ); +} + +function loadingResponse() { + flushResponse(); + document.getElementById("alert-status" ).innerHTML = "Loading..."; + document.getElementById("alert-desc" ).innerHTML = "Please wait..."; + document.getElementById("alert-response").classList.add('alert-primary'); + document.getElementById("alert-response").style.display = 'block'; +} + +function responseSession(response) { + flushResponse(); + const obj = JSON.parse(response); + document.getElementById("alert-status").innerHTML = obj.status; + if (obj.status == "success") { + document.getElementById("alert-desc" ).innerHTML = "Welcome!"; + document.getElementById("alert-response").classList.add('alert-success'); + document.getElementById("alert-response").style.display = 'block'; + window.location.replace("/?msg=Welcome"); + } + else { + document.getElementById("alert-desc" ).innerHTML = "Internal error"; + document.getElementById("alert-response").classList.add('alert-danger'); + document.getElementById("alert-response").style.display = 'block'; + } +} + +function setSession(jwt) { + var url = "/api/auth/session/set"; + var payload = { + "jwt" : jwt + }; + sendHttpRequest(url, "POST", payload, function (error, response) { + if (error) console.error("Error:", error); + else { + console.log("JSON Response:", response); + responseSession(response); + } + }, "application/json"); +} + +function responseAlert(response) { + flushResponse(); + const obj = JSON.parse(response); + if (obj.status == "success") { + loadingResponse(); + document.getElementById("alert-desc" ).innerHTML = "Set the session"; + setSession(obj.data.jwt); + } + if (obj.status == "failed") { + document.getElementById("alert-response").classList.add('alert-danger'); + document.getElementById("alert-status" ).innerHTML = obj.status; + document.getElementById("alert-desc" ).innerHTML = obj.desc; + document.getElementById("alert-response").style.display = 'block'; + } +} + +function onSubmit() { + loadingResponse(); + var username = document.getElementById("form-username").value; + var password = document.getElementById("form-password").value; + + var url = "/api/auth/login"; + var payload = { + "username" : username, + "password" : password + }; + sendHttpRequest(url, "POST", payload, function (error, response) { + if (error) console.error("Error:", error); + else { + console.log("JSON Response:", response); + responseAlert(response); + } + }, "application/json"); + +} + +flushResponse(); diff --git a/static/js/auth/notme.js b/static/js/auth/notme.js new file mode 100644 index 0000000..4861e2a --- /dev/null +++ b/static/js/auth/notme.js @@ -0,0 +1,45 @@ +function flushResponse() { + document.getElementById("alert-response" ).style.display = 'none'; + document.getElementById("alert-response" ).classList.remove('alert-success' ); + document.getElementById("alert-response" ).classList.remove('alert-danger' ); + document.getElementById("alert-response" ).classList.remove('alert-primary' ); +} + +function loadingResponse() { + flushResponse(); + document.getElementById("alert-status" ).innerHTML = "Loading..."; + document.getElementById("alert-desc" ).innerHTML = "Please wait..."; + document.getElementById("alert-response").classList.add('alert-primary'); + document.getElementById("alert-response").style.display = 'block'; +} + +function responseAlert(response) { + flushResponse(); + const obj = JSON.parse(response); + if (obj.status == "success" ) document.getElementById("alert-response").classList.add('alert-success' ); + if (obj.status == "failed" ) document.getElementById("alert-response").classList.add('alert-danger' ); + document.getElementById("alert-status" ).innerHTML = obj.status; + document.getElementById("alert-desc" ).innerHTML = obj.desc; + document.getElementById("alert-response").style.display = 'block'; +} + +function notme() { + document.getElementById("notme-link").style.display = 'none'; + loadingResponse(); + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + const token = urlParams.get('token'); + var url = "/api/auth/notme"; + var payload = { + "token" : token + }; + sendHttpRequest(url, "POST", payload, function (error, response) { + if (error) console.error("Error:", error); + else { + console.log("JSON Response:", response); + responseAlert(response); + } + }, "application/json"); +} + +flushResponse(); diff --git a/static/js/auth/register.js b/static/js/auth/register.js new file mode 100644 index 0000000..e3a8005 --- /dev/null +++ b/static/js/auth/register.js @@ -0,0 +1,68 @@ +function flushResponse() { + document.getElementById("alert-response" ).style.display = 'none'; + document.getElementById("resend-div" ).style.display = 'none'; + document.getElementById("alert-response" ).classList.remove('alert-success' ); + document.getElementById("alert-response" ).classList.remove('alert-danger' ); + document.getElementById("alert-response" ).classList.remove('alert-primary' ); +} + +function loadingResponse() { + flushResponse(); + document.getElementById("alert-status" ).innerHTML = "Loading..."; + document.getElementById("alert-desc" ).innerHTML = "Please wait..."; + document.getElementById("alert-response").classList.add('alert-primary'); + document.getElementById("alert-response").style.display = 'block'; +} + +function responseAlert(response) { + flushResponse(); + const obj = JSON.parse(response); + if (obj.status == "success" ) document.getElementById("alert-response").classList.add('alert-success' ); + if (obj.status == "failed" ) document.getElementById("alert-response").classList.add('alert-danger' ); + if (obj.desc == "check email for verification") { + document.getElementById("resend-email" ).value = document.getElementById("form-email").value; + document.getElementById("resend-message" ).innerHTML = obj.data.message; + document.getElementById("resend-link" ).setAttribute('href', obj.data.resend); + document.getElementById("resend-div" ).style.display = 'block'; + } + document.getElementById("alert-status" ).innerHTML = obj.status; + document.getElementById("alert-desc" ).innerHTML = obj.desc; + document.getElementById("alert-response").style.display = 'block'; +} + +function onSubmit(token) { + loadingResponse(); + var email = document.getElementById("form-email" ).value; + var username = document.getElementById("form-username" ).value; + var password = document.getElementById("form-password" ).value; + var roles = document.getElementById("roles" ).value; + var url = "/api/auth/register/"+roles; + var payload = { + "email" : email, + "username" : username, + "password" : password + }; + payload.captcha = token; // Add response from reCAPTCHA + sendHttpRequest(url, "POST", payload, function (error, response) { + if (error) console.error("Error:", error); + else { + console.log("JSON Response:", response); + responseAlert(response); + } + }, "application/json"); +} + +function resending() { + loadingResponse(); + var email = document.getElementById("resend-email").value; + var url = "/api/auth/resend?email="+email; + sendHttpRequest(url, "GET", null, function (error, response) { + if (error) console.error("Error:", error); + else { + console.log("JSON Response:", response); + responseAlert(response); + } + }, "multipart/form-data"); +} + +flushResponse(); diff --git a/static/js/auth/verify.js b/static/js/auth/verify.js new file mode 100644 index 0000000..61b5e18 --- /dev/null +++ b/static/js/auth/verify.js @@ -0,0 +1,44 @@ +function flushResponse() { + document.getElementById("alert-response" ).style.display = 'none'; + document.getElementById("alert-response" ).classList.remove('alert-success' ); + document.getElementById("alert-response" ).classList.remove('alert-danger' ); + document.getElementById("alert-response" ).classList.remove('alert-primary' ); +} + +function loadingResponse() { + flushResponse(); + document.getElementById("alert-status" ).innerHTML = "Loading..."; + document.getElementById("alert-desc" ).innerHTML = "Please wait..."; + document.getElementById("alert-response").classList.add('alert-primary'); + document.getElementById("alert-response").style.display = 'block'; +} + +function responseAlert(response) { + flushResponse(); + const obj = JSON.parse(response); + if (obj.status == "success" ) document.getElementById("alert-response").classList.add('alert-success' ); + if (obj.status == "failed" ) document.getElementById("alert-response").classList.add('alert-danger' ); + document.getElementById("alert-status" ).innerHTML = obj.status; + document.getElementById("alert-desc" ).innerHTML = obj.desc; + document.getElementById("alert-response").style.display = 'block'; +} + +function verify() { + loadingResponse(); + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + const token = urlParams.get('token') + var url = "/api/auth/verify"; + var payload = { + "token" : token + }; + sendHttpRequest(url, "POST", payload, function (error, response) { + if (error) console.error("Error:", error); + else { + console.log("JSON Response:", response); + responseAlert(response); + } + }, "application/json"); +} + +verify();