summaryrefslogtreecommitdiff
path: root/oauthlib
diff options
context:
space:
mode:
Diffstat (limited to 'oauthlib')
-rw-r--r--oauthlib/common.py76
-rw-r--r--oauthlib/oauth1/__init__.py2
-rw-r--r--oauthlib/oauth1/rfc5849/__init__.py27
-rw-r--r--oauthlib/oauth1/rfc5849/endpoints/__init__.py2
-rw-r--r--oauthlib/oauth1/rfc5849/endpoints/access_token.py2
-rw-r--r--oauthlib/oauth1/rfc5849/endpoints/authorization.py8
-rw-r--r--oauthlib/oauth1/rfc5849/endpoints/base.py6
-rw-r--r--oauthlib/oauth1/rfc5849/endpoints/pre_configured.py2
-rw-r--r--oauthlib/oauth1/rfc5849/endpoints/request_token.py4
-rw-r--r--oauthlib/oauth1/rfc5849/endpoints/resource.py2
-rw-r--r--oauthlib/oauth1/rfc5849/endpoints/signature_only.py2
-rw-r--r--oauthlib/oauth1/rfc5849/errors.py6
-rw-r--r--oauthlib/oauth1/rfc5849/parameters.py9
-rw-r--r--oauthlib/oauth1/rfc5849/request_validator.py6
-rw-r--r--oauthlib/oauth1/rfc5849/signature.py18
-rw-r--r--oauthlib/oauth1/rfc5849/utils.py15
-rw-r--r--oauthlib/oauth2/__init__.py2
-rw-r--r--oauthlib/oauth2/rfc6749/__init__.py2
-rw-r--r--oauthlib/oauth2/rfc6749/clients/__init__.py2
-rw-r--r--oauthlib/oauth2/rfc6749/clients/backend_application.py2
-rw-r--r--oauthlib/oauth2/rfc6749/clients/base.py8
-rw-r--r--oauthlib/oauth2/rfc6749/clients/legacy_application.py4
-rw-r--r--oauthlib/oauth2/rfc6749/clients/mobile_application.py2
-rw-r--r--oauthlib/oauth2/rfc6749/clients/service_application.py4
-rw-r--r--oauthlib/oauth2/rfc6749/clients/web_application.py4
-rw-r--r--oauthlib/oauth2/rfc6749/endpoints/__init__.py2
-rw-r--r--oauthlib/oauth2/rfc6749/endpoints/authorization.py2
-rw-r--r--oauthlib/oauth2/rfc6749/endpoints/base.py4
-rw-r--r--oauthlib/oauth2/rfc6749/endpoints/introspect.py2
-rw-r--r--oauthlib/oauth2/rfc6749/endpoints/metadata.py5
-rw-r--r--oauthlib/oauth2/rfc6749/endpoints/pre_configured.py2
-rw-r--r--oauthlib/oauth2/rfc6749/endpoints/resource.py2
-rw-r--r--oauthlib/oauth2/rfc6749/endpoints/revocation.py4
-rw-r--r--oauthlib/oauth2/rfc6749/endpoints/token.py2
-rw-r--r--oauthlib/oauth2/rfc6749/errors.py8
-rw-r--r--oauthlib/oauth2/rfc6749/grant_types/__init__.py2
-rw-r--r--oauthlib/oauth2/rfc6749/grant_types/authorization_code.py2
-rw-r--r--oauthlib/oauth2/rfc6749/grant_types/base.py6
-rw-r--r--oauthlib/oauth2/rfc6749/grant_types/client_credentials.py2
-rw-r--r--oauthlib/oauth2/rfc6749/grant_types/implicit.py2
-rw-r--r--oauthlib/oauth2/rfc6749/grant_types/refresh_token.py6
-rw-r--r--oauthlib/oauth2/rfc6749/grant_types/resource_owner_password_credentials.py2
-rw-r--r--oauthlib/oauth2/rfc6749/parameters.py20
-rw-r--r--oauthlib/oauth2/rfc6749/request_validator.py4
-rw-r--r--oauthlib/oauth2/rfc6749/tokens.py17
-rw-r--r--oauthlib/oauth2/rfc6749/utils.py25
-rw-r--r--oauthlib/openid/__init__.py2
-rw-r--r--oauthlib/openid/connect/core/endpoints/__init__.py2
-rw-r--r--oauthlib/openid/connect/core/endpoints/pre_configured.py2
-rw-r--r--oauthlib/openid/connect/core/endpoints/userinfo.py5
-rw-r--r--oauthlib/openid/connect/core/exceptions.py2
-rw-r--r--oauthlib/openid/connect/core/grant_types/__init__.py2
-rw-r--r--oauthlib/openid/connect/core/grant_types/authorization_code.py4
-rw-r--r--oauthlib/openid/connect/core/grant_types/base.py4
-rw-r--r--oauthlib/openid/connect/core/grant_types/dispatchers.py2
-rw-r--r--oauthlib/openid/connect/core/grant_types/exceptions.py2
-rw-r--r--oauthlib/openid/connect/core/grant_types/hybrid.py4
-rw-r--r--oauthlib/openid/connect/core/grant_types/implicit.py6
-rw-r--r--oauthlib/openid/connect/core/request_validator.py2
-rw-r--r--oauthlib/openid/connect/core/tokens.py3
-rw-r--r--oauthlib/signals.py4
-rw-r--r--oauthlib/uri_validate.py2
62 files changed, 102 insertions, 284 deletions
diff --git a/oauthlib/common.py b/oauthlib/common.py
index 5aeb015..e7131df 100644
--- a/oauthlib/common.py
+++ b/oauthlib/common.py
@@ -6,15 +6,16 @@ oauthlib.common
This module provides data structures and utilities common
to all implementations of OAuth.
"""
-from __future__ import absolute_import, unicode_literals
-
import collections
import datetime
import logging
import re
-import sys
import time
+import urllib.parse as urlparse
from . import get_debug
+from urllib.parse import quote as _quote
+from urllib.parse import unquote as _unquote
+from urllib.parse import urlencode as _urlencode
try:
from secrets import randbits
@@ -22,18 +23,6 @@ try:
except ImportError:
from random import getrandbits as randbits
from random import SystemRandom
-try:
- from urllib import quote as _quote
- from urllib import unquote as _unquote
- from urllib import urlencode as _urlencode
-except ImportError:
- from urllib.parse import quote as _quote
- from urllib.parse import unquote as _unquote
- from urllib.parse import urlencode as _urlencode
-try:
- import urlparse
-except ImportError:
- import urllib.parse as urlparse
UNICODE_ASCII_CHARACTER_SET = ('abcdefghijklmnopqrstuvwxyz'
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
@@ -51,17 +40,10 @@ always_safe = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
log = logging.getLogger('oauthlib')
-PY3 = sys.version_info[0] == 3
-
-if PY3:
- unicode_type = str
-else:
- unicode_type = unicode
-
# 'safe' must be bytes (Python 2.6 requires bytes, other versions allow either)
def quote(s, safe=b'/'):
- s = s.encode('utf-8') if isinstance(s, unicode_type) else s
+ s = s.encode('utf-8') if isinstance(s, str) else s
s = _quote(s, safe)
# PY3 always returns unicode. PY2 may return either, depending on whether
# it had to modify the string.
@@ -83,7 +65,7 @@ def unquote(s):
def urlencode(params):
utf8_params = encode_params_utf8(params)
urlencoded = _urlencode(utf8_params)
- if isinstance(urlencoded, unicode_type): # PY3 returns unicode
+ if isinstance(urlencoded, str):
return urlencoded
else:
return urlencoded.decode("utf-8")
@@ -96,8 +78,8 @@ def encode_params_utf8(params):
encoded = []
for k, v in params:
encoded.append((
- k.encode('utf-8') if isinstance(k, unicode_type) else k,
- v.encode('utf-8') if isinstance(v, unicode_type) else v))
+ k.encode('utf-8') if isinstance(k, str) else k,
+ v.encode('utf-8') if isinstance(v, str) else v))
return encoded
@@ -141,22 +123,6 @@ def urldecode(query):
if INVALID_HEX_PATTERN.search(query):
raise ValueError('Invalid hex encoding in query string.')
- # We encode to utf-8 prior to parsing because parse_qsl behaves
- # differently on unicode input in python 2 and 3.
- # Python 2.7
- # >>> urlparse.parse_qsl(u'%E5%95%A6%E5%95%A6')
- # u'\xe5\x95\xa6\xe5\x95\xa6'
- # Python 2.7, non unicode input gives the same
- # >>> urlparse.parse_qsl('%E5%95%A6%E5%95%A6')
- # '\xe5\x95\xa6\xe5\x95\xa6'
- # but now we can decode it to unicode
- # >>> urlparse.parse_qsl('%E5%95%A6%E5%95%A6').decode('utf-8')
- # u'\u5566\u5566'
- # Python 3.3 however
- # >>> urllib.parse.parse_qsl(u'%E5%95%A6%E5%95%A6')
- # u'\u5566\u5566'
- query = query.encode(
- 'utf-8') if not PY3 and isinstance(query, unicode_type) else query
# We want to allow queries such as "c2" whereas urlparse.parse_qsl
# with the strict_parsing flag will not.
params = urlparse.parse_qsl(query, keep_blank_values=True)
@@ -173,7 +139,7 @@ def extract_params(raw):
empty list of parameters. Any other input will result in a return
value of None.
"""
- if isinstance(raw, (bytes, unicode_type)):
+ if isinstance(raw, (bytes, str)):
try:
params = urldecode(raw)
except ValueError:
@@ -206,7 +172,7 @@ def generate_nonce():
.. _`section 3.2.1`: https://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01#section-3.2.1
.. _`section 3.3`: https://tools.ietf.org/html/rfc5849#section-3.3
"""
- return unicode_type(unicode_type(randbits(64)) + generate_timestamp())
+ return str(str(randbits(64)) + generate_timestamp())
def generate_timestamp():
@@ -218,7 +184,7 @@ def generate_timestamp():
.. _`section 3.2.1`: https://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01#section-3.2.1
.. _`section 3.3`: https://tools.ietf.org/html/rfc5849#section-3.3
"""
- return unicode_type(int(time.time()))
+ return str(int(time.time()))
def generate_token(length=30, chars=UNICODE_ASCII_CHARACTER_SET):
@@ -305,11 +271,11 @@ def safe_string_equals(a, b):
def to_unicode(data, encoding='UTF-8'):
"""Convert a number of different types of objects to unicode."""
- if isinstance(data, unicode_type):
+ if isinstance(data, str):
return data
if isinstance(data, bytes):
- return unicode_type(data, encoding=encoding)
+ return str(data, encoding=encoding)
if hasattr(data, '__iter__'):
try:
@@ -323,7 +289,7 @@ def to_unicode(data, encoding='UTF-8'):
# We support 2.6 which lacks dict comprehensions
if hasattr(data, 'items'):
data = data.items()
- return dict(((to_unicode(k, encoding), to_unicode(v, encoding)) for k, v in data))
+ return {to_unicode(k, encoding): to_unicode(v, encoding) for k, v in data}
return data
@@ -335,7 +301,7 @@ class CaseInsensitiveDict(dict):
proxy = {}
def __init__(self, data):
- self.proxy = dict((k.lower(), k) for k in data)
+ self.proxy = {k.lower(): k for k in data}
for k in data:
self[k] = data[k]
@@ -344,27 +310,27 @@ class CaseInsensitiveDict(dict):
def __delitem__(self, k):
key = self.proxy[k.lower()]
- super(CaseInsensitiveDict, self).__delitem__(key)
+ super().__delitem__(key)
del self.proxy[k.lower()]
def __getitem__(self, k):
key = self.proxy[k.lower()]
- return super(CaseInsensitiveDict, self).__getitem__(key)
+ return super().__getitem__(key)
def get(self, k, default=None):
return self[k] if k in self else default
def __setitem__(self, k, v):
- super(CaseInsensitiveDict, self).__setitem__(k, v)
+ super().__setitem__(k, v)
self.proxy[k.lower()] = k
def update(self, *args, **kwargs):
- super(CaseInsensitiveDict, self).update(*args, **kwargs)
+ super().update(*args, **kwargs)
for k in dict(*args, **kwargs):
self.proxy[k.lower()] = k
-class Request(object):
+class Request:
"""A malleable representation of a signable HTTP request.
@@ -444,7 +410,7 @@ class Request(object):
body = SANITIZE_PATTERN.sub('\1<SANITIZED>', str(body))
if 'Authorization' in headers:
headers['Authorization'] = '<SANITIZED>'
- return '<oauthlib.Request url="%s", http_method="%s", headers="%s", body="%s">' % (
+ return '<oauthlib.Request url="{}", http_method="{}", headers="{}", body="{}">'.format(
self.uri, self.http_method, headers, body)
@property
diff --git a/oauthlib/oauth1/__init__.py b/oauthlib/oauth1/__init__.py
index dc908d4..e6d8a80 100644
--- a/oauthlib/oauth1/__init__.py
+++ b/oauthlib/oauth1/__init__.py
@@ -6,8 +6,6 @@ oauthlib.oauth1
This module is a wrapper for the most recent implementation of OAuth 1.0 Client
and Server classes.
"""
-from __future__ import absolute_import, unicode_literals
-
from .rfc5849 import Client
from .rfc5849 import SIGNATURE_HMAC, SIGNATURE_HMAC_SHA1, SIGNATURE_HMAC_SHA256, SIGNATURE_RSA, SIGNATURE_PLAINTEXT
from .rfc5849 import SIGNATURE_TYPE_AUTH_HEADER, SIGNATURE_TYPE_QUERY
diff --git a/oauthlib/oauth1/rfc5849/__init__.py b/oauthlib/oauth1/rfc5849/__init__.py
index 4f462bb..b629fc1 100644
--- a/oauthlib/oauth1/rfc5849/__init__.py
+++ b/oauthlib/oauth1/rfc5849/__init__.py
@@ -6,17 +6,12 @@ oauthlib.oauth1.rfc5849
This module is an implementation of various logic needed
for signing and checking OAuth 1.0 RFC 5849 requests.
"""
-from __future__ import absolute_import, unicode_literals
import base64
import hashlib
import logging
log = logging.getLogger(__name__)
-import sys
-try:
- import urlparse
-except ImportError:
- import urllib.parse as urlparse
+import urllib.parse as urlparse
from oauthlib.common import Request, urlencode, generate_nonce
from oauthlib.common import generate_timestamp, to_unicode
@@ -36,7 +31,7 @@ SIGNATURE_TYPE_BODY = 'BODY'
CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded'
-class Client(object):
+class Client:
"""A client used to sign OAuth 1.0 RFC 5849 requests."""
SIGNATURE_METHODS = {
@@ -106,8 +101,8 @@ class Client(object):
attrs['rsa_key'] = '****' if attrs['rsa_key'] else None
attrs[
'resource_owner_secret'] = '****' if attrs['resource_owner_secret'] else None
- attribute_str = ', '.join('%s=%s' % (k, v) for k, v in attrs.items())
- return '<%s %s>' % (self.__class__.__name__, attribute_str)
+ attribute_str = ', '.join('{}={}'.format(k, v) for k, v in attrs.items())
+ return '<{} {}>'.format(self.__class__.__name__, attribute_str)
def get_oauth_signature(self, request):
"""Get an OAuth signature to be used in signing a request
@@ -130,24 +125,24 @@ class Client(object):
uri_query=urlparse.urlparse(uri).query,
body=body,
headers=headers)
- log.debug("Collected params: {0}".format(collected_params))
+ log.debug("Collected params: {}".format(collected_params))
normalized_params = signature.normalize_parameters(collected_params)
normalized_uri = signature.base_string_uri(uri, headers.get('Host', None))
- log.debug("Normalized params: {0}".format(normalized_params))
- log.debug("Normalized URI: {0}".format(normalized_uri))
+ log.debug("Normalized params: {}".format(normalized_params))
+ log.debug("Normalized URI: {}".format(normalized_uri))
base_string = signature.signature_base_string(request.http_method,
normalized_uri, normalized_params)
- log.debug("Signing: signature base string: {0}".format(base_string))
+ log.debug("Signing: signature base string: {}".format(base_string))
if self.signature_method not in self.SIGNATURE_METHODS:
raise ValueError('Invalid signature method.')
sig = self.SIGNATURE_METHODS[self.signature_method](base_string, self)
- log.debug("Signature: {0}".format(sig))
+ log.debug("Signature: {}".format(sig))
return sig
def get_oauth_params(self, request):
@@ -278,8 +273,8 @@ class Client(object):
# header field set to "application/x-www-form-urlencoded".
elif not should_have_params and has_params:
raise ValueError(
- "Body contains parameters but Content-Type header was {0} "
- "instead of {1}".format(content_type or "not set",
+ "Body contains parameters but Content-Type header was {} "
+ "instead of {}".format(content_type or "not set",
CONTENT_TYPE_FORM_URLENCODED))
# 3.5.2. Form-Encoded Body
diff --git a/oauthlib/oauth1/rfc5849/endpoints/__init__.py b/oauthlib/oauth1/rfc5849/endpoints/__init__.py
index b16ccba..78ade72 100644
--- a/oauthlib/oauth1/rfc5849/endpoints/__init__.py
+++ b/oauthlib/oauth1/rfc5849/endpoints/__init__.py
@@ -1,5 +1,3 @@
-from __future__ import absolute_import
-
from .base import BaseEndpoint
from .request_token import RequestTokenEndpoint
from .authorization import AuthorizationEndpoint
diff --git a/oauthlib/oauth1/rfc5849/endpoints/access_token.py b/oauthlib/oauth1/rfc5849/endpoints/access_token.py
index bea8274..13665db 100644
--- a/oauthlib/oauth1/rfc5849/endpoints/access_token.py
+++ b/oauthlib/oauth1/rfc5849/endpoints/access_token.py
@@ -8,8 +8,6 @@ OAuth 1.0 RFC 5849. It validates the correctness of access token requests,
creates and persists tokens as well as create the proper response to be
returned to the client.
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from oauthlib.common import urlencode
diff --git a/oauthlib/oauth1/rfc5849/endpoints/authorization.py b/oauthlib/oauth1/rfc5849/endpoints/authorization.py
index b465946..7d0353b 100644
--- a/oauthlib/oauth1/rfc5849/endpoints/authorization.py
+++ b/oauthlib/oauth1/rfc5849/endpoints/authorization.py
@@ -6,17 +6,11 @@ oauthlib.oauth1.rfc5849.endpoints.authorization
This module is an implementation of various logic needed
for signing and checking OAuth 1.0 RFC 5849 requests.
"""
-from __future__ import absolute_import, unicode_literals
-
from oauthlib.common import Request, add_params_to_uri
from .. import errors
from .base import BaseEndpoint
-
-try:
- from urllib import urlencode
-except ImportError:
- from urllib.parse import urlencode
+from urllib.parse import urlencode
class AuthorizationEndpoint(BaseEndpoint):
diff --git a/oauthlib/oauth1/rfc5849/endpoints/base.py b/oauthlib/oauth1/rfc5849/endpoints/base.py
index f005256..f9a8f57 100644
--- a/oauthlib/oauth1/rfc5849/endpoints/base.py
+++ b/oauthlib/oauth1/rfc5849/endpoints/base.py
@@ -6,8 +6,6 @@ oauthlib.oauth1.rfc5849.endpoints.base
This module is an implementation of various logic needed
for signing and checking OAuth 1.0 RFC 5849 requests.
"""
-from __future__ import absolute_import, unicode_literals
-
import time
from oauthlib.common import CaseInsensitiveDict, Request, generate_token
@@ -17,7 +15,7 @@ from .. import (CONTENT_TYPE_FORM_URLENCODED, SIGNATURE_HMAC_SHA1, SIGNATURE_HMA
SIGNATURE_TYPE_QUERY, errors, signature, utils)
-class BaseEndpoint(object):
+class BaseEndpoint:
def __init__(self, request_validator, token_generator=None):
self.request_validator = request_validator
@@ -131,7 +129,7 @@ class BaseEndpoint(object):
if (not request.signature_method in
self.request_validator.allowed_signature_methods):
raise errors.InvalidSignatureMethodError(
- description="Invalid signature, %s not in %r." % (
+ description="Invalid signature, {} not in {!r}.".format(
request.signature_method,
self.request_validator.allowed_signature_methods))
diff --git a/oauthlib/oauth1/rfc5849/endpoints/pre_configured.py b/oauthlib/oauth1/rfc5849/endpoints/pre_configured.py
index f89393a..b14a6d8 100644
--- a/oauthlib/oauth1/rfc5849/endpoints/pre_configured.py
+++ b/oauthlib/oauth1/rfc5849/endpoints/pre_configured.py
@@ -1,5 +1,3 @@
-from __future__ import absolute_import, unicode_literals
-
from . import (AccessTokenEndpoint, AuthorizationEndpoint,
RequestTokenEndpoint, ResourceEndpoint)
diff --git a/oauthlib/oauth1/rfc5849/endpoints/request_token.py b/oauthlib/oauth1/rfc5849/endpoints/request_token.py
index e9ca331..bb67e71 100644
--- a/oauthlib/oauth1/rfc5849/endpoints/request_token.py
+++ b/oauthlib/oauth1/rfc5849/endpoints/request_token.py
@@ -8,8 +8,6 @@ OAuth 1.0 RFC 5849. It validates the correctness of request token requests,
creates and persists tokens as well as create the proper response to be
returned to the client.
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from oauthlib.common import urlencode
@@ -129,7 +127,7 @@ class RequestTokenEndpoint(BaseEndpoint):
request.client_key, request)
if not self.request_validator.check_realms(request.realms):
raise errors.InvalidRequestError(
- description='Invalid realm %s. Allowed are %r.' % (
+ description='Invalid realm {}. Allowed are {!r}.'.format(
request.realms, self.request_validator.realms))
if not request.redirect_uri:
diff --git a/oauthlib/oauth1/rfc5849/endpoints/resource.py b/oauthlib/oauth1/rfc5849/endpoints/resource.py
index f82e8b1..45bdaaa 100644
--- a/oauthlib/oauth1/rfc5849/endpoints/resource.py
+++ b/oauthlib/oauth1/rfc5849/endpoints/resource.py
@@ -6,8 +6,6 @@ oauthlib.oauth1.rfc5849.endpoints.resource
This module is an implementation of the resource protection provider logic of
OAuth 1.0 RFC 5849.
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from .. import errors
diff --git a/oauthlib/oauth1/rfc5849/endpoints/signature_only.py b/oauthlib/oauth1/rfc5849/endpoints/signature_only.py
index 4297770..d693ccb 100644
--- a/oauthlib/oauth1/rfc5849/endpoints/signature_only.py
+++ b/oauthlib/oauth1/rfc5849/endpoints/signature_only.py
@@ -6,8 +6,6 @@ oauthlib.oauth1.rfc5849.endpoints.signature_only
This module is an implementation of the signing logic of OAuth 1.0 RFC 5849.
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from .. import errors
diff --git a/oauthlib/oauth1/rfc5849/errors.py b/oauthlib/oauth1/rfc5849/errors.py
index a5c59bd..98d327f 100644
--- a/oauthlib/oauth1/rfc5849/errors.py
+++ b/oauthlib/oauth1/rfc5849/errors.py
@@ -6,8 +6,6 @@ oauthlib.oauth1.rfc5849.errors
Error used both by OAuth 1 clients and provicers to represent the spec
defined error responses for all four core grant types.
"""
-from __future__ import unicode_literals
-
from oauthlib.common import add_params_to_uri, urlencode
@@ -37,10 +35,10 @@ class OAuth1Error(Exception):
request: Oauthlib Request object
"""
self.description = description or self.description
- message = '(%s) %s' % (self.error, self.description)
+ message = '({}) {}'.format(self.error, self.description)
if request:
message += ' ' + repr(request)
- super(OAuth1Error, self).__init__(message)
+ super().__init__(message)
self.uri = uri
self.status_code = status_code
diff --git a/oauthlib/oauth1/rfc5849/parameters.py b/oauthlib/oauth1/rfc5849/parameters.py
index db4400e..778a46d 100644
--- a/oauthlib/oauth1/rfc5849/parameters.py
+++ b/oauthlib/oauth1/rfc5849/parameters.py
@@ -7,16 +7,11 @@ This module contains methods related to `section 3.5`_ of the OAuth 1.0a spec.
.. _`section 3.5`: https://tools.ietf.org/html/rfc5849#section-3.5
"""
-from __future__ import absolute_import, unicode_literals
-
from oauthlib.common import extract_params, urlencode
from . import utils
-try:
- from urlparse import urlparse, urlunparse
-except ImportError: # noqa
- from urllib.parse import urlparse, urlunparse
+from urllib.parse import urlparse, urlunparse
# TODO: do we need filter_params now that oauth_params are handled by Request?
@@ -61,7 +56,7 @@ def prepare_headers(oauth_params, headers=None, realm=None):
# 2. Each parameter's name is immediately followed by an "=" character
# (ASCII code 61), a """ character (ASCII code 34), the parameter
# value (MAY be empty), and another """ character (ASCII code 34).
- part = '{0}="{1}"'.format(escaped_name, escaped_value)
+ part = '{}="{}"'.format(escaped_name, escaped_value)
authorization_header_parameters_parts.append(part)
diff --git a/oauthlib/oauth1/rfc5849/request_validator.py b/oauthlib/oauth1/rfc5849/request_validator.py
index 330bcbb..657bfe3 100644
--- a/oauthlib/oauth1/rfc5849/request_validator.py
+++ b/oauthlib/oauth1/rfc5849/request_validator.py
@@ -6,14 +6,12 @@ oauthlib.oauth1.rfc5849
This module is an implementation of various logic needed
for signing and checking OAuth 1.0 RFC 5849 requests.
"""
-from __future__ import absolute_import, unicode_literals
-
import sys
from . import SIGNATURE_METHODS, utils
-class RequestValidator(object):
+class RequestValidator:
"""A validator/datastore interaction base class for OAuth 1 providers.
@@ -197,7 +195,7 @@ class RequestValidator(object):
def check_realms(self, realms):
"""Check that the realm is one of a set allowed realms."""
- return all((r in self.realms for r in realms))
+ return all(r in self.realms for r in realms)
def _subclass_must_implement(self, fn):
"""
diff --git a/oauthlib/oauth1/rfc5849/signature.py b/oauthlib/oauth1/rfc5849/signature.py
index 243a586..fdc359e 100644
--- a/oauthlib/oauth1/rfc5849/signature.py
+++ b/oauthlib/oauth1/rfc5849/signature.py
@@ -21,22 +21,16 @@ Steps for signing a request:
.. _`section 3.4`: https://tools.ietf.org/html/rfc5849#section-3.4
"""
-from __future__ import absolute_import, unicode_literals
-
import binascii
import hashlib
import hmac
import logging
-from oauthlib.common import (extract_params, safe_string_equals,
- unicode_type, urldecode)
+from oauthlib.common import extract_params, safe_string_equals, urldecode
+import urllib.parse as urlparse
from . import utils
-try:
- import urlparse
-except ImportError:
- import urllib.parse as urlparse
log = logging.getLogger(__name__)
@@ -128,7 +122,7 @@ def base_string_uri(uri, host=None):
The host argument overrides the netloc part of the uri argument.
"""
- if not isinstance(uri, unicode_type):
+ if not isinstance(uri, str):
raise ValueError('uri must be a unicode object.')
# FIXME: urlparse does not support unicode
@@ -301,7 +295,7 @@ def collect_parameters(uri_query='', body=[], headers=None,
#
# .. _`Section 3.5.1`: https://tools.ietf.org/html/rfc5849#section-3.5.1
if headers:
- headers_lower = dict((k.lower(), v) for k, v in headers.items())
+ headers_lower = {k.lower(): v for k, v in headers.items()}
authorization_header = headers_lower.get('authorization')
if authorization_header is not None:
params.extend([i for i in utils.parse_authorization_header(
@@ -430,7 +424,7 @@ def normalize_parameters(params):
# 3. The name of each parameter is concatenated to its corresponding
# value using an "=" character (ASCII code 61) as a separator, even
# if the value is empty.
- parameter_parts = ['{0}={1}'.format(k, v) for k, v in key_values]
+ parameter_parts = ['{}={}'.format(k, v) for k, v in key_values]
# 4. The sorted name/value pairs are concatenated together into a
# single string by using an "&" character (ASCII code 38) as
@@ -577,7 +571,7 @@ def sign_rsa_sha1(base_string, rsa_private_key):
.. _`RFC3447, Section 8.2`: https://tools.ietf.org/html/rfc3447#section-8.2
"""
- if isinstance(base_string, unicode_type):
+ if isinstance(base_string, str):
base_string = base_string.encode('utf-8')
# TODO: finish RSA documentation
alg = _jwt_rs1_signing_algorithm()
diff --git a/oauthlib/oauth1/rfc5849/utils.py b/oauthlib/oauth1/rfc5849/utils.py
index 735f21d..28e006a 100644
--- a/oauthlib/oauth1/rfc5849/utils.py
+++ b/oauthlib/oauth1/rfc5849/utils.py
@@ -6,14 +6,9 @@ oauthlib.utils
This module contains utility methods used by various parts of the OAuth
spec.
"""
-from __future__ import absolute_import, unicode_literals
+from oauthlib.common import quote, unquote
-from oauthlib.common import quote, unicode_type, unquote
-
-try:
- import urllib2
-except ImportError:
- import urllib.request as urllib2
+import urllib.request as urllib2
UNICODE_ASCII_CHARACTER_SET = ('abcdefghijklmnopqrstuvwxyz'
@@ -52,16 +47,16 @@ def escape(u):
.. _`section 3.6`: https://tools.ietf.org/html/rfc5849#section-3.6
"""
- if not isinstance(u, unicode_type):
+ if not isinstance(u, str):
raise ValueError('Only unicode objects are escapable. ' +
- 'Got %r of type %s.' % (u, type(u)))
+ 'Got {!r} of type {}.'.format(u, type(u)))
# Letters, digits, and the characters '_.-' are already treated as safe
# by urllib.quote(). We need to add '~' to fully support rfc5849.
return quote(u, safe=b'~')
def unescape(u):
- if not isinstance(u, unicode_type):
+ if not isinstance(u, str):
raise ValueError('Only unicode objects are unescapable.')
return unquote(u)
diff --git a/oauthlib/oauth2/__init__.py b/oauthlib/oauth2/__init__.py
index 3f43755..9186800 100644
--- a/oauthlib/oauth2/__init__.py
+++ b/oauthlib/oauth2/__init__.py
@@ -6,8 +6,6 @@ oauthlib.oauth2
This module is a wrapper for the most recent implementation of OAuth 2.0 Client
and Server classes.
"""
-from __future__ import absolute_import, unicode_literals
-
from .rfc6749.clients import Client
from .rfc6749.clients import WebApplicationClient
from .rfc6749.clients import MobileApplicationClient
diff --git a/oauthlib/oauth2/rfc6749/__init__.py b/oauthlib/oauth2/rfc6749/__init__.py
index 1a4128c..1c11234 100644
--- a/oauthlib/oauth2/rfc6749/__init__.py
+++ b/oauthlib/oauth2/rfc6749/__init__.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749
This module is an implementation of various logic needed
for consuming and providing OAuth 2.0 RFC6749.
"""
-from __future__ import absolute_import, unicode_literals
-
import functools
import logging
diff --git a/oauthlib/oauth2/rfc6749/clients/__init__.py b/oauthlib/oauth2/rfc6749/clients/__init__.py
index 17d0023..6fef738 100644
--- a/oauthlib/oauth2/rfc6749/clients/__init__.py
+++ b/oauthlib/oauth2/rfc6749/clients/__init__.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749
This module is an implementation of various logic needed
for consuming OAuth 2.0 RFC6749.
"""
-from __future__ import absolute_import, unicode_literals
-
from .base import Client, AUTH_HEADER, URI_QUERY, BODY
from .web_application import WebApplicationClient
from .mobile_application import MobileApplicationClient
diff --git a/oauthlib/oauth2/rfc6749/clients/backend_application.py b/oauthlib/oauth2/rfc6749/clients/backend_application.py
index 5737814..5ffe6ae 100644
--- a/oauthlib/oauth2/rfc6749/clients/backend_application.py
+++ b/oauthlib/oauth2/rfc6749/clients/backend_application.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749
This module is an implementation of various logic needed
for consuming and providing OAuth 2.0 RFC6749.
"""
-from __future__ import absolute_import, unicode_literals
-
from ..parameters import parse_token_response, prepare_token_request
from .base import Client
diff --git a/oauthlib/oauth2/rfc6749/clients/base.py b/oauthlib/oauth2/rfc6749/clients/base.py
index 9b05ad5..04dabe6 100644
--- a/oauthlib/oauth2/rfc6749/clients/base.py
+++ b/oauthlib/oauth2/rfc6749/clients/base.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749
This module is an implementation of various logic needed
for consuming OAuth 2.0 RFC6749.
"""
-from __future__ import absolute_import, unicode_literals
-
import time
import warnings
@@ -29,7 +27,7 @@ FORM_ENC_HEADERS = {
}
-class Client(object):
+class Client:
"""Base OAuth2 client responsible for access token management.
This class also acts as a generic interface providing methods common to all
@@ -186,8 +184,8 @@ class Client(object):
token_placement = token_placement or self.default_token_placement
- case_insensitive_token_types = dict(
- (k.lower(), v) for k, v in self.token_types.items())
+ case_insensitive_token_types = {
+ k.lower(): v for k, v in self.token_types.items()}
if not self.token_type.lower() in case_insensitive_token_types:
raise ValueError("Unsupported token type: %s" % self.token_type)
diff --git a/oauthlib/oauth2/rfc6749/clients/legacy_application.py b/oauthlib/oauth2/rfc6749/clients/legacy_application.py
index ca218e4..1bb0e14 100644
--- a/oauthlib/oauth2/rfc6749/clients/legacy_application.py
+++ b/oauthlib/oauth2/rfc6749/clients/legacy_application.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749
This module is an implementation of various logic needed
for consuming and providing OAuth 2.0 RFC6749.
"""
-from __future__ import absolute_import, unicode_literals
-
from ..parameters import parse_token_response, prepare_token_request
from .base import Client
@@ -38,7 +36,7 @@ class LegacyApplicationClient(Client):
grant_type = 'password'
def __init__(self, client_id, **kwargs):
- super(LegacyApplicationClient, self).__init__(client_id, **kwargs)
+ super().__init__(client_id, **kwargs)
def prepare_request_body(self, username, password, body='', scope=None,
include_client_id=False, **kwargs):
diff --git a/oauthlib/oauth2/rfc6749/clients/mobile_application.py b/oauthlib/oauth2/rfc6749/clients/mobile_application.py
index 11c6c51..73627c4 100644
--- a/oauthlib/oauth2/rfc6749/clients/mobile_application.py
+++ b/oauthlib/oauth2/rfc6749/clients/mobile_application.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749
This module is an implementation of various logic needed
for consuming and providing OAuth 2.0 RFC6749.
"""
-from __future__ import absolute_import, unicode_literals
-
from ..parameters import parse_implicit_response, prepare_grant_uri
from .base import Client
diff --git a/oauthlib/oauth2/rfc6749/clients/service_application.py b/oauthlib/oauth2/rfc6749/clients/service_application.py
index ea946ce..09fc7ba 100644
--- a/oauthlib/oauth2/rfc6749/clients/service_application.py
+++ b/oauthlib/oauth2/rfc6749/clients/service_application.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749
This module is an implementation of various logic needed
for consuming and providing OAuth 2.0 RFC6749.
"""
-from __future__ import absolute_import, unicode_literals
-
import time
from oauthlib.common import to_unicode
@@ -57,7 +55,7 @@ class ServiceApplicationClient(Client):
state and token. See ``Client.__init__.__doc__`` for
details.
"""
- super(ServiceApplicationClient, self).__init__(client_id, **kwargs)
+ super().__init__(client_id, **kwargs)
self.private_key = private_key
self.subject = subject
self.issuer = issuer
diff --git a/oauthlib/oauth2/rfc6749/clients/web_application.py b/oauthlib/oauth2/rfc6749/clients/web_application.py
index 0cd39ce..aedc9d1 100644
--- a/oauthlib/oauth2/rfc6749/clients/web_application.py
+++ b/oauthlib/oauth2/rfc6749/clients/web_application.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749
This module is an implementation of various logic needed
for consuming and providing OAuth 2.0 RFC6749.
"""
-from __future__ import absolute_import, unicode_literals
-
import warnings
from ..parameters import (parse_authorization_code_response,
@@ -38,7 +36,7 @@ class WebApplicationClient(Client):
grant_type = 'authorization_code'
def __init__(self, client_id, code=None, **kwargs):
- super(WebApplicationClient, self).__init__(client_id, **kwargs)
+ super().__init__(client_id, **kwargs)
self.code = code
def prepare_request_uri(self, uri, redirect_uri=None, scope=None,
diff --git a/oauthlib/oauth2/rfc6749/endpoints/__init__.py b/oauthlib/oauth2/rfc6749/endpoints/__init__.py
index 51e173d..49e7ee9 100644
--- a/oauthlib/oauth2/rfc6749/endpoints/__init__.py
+++ b/oauthlib/oauth2/rfc6749/endpoints/__init__.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749
This module is an implementation of various logic needed
for consuming and providing OAuth 2.0 RFC6749.
"""
-from __future__ import absolute_import, unicode_literals
-
from .authorization import AuthorizationEndpoint
from .introspect import IntrospectEndpoint
from .metadata import MetadataEndpoint
diff --git a/oauthlib/oauth2/rfc6749/endpoints/authorization.py b/oauthlib/oauth2/rfc6749/endpoints/authorization.py
index 92cde34..fd77f46 100644
--- a/oauthlib/oauth2/rfc6749/endpoints/authorization.py
+++ b/oauthlib/oauth2/rfc6749/endpoints/authorization.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749
This module is an implementation of various logic needed
for consuming and providing OAuth 2.0 RFC6749.
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from oauthlib.common import Request
diff --git a/oauthlib/oauth2/rfc6749/endpoints/base.py b/oauthlib/oauth2/rfc6749/endpoints/base.py
index e39232f..5169517 100644
--- a/oauthlib/oauth2/rfc6749/endpoints/base.py
+++ b/oauthlib/oauth2/rfc6749/endpoints/base.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749
This module is an implementation of various logic needed
for consuming and providing OAuth 2.0 RFC6749.
"""
-from __future__ import absolute_import, unicode_literals
-
import functools
import logging
@@ -20,7 +18,7 @@ from oauthlib.common import CaseInsensitiveDict, urldecode
log = logging.getLogger(__name__)
-class BaseEndpoint(object):
+class BaseEndpoint:
def __init__(self):
self._available = True
diff --git a/oauthlib/oauth2/rfc6749/endpoints/introspect.py b/oauthlib/oauth2/rfc6749/endpoints/introspect.py
index 4accbdc..bad8950 100644
--- a/oauthlib/oauth2/rfc6749/endpoints/introspect.py
+++ b/oauthlib/oauth2/rfc6749/endpoints/introspect.py
@@ -7,8 +7,6 @@ An implementation of the OAuth 2.0 `Token Introspection`.
.. _`Token Introspection`: https://tools.ietf.org/html/rfc7662
"""
-from __future__ import absolute_import, unicode_literals
-
import json
import logging
diff --git a/oauthlib/oauth2/rfc6749/endpoints/metadata.py b/oauthlib/oauth2/rfc6749/endpoints/metadata.py
index 936e878..6bc078d 100644
--- a/oauthlib/oauth2/rfc6749/endpoints/metadata.py
+++ b/oauthlib/oauth2/rfc6749/endpoints/metadata.py
@@ -7,13 +7,10 @@ An implementation of the `OAuth 2.0 Authorization Server Metadata`.
.. _`OAuth 2.0 Authorization Server Metadata`: https://tools.ietf.org/html/rfc8414
"""
-from __future__ import absolute_import, unicode_literals
-
import copy
import json
import logging
-from ....common import unicode_type
from .base import BaseEndpoint, catch_errors_and_unavailability
from .authorization import AuthorizationEndpoint
from .introspect import IntrospectEndpoint
@@ -85,7 +82,7 @@ class MetadataEndpoint(BaseEndpoint):
if not isinstance(array[key], list):
raise ValueError("key {}: {} must be an Array".format(key, array[key]))
for elem in array[key]:
- if not isinstance(elem, unicode_type):
+ if not isinstance(elem, str):
raise ValueError("array {}: {} must contains only string (not {})".format(key, array[key], elem))
def validate_metadata_token(self, claims, endpoint):
diff --git a/oauthlib/oauth2/rfc6749/endpoints/pre_configured.py b/oauthlib/oauth2/rfc6749/endpoints/pre_configured.py
index e2cc9db..1855973 100644
--- a/oauthlib/oauth2/rfc6749/endpoints/pre_configured.py
+++ b/oauthlib/oauth2/rfc6749/endpoints/pre_configured.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749.endpoints.pre_configured
This module is an implementation of various endpoints needed
for providing OAuth 2.0 RFC6749 servers.
"""
-from __future__ import absolute_import, unicode_literals
-
from ..grant_types import (AuthorizationCodeGrant,
ClientCredentialsGrant,
ImplicitGrant,
diff --git a/oauthlib/oauth2/rfc6749/endpoints/resource.py b/oauthlib/oauth2/rfc6749/endpoints/resource.py
index f19c60c..76e57b1 100644
--- a/oauthlib/oauth2/rfc6749/endpoints/resource.py
+++ b/oauthlib/oauth2/rfc6749/endpoints/resource.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749
This module is an implementation of various logic needed
for consuming and providing OAuth 2.0 RFC6749.
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from oauthlib.common import Request
diff --git a/oauthlib/oauth2/rfc6749/endpoints/revocation.py b/oauthlib/oauth2/rfc6749/endpoints/revocation.py
index 1fabd03..ed245f3 100644
--- a/oauthlib/oauth2/rfc6749/endpoints/revocation.py
+++ b/oauthlib/oauth2/rfc6749/endpoints/revocation.py
@@ -7,8 +7,6 @@ An implementation of the OAuth 2 `Token Revocation`_ spec (draft 11).
.. _`Token Revocation`: https://tools.ietf.org/html/draft-ietf-oauth-revocation-11
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from oauthlib.common import Request
@@ -73,7 +71,7 @@ class RevocationEndpoint(BaseEndpoint):
log.debug('Client error during validation of %r. %r.', request, e)
response_body = e.json
if self.enable_jsonp and request.callback:
- response_body = '%s(%s);' % (request.callback, response_body)
+ response_body = '{}({});'.format(request.callback, response_body)
resp_headers.update(e.headers)
return resp_headers, response_body, e.status_code
diff --git a/oauthlib/oauth2/rfc6749/endpoints/token.py b/oauthlib/oauth2/rfc6749/endpoints/token.py
index bc87e9b..2b2d495 100644
--- a/oauthlib/oauth2/rfc6749/endpoints/token.py
+++ b/oauthlib/oauth2/rfc6749/endpoints/token.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749
This module is an implementation of various logic needed
for consuming and providing OAuth 2.0 RFC6749.
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from oauthlib.common import Request
diff --git a/oauthlib/oauth2/rfc6749/errors.py b/oauthlib/oauth2/rfc6749/errors.py
index d2a1402..9896303 100644
--- a/oauthlib/oauth2/rfc6749/errors.py
+++ b/oauthlib/oauth2/rfc6749/errors.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749.errors
Error used both by OAuth 2 clients and providers to represent the spec
defined error responses for all four core grant types.
"""
-from __future__ import unicode_literals
-
import json
from oauthlib.common import add_params_to_uri, urlencode
@@ -45,10 +43,10 @@ class OAuth2Error(Exception):
if description is not None:
self.description = description
- message = '(%s) %s' % (self.error, self.description)
+ message = '({}) {}'.format(self.error, self.description)
if request:
message += ' ' + repr(request)
- super(OAuth2Error, self).__init__(message)
+ super().__init__(message)
self.uri = uri
self.state = state
@@ -389,7 +387,7 @@ class CustomOAuth2Error(OAuth2Error):
"""
def __init__(self, error, *args, **kwargs):
self.error = error
- super(CustomOAuth2Error, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
def raise_from_error(error, params=None):
diff --git a/oauthlib/oauth2/rfc6749/grant_types/__init__.py b/oauthlib/oauth2/rfc6749/grant_types/__init__.py
index 2ec8e4f..30c90d7 100644
--- a/oauthlib/oauth2/rfc6749/grant_types/__init__.py
+++ b/oauthlib/oauth2/rfc6749/grant_types/__init__.py
@@ -3,8 +3,6 @@
oauthlib.oauth2.rfc6749.grant_types
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
-from __future__ import unicode_literals, absolute_import
-
from .authorization_code import AuthorizationCodeGrant
from .implicit import ImplicitGrant
from .resource_owner_password_credentials import ResourceOwnerPasswordCredentialsGrant
diff --git a/oauthlib/oauth2/rfc6749/grant_types/authorization_code.py b/oauthlib/oauth2/rfc6749/grant_types/authorization_code.py
index 9b84c4c..f4bde86 100644
--- a/oauthlib/oauth2/rfc6749/grant_types/authorization_code.py
+++ b/oauthlib/oauth2/rfc6749/grant_types/authorization_code.py
@@ -3,8 +3,6 @@
oauthlib.oauth2.rfc6749.grant_types
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
-from __future__ import absolute_import, unicode_literals
-
import base64
import hashlib
import json
diff --git a/oauthlib/oauth2/rfc6749/grant_types/base.py b/oauthlib/oauth2/rfc6749/grant_types/base.py
index f0772e2..66e1fd1 100644
--- a/oauthlib/oauth2/rfc6749/grant_types/base.py
+++ b/oauthlib/oauth2/rfc6749/grant_types/base.py
@@ -3,8 +3,6 @@
oauthlib.oauth2.rfc6749.grant_types
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from itertools import chain
@@ -17,7 +15,7 @@ from ..request_validator import RequestValidator
log = logging.getLogger(__name__)
-class ValidatorsContainer(object):
+class ValidatorsContainer:
"""
Container object for holding custom validator callables to be invoked
as part of the grant type `validate_authorization_request()` or
@@ -74,7 +72,7 @@ class ValidatorsContainer(object):
return chain(self.post_auth, self.post_token)
-class GrantTypeBase(object):
+class GrantTypeBase:
error_uri = None
request_validator = None
default_response_mode = 'fragment'
diff --git a/oauthlib/oauth2/rfc6749/grant_types/client_credentials.py b/oauthlib/oauth2/rfc6749/grant_types/client_credentials.py
index 7e50857..fdb0bf6 100644
--- a/oauthlib/oauth2/rfc6749/grant_types/client_credentials.py
+++ b/oauthlib/oauth2/rfc6749/grant_types/client_credentials.py
@@ -3,8 +3,6 @@
oauthlib.oauth2.rfc6749.grant_types
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
-from __future__ import absolute_import, unicode_literals
-
import json
import logging
diff --git a/oauthlib/oauth2/rfc6749/grant_types/implicit.py b/oauthlib/oauth2/rfc6749/grant_types/implicit.py
index 48bae7a..335e58c 100644
--- a/oauthlib/oauth2/rfc6749/grant_types/implicit.py
+++ b/oauthlib/oauth2/rfc6749/grant_types/implicit.py
@@ -3,8 +3,6 @@
oauthlib.oauth2.rfc6749.grant_types
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from oauthlib import common
diff --git a/oauthlib/oauth2/rfc6749/grant_types/refresh_token.py b/oauthlib/oauth2/rfc6749/grant_types/refresh_token.py
index fc61d65..e7405d2 100644
--- a/oauthlib/oauth2/rfc6749/grant_types/refresh_token.py
+++ b/oauthlib/oauth2/rfc6749/grant_types/refresh_token.py
@@ -3,8 +3,6 @@
oauthlib.oauth2.rfc6749.grant_types
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
-from __future__ import absolute_import, unicode_literals
-
import json
import logging
@@ -25,7 +23,7 @@ class RefreshTokenGrant(GrantTypeBase):
def __init__(self, request_validator=None,
issue_new_refresh_tokens=True,
**kwargs):
- super(RefreshTokenGrant, self).__init__(
+ super().__init__(
request_validator,
issue_new_refresh_tokens=issue_new_refresh_tokens,
**kwargs)
@@ -126,7 +124,7 @@ class RefreshTokenGrant(GrantTypeBase):
if request.scope:
request.scopes = utils.scope_to_list(request.scope)
- if (not all((s in original_scopes for s in request.scopes))
+ if (not all(s in original_scopes for s in request.scopes)
and not self.request_validator.is_within_original_scope(
request.scopes, request.refresh_token, request)):
log.debug('Refresh token %s lack requested scopes, %r.',
diff --git a/oauthlib/oauth2/rfc6749/grant_types/resource_owner_password_credentials.py b/oauthlib/oauth2/rfc6749/grant_types/resource_owner_password_credentials.py
index 5929afb..9c8ee1d 100644
--- a/oauthlib/oauth2/rfc6749/grant_types/resource_owner_password_credentials.py
+++ b/oauthlib/oauth2/rfc6749/grant_types/resource_owner_password_credentials.py
@@ -3,8 +3,6 @@
oauthlib.oauth2.rfc6749.grant_types
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
-from __future__ import absolute_import, unicode_literals
-
import json
import logging
diff --git a/oauthlib/oauth2/rfc6749/parameters.py b/oauthlib/oauth2/rfc6749/parameters.py
index 14d4c0d..54c8d24 100644
--- a/oauthlib/oauth2/rfc6749/parameters.py
+++ b/oauthlib/oauth2/rfc6749/parameters.py
@@ -7,14 +7,13 @@ This module contains methods related to `Section 4`_ of the OAuth 2 RFC.
.. _`Section 4`: https://tools.ietf.org/html/rfc6749#section-4
"""
-from __future__ import absolute_import, unicode_literals
-
import json
import os
import time
-from oauthlib.common import add_params_to_qs, add_params_to_uri, unicode_type
+from oauthlib.common import add_params_to_qs, add_params_to_uri
from oauthlib.signals import scope_changed
+import urllib.parse as urlparse
from .errors import (InsecureTransportError, MismatchingStateError,
MissingCodeError, MissingTokenError,
@@ -22,11 +21,6 @@ from .errors import (InsecureTransportError, MismatchingStateError,
from .tokens import OAuth2Token
from .utils import is_secure_transport, list_to_scope, scope_to_list
-try:
- import urlparse
-except ImportError:
- import urllib.parse as urlparse
-
def prepare_grant_uri(uri, client_id, response_type, redirect_uri=None,
scope=None, state=None, **kwargs):
@@ -82,7 +76,7 @@ def prepare_grant_uri(uri, client_id, response_type, redirect_uri=None,
for k in kwargs:
if kwargs[k]:
- params.append((unicode_type(k), kwargs[k]))
+ params.append((str(k), kwargs[k]))
return add_params_to_uri(uri, params)
@@ -146,18 +140,18 @@ def prepare_token_request(grant_type, body='', include_client_id=True, **kwargs)
client_id = kwargs.pop('client_id', None)
if include_client_id:
if client_id is not None:
- params.append((unicode_type('client_id'), client_id))
+ params.append(('client_id', client_id))
# the kwargs iteration below only supports including boolean truth (truthy)
# values, but some servers may require an empty string for `client_secret`
client_secret = kwargs.pop('client_secret', None)
if client_secret is not None:
- params.append((unicode_type('client_secret'), client_secret))
+ params.append(('client_secret', client_secret))
# this handles: `code`, `redirect_uri`, and other undocumented params
for k in kwargs:
if kwargs[k]:
- params.append((unicode_type(k), kwargs[k]))
+ params.append((str(k), kwargs[k]))
return add_params_to_qs(body, params)
@@ -209,7 +203,7 @@ def prepare_token_revocation_request(url, token, token_type_hint="access_token",
for k in kwargs:
if kwargs[k]:
- params.append((unicode_type(k), kwargs[k]))
+ params.append((str(k), kwargs[k]))
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
diff --git a/oauthlib/oauth2/rfc6749/request_validator.py b/oauthlib/oauth2/rfc6749/request_validator.py
index 86509b6..78d025b 100644
--- a/oauthlib/oauth2/rfc6749/request_validator.py
+++ b/oauthlib/oauth2/rfc6749/request_validator.py
@@ -3,14 +3,12 @@
oauthlib.oauth2.rfc6749.request_validator
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
log = logging.getLogger(__name__)
-class RequestValidator(object):
+class RequestValidator:
def client_authentication_required(self, request, *args, **kwargs):
"""Determine if client authentication is required for current request.
diff --git a/oauthlib/oauth2/rfc6749/tokens.py b/oauthlib/oauth2/rfc6749/tokens.py
index 3587af4..6f6b1f6 100644
--- a/oauthlib/oauth2/rfc6749/tokens.py
+++ b/oauthlib/oauth2/rfc6749/tokens.py
@@ -7,28 +7,23 @@ This module contains methods for adding two types of access tokens to requests.
- Bearer https://tools.ietf.org/html/rfc6750
- MAC https://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01
"""
-from __future__ import absolute_import, unicode_literals
-
import hashlib
import hmac
from binascii import b2a_base64
import warnings
from oauthlib import common
-from oauthlib.common import add_params_to_qs, add_params_to_uri, unicode_type
+from oauthlib.common import add_params_to_qs, add_params_to_uri
+from urllib.parse import urlparse
from . import utils
-try:
- from urlparse import urlparse
-except ImportError:
- from urllib.parse import urlparse
class OAuth2Token(dict):
def __init__(self, params, old_scope=None):
- super(OAuth2Token, self).__init__(params)
+ super().__init__(params)
self._new_scope = None
if 'scope' in params and params['scope']:
self._new_scope = set(utils.scope_to_list(params['scope']))
@@ -121,7 +116,7 @@ def prepare_mac_header(token, uri, key, http_method,
raise ValueError('unknown hash algorithm')
if draft == 0:
- nonce = nonce or '{0}:{1}'.format(utils.generate_age(issue_time),
+ nonce = nonce or '{}:{}'.format(utils.generate_age(issue_time),
common.generate_nonce())
else:
ts = common.generate_timestamp()
@@ -158,7 +153,7 @@ def prepare_mac_header(token, uri, key, http_method,
base_string = '\n'.join(base) + '\n'
# hmac struggles with unicode strings - http://bugs.python.org/issue5285
- if isinstance(key, unicode_type):
+ if isinstance(key, str):
key = key.encode('utf-8')
sign = hmac.new(key, base_string.encode('utf-8'), h)
sign = b2a_base64(sign.digest())[:-1].decode('utf-8')
@@ -262,7 +257,7 @@ def get_token_from_header(request):
return token
-class TokenBase(object):
+class TokenBase:
def __call__(self, request, refresh_token=False):
raise NotImplementedError('Subclasses must implement this method.')
diff --git a/oauthlib/oauth2/rfc6749/utils.py b/oauthlib/oauth2/rfc6749/utils.py
index f67019d..3117d4b 100644
--- a/oauthlib/oauth2/rfc6749/utils.py
+++ b/oauthlib/oauth2/rfc6749/utils.py
@@ -5,29 +5,20 @@ oauthlib.utils
This module contains utility methods used by various parts of the OAuth 2 spec.
"""
-from __future__ import absolute_import, unicode_literals
-
import datetime
import os
-from oauthlib.common import unicode_type, urldecode
-
-try:
- from urllib import quote
-except ImportError:
- from urllib.parse import quote
-try:
- from urlparse import urlparse
-except ImportError:
- from urllib.parse import urlparse
+from oauthlib.common import urldecode
+from urllib.parse import quote
+from urllib.parse import urlparse
def list_to_scope(scope):
"""Convert a list of scopes to a space separated string."""
- if isinstance(scope, unicode_type) or scope is None:
+ if isinstance(scope, str) or scope is None:
return scope
elif isinstance(scope, (set, tuple, list)):
- return " ".join([unicode_type(s) for s in scope])
+ return " ".join([str(s) for s in scope])
else:
raise ValueError("Invalid scope (%s), must be string, tuple, set, or list." % scope)
@@ -35,7 +26,7 @@ def list_to_scope(scope):
def scope_to_list(scope):
"""Convert a space separated string to a list of scopes."""
if isinstance(scope, (tuple, list, set)):
- return [unicode_type(s) for s in scope]
+ return [str(s) for s in scope]
elif scope is None:
return None
else:
@@ -74,7 +65,7 @@ def escape(u):
TODO: verify whether this can in fact be used for OAuth 2
"""
- if not isinstance(u, unicode_type):
+ if not isinstance(u, str):
raise ValueError('Only unicode objects are escapable.')
return quote(u.encode('utf-8'), safe=b'~')
@@ -84,7 +75,7 @@ def generate_age(issue_time):
td = datetime.datetime.now() - issue_time
age = (td.microseconds + (td.seconds + td.days * 24 * 3600)
* 10 ** 6) / 10 ** 6
- return unicode_type(age)
+ return str(age)
def is_secure_transport(uri):
diff --git a/oauthlib/openid/__init__.py b/oauthlib/openid/__init__.py
index 8157c29..fb1ac8d 100644
--- a/oauthlib/openid/__init__.py
+++ b/oauthlib/openid/__init__.py
@@ -4,8 +4,6 @@ oauthlib.openid
~~~~~~~~~~~~~~
"""
-from __future__ import absolute_import, unicode_literals
-
from .connect.core.endpoints import Server
from .connect.core.endpoints import UserInfoEndpoint
from .connect.core.request_validator import RequestValidator
diff --git a/oauthlib/openid/connect/core/endpoints/__init__.py b/oauthlib/openid/connect/core/endpoints/__init__.py
index 528841f..92f1ba9 100644
--- a/oauthlib/openid/connect/core/endpoints/__init__.py
+++ b/oauthlib/openid/connect/core/endpoints/__init__.py
@@ -6,7 +6,5 @@ oauthlib.oopenid.core
This module is an implementation of various logic needed
for consuming and providing OpenID Connect
"""
-from __future__ import absolute_import, unicode_literals
-
from .pre_configured import Server
from .userinfo import UserInfoEndpoint
diff --git a/oauthlib/openid/connect/core/endpoints/pre_configured.py b/oauthlib/openid/connect/core/endpoints/pre_configured.py
index fde2739..ad2faa7 100644
--- a/oauthlib/openid/connect/core/endpoints/pre_configured.py
+++ b/oauthlib/openid/connect/core/endpoints/pre_configured.py
@@ -6,8 +6,6 @@ oauthlib.openid.connect.core.endpoints.pre_configured
This module is an implementation of various endpoints needed
for providing OpenID Connect servers.
"""
-from __future__ import absolute_import, unicode_literals
-
from oauthlib.oauth2.rfc6749.endpoints import (
AuthorizationEndpoint,
IntrospectEndpoint,
diff --git a/oauthlib/openid/connect/core/endpoints/userinfo.py b/oauthlib/openid/connect/core/endpoints/userinfo.py
index 7a39f76..dc73373 100644
--- a/oauthlib/openid/connect/core/endpoints/userinfo.py
+++ b/oauthlib/openid/connect/core/endpoints/userinfo.py
@@ -4,13 +4,10 @@ oauthlib.openid.connect.core.endpoints.userinfo
This module is an implementation of userinfo endpoint.
"""
-from __future__ import absolute_import, unicode_literals
-
import json
import logging
from oauthlib.common import Request
-from oauthlib.common import unicode_type
from oauthlib.oauth2.rfc6749.endpoints.base import BaseEndpoint
from oauthlib.oauth2.rfc6749.endpoints.base import catch_errors_and_unavailability
from oauthlib.oauth2.rfc6749.tokens import BearerToken
@@ -55,7 +52,7 @@ class UserInfoEndpoint(BaseEndpoint):
log.error('Userinfo MUST have "sub" for %r.', request)
raise errors.ServerError(status_code=500)
body = json.dumps(claims)
- elif isinstance(claims, unicode_type):
+ elif isinstance(claims, str):
resp_headers = {
'Content-Type': 'application/jwt'
}
diff --git a/oauthlib/openid/connect/core/exceptions.py b/oauthlib/openid/connect/core/exceptions.py
index 8b08d21..aa795e0 100644
--- a/oauthlib/openid/connect/core/exceptions.py
+++ b/oauthlib/openid/connect/core/exceptions.py
@@ -6,8 +6,6 @@ oauthlib.oauth2.rfc6749.errors
Error used both by OAuth 2 clients and providers to represent the spec
defined error responses for all four core grant types.
"""
-from __future__ import unicode_literals
-
from oauthlib.oauth2.rfc6749.errors import FatalClientError, OAuth2Error
diff --git a/oauthlib/openid/connect/core/grant_types/__init__.py b/oauthlib/openid/connect/core/grant_types/__init__.py
index 63f30ac..4e7b474 100644
--- a/oauthlib/openid/connect/core/grant_types/__init__.py
+++ b/oauthlib/openid/connect/core/grant_types/__init__.py
@@ -3,8 +3,6 @@
oauthlib.openid.connect.core.grant_types
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
-from __future__ import unicode_literals, absolute_import
-
from .authorization_code import AuthorizationCodeGrant
from .implicit import ImplicitGrant
from .base import GrantTypeBase
diff --git a/oauthlib/openid/connect/core/grant_types/authorization_code.py b/oauthlib/openid/connect/core/grant_types/authorization_code.py
index becfcfa..d07d138 100644
--- a/oauthlib/openid/connect/core/grant_types/authorization_code.py
+++ b/oauthlib/openid/connect/core/grant_types/authorization_code.py
@@ -3,8 +3,6 @@
oauthlib.openid.connect.core.grant_types
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from oauthlib.oauth2.rfc6749.grant_types.authorization_code import AuthorizationCodeGrant as OAuth2AuthorizationCodeGrant
@@ -41,4 +39,4 @@ class AuthorizationCodeGrant(GrantTypeBase):
request.redirect_uri,
request
)
- return super(AuthorizationCodeGrant, self).add_id_token(token, token_handler, request, nonce=nonce)
+ return super().add_id_token(token, token_handler, request, nonce=nonce)
diff --git a/oauthlib/openid/connect/core/grant_types/base.py b/oauthlib/openid/connect/core/grant_types/base.py
index 32a21b6..cd27237 100644
--- a/oauthlib/openid/connect/core/grant_types/base.py
+++ b/oauthlib/openid/connect/core/grant_types/base.py
@@ -11,7 +11,7 @@ from oauthlib.oauth2.rfc6749.errors import ConsentRequired, InvalidRequestError,
log = logging.getLogger(__name__)
-class GrantTypeBase(object):
+class GrantTypeBase:
# Just proxy the majority of method calls through to the
# proxy_target grant type handler, which will usually be either
@@ -20,7 +20,7 @@ class GrantTypeBase(object):
return getattr(self.proxy_target, attr)
def __setattr__(self, attr, value):
- proxied_attrs = set(('refresh_token', 'response_types'))
+ proxied_attrs = {'refresh_token', 'response_types'}
if attr in proxied_attrs:
setattr(self.proxy_target, attr, value)
else:
diff --git a/oauthlib/openid/connect/core/grant_types/dispatchers.py b/oauthlib/openid/connect/core/grant_types/dispatchers.py
index be8e2f3..541467a 100644
--- a/oauthlib/openid/connect/core/grant_types/dispatchers.py
+++ b/oauthlib/openid/connect/core/grant_types/dispatchers.py
@@ -2,7 +2,7 @@ import logging
log = logging.getLogger(__name__)
-class Dispatcher(object):
+class Dispatcher:
default_grant = None
oidc_grant = None
diff --git a/oauthlib/openid/connect/core/grant_types/exceptions.py b/oauthlib/openid/connect/core/grant_types/exceptions.py
index 809f1b3..4636fe7 100644
--- a/oauthlib/openid/connect/core/grant_types/exceptions.py
+++ b/oauthlib/openid/connect/core/grant_types/exceptions.py
@@ -29,4 +29,4 @@ class OIDCNoPrompt(Exception):
"for authorization, it should been done using silent "
"authentication through create_authorization_response. "
"See OIDCNoPrompt.__doc__ for more details.")
- super(OIDCNoPrompt, self).__init__(msg)
+ super().__init__(msg)
diff --git a/oauthlib/openid/connect/core/grant_types/hybrid.py b/oauthlib/openid/connect/core/grant_types/hybrid.py
index 685fa08..caf8547 100644
--- a/oauthlib/openid/connect/core/grant_types/hybrid.py
+++ b/oauthlib/openid/connect/core/grant_types/hybrid.py
@@ -3,8 +3,6 @@
oauthlib.openid.connect.core.grant_types
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from oauthlib.oauth2.rfc6749.grant_types.authorization_code import AuthorizationCodeGrant as OAuth2AuthorizationCodeGrant
@@ -39,7 +37,7 @@ class HybridGrant(GrantTypeBase):
def openid_authorization_validator(self, request):
"""Additional validation when following the Authorization Code flow.
"""
- request_info = super(HybridGrant, self).openid_authorization_validator(request)
+ request_info = super().openid_authorization_validator(request)
if not request_info: # returns immediately if OAuth2.0
return request_info
diff --git a/oauthlib/openid/connect/core/grant_types/implicit.py b/oauthlib/openid/connect/core/grant_types/implicit.py
index c2dbc27..62f63f9 100644
--- a/oauthlib/openid/connect/core/grant_types/implicit.py
+++ b/oauthlib/openid/connect/core/grant_types/implicit.py
@@ -3,8 +3,6 @@
oauthlib.openid.connect.core.grant_types
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from .base import GrantTypeBase
@@ -29,12 +27,12 @@ class ImplicitGrant(GrantTypeBase):
def add_id_token(self, token, token_handler, request):
if 'state' not in token and request.state:
token['state'] = request.state
- return super(ImplicitGrant, self).add_id_token(token, token_handler, request, nonce=request.nonce)
+ return super().add_id_token(token, token_handler, request, nonce=request.nonce)
def openid_authorization_validator(self, request):
"""Additional validation when following the implicit flow.
"""
- request_info = super(ImplicitGrant, self).openid_authorization_validator(request)
+ request_info = super().openid_authorization_validator(request)
if not request_info: # returns immediately if OAuth2.0
return request_info
diff --git a/oauthlib/openid/connect/core/request_validator.py b/oauthlib/openid/connect/core/request_validator.py
index e853d39..ebc07dc 100644
--- a/oauthlib/openid/connect/core/request_validator.py
+++ b/oauthlib/openid/connect/core/request_validator.py
@@ -3,8 +3,6 @@
oauthlib.openid.connect.core.request_validator
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
-from __future__ import absolute_import, unicode_literals
-
import logging
from oauthlib.oauth2.rfc6749.request_validator import RequestValidator as OAuth2RequestValidator
diff --git a/oauthlib/openid/connect/core/tokens.py b/oauthlib/openid/connect/core/tokens.py
index b67cdf2..d24cb56 100644
--- a/oauthlib/openid/connect/core/tokens.py
+++ b/oauthlib/openid/connect/core/tokens.py
@@ -4,9 +4,6 @@ authlib.openid.connect.core.tokens
This module contains methods for adding JWT tokens to requests.
"""
-from __future__ import absolute_import, unicode_literals
-
-
from oauthlib.oauth2.rfc6749.tokens import TokenBase, random_token_generator
diff --git a/oauthlib/signals.py b/oauthlib/signals.py
index 22d47a4..9356cc2 100644
--- a/oauthlib/signals.py
+++ b/oauthlib/signals.py
@@ -9,11 +9,11 @@ try:
from blinker import Namespace
signals_available = True
except ImportError: # noqa
- class Namespace(object):
+ class Namespace:
def signal(self, name, doc=None):
return _FakeSignal(name, doc)
- class _FakeSignal(object):
+ class _FakeSignal:
"""If blinker is unavailable, create a fake class with the same
interface that allows sending of signals but will fail with an
error on anything else. Instead of doing anything on send, it
diff --git a/oauthlib/uri_validate.py b/oauthlib/uri_validate.py
index ce8ea40..93b6131 100644
--- a/oauthlib/uri_validate.py
+++ b/oauthlib/uri_validate.py
@@ -8,8 +8,6 @@ They should be processed with re.VERBOSE.
Thanks Mark Nottingham for this code - https://gist.github.com/138549
"""
-from __future__ import unicode_literals
-
import re
# basics