114 lines
2.7 KiB
Python
114 lines
2.7 KiB
Python
import os
|
|
import sys
|
|
import asyncio
|
|
import aiohttp
|
|
import aiohttp_jinja2
|
|
import jinja2
|
|
|
|
from ipaddress import ip_address as address
|
|
from urllib.parse import urlparse
|
|
|
|
from .config import PAWSCONFIG, MASTOCONFIG, VERSION, script_path, logging
|
|
from .functions import color
|
|
from . import middleware
|
|
|
|
|
|
def webserver():
|
|
from . import views
|
|
|
|
web = aiohttp.web.Application(middlewares=[
|
|
middleware.http_filter,
|
|
middleware.http_signatures,
|
|
middleware.http_redirect
|
|
])
|
|
|
|
web.on_response_prepare.append(middleware.http_server_header)
|
|
|
|
web.add_routes([
|
|
aiohttp.web.route('GET', '/paws', views.get_paws),
|
|
aiohttp.web.route('POST', '/paws', views.post_paws),
|
|
aiohttp.web.route('GET', '/paws/login', views.get_login),
|
|
aiohttp.web.route('POST', '/paws/login', views.post_login),
|
|
aiohttp.web.route('GET', '/paws/logout', views.get_logout),
|
|
aiohttp.web.route('GET', '/paws/auth', views.get_auth),
|
|
aiohttp.web.route('GET', '/paws/style.css', views.get_style),
|
|
aiohttp.web.route('POST', '/paws/inbox', views.post_inbox),
|
|
aiohttp.web.route('GET', '/paws/actor', views.get_actor)
|
|
])
|
|
|
|
async def global_vars(request):
|
|
return {
|
|
'VERSION': VERSION,
|
|
'len': len,
|
|
'request': request,
|
|
'domain': MASTOCONFIG['domain'],
|
|
'urlparse': urlparse,
|
|
'lighten': color().lighten,
|
|
'darken': color().darken,
|
|
'saturate': color().saturate,
|
|
'desaturate': color().desaturate,
|
|
'rgba': color().rgba
|
|
}
|
|
|
|
|
|
aiohttp_jinja2.setup(
|
|
web,
|
|
loader=jinja2.FileSystemLoader(f'{script_path}/templates'),
|
|
autoescape=jinja2.select_autoescape(['html', 'css']),
|
|
context_processors=[global_vars],
|
|
lstrip_blocks=True,
|
|
trim_blocks=True
|
|
)
|
|
|
|
return web
|
|
|
|
|
|
async def start_webserver():
|
|
app = webserver()
|
|
runner = aiohttp.web.AppRunner(app, access_log_format='%{X-Real-Ip}i "%r" %s %b "%{User-Agent}i"')
|
|
await runner.setup()
|
|
|
|
listen = PAWSCONFIG['host']
|
|
port = PAWSCONFIG['port']
|
|
|
|
if listen.startswith('unix:'):
|
|
if sys.platform != 'win32':
|
|
sock_listen = listen.replace('unix:', '')
|
|
|
|
logging.info(f'Starting webserver at socket: {sock_listen}')
|
|
site = aiohttp.web.UnixSite(runner, sock_listen)
|
|
|
|
else:
|
|
logging.error('Windows cannot use unix sockets. Use an IP address instead. Exiting...')
|
|
sys.exit()
|
|
|
|
else:
|
|
try:
|
|
address(listen)
|
|
|
|
except ValueError:
|
|
logging.warning('Invalid IP address. Listening on "0.0.0.0" instead.')
|
|
listen = '127.0.0.1'
|
|
|
|
try:
|
|
int(port)
|
|
|
|
except ValueError:
|
|
logging.warning('Invalid port. Using 3621 instead.')
|
|
port = 3621
|
|
|
|
logging.info(f'Starting webserver at address: {listen}:{port}')
|
|
site = aiohttp.web.TCPSite(runner, listen, port)
|
|
|
|
await site.start()
|
|
|
|
|
|
def main():
|
|
try:
|
|
loop = asyncio.get_event_loop()
|
|
asyncio.ensure_future(start_webserver())
|
|
loop.run_forever()
|
|
|
|
except KeyboardInterrupt:
|
|
logging.info('Bye!')
|