2020-11-11 13:27:18 -05:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
"""
|
|
|
|
An email management frontend.
|
|
|
|
"""
|
|
|
|
import asyncio
|
|
|
|
|
|
|
|
from aiohttp import web
|
|
|
|
import jinja2
|
|
|
|
import aiohttp_jinja2
|
|
|
|
from aiohttp_jinja2 import render_template
|
|
|
|
import uvloop
|
2020-11-17 12:46:58 -05:00
|
|
|
import asyncpg
|
2020-11-17 15:52:55 -05:00
|
|
|
from passlib.hash import argon2
|
2020-11-11 13:27:18 -05:00
|
|
|
|
2020-11-21 14:23:34 -05:00
|
|
|
import forms
|
2020-11-11 13:27:18 -05:00
|
|
|
import config
|
|
|
|
import buckler_aiohttp
|
|
|
|
|
|
|
|
uvloop.install()
|
|
|
|
routes = web.RouteTableDef()
|
|
|
|
|
|
|
|
@routes.get('/', name='index')
|
2020-11-17 15:52:55 -05:00
|
|
|
@routes.post('/', name='index')
|
2020-11-11 13:27:18 -05:00
|
|
|
async def index(request):
|
|
|
|
"""The index page."""
|
2020-11-17 15:52:55 -05:00
|
|
|
user_id = int(request.cookies.get('userid'))
|
2020-11-21 14:23:34 -05:00
|
|
|
server_domain = config.server_domain
|
|
|
|
result = {}
|
2020-11-17 15:52:55 -05:00
|
|
|
|
2020-11-17 12:46:58 -05:00
|
|
|
async with request.app['pool'].acquire() as conn:
|
2020-11-21 14:23:34 -05:00
|
|
|
user_data = await conn.fetchrow(
|
2020-11-17 15:52:55 -05:00
|
|
|
"SELECT * FROM virtual_users WHERE buckler_id = $1",
|
2020-11-17 12:46:58 -05:00
|
|
|
user_id)
|
2020-11-17 15:52:55 -05:00
|
|
|
|
2020-11-21 14:23:34 -05:00
|
|
|
if not user_data and request.method == 'GET':
|
|
|
|
return render_template('index.html', request, locals())
|
|
|
|
|
2020-11-17 15:52:55 -05:00
|
|
|
if request.method == 'POST':
|
|
|
|
data = await request.post()
|
2020-11-21 14:23:34 -05:00
|
|
|
form_type = data.get('form_type')
|
|
|
|
if form_type == 'change_password':
|
|
|
|
result = await forms.change_password(request, user_data)
|
|
|
|
elif form_type == 'new_email':
|
2020-11-21 14:27:33 -05:00
|
|
|
if user_data:
|
|
|
|
result = {
|
|
|
|
'ok': False,
|
|
|
|
'message': "You already have an email account."
|
|
|
|
}
|
|
|
|
return render_template('index.html', request, locals())
|
2020-11-21 14:23:34 -05:00
|
|
|
result = await forms.new_email(request)
|
|
|
|
if result['ok']:
|
|
|
|
email = request['meta']['username'] + '@' +config.server_domain
|
|
|
|
user_data = {'email': email}
|
2020-11-17 15:52:55 -05:00
|
|
|
|
2020-11-11 13:27:18 -05:00
|
|
|
return render_template('index.html', request, locals())
|
|
|
|
|
|
|
|
|
|
|
|
async def init_app():
|
|
|
|
"""Initializes the application."""
|
|
|
|
app = web.Application(middlewares=[buckler_aiohttp.buckler_session])
|
|
|
|
aiohttp_jinja2.setup(
|
|
|
|
app,
|
|
|
|
trim_blocks=True,
|
|
|
|
lstrip_blocks=True,
|
|
|
|
undefined=jinja2.StrictUndefined,
|
|
|
|
loader=jinja2.FileSystemLoader('templates'),
|
|
|
|
)
|
2020-11-17 12:46:58 -05:00
|
|
|
app['pool'] = await asyncpg.create_pool(**config.mailserver_db)
|
2020-11-11 13:27:18 -05:00
|
|
|
app.router.add_routes(routes)
|
|
|
|
app_wrap = web.Application()
|
|
|
|
app_wrap.add_subapp(config.url_prefix, app)
|
|
|
|
return app_wrap
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
app = asyncio.run(init_app())
|
|
|
|
aiohttp.web.run_app(app, host='0.0.0.0', port=5050)
|