amity/app/accept_invite.py
Micke Nordin 4dd92c0bdc
first commit
Signed-off-by: Micke Nordin <kano@sunet.se>
2025-06-24 13:27:40 +02:00

48 lines
1.7 KiB
Python

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)