paws/paws/views.py
2020-01-17 08:47:37 -05:00

149 lines
3.8 KiB
Python

import aiohttp
import random
from aiohttp_jinja2 import render_template as render
from urllib.parse import quote_plus, unquote_plus
from .database import pawsdb, trans, query, where, keys, ban_check
from .functions import error, fed_domain
from .oauth import create_app, login
from .config import MASTOCONFIG
async def get_login(request):
parms = request.rel_url.query
redir = parms.get('redir')
token = request.cookies.get('paws_token')
numid = random.randint(1*1000000, 10*1000000-1)
if pawsdb.users.get(query.token == token):
return aiohttp.web.HTTPFound(f'/about')
return render('pages/login.html', request, {'redir': redir, 'numid': numid})
async def post_login(request):
data = await request.post()
domain = data.get('domain')
redir = data.get('redir')
numid = data.get('numid')
if domain in ['', None]:
return render('pages/login.html', request, {'msg': 'Missing domain'})
if ban_check(domain):
return render('pages/error.html', request, {'msg': 'Instance banned', 'code': '403'}, status=403)
appid, appsecret, redir_url = create_app(domain)
with trans(pawsdb.users) as tr:
tr.insert({
'handle': data['numid'],
'domain': data['domain'],
'appid': appid,
'appsecret': appsecret,
'token': None
})
response = aiohttp.web.HTTPFound(redir_url)
response.set_cookie('paws_numid', numid, max_age=60*60*24*14, path='/paws')
if redir not in ['', None]:
response.set_cookie('paws_redir', redir, max_age=60*60*24*14, path='/paws')
return response
async def get_auth(request):
parms = request.rel_url.query
cookies = request.cookies
redir = cookies.get('paws_redir')
numid = cookies.get('paws_numid')
code = parms.get('code')
if None in [numid, code]:
return render('pages/error.html', request, {'msg': 'Missing temporary userid or auth code', 'code': '500'}, status=500)
if redir in ['', None]:
redir = '/about'
user = pawsdb.users.get(query.handle == str(numid))
token, userinfo = login(user, code)
instance = fed_domain(userinfo['username'], user['domain'])
with trans(pawsdb.users) as tr:
tr.update({'handle': userinfo['username'], 'instance': instance, 'token': token, 'appid': None, 'appsecret': None}, where('handle') == numid)
response = aiohttp.web.HTTPFound(redir)
response.set_cookie('paws_token', token, max_age=60*60*24*14)
response.del_cookie('paws_redir', path='/paws')
response.del_cookie('paws_numid', path='/paws')
return response
async def get_logout(request):
token = request.cookies.get('paws_token')
with trans(pawsdb.users) as tr:
tr.remove(where('token') == token)
response = render('pages/login.html', request, {'msg': 'Logged out'})
response.del_cookie('token')
return response
async def get_style(request):
response = render('color.css', request, {})
response.headers['Content-Type'] = 'text/css'
return response
async def get_actor(request):
rsakey = keys('default')
HOST = MASTOCONFIG['domain']
if not rsakey:
render('pages/error.html', request, {'msg': 'Missing actor keys', 'code': 500}, status=500)
PUBKEY = rsakey['pubkey']
data = {
'@context': [
'https://www.w3.org/ns/activitystreams'
],
'endpoints': {
'sharedInbox': f'https://{HOST}/inbox'
},
'inbox': f'https://{HOST}/paws/inbox',
'name': f'PAWS @ {HOST}',
'type': 'Application',
'id': f'https://{HOST}/paws/actor',
'publicKey': {
'id': f'https://{HOST}/paws/actor#main-key',
'owner': f'https://{HOST}/paws/actor',
'publicKeyPem': PUBKEY
},
'summary': 'PAWS Actor',
'preferredUsername': 'paws',
'url': f'https://{HOST}/paws/actor'
}
return aiohttp.web.json_response(data)
async def post_inbox(request):
return aiohttp.web.json_response('UvU', status=202)
async def get_paws(request):
return aiohttp.web.json_response('UvU', status=202)
async def post_paws(request):
return aiohttp.web.json_response('UvU', status=202)