48 lines
1.7 KiB
Python
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)
|