def _verify_redirect_uri(self, areq): """ MUST NOT contain a fragment MAY contain query component :return: An error response if the redirect URI is faulty otherwise None """ try: _redirect_uri = urlparse.unquote(areq["redirect_uri"]) part = urlparse.urlparse(_redirect_uri) if part.fragment: raise URIError("Contains fragment") (_base, _query) = urllib.splitquery(_redirect_uri) if _query: _query = urlparse.parse_qs(_query) match = False for regbase, rquery in self.cdb[ areq["client_id"]]["redirect_uris"]: if _base == regbase or _redirect_uri.startswith(regbase): # every registered query component must exist in the # redirect_uri if rquery: for key, vals in rquery.items(): assert key in _query for val in vals: assert val in _query[key] # and vice versa, every query component in the redirect_uri # must be registered if _query: if rquery is None: raise ValueError for key, vals in _query.items(): assert key in rquery for val in vals: assert val in rquery[key] match = True break if not match: raise RedirectURIError("Doesn't match any registered uris") # ignore query components that are not registered return None except Exception: logger.error("Faulty redirect_uri: %s" % areq["redirect_uri"]) try: _cinfo = self.cdb[areq["client_id"]] except KeyError: logger.info("Unknown client: %s" % areq["client_id"]) raise UnknownClient(areq["client_id"]) else: logger.info("Registered redirect_uris: %s" % _cinfo) raise RedirectURIError("Faulty redirect_uri: %s" % areq["redirect_uri"])
def _verify_redirect_uri(self, areq): """ MUST NOT contain a fragment MAY contain query component :return: An error response if the redirect URI is faulty otherwise None """ try: _redirect_uri = unquote(areq["redirect_uri"]) part = urlparse(_redirect_uri) if part.fragment: raise URIError("Contains fragment") (_base, _query) = splitquery(_redirect_uri) if _query: _query = parse_qs(_query) match = False for regbase, rquery in self.cdb[str(areq["client_id"])][ "redirect_uris"]: # The URI MUST exactly match one of the Redirection URI if _base == regbase: # every registered query component must exist in the # redirect_uri if rquery: for key, vals in rquery.items(): assert key in _query for val in vals: assert val in _query[key] # and vice versa, every query component in the redirect_uri # must be registered if _query: if rquery is None: raise ValueError for key, vals in _query.items(): assert key in rquery for val in vals: assert val in rquery[key] match = True break if not match: raise RedirectURIError("Doesn't match any registered uris") # ignore query components that are not registered return None except Exception: logger.error("Faulty redirect_uri: %s" % areq["redirect_uri"]) try: _cinfo = self.cdb[str(areq["client_id"])] except KeyError: try: cid = areq["client_id"] except KeyError: logger.error('No client id found') raise UnknownClient('No client_id provided') else: logger.info("Unknown client: %s" % cid) raise UnknownClient(areq["client_id"]) else: logger.info("Registered redirect_uris: %s" % sanitize(_cinfo)) raise RedirectURIError( "Faulty redirect_uri: %s" % areq["redirect_uri"])
def _verify_redirect_uri(self, areq): """ Verify that redirect_uri is valid. MUST NOT contain a fragment MAY contain query component :return: An error response if the redirect URI is faulty otherwise None """ try: _redirect_uri = unquote(areq["redirect_uri"]) part = urlparse(_redirect_uri) if part.fragment: raise URIError("Contains fragment") (_base, _query) = splitquery(_redirect_uri) if _query: _query = parse_qs(_query) match = False for regbase, rquery in self.cdb[str( areq["client_id"])]["redirect_uris"]: # The URI MUST exactly match one of the Redirection URI if _base != regbase: continue if not rquery and not _query: match = True break if not rquery or not _query: continue # every registered query component must exist in the # redirect_uri is_match_query = True for key, vals in _query.items(): if key not in rquery: is_match_query = False break for val in vals: if val not in rquery[key]: is_match_query = False break if not is_match_query: break if not is_match_query: continue match = True break if not match: raise RedirectURIError("Doesn't match any registered uris") # ignore query components that are not registered return None except Exception: logger.error("Faulty redirect_uri: %s" % areq["redirect_uri"]) try: _cinfo = self.cdb[str(areq["client_id"])] except KeyError: try: cid = areq["client_id"] except KeyError: logger.error("No client id found") raise UnknownClient("No client_id provided") else: logger.info("Unknown client: %s" % cid) raise UnknownClient(areq["client_id"]) else: logger.info("Registered redirect_uris: %s" % sanitize(_cinfo)) raise RedirectURIError("Faulty redirect_uri: %s" % areq["redirect_uri"])