Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions oauth2app/authorize.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@


import simplejson as json
from django.http import absolute_http_url_re, HttpResponse, HttpResponseRedirect, HttpResponseBadRequest
from urllib import urlencode

from django.http import absolute_http_url_re, HttpResponse, HttpResponseRedirect, HttpResponseBadRequest
from django.core.exceptions import SuspiciousOperation

from .consts import ACCESS_TOKEN_EXPIRATION, REFRESHABLE
from .consts import CODE, TOKEN, CODE_AND_TOKEN
from .consts import AUTHENTICATION_METHOD, MAC, BEARER, MAC_KEY_LENGTH
from .consts import REDIRECT_CLASS
from .exceptions import OAuth2Exception
from .lib.uri import add_parameters, add_fragments, normalize
from .models import Client, AccessRange, Code, AccessToken, KeyGenerator
Expand Down Expand Up @@ -195,7 +199,9 @@ def _validate(self):
if self.authorized_response_type & RESPONSE_TYPES[self.response_type] == 0:
raise UnauthorizedClient("Response type %s not allowed." %
self.response_type)
if not absolute_http_url_re.match(self.redirect_uri):
try:
REDIRECT_CLASS(self.redirect_uri)
except SuspiciousOperation:
raise InvalidRequest('Absolute URI required for redirect_uri')
# Scope
if self.authorized_scope is not None and self.scope is None:
Expand All @@ -217,7 +223,7 @@ def _check_redirect_uri(self):
if self.redirect_uri is None:
raise MissingRedirectURI('No redirect_uri to send response.')
if not absolute_http_url_re.match(self.redirect_uri):
raise MissingRedirectURI('Absolute redirect_uri required.')
raise MissingRedirectURI('Absolute redirect_uri required.')

def error_redirect(self):
"""In the event of an error, return a Django HttpResponseRedirect
Expand Down Expand Up @@ -313,7 +319,7 @@ def grant_redirect(self):
parameters['state'] = self.state
redirect_uri = add_parameters(self.redirect_uri, parameters)
redirect_uri = add_fragments(redirect_uri, fragments)
return HttpResponseRedirect(redirect_uri)
return REDIRECT_CLASS(redirect_uri)
else:
raise UnauthenticatedUser("Django user object associated with the "
"request is not authenticated.")
16 changes: 15 additions & 1 deletion oauth2app/consts.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@

"""OAuth 2.0 Default Values."""

import sys

from django.conf import settings
from django.http import HttpResponseRedirect

from .exceptions import OAuth2Exception


Expand Down Expand Up @@ -51,4 +54,15 @@
# Grants code style parameters.
CODE = 2
# Grants both style parameters.
CODE_AND_TOKEN = CODE | TOKEN
CODE_AND_TOKEN = CODE | TOKEN
# redirect_class
REDIRECT_CLASS = getattr(settings, "OAUTH2_REDIRECT_CLASS", HttpResponseRedirect)
if isinstance(REDIRECT_CLASS, basestring):
pos = REDIRECT_CLASS.rfind('.')
module_name = REDIRECT_CLASS[:pos]
cls_name = REDIRECT_CLASS[pos+1:]

__import__(module_name, {}, {}, [])
module = sys.modules[module_name]

REDIRECT_CLASS = getattr(module, cls_name)
20 changes: 13 additions & 7 deletions oauth2app/lib/uri.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"""OAuth 2.0 URI Helper Functions"""


from urlparse import urlparse, urlunparse, parse_qsl
from urlparse import urlparse, urlunparse, parse_qsl, uses_netloc
from urllib import urlencode
from url_normalize import url_normalize

Expand All @@ -19,9 +19,12 @@ def add_parameters(url, parameters):

*Returns str*"""
parts = list(urlparse(url))
parts[4] = urlencode(parse_qsl(parts[4]) + parameters.items())
return urlunparse(parts)

if parts[0] in uses_netloc:
parts[4] = urlencode(parse_qsl(parts[4]) + parameters.items())
return urlunparse(parts)
else:
return '%s?%s' % (url, urlencode(parse_qsl(parts[4]) + parameters.items()))


def add_fragments(url, fragments):
"""Parses URL and appends fragments.
Expand All @@ -33,9 +36,12 @@ def add_fragments(url, fragments):

*Returns str*"""
parts = list(urlparse(url))
parts[5] = urlencode(parse_qsl(parts[5]) + fragments.items())
return urlunparse(parts)

if parts[0] in uses_netloc:
parts[5] = urlencode(parse_qsl(parts[5]) + fragments.items())
return urlunparse(parts)
else:
return '%s#%s' % (url, urlencode(parse_qsl(parts[5]) + fragments.items()))


def normalize(url):
"""Normalizes URL.
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

packages = find_packages(),

install_requires = ['Django>=1.2.3', 'simplejson>=2.1.5', "django-uni-form>=0.8.0"],
install_requires = ['Django>=1.2.3', 'simplejson>=2.1.5'],
include_package_data = True,

# metadata for upload to PyPI
Expand Down