amity/app/accept_invite.py

49 lines
1.7 KiB
Python
Raw Permalink Normal View History

import cherrypy
import requests
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))
def get_working_url(primary, fallback, timeout=1):
try:
response = requests.get(primary, timeout=timeout)
if response.status_code == 200:
return primary
except requests.RequestException:
pass
return fallback
class AcceptInvite(object):
@cherrypy.expose
def index(self, remote=None, token=None):
if not remote:
raise cherrypy.HTTPError(400, "Missing remote")
if not token:
raise cherrypy.HTTPError(400, "Missing token")
disco_url = get_working_url(f'{remote}/.well-known/ocm',
f'{remote}/ocm-provider')
try:
r = requests.get(disco_url)
except requests.exceptions.ConnectionError:
tmpl = env.get_template('error.html')
return tmpl.render(message='Unable to reach OCM provider')
if r.status_code != 200:
tmpl = env.get_template('error.html')
return tmpl.render(message=f'Unable to reach OCM provider: {r.status_code}')
provider_data = r.json()
if ('capabilities' not in provider_data) or (
'inviteAcceptDialog' not in provider_data) or (
'capabilities' in provider_data
and 'invite' not in provider_data['capabilities']):
tmpl = env.get_template('error.html')
return tmpl.render(message='Remote does not support OCM invites')
redirect_url = f'{provider_data['inviteAcceptDialog']}'
redirect_url += f'?token={token}&providerDomain={cherrypy.request.base}'
raise cherrypy.HTTPRedirect(redirect_url)