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: raise cherrypy.HTTPError(500, "Unable to reach OCM") if r.status_code != 200: raise cherrypy.HTTPError(500, f"Unable to reach OCM: {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']): raise cherrypy.HTTPError(500, "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)