def client_register(request): """ Endpoint for client registration """ try: data = decode_request(request) except ValueError: error = "Could not decode data." return json_response({"error": error}, status=400) if data is "": error = "Unknown Content-Type" return json_response({"error": error}, status=400) if "type" not in data: error = "No registration type provided." return json_response({"error": error}, status=400) if data.get("application_type", None) not in CLIENT_TYPES: error = "Unknown application_type." return json_response({"error": error}, status=400) client_type = data["type"] if client_type == "client_update": # updating a client if "client_id" not in data: error = "client_id is requried to update." return json_response({"error": error}, status=400) elif "client_secret" not in data: error = "client_secret is required to update." return json_response({"error": error}, status=400) client = Client.query.filter_by(id=data["client_id"], secret=data["client_secret"]).first() if client is None: error = "Unauthorized." return json_response({"error": error}, status=403) client.application_name = data.get("application_name", client.application_name) client.application_type = data.get("application_type", client.application_type) app_name = ("application_type", client.application_name) if app_name in CLIENT_TYPES: client.application_name = app_name elif client_type == "client_associate": # registering if "client_id" in data: error = "Only set client_id for update." return json_response({"error": error}, status=400) elif "access_token" in data: error = "access_token not needed for registration." return json_response({"error": error}, status=400) elif "client_secret" in data: error = "Only set client_secret for update." return json_response({"error": error}, status=400) # generate the client_id and client_secret client_id = random_string(22, UNICODE_ASCII_CHARACTER_SET) client_secret = random_string(43, UNICODE_ASCII_CHARACTER_SET) expirey = 0 # for now, lets not have it expire expirey_db = None if expirey == 0 else expirey application_type = data["application_type"] # save it client = Client( id=client_id, secret=client_secret, expirey=expirey_db, application_type=application_type, ) else: error = "Invalid registration type" return json_response({"error": error}, status=400) logo_uri = data.get("logo_uri", client.logo_url) if logo_uri is not None and not validate_url(logo_uri): error = "Logo URI {0} is not a valid URI.".format(logo_uri) return json_response({"error": error}, status=400) else: client.logo_url = logo_uri client.application_name = data.get("application_name", None) contacts = data.get("contacts", None) if contacts is not None: if not isinstance(contacts, six.text_type): error = "Contacts must be a string of space-seporated email addresses." return json_response({"error": error}, status=400) contacts = contacts.split() for contact in contacts: if not validate_email(contact): # not a valid email error = "Email {0} is not a valid email.".format(contact) return json_response({"error": error}, status=400) client.contacts = contacts redirect_uris = data.get("redirect_uris", None) if redirect_uris is not None: if not isinstance(redirect_uris, six.text_type): error = "redirect_uris must be space-seporated URLs." return json_response({"error": error}, status=400) redirect_uris = redirect_uris.split() for uri in redirect_uris: if not validate_url(uri): # not a valid uri error = "URI {0} is not a valid URI".format(uri) return json_response({"error": error}, status=400) client.redirect_uri = redirect_uris client.save() expirey = 0 if client.expirey is None else client.expirey return json_response({ "client_id": client.id, "client_secret": client.secret, "expires_at": expirey, })
def client_register(request): """ Endpoint for client registration """ try: data = decode_request(request) except ValueError: error = "Could not decode data." return json_response({"error": error}, status=400) if data is "": error = "Unknown Content-Type" return json_response({"error": error}, status=400) if "type" not in data: error = "No registration type provided." return json_response({"error": error}, status=400) if data.get("application_type", None) not in CLIENT_TYPES: error = "Unknown application_type." return json_response({"error": error}, status=400) client_type = data["type"] if client_type == "client_update": # updating a client if "client_id" not in data: error = "client_id is requried to update." return json_response({"error": error}, status=400) elif "client_secret" not in data: error = "client_secret is required to update." return json_response({"error": error}, status=400) client = Client.query.filter_by( id=data["client_id"], secret=data["client_secret"] ).first() if client is None: error = "Unauthorized." return json_response({"error": error}, status=403) client.application_name = data.get( "application_name", client.application_name ) client.application_type = data.get( "application_type", client.application_type ) app_name = ("application_type", client.application_name) if app_name in CLIENT_TYPES: client.application_name = app_name elif client_type == "client_associate": # registering if "client_id" in data: error = "Only set client_id for update." return json_response({"error": error}, status=400) elif "access_token" in data: error = "access_token not needed for registration." return json_response({"error": error}, status=400) elif "client_secret" in data: error = "Only set client_secret for update." return json_response({"error": error}, status=400) # generate the client_id and client_secret client_id = random_string(22, UNICODE_ASCII_CHARACTER_SET) client_secret = random_string(43, UNICODE_ASCII_CHARACTER_SET) expirey = 0 # for now, lets not have it expire expirey_db = None if expirey == 0 else expirey application_type = data["application_type"] # save it client = Client( id=client_id, secret=client_secret, expirey=expirey_db, application_type=application_type, ) else: error = "Invalid registration type" return json_response({"error": error}, status=400) logo_uri = data.get("logo_uri", client.logo_url) if logo_uri is not None and not validate_url(logo_uri): error = "Logo URI {0} is not a valid URI.".format(logo_uri) return json_response( {"error": error}, status=400 ) else: client.logo_url = logo_uri client.application_name = data.get("application_name", None) contacts = data.get("contacts", None) if contacts is not None: if not isinstance(contacts, six.text_type): error = "Contacts must be a string of space-seporated email addresses." return json_response({"error": error}, status=400) contacts = contacts.split() for contact in contacts: if not validate_email(contact): # not a valid email error = "Email {0} is not a valid email.".format(contact) return json_response({"error": error}, status=400) client.contacts = contacts redirect_uris = data.get("redirect_uris", None) if redirect_uris is not None: if not isinstance(redirect_uris, six.text_type): error = "redirect_uris must be space-seporated URLs." return json_response({"error": error}, status=400) redirect_uris = redirect_uris.split() for uri in redirect_uris: if not validate_url(uri): # not a valid uri error = "URI {0} is not a valid URI".format(uri) return json_response({"error": error}, status=400) client.redirect_uri = redirect_uris client.save() expirey = 0 if client.expirey is None else client.expirey return json_response( { "client_id": client.id, "client_secret": client.secret, "expires_at": expirey, })