149 lines
3.8 KiB
Python
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)
|
|
|
|
|
|
|