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)