@@ -18,6 +18,7 @@ env:
|
||||
- TOX_ENV=system-tests
|
||||
- TOX_ENV=system-tests3
|
||||
- TOX_ENV=gae
|
||||
- TOX_ENV=flake8
|
||||
global:
|
||||
- GAE_PYTHONPATH=${HOME}/.cache/google_appengine
|
||||
cache:
|
||||
|
||||
27
docs/conf.py
27
docs/conf.py
@@ -5,14 +5,22 @@
|
||||
#
|
||||
|
||||
import os
|
||||
from pkg_resources import get_distribution
|
||||
import sys
|
||||
|
||||
import mock
|
||||
|
||||
# See
|
||||
# (https://read-the-docs.readthedocs.io/en/latest/faq.html#\
|
||||
# i-get-import-errors-on-libraries-that-depend-on-c-modules)
|
||||
# In order to load django before 1.7, we need to create a faux
|
||||
# settings module and load it. This assumes django has been installed
|
||||
# (but it must be for the docs to build), so if it has not already
|
||||
# been installed run `pip install -r docs/requirements.txt`.
|
||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.contrib.test_django_settings'
|
||||
import django
|
||||
import mock
|
||||
from pkg_resources import get_distribution
|
||||
if django.VERSION[1] < 7:
|
||||
sys.path.insert(0, '.')
|
||||
|
||||
# See https://read-the-docs.readthedocs.io/en/latest/faq.html#i-get-import-errors-on-libraries-that-depend-on-c-modules
|
||||
|
||||
|
||||
class Mock(mock.Mock):
|
||||
|
||||
@@ -61,15 +69,6 @@ release = distro.version
|
||||
|
||||
exclude_patterns = ['_build']
|
||||
|
||||
# In order to load django before 1.7, we need to create a faux
|
||||
# settings module and load it. This assumes django has been installed
|
||||
# (but it must be for the docs to build), so if it has not already
|
||||
# been installed run `pip install -r docs/requirements.txt`.
|
||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.contrib.test_django_settings'
|
||||
import django
|
||||
if django.VERSION[1] < 7:
|
||||
sys.path.insert(0, '.')
|
||||
|
||||
# -- Options for HTML output ----------------------------------------------
|
||||
|
||||
# We fake our more expensive imports when building the docs.
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
import base64
|
||||
import json
|
||||
|
||||
import six
|
||||
|
||||
|
||||
|
||||
@@ -13,8 +13,6 @@
|
||||
# limitations under the License.
|
||||
"""OpenSSL Crypto-related routines for oauth2client."""
|
||||
|
||||
import base64
|
||||
|
||||
from OpenSSL import crypto
|
||||
|
||||
from oauth2client._helpers import _parse_pem_key
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
# limitations under the License.
|
||||
"""pyCrypto Crypto-related routines for oauth2client."""
|
||||
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Hash import SHA256
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Signature import PKCS1_v1_5
|
||||
from Crypto.Util.asn1 import DerSequence
|
||||
|
||||
|
||||
@@ -17,33 +17,32 @@
|
||||
Tools for interacting with OAuth 2.0 protected resources.
|
||||
"""
|
||||
|
||||
import base64
|
||||
import collections
|
||||
import copy
|
||||
import datetime
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
import socket
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
import shutil
|
||||
|
||||
import httplib2
|
||||
import six
|
||||
from six.moves import http_client
|
||||
from six.moves import urllib
|
||||
|
||||
import httplib2
|
||||
from oauth2client import clientsecrets
|
||||
from oauth2client import GOOGLE_AUTH_URI
|
||||
from oauth2client import GOOGLE_DEVICE_URI
|
||||
from oauth2client import GOOGLE_REVOKE_URI
|
||||
from oauth2client import GOOGLE_TOKEN_URI
|
||||
from oauth2client import GOOGLE_TOKEN_INFO_URI
|
||||
from oauth2client import GOOGLE_TOKEN_URI
|
||||
from oauth2client import util
|
||||
from oauth2client._helpers import _from_bytes
|
||||
from oauth2client._helpers import _to_bytes
|
||||
from oauth2client._helpers import _urlsafe_b64decode
|
||||
from oauth2client import clientsecrets
|
||||
from oauth2client import util
|
||||
|
||||
|
||||
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
||||
@@ -259,8 +258,8 @@ class Credentials(object):
|
||||
strip: array, An array of names of members to exclude from the
|
||||
JSON.
|
||||
to_serialize: dict, (Optional) The properties for this object
|
||||
that will be serialized. This allows callers to modify
|
||||
before serializing.
|
||||
that will be serialized. This allows callers to
|
||||
modify before serializing.
|
||||
|
||||
Returns:
|
||||
string, a JSON representation of this instance, suitable to pass to
|
||||
@@ -359,7 +358,8 @@ class Storage(object):
|
||||
|
||||
Args:
|
||||
lock: An optional threading.Lock-like object. Must implement at
|
||||
least acquire() and release(). Does not need to be re-entrant.
|
||||
least acquire() and release(). Does not need to be
|
||||
re-entrant.
|
||||
"""
|
||||
self._lock = lock
|
||||
|
||||
@@ -1195,7 +1195,7 @@ class GoogleCredentials(OAuth2Credentials):
|
||||
print(response)
|
||||
"""
|
||||
|
||||
NON_SERIALIZED_MEMBERS = (
|
||||
NON_SERIALIZED_MEMBERS = (
|
||||
frozenset(['_private_key']) |
|
||||
OAuth2Credentials.NON_SERIALIZED_MEMBERS)
|
||||
"""Members that aren't serialized when object is converted to JSON."""
|
||||
@@ -1253,12 +1253,11 @@ class GoogleCredentials(OAuth2Credentials):
|
||||
# We handle service_account.ServiceAccountCredentials since it is a
|
||||
# possible return type of GoogleCredentials.get_application_default()
|
||||
if (data['_module'] == 'oauth2client.service_account' and
|
||||
data['_class'] == 'ServiceAccountCredentials'):
|
||||
data['_class'] == 'ServiceAccountCredentials'):
|
||||
return ServiceAccountCredentials.from_json(data)
|
||||
elif (data['_module'] == 'oauth2client.service_account' and
|
||||
data['_class'] == '_JWTAccessCredentials'):
|
||||
data['_class'] == '_JWTAccessCredentials'):
|
||||
return _JWTAccessCredentials.from_json(data)
|
||||
|
||||
|
||||
token_expiry = _parse_expiry(data.get('token_expiry'))
|
||||
google_credentials = cls(
|
||||
@@ -1468,8 +1467,7 @@ def save_to_well_known_file(credentials, well_known_file=None):
|
||||
|
||||
def _get_environment_variable_file():
|
||||
application_default_credential_filename = (
|
||||
os.environ.get(GOOGLE_APPLICATION_CREDENTIALS,
|
||||
None))
|
||||
os.environ.get(GOOGLE_APPLICATION_CREDENTIALS, None))
|
||||
|
||||
if application_default_credential_filename:
|
||||
if os.path.isfile(application_default_credential_filename):
|
||||
@@ -1552,8 +1550,8 @@ def _raise_exception_for_reading_json(credential_file,
|
||||
extra_help,
|
||||
error):
|
||||
raise ApplicationDefaultCredentialsError(
|
||||
'An error was encountered while reading json file: ' +
|
||||
credential_file + extra_help + ': ' + str(error))
|
||||
'An error was encountered while reading json file: ' +
|
||||
credential_file + extra_help + ': ' + str(error))
|
||||
|
||||
|
||||
def _get_application_default_credential_GAE():
|
||||
@@ -2213,7 +2211,8 @@ def flow_from_clientsecrets(filename, scope, redirect_uri=None,
|
||||
except clientsecrets.InvalidClientSecretsError as e:
|
||||
if message is not None:
|
||||
if e.args:
|
||||
message = 'The client secrets were invalid: \n{0}\n{1}'.format(e, message)
|
||||
message = ('The client secrets were invalid: '
|
||||
'\n{0}\n{1}'.format(e, message))
|
||||
sys.exit(message)
|
||||
else:
|
||||
raise
|
||||
|
||||
@@ -19,8 +19,8 @@ an OAuth 2.0 protected service.
|
||||
"""
|
||||
|
||||
import json
|
||||
import six
|
||||
|
||||
import six
|
||||
|
||||
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
||||
|
||||
|
||||
@@ -13,9 +13,8 @@
|
||||
# limitations under the License.
|
||||
|
||||
import errno
|
||||
import time
|
||||
|
||||
import fcntl
|
||||
import time
|
||||
|
||||
from oauth2client.contrib.locked_file import _Opener
|
||||
from oauth2client.contrib.locked_file import AlreadyLockedException
|
||||
|
||||
@@ -18,15 +18,15 @@ See https://cloud.google.com/compute/docs/metadata
|
||||
"""
|
||||
|
||||
import datetime
|
||||
import httplib2
|
||||
import json
|
||||
|
||||
import httplib2
|
||||
from six.moves import http_client
|
||||
from six.moves.urllib import parse as urlparse
|
||||
|
||||
from oauth2client import util
|
||||
from oauth2client._helpers import _from_bytes
|
||||
from oauth2client.client import _UTCNOW
|
||||
from oauth2client import util
|
||||
|
||||
|
||||
METADATA_ROOT = 'http://metadata.google.internal/computeMetadata/v1/'
|
||||
|
||||
@@ -24,19 +24,18 @@ import os
|
||||
import pickle
|
||||
import threading
|
||||
|
||||
import httplib2
|
||||
import webapp2 as webapp
|
||||
|
||||
from google.appengine.api import app_identity
|
||||
from google.appengine.api import memcache
|
||||
from google.appengine.api import users
|
||||
from google.appengine.ext import db
|
||||
from google.appengine.ext.webapp.util import login_required
|
||||
import httplib2
|
||||
import webapp2 as webapp
|
||||
|
||||
from oauth2client import clientsecrets
|
||||
from oauth2client import GOOGLE_AUTH_URI
|
||||
from oauth2client import GOOGLE_REVOKE_URI
|
||||
from oauth2client import GOOGLE_TOKEN_URI
|
||||
from oauth2client import clientsecrets
|
||||
from oauth2client import util
|
||||
from oauth2client.client import AccessTokenRefreshError
|
||||
from oauth2client.client import AssertionCredentials
|
||||
|
||||
@@ -19,8 +19,8 @@ import json
|
||||
import os
|
||||
import socket
|
||||
|
||||
from oauth2client._helpers import _to_bytes
|
||||
from oauth2client import client
|
||||
from oauth2client._helpers import _to_bytes
|
||||
|
||||
# Expose utcnow() at module level to allow for
|
||||
# easier testing (by replacing with a stub).
|
||||
|
||||
@@ -21,13 +21,13 @@ the Django datastore.
|
||||
Only Django versions 1.8+ are supported.
|
||||
"""
|
||||
|
||||
import oauth2client
|
||||
import base64
|
||||
import pickle
|
||||
import six
|
||||
|
||||
from django.db import models
|
||||
from django.utils.encoding import smart_bytes, smart_text
|
||||
|
||||
import oauth2client
|
||||
from oauth2client.client import Storage as BaseStorage
|
||||
|
||||
|
||||
@@ -179,4 +179,4 @@ class Storage(BaseStorage):
|
||||
"""Delete Credentials from the datastore."""
|
||||
|
||||
query = {self.key_name: self.key_value}
|
||||
entities = self.model_class.objects.filter(**query).delete()
|
||||
self.model_class.objects.filter(**query).delete()
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
"""Utilities for the Django web framework
|
||||
|
||||
Provides Django views and helpers the make using the OAuth2 web server
|
||||
flow easier. It includes an ``oauth_required`` decorator to automatically ensure
|
||||
that user credentials are available, and an ``oauth_enabled`` decorator to check
|
||||
if the user has authorized, and helper shortcuts to create the authorization
|
||||
URL otherwise.
|
||||
flow easier. It includes an ``oauth_required`` decorator to automatically
|
||||
ensure that user credentials are available, and an ``oauth_enabled`` decorator
|
||||
to check if the user has authorized, and helper shortcuts to create the
|
||||
authorization URL otherwise.
|
||||
|
||||
Only Django versions 1.8+ are supported.
|
||||
|
||||
@@ -89,8 +89,8 @@ Add the oauth2 routes to your application's urls.py urlpatterns.
|
||||
urlpatterns += [url(r'^oauth2/', include(oauth2_urls))]
|
||||
|
||||
To require OAuth2 credentials for a view, use the `oauth2_required` decorator.
|
||||
This creates a credentials object with an id_token, and allows you to create an
|
||||
`http` object to build service clients with. These are all attached to the
|
||||
This creates a credentials object with an id_token, and allows you to create
|
||||
an `http` object to build service clients with. These are all attached to the
|
||||
request.oauth
|
||||
|
||||
.. code-block:: python
|
||||
@@ -124,8 +124,9 @@ To make OAuth2 optional and provide an authorization link in your own views.
|
||||
return HttpResponse("User email: %s"
|
||||
% request.oauth.credentials.id_token['email'])
|
||||
else:
|
||||
return HttpResponse('Here is an OAuth Authorize link:
|
||||
<a href="%s">Authorize</a>' % request.oauth.get_authorize_redirect())
|
||||
return HttpResponse(
|
||||
'Here is an OAuth Authorize link: <a href="%s">Authorize</a>'
|
||||
% request.oauth.get_authorize_redirect())
|
||||
|
||||
If a view needs a scope not included in the default scopes specified in
|
||||
the settings, you can use [incremental auth](https://developers.google.com/identity/sign-in/web/incremental-auth)
|
||||
@@ -144,8 +145,9 @@ and specify additional scopes in the decorator arguments.
|
||||
events = service.files().list().execute()['items']
|
||||
return HttpResponse(str(events))
|
||||
else:
|
||||
return HttpResponse('Here is an OAuth Authorize link:
|
||||
<a href="%s">Authorize</a>' % request.oauth.get_authorize_redirect())
|
||||
return HttpResponse(
|
||||
'Here is an OAuth Authorize link: <a href="%s">Authorize</a>'
|
||||
% request.oauth.get_authorize_redirect())
|
||||
|
||||
|
||||
To provide a callback on authorization being completed, use the
|
||||
@@ -168,9 +170,10 @@ import django.conf
|
||||
from django.core import exceptions
|
||||
from django.core import urlresolvers
|
||||
import httplib2
|
||||
from six.moves.urllib import parse
|
||||
|
||||
from oauth2client import clientsecrets
|
||||
from oauth2client.contrib.django_util import storage
|
||||
from six.moves.urllib import parse
|
||||
|
||||
GOOGLE_OAUTH2_DEFAULT_SCOPES = ('email',)
|
||||
GOOGLE_OAUTH2_REQUEST_ATTRIBUTE = 'oauth'
|
||||
@@ -202,9 +205,9 @@ def _get_oauth2_client_id_and_secret(settings_instance):
|
||||
return client_id, client_secret
|
||||
else:
|
||||
raise exceptions.ImproperlyConfigured(
|
||||
"Must specify either GOOGLE_OAUTH2_CLIENT_SECRETS_JSON, or "
|
||||
" both GOOGLE_OAUTH2_CLIENT_ID and GOOGLE_OAUTH2_CLIENT_SECRET "
|
||||
"in settings.py")
|
||||
"Must specify either GOOGLE_OAUTH2_CLIENT_SECRETS_JSON, or "
|
||||
"both GOOGLE_OAUTH2_CLIENT_ID and "
|
||||
"GOOGLE_OAUTH2_CLIENT_SECRET in settings.py")
|
||||
|
||||
|
||||
class OAuth2Settings(object):
|
||||
@@ -290,8 +293,8 @@ class UserOAuth2(object):
|
||||
def has_credentials(self):
|
||||
"""Returns True if there are valid credentials for the current user
|
||||
and required scopes."""
|
||||
return (self.credentials and not self.credentials.invalid
|
||||
and self.credentials.has_scopes(self.scopes))
|
||||
return (self.credentials and not self.credentials.invalid and
|
||||
self.credentials.has_scopes(self.scopes))
|
||||
|
||||
@property
|
||||
def credentials(self):
|
||||
|
||||
@@ -13,9 +13,10 @@
|
||||
# limitations under the License.
|
||||
|
||||
from django import shortcuts
|
||||
from oauth2client.contrib import django_util
|
||||
from six import wraps
|
||||
|
||||
from oauth2client.contrib import django_util
|
||||
|
||||
|
||||
def oauth_required(decorated_function=None, scopes=None, **decorator_kwargs):
|
||||
""" Decorator to require OAuth2 credentials for a view
|
||||
@@ -36,7 +37,7 @@ def oauth_required(decorated_function=None, scopes=None, **decorator_kwargs):
|
||||
developerKey=API_KEY)
|
||||
events = service.events().list(
|
||||
calendarId='primary').execute()['items']
|
||||
return HttpResponse("email: %s , calendar: %s" % (email, str(events)))
|
||||
return HttpResponse("email: %s, calendar: %s" % (email, str(events)))
|
||||
|
||||
:param decorated_function: View function to decorate, must have the Django
|
||||
request object as the first argument
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# limitations under the License.
|
||||
|
||||
from django.conf import urls
|
||||
|
||||
from oauth2client.contrib.django_util import views
|
||||
|
||||
urlpatterns = [
|
||||
|
||||
@@ -16,9 +16,11 @@ import hashlib
|
||||
import json
|
||||
import os
|
||||
import pickle
|
||||
|
||||
from django import http
|
||||
from django.core import urlresolvers
|
||||
from django import shortcuts
|
||||
from django.core import urlresolvers
|
||||
|
||||
from oauth2client import client
|
||||
from oauth2client.contrib import django_util
|
||||
from oauth2client.contrib.django_util import signals
|
||||
@@ -87,7 +89,8 @@ def oauth2_callback(request):
|
||||
try:
|
||||
server_csrf = request.session[_CSRF_KEY]
|
||||
except KeyError:
|
||||
return http.HttpResponseBadRequest("No existing session for this flow.")
|
||||
return http.HttpResponseBadRequest(
|
||||
"No existing session for this flow.")
|
||||
|
||||
try:
|
||||
state = json.loads(encoded_state)
|
||||
|
||||
@@ -162,14 +162,11 @@ available outside of a request context, you will need to implement your own
|
||||
:class:`oauth2client.Storage`.
|
||||
"""
|
||||
|
||||
from functools import wraps
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import pickle
|
||||
from functools import wraps
|
||||
|
||||
import six.moves.http_client as httplib
|
||||
import httplib2
|
||||
|
||||
try:
|
||||
from flask import Blueprint
|
||||
@@ -182,10 +179,13 @@ try:
|
||||
except ImportError: # pragma: NO COVER
|
||||
raise ImportError('The flask utilities require flask 0.9 or newer.')
|
||||
|
||||
import httplib2
|
||||
import six.moves.http_client as httplib
|
||||
|
||||
from oauth2client import clientsecrets
|
||||
from oauth2client.client import FlowExchangeError
|
||||
from oauth2client.client import OAuth2WebServerFlow
|
||||
from oauth2client.contrib.dictionary_storage import DictionaryStorage
|
||||
from oauth2client import clientsecrets
|
||||
|
||||
|
||||
__author__ = 'jonwayne@google.com (Jon Wayne Parrott)'
|
||||
@@ -446,8 +446,8 @@ class UserOAuth2(object):
|
||||
if not self.credentials:
|
||||
return False
|
||||
# Is the access token expired? If so, do we have an refresh token?
|
||||
elif (self.credentials.access_token_expired
|
||||
and not self.credentials.refresh_token):
|
||||
elif (self.credentials.access_token_expired and
|
||||
not self.credentials.refresh_token):
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
@@ -112,7 +112,8 @@ class AppAssertionCredentials(AssertionCredentials):
|
||||
"""
|
||||
if self.invalid:
|
||||
info = _metadata.get_service_account_info(
|
||||
http_request, service_account=self.service_account_email or 'default')
|
||||
http_request,
|
||||
service_account=self.service_account_email or 'default')
|
||||
self.invalid = False
|
||||
self.service_account_email = info['email']
|
||||
self.scopes = info['scopes']
|
||||
|
||||
@@ -50,12 +50,11 @@ import logging
|
||||
import os
|
||||
import threading
|
||||
|
||||
from oauth2client import util
|
||||
from oauth2client.client import Credentials
|
||||
from oauth2client.client import Storage as BaseStorage
|
||||
from oauth2client import util
|
||||
from oauth2client.contrib.locked_file import LockedFile
|
||||
|
||||
|
||||
__author__ = 'jbeda@google.com (Joe Beda)'
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -90,9 +90,10 @@ We will reuse tables defined above.
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import oauth2client.client
|
||||
import sqlalchemy.types
|
||||
|
||||
import oauth2client.client
|
||||
|
||||
|
||||
class CredentialsType(sqlalchemy.types.PickleType):
|
||||
"""Type representing credentials.
|
||||
|
||||
@@ -19,8 +19,8 @@ import binascii
|
||||
import hmac
|
||||
import time
|
||||
|
||||
from oauth2client._helpers import _to_bytes
|
||||
from oauth2client import util
|
||||
from oauth2client._helpers import _to_bytes
|
||||
|
||||
__authors__ = [
|
||||
'"Doug Coker" <dcoker@google.com>',
|
||||
|
||||
@@ -17,27 +17,24 @@
|
||||
import base64
|
||||
import copy
|
||||
import datetime
|
||||
import httplib2
|
||||
import json
|
||||
import time
|
||||
|
||||
import httplib2
|
||||
|
||||
from oauth2client import crypt
|
||||
from oauth2client import GOOGLE_REVOKE_URI
|
||||
from oauth2client import GOOGLE_TOKEN_URI
|
||||
from oauth2client._helpers import _json_encode
|
||||
from oauth2client._helpers import _from_bytes
|
||||
from oauth2client._helpers import _urlsafe_b64encode
|
||||
from oauth2client import util
|
||||
from oauth2client._helpers import _from_bytes
|
||||
from oauth2client.client import _apply_user_agent
|
||||
from oauth2client.client import _initialize_headers
|
||||
from oauth2client.client import _UTCNOW
|
||||
from oauth2client.client import AccessTokenInfo
|
||||
from oauth2client.client import AssertionCredentials
|
||||
from oauth2client.client import clean_headers
|
||||
from oauth2client.client import EXPIRY_FORMAT
|
||||
from oauth2client.client import GoogleCredentials
|
||||
from oauth2client.client import SERVICE_ACCOUNT
|
||||
from oauth2client.client import TokenRevokeError
|
||||
from oauth2client.client import _UTCNOW
|
||||
from oauth2client import crypt
|
||||
|
||||
|
||||
_PASSWORD_DEFAULT = 'notasecret'
|
||||
@@ -94,7 +91,7 @@ class ServiceAccountCredentials(AssertionCredentials):
|
||||
MAX_TOKEN_LIFETIME_SECS = 3600
|
||||
"""Max lifetime of the token (one hour, in seconds)."""
|
||||
|
||||
NON_SERIALIZED_MEMBERS = (
|
||||
NON_SERIALIZED_MEMBERS = (
|
||||
frozenset(['_signer']) |
|
||||
AssertionCredentials.NON_SERIALIZED_MEMBERS)
|
||||
"""Members that aren't serialized when object is converted to JSON."""
|
||||
@@ -138,8 +135,8 @@ class ServiceAccountCredentials(AssertionCredentials):
|
||||
strip: array, An array of names of members to exclude from the
|
||||
JSON.
|
||||
to_serialize: dict, (Optional) The properties for this object
|
||||
that will be serialized. This allows callers to modify
|
||||
before serializing.
|
||||
that will be serialized. This allows callers to
|
||||
modify before serializing.
|
||||
|
||||
Returns:
|
||||
string, a JSON representation of this instance, suitable to pass to
|
||||
@@ -502,7 +499,7 @@ class ServiceAccountCredentials(AssertionCredentials):
|
||||
result._private_key_pkcs12 = self._private_key_pkcs12
|
||||
result._private_key_password = self._private_key_password
|
||||
return result
|
||||
|
||||
|
||||
def create_with_claims(self, claims):
|
||||
"""Create credentials that specify additional claims.
|
||||
|
||||
@@ -511,7 +508,8 @@ class ServiceAccountCredentials(AssertionCredentials):
|
||||
|
||||
Returns:
|
||||
ServiceAccountCredentials, a copy of the current service account
|
||||
credentials with updated claims to use when obtaining access tokens.
|
||||
credentials with updated claims to use when obtaining access
|
||||
tokens.
|
||||
"""
|
||||
new_kwargs = dict(self._kwargs)
|
||||
new_kwargs.update(claims)
|
||||
@@ -552,11 +550,11 @@ class ServiceAccountCredentials(AssertionCredentials):
|
||||
|
||||
|
||||
def _datetime_to_secs(utc_time):
|
||||
# TODO(issue 298): use time_delta.total_seconds()
|
||||
# time_delta.total_seconds() not supported in Python 2.6
|
||||
epoch = datetime.datetime(1970, 1, 1)
|
||||
time_delta = utc_time - epoch
|
||||
return time_delta.days * 86400 + time_delta.seconds
|
||||
# TODO(issue 298): use time_delta.total_seconds()
|
||||
# time_delta.total_seconds() not supported in Python 2.6
|
||||
epoch = datetime.datetime(1970, 1, 1)
|
||||
time_delta = utc_time - epoch
|
||||
return time_delta.days * 86400 + time_delta.seconds
|
||||
|
||||
|
||||
class _JWTAccessCredentials(ServiceAccountCredentials):
|
||||
@@ -607,7 +605,8 @@ class _JWTAccessCredentials(ServiceAccountCredentials):
|
||||
h = credentials.authorize(h)
|
||||
"""
|
||||
request_orig = http.request
|
||||
request_auth = super(_JWTAccessCredentials, self).authorize(http).request
|
||||
request_auth = super(
|
||||
_JWTAccessCredentials, self).authorize(http).request
|
||||
|
||||
# The closure that will replace 'httplib2.Http.request'.
|
||||
def new_request(uri, method='GET', body=None, headers=None,
|
||||
@@ -695,7 +694,8 @@ class _JWTAccessCredentials(ServiceAccountCredentials):
|
||||
|
||||
def _create_token(self, additional_claims=None):
|
||||
now = _UTCNOW()
|
||||
expiry = now + datetime.timedelta(seconds=self._MAX_TOKEN_LIFETIME_SECS)
|
||||
lifetime = datetime.timedelta(seconds=self._MAX_TOKEN_LIFETIME_SECS)
|
||||
expiry = now + lifetime
|
||||
payload = {
|
||||
'iat': _datetime_to_secs(now),
|
||||
'exp': _datetime_to_secs(expiry),
|
||||
|
||||
@@ -27,8 +27,8 @@ import sys
|
||||
|
||||
from six.moves import BaseHTTPServer
|
||||
from six.moves import http_client
|
||||
from six.moves import urllib
|
||||
from six.moves import input
|
||||
from six.moves import urllib
|
||||
|
||||
from oauth2client import client
|
||||
from oauth2client import util
|
||||
@@ -48,6 +48,32 @@ with information from the APIs Console <https://code.google.com/apis/console>.
|
||||
|
||||
"""
|
||||
|
||||
_FAILED_START_MESSAGE = """
|
||||
Failed to start a local webserver listening on either port 8080
|
||||
or port 8090. Please check your firewall settings and locally
|
||||
running programs that may be blocking or using those ports.
|
||||
|
||||
Falling back to --noauth_local_webserver and continuing with
|
||||
authorization.
|
||||
"""
|
||||
|
||||
_BROWSER_OPENED_MESSAGE = """
|
||||
Your browser has been opened to visit:
|
||||
|
||||
%s
|
||||
|
||||
If your browser is on a different machine then exit and re-run this
|
||||
application with the command-line parameter
|
||||
|
||||
--noauth_local_webserver
|
||||
"""
|
||||
|
||||
_GO_TO_LINK_MESSAGE = """
|
||||
Go to the following link in your browser:
|
||||
|
||||
%s
|
||||
"""
|
||||
|
||||
|
||||
def _CreateArgumentParser():
|
||||
try:
|
||||
@@ -182,14 +208,7 @@ def run_flow(flow, storage, flags=None, http=None):
|
||||
break
|
||||
flags.noauth_local_webserver = not success
|
||||
if not success:
|
||||
print('Failed to start a local webserver listening '
|
||||
'on either port 8080')
|
||||
print('or port 8090. Please check your firewall settings and locally')
|
||||
print('running programs that may be blocking or using those ports.')
|
||||
print()
|
||||
print('Falling back to --noauth_local_webserver and continuing with')
|
||||
print('authorization.')
|
||||
print()
|
||||
print(_FAILED_START_MESSAGE)
|
||||
|
||||
if not flags.noauth_local_webserver:
|
||||
oauth_callback = 'http://%s:%s/' % (flags.auth_host_name, port_number)
|
||||
@@ -201,21 +220,9 @@ def run_flow(flow, storage, flags=None, http=None):
|
||||
if not flags.noauth_local_webserver:
|
||||
import webbrowser
|
||||
webbrowser.open(authorize_url, new=1, autoraise=True)
|
||||
print('Your browser has been opened to visit:')
|
||||
print()
|
||||
print(' ' + authorize_url)
|
||||
print()
|
||||
print('If your browser is on a different machine then '
|
||||
'exit and re-run this')
|
||||
print('application with the command-line parameter ')
|
||||
print()
|
||||
print(' --noauth_local_webserver')
|
||||
print()
|
||||
print(_BROWSER_OPENED_MESSAGE % authorize_url)
|
||||
else:
|
||||
print('Go to the following link in your browser:')
|
||||
print()
|
||||
print(' ' + authorize_url)
|
||||
print()
|
||||
print(_GO_TO_LINK_MESSAGE % authorize_url)
|
||||
|
||||
code = None
|
||||
if not flags.noauth_local_webserver:
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
# See: https://developers.google.com/compute/docs/authentication
|
||||
|
||||
from googleapiclient.discovery import build
|
||||
|
||||
from oauth2client.client import GoogleCredentials
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
# To be used to test GoogleCredentials.get_application_default()
|
||||
# from devel GAE (ie, dev_appserver.py).
|
||||
|
||||
import webapp2
|
||||
from googleapiclient.discovery import build
|
||||
import webapp2
|
||||
|
||||
from oauth2client.client import GoogleCredentials
|
||||
|
||||
|
||||
@@ -23,4 +24,4 @@ class MainPage(webapp2.RequestHandler):
|
||||
self.response.write(get_instances())
|
||||
|
||||
|
||||
app = webapp2.WSGIApplication([('/', MainPage),], debug=True)
|
||||
app = webapp2.WSGIApplication([('/', MainPage), ], debug=True)
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
|
||||
# See: https://developers.google.com/accounts/docs/OAuth2ForDevices
|
||||
|
||||
from googleapiclient.discovery import build
|
||||
import httplib2
|
||||
from six.moves import input
|
||||
|
||||
from oauth2client.client import OAuth2WebServerFlow
|
||||
from googleapiclient.discovery import build
|
||||
|
||||
CLIENT_ID = "some+client+id"
|
||||
CLIENT_SECRET = "some+client+secret"
|
||||
|
||||
@@ -13,11 +13,11 @@
|
||||
# limitations under the License.
|
||||
|
||||
import json
|
||||
import unittest2
|
||||
|
||||
import httplib2
|
||||
from six.moves import http_client
|
||||
from six.moves import urllib
|
||||
import unittest2
|
||||
|
||||
from oauth2client import GOOGLE_TOKEN_INFO_URI
|
||||
from oauth2client.client import GoogleCredentials
|
||||
|
||||
@@ -17,6 +17,7 @@ import os
|
||||
|
||||
import httplib2
|
||||
from six.moves import http_client
|
||||
|
||||
from oauth2client import client
|
||||
from oauth2client.service_account import ServiceAccountCredentials
|
||||
|
||||
@@ -36,8 +37,8 @@ USER_INFO = 'https://www.googleapis.com/oauth2/v2/userinfo'
|
||||
|
||||
def _require_environ():
|
||||
if (JSON_KEY_PATH is None or P12_KEY_PATH is None or
|
||||
P12_KEY_EMAIL is None or USER_KEY_PATH is None or
|
||||
USER_KEY_EMAIL is None):
|
||||
P12_KEY_EMAIL is None or USER_KEY_PATH is None or
|
||||
USER_KEY_EMAIL is None):
|
||||
raise EnvironmentError('Expected environment variables to be set:',
|
||||
'OAUTH2CLIENT_TEST_JSON_KEY_PATH',
|
||||
'OAUTH2CLIENT_TEST_P12_KEY_PATH',
|
||||
|
||||
9
setup.py
9
setup.py
@@ -21,6 +21,11 @@ from __future__ import print_function
|
||||
|
||||
import sys
|
||||
|
||||
from setuptools import find_packages
|
||||
from setuptools import setup
|
||||
|
||||
import oauth2client
|
||||
|
||||
if sys.version_info < (2, 6):
|
||||
print('oauth2client requires python2 version >= 2.6.', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
@@ -28,9 +33,6 @@ if (3, 1) <= sys.version_info < (3, 3):
|
||||
print('oauth2client requires python3 version >= 3.3.', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
from setuptools import find_packages
|
||||
from setuptools import setup
|
||||
|
||||
install_requires = [
|
||||
'httplib2>=0.9.1',
|
||||
'pyasn1>=0.1.7',
|
||||
@@ -41,7 +43,6 @@ install_requires = [
|
||||
|
||||
long_desc = """The oauth2client is a client library for OAuth 2.0."""
|
||||
|
||||
import oauth2client
|
||||
version = oauth2client.__version__
|
||||
|
||||
setup(
|
||||
|
||||
@@ -13,21 +13,15 @@
|
||||
# limitations under the License.
|
||||
|
||||
import datetime
|
||||
import httplib2
|
||||
import json
|
||||
import os
|
||||
import tempfile
|
||||
import time
|
||||
import unittest2
|
||||
|
||||
from six.moves import urllib
|
||||
|
||||
import dev_appserver
|
||||
dev_appserver.fix_sys_path()
|
||||
import mock
|
||||
import webapp2
|
||||
|
||||
from ..http_mock import CacheMock
|
||||
dev_appserver.fix_sys_path()
|
||||
|
||||
from google.appengine.api import apiproxy_stub
|
||||
from google.appengine.api import apiproxy_stub_map
|
||||
from google.appengine.api import app_identity
|
||||
@@ -37,12 +31,25 @@ from google.appengine.api.memcache import memcache_stub
|
||||
from google.appengine.ext import db
|
||||
from google.appengine.ext import ndb
|
||||
from google.appengine.ext import testbed
|
||||
from oauth2client.contrib import appengine
|
||||
from oauth2client import GOOGLE_TOKEN_URI
|
||||
import httplib2
|
||||
import mock
|
||||
from six.moves import urllib
|
||||
import unittest2
|
||||
import webapp2
|
||||
from webtest import TestApp
|
||||
|
||||
from oauth2client import GOOGLE_REVOKE_URI
|
||||
from oauth2client import GOOGLE_TOKEN_URI
|
||||
from oauth2client.client import _CLOUDSDK_CONFIG_ENV_VAR
|
||||
from oauth2client.client import AccessTokenRefreshError
|
||||
from oauth2client.client import Credentials
|
||||
from oauth2client.client import flow_from_clientsecrets
|
||||
from oauth2client.client import OAuth2Credentials
|
||||
from oauth2client.client import save_to_well_known_file
|
||||
from oauth2client.clientsecrets import _loadfile
|
||||
from oauth2client.clientsecrets import TYPE_WEB
|
||||
from oauth2client.clientsecrets import InvalidClientSecretsError
|
||||
from oauth2client.clientsecrets import TYPE_WEB
|
||||
from oauth2client.contrib import appengine
|
||||
from oauth2client.contrib.appengine import AppAssertionCredentials
|
||||
from oauth2client.contrib.appengine import CredentialsModel
|
||||
from oauth2client.contrib.appengine import CredentialsNDBModel
|
||||
@@ -51,17 +58,10 @@ from oauth2client.contrib.appengine import FlowProperty
|
||||
from oauth2client.contrib.appengine import (
|
||||
InvalidClientSecretsError as AppEngineInvalidClientSecretsError)
|
||||
from oauth2client.contrib.appengine import OAuth2Decorator
|
||||
from oauth2client.contrib.appengine import OAuth2DecoratorFromClientSecrets
|
||||
from oauth2client.contrib.appengine import oauth2decorator_from_clientsecrets
|
||||
from oauth2client.contrib.appengine import OAuth2DecoratorFromClientSecrets
|
||||
from oauth2client.contrib.appengine import StorageByKeyName
|
||||
from oauth2client.client import _CLOUDSDK_CONFIG_ENV_VAR
|
||||
from oauth2client.client import AccessTokenRefreshError
|
||||
from oauth2client.client import Credentials
|
||||
from oauth2client.client import OAuth2Credentials
|
||||
from oauth2client.client import flow_from_clientsecrets
|
||||
from oauth2client.client import save_to_well_known_file
|
||||
from webtest import TestApp
|
||||
|
||||
from ..http_mock import CacheMock
|
||||
|
||||
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
||||
|
||||
@@ -847,7 +847,7 @@ class DecoratorTests(unittest2.TestCase):
|
||||
# An initial request to an oauth_aware decorated path should
|
||||
# not redirect.
|
||||
response = self.app.get('/bar_path/2012/01')
|
||||
url = self.decorator.authorize_url()
|
||||
self.decorator.authorize_url()
|
||||
response = self.app.get('/oauth2callback', {
|
||||
'error': 'Bad<Stuff>Happened\''
|
||||
})
|
||||
@@ -903,9 +903,7 @@ class DecoratorTests(unittest2.TestCase):
|
||||
|
||||
with decorator_patch as decorator_mock:
|
||||
filename = datafile('client_secrets.json')
|
||||
decorator = oauth2decorator_from_clientsecrets(
|
||||
filename,
|
||||
scope='foo_scope')
|
||||
oauth2decorator_from_clientsecrets(filename, scope='foo_scope')
|
||||
decorator_mock.assert_called_once_with(
|
||||
filename,
|
||||
'foo_scope',
|
||||
@@ -974,7 +972,7 @@ class DecoratorTests(unittest2.TestCase):
|
||||
def test_decorator_from_unfilled_client_secrets_required(self):
|
||||
MESSAGE = 'File is missing'
|
||||
try:
|
||||
decorator = OAuth2DecoratorFromClientSecrets(
|
||||
OAuth2DecoratorFromClientSecrets(
|
||||
datafile('unfilled_client_secrets.json'),
|
||||
scope=['foo_scope', 'bar_scope'], message=MESSAGE)
|
||||
except InvalidClientSecretsError:
|
||||
@@ -983,7 +981,7 @@ class DecoratorTests(unittest2.TestCase):
|
||||
def test_decorator_from_unfilled_client_secrets_aware(self):
|
||||
MESSAGE = 'File is missing'
|
||||
try:
|
||||
decorator = OAuth2DecoratorFromClientSecrets(
|
||||
OAuth2DecoratorFromClientSecrets(
|
||||
datafile('unfilled_client_secrets.json'),
|
||||
scope=['foo_scope', 'bar_scope'], message=MESSAGE)
|
||||
except InvalidClientSecretsError:
|
||||
|
||||
@@ -19,17 +19,17 @@ import json
|
||||
import os
|
||||
import socket
|
||||
import threading
|
||||
import unittest2
|
||||
|
||||
import mock
|
||||
import unittest2
|
||||
|
||||
from oauth2client.contrib import devshell
|
||||
from oauth2client._helpers import _from_bytes
|
||||
from oauth2client._helpers import _to_bytes
|
||||
from oauth2client.client import save_to_well_known_file
|
||||
from oauth2client.contrib import devshell
|
||||
from oauth2client.contrib.devshell import _SendRecv
|
||||
from oauth2client.contrib.devshell import CREDENTIAL_INFO_REQUEST_JSON
|
||||
from oauth2client.contrib.devshell import CommunicationError
|
||||
from oauth2client.contrib.devshell import CREDENTIAL_INFO_REQUEST_JSON
|
||||
from oauth2client.contrib.devshell import CredentialInfoResponse
|
||||
from oauth2client.contrib.devshell import DEVSHELL_ENV
|
||||
from oauth2client.contrib.devshell import DevshellCredentials
|
||||
|
||||
@@ -19,14 +19,10 @@ Unit tests for objects created from discovery documents.
|
||||
|
||||
import base64
|
||||
import datetime
|
||||
import imp
|
||||
import os
|
||||
import pickle
|
||||
import sys
|
||||
import unittest2
|
||||
# Mock a Django environment
|
||||
from django.conf import global_settings
|
||||
|
||||
# Mock a Django environment
|
||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.contrib.test_django_settings'
|
||||
from django.conf import settings
|
||||
|
||||
@@ -38,8 +34,6 @@ import django
|
||||
django.setup()
|
||||
from django.apps import AppConfig
|
||||
|
||||
import mock
|
||||
|
||||
|
||||
class DjangoOrmTestApp(AppConfig):
|
||||
"""App Config for Django Helper."""
|
||||
@@ -48,6 +42,10 @@ class DjangoOrmTestApp(AppConfig):
|
||||
|
||||
|
||||
from django.db import models
|
||||
import mock
|
||||
import unittest2
|
||||
|
||||
from oauth2client import GOOGLE_TOKEN_URI
|
||||
from oauth2client._helpers import _from_bytes
|
||||
from oauth2client.client import Credentials
|
||||
from oauth2client.client import Flow
|
||||
@@ -55,7 +53,6 @@ from oauth2client.client import OAuth2Credentials
|
||||
from oauth2client.contrib.django_orm import CredentialsField
|
||||
from oauth2client.contrib.django_orm import FlowField
|
||||
from oauth2client.contrib.django_orm import Storage
|
||||
from oauth2client import GOOGLE_TOKEN_URI
|
||||
|
||||
__author__ = 'conleyo@google.com (Conley Owens)'
|
||||
|
||||
|
||||
@@ -13,22 +13,23 @@
|
||||
# limitations under the License.
|
||||
|
||||
import json
|
||||
import unittest2
|
||||
|
||||
from django.conf.urls import include, url
|
||||
from django.core import exceptions
|
||||
from django import http
|
||||
from django import test
|
||||
import mock
|
||||
from oauth2client.client import FlowExchangeError, OAuth2WebServerFlow
|
||||
import django.conf
|
||||
from django.conf.urls import include, url
|
||||
from django.core import exceptions
|
||||
import mock
|
||||
from six.moves import http_client
|
||||
from six.moves.urllib import parse
|
||||
import unittest2
|
||||
|
||||
from oauth2client.client import FlowExchangeError, OAuth2WebServerFlow
|
||||
from oauth2client.contrib import django_util
|
||||
from oauth2client.contrib.django_util import decorators
|
||||
from oauth2client.contrib.django_util import site
|
||||
from oauth2client.contrib.django_util import storage
|
||||
from oauth2client.contrib.django_util import views
|
||||
from six.moves import http_client
|
||||
from six.moves.urllib import parse
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^oauth2/', include(site.urls))
|
||||
@@ -242,9 +243,8 @@ class Oauth2AuthorizeTest(TestWithSession):
|
||||
self.assertTrue(isinstance(response, http.HttpResponseRedirect))
|
||||
|
||||
def test_authorize_works_explicit_return_url(self):
|
||||
request = self.factory.get('oauth2/oauth2authorize', data={
|
||||
'return_url': '/return_endpoint'
|
||||
})
|
||||
request = self.factory.get('oauth2/oauth2authorize',
|
||||
data={'return_url': '/return_endpoint'})
|
||||
request.session = self.session
|
||||
response = views.oauth2_authorize(request)
|
||||
self.assertTrue(isinstance(response, http.HttpResponseRedirect))
|
||||
|
||||
@@ -15,21 +15,21 @@
|
||||
"""Unit tests for the Flask utilities"""
|
||||
|
||||
import datetime
|
||||
import httplib2
|
||||
import json
|
||||
import unittest2
|
||||
|
||||
import flask
|
||||
import six.moves.http_client as httplib
|
||||
import httplib2
|
||||
import mock
|
||||
import six.moves.http_client as httplib
|
||||
import six.moves.urllib.parse as urlparse
|
||||
import unittest2
|
||||
|
||||
from oauth2client import clientsecrets
|
||||
from oauth2client import GOOGLE_AUTH_URI
|
||||
from oauth2client import GOOGLE_TOKEN_URI
|
||||
from oauth2client import clientsecrets
|
||||
from oauth2client.client import OAuth2Credentials
|
||||
from oauth2client.contrib.flask_util import _get_flow_for_token
|
||||
from oauth2client.contrib.flask_util import UserOAuth2 as FlaskOAuth2
|
||||
from oauth2client.client import OAuth2Credentials
|
||||
|
||||
|
||||
__author__ = 'jonwayne@google.com (Jon Wayne Parrott)'
|
||||
@@ -474,7 +474,8 @@ class FlaskOAuth2Tests(unittest2.TestCase):
|
||||
# Starting the authorization flow should include the
|
||||
# include_granted_scopes parameter as well as the scopes.
|
||||
response = client.get(response.headers['Location'][17:])
|
||||
q = urlparse.parse_qs(response.headers['Location'].split('?', 1)[1])
|
||||
q = urlparse.parse_qs(
|
||||
response.headers['Location'].split('?', 1)[1])
|
||||
self.assertIn('include_granted_scopes', q)
|
||||
self.assertEqual(
|
||||
set(q['scope'][0].split(' ')),
|
||||
|
||||
@@ -15,18 +15,18 @@
|
||||
"""Unit tests for oauth2client.contrib.gce."""
|
||||
|
||||
import datetime
|
||||
import httplib2
|
||||
import json
|
||||
|
||||
import httplib2
|
||||
import mock
|
||||
from six.moves import http_client
|
||||
from tests.contrib.test_metadata import request_mock
|
||||
import unittest2
|
||||
|
||||
from oauth2client.client import save_to_well_known_file
|
||||
from oauth2client.client import HttpAccessTokenRefreshError
|
||||
from oauth2client.client import save_to_well_known_file
|
||||
from oauth2client.contrib.gce import _SCOPES_WARNING
|
||||
from oauth2client.contrib.gce import AppAssertionCredentials
|
||||
from tests.contrib.test_metadata import request_mock
|
||||
|
||||
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
||||
|
||||
@@ -36,6 +36,7 @@ SERVICE_ACCOUNT_INFO = {
|
||||
'aliases': ['default']
|
||||
}
|
||||
|
||||
|
||||
class AppAssertionCredentialsTests(unittest2.TestCase):
|
||||
|
||||
def test_constructor(self):
|
||||
@@ -78,11 +79,13 @@ class AppAssertionCredentialsTests(unittest2.TestCase):
|
||||
credentials.get_access_token(http=http_mock)
|
||||
self.assertEqual(credentials.access_token, 'A')
|
||||
self.assertTrue(credentials.access_token_expired)
|
||||
get_token.assert_called_with(http_request, service_account='a@example.com')
|
||||
get_token.assert_called_with(http_request,
|
||||
service_account='a@example.com')
|
||||
credentials.get_access_token(http=http_mock)
|
||||
self.assertEqual(credentials.access_token, 'B')
|
||||
self.assertFalse(credentials.access_token_expired)
|
||||
get_token.assert_called_with(http_request, service_account='a@example.com')
|
||||
get_token.assert_called_with(http_request,
|
||||
service_account='a@example.com')
|
||||
get_info.assert_not_called()
|
||||
|
||||
def test_refresh_token_failed_fetch(self):
|
||||
@@ -124,7 +127,8 @@ class AppAssertionCredentialsTests(unittest2.TestCase):
|
||||
self.assertFalse(credentials.invalid)
|
||||
credentials.retrieve_scopes(http_mock)
|
||||
# Assert scopes weren't refetched
|
||||
metadata.assert_called_once_with(http_request, service_account='default')
|
||||
metadata.assert_called_once_with(http_request,
|
||||
service_account='default')
|
||||
|
||||
@mock.patch('oauth2client.contrib._metadata.get_service_account_info',
|
||||
side_effect=httplib2.HttpLib2Error('No Such Email'))
|
||||
@@ -135,7 +139,8 @@ class AppAssertionCredentialsTests(unittest2.TestCase):
|
||||
with self.assertRaises(httplib2.HttpLib2Error):
|
||||
credentials.retrieve_scopes(http_mock)
|
||||
|
||||
metadata.assert_called_once_with(http_request, service_account='b@example.com')
|
||||
metadata.assert_called_once_with(http_request,
|
||||
service_account='b@example.com')
|
||||
|
||||
def test_save_to_well_known_file(self):
|
||||
import os
|
||||
|
||||
@@ -15,11 +15,11 @@
|
||||
"""Tests for oauth2client.contrib.keyring_storage."""
|
||||
|
||||
import datetime
|
||||
import keyring
|
||||
import threading
|
||||
import unittest2
|
||||
|
||||
import keyring
|
||||
import mock
|
||||
import unittest2
|
||||
|
||||
from oauth2client import GOOGLE_TOKEN_URI
|
||||
from oauth2client.client import OAuth2Credentials
|
||||
|
||||
@@ -13,12 +13,12 @@
|
||||
# limitations under the License.
|
||||
|
||||
import datetime
|
||||
import httplib2
|
||||
import json
|
||||
import mock
|
||||
import unittest2
|
||||
|
||||
import httplib2
|
||||
import mock
|
||||
from six.moves import http_client
|
||||
import unittest2
|
||||
|
||||
from oauth2client.contrib import _metadata
|
||||
|
||||
@@ -81,7 +81,7 @@ class TestMetadata(unittest2.TestCase):
|
||||
self.assertEqual(
|
||||
expiry, datetime.datetime.min + datetime.timedelta(seconds=100))
|
||||
http_request.assert_called_once_with(
|
||||
EXPECTED_URL+'/token',
|
||||
EXPECTED_URL + '/token',
|
||||
**EXPECTED_KWARGS
|
||||
)
|
||||
now.assert_called_once_with()
|
||||
@@ -92,6 +92,6 @@ class TestMetadata(unittest2.TestCase):
|
||||
info = _metadata.get_service_account_info(http_request)
|
||||
self.assertEqual(info, DATA)
|
||||
http_request.assert_called_once_with(
|
||||
EXPECTED_URL+'/?recursive=True',
|
||||
EXPECTED_URL + '/?recursive=True',
|
||||
**EXPECTED_KWARGS
|
||||
)
|
||||
|
||||
@@ -19,9 +19,9 @@ import errno
|
||||
import os
|
||||
import stat
|
||||
import tempfile
|
||||
import unittest2
|
||||
|
||||
import mock
|
||||
import unittest2
|
||||
|
||||
from oauth2client import util
|
||||
from oauth2client.client import OAuth2Credentials
|
||||
|
||||
@@ -14,14 +14,15 @@
|
||||
|
||||
import datetime
|
||||
|
||||
import oauth2client
|
||||
import oauth2client.client
|
||||
import oauth2client.contrib.sqlalchemy
|
||||
import sqlalchemy
|
||||
import sqlalchemy.ext.declarative
|
||||
import sqlalchemy.orm
|
||||
import unittest2
|
||||
|
||||
import oauth2client
|
||||
import oauth2client.client
|
||||
import oauth2client.contrib.sqlalchemy
|
||||
|
||||
Base = sqlalchemy.ext.declarative.declarative_base()
|
||||
|
||||
|
||||
|
||||
@@ -15,9 +15,9 @@
|
||||
"""Tests for oauth2client.contrib.xsrfutil."""
|
||||
|
||||
import base64
|
||||
import unittest2
|
||||
|
||||
import mock
|
||||
import unittest2
|
||||
|
||||
from oauth2client._helpers import _to_bytes
|
||||
from oauth2client.contrib import xsrfutil
|
||||
@@ -49,7 +49,6 @@ class Test_generate_token(unittest2.TestCase):
|
||||
|
||||
def test_it(self):
|
||||
digest = b'foobar'
|
||||
curr_time = 1440449755.74
|
||||
digester = mock.MagicMock()
|
||||
digester.digest = mock.MagicMock(name='digest', return_value=digest)
|
||||
with mock.patch('oauth2client.contrib.xsrfutil.hmac') as hmac:
|
||||
|
||||
@@ -22,8 +22,8 @@ import rsa
|
||||
import six
|
||||
import unittest2
|
||||
|
||||
from oauth2client._helpers import _from_bytes
|
||||
from oauth2client import _pure_python_crypt
|
||||
from oauth2client._helpers import _from_bytes
|
||||
from oauth2client.crypt import RsaSigner
|
||||
from oauth2client.crypt import RsaVerifier
|
||||
|
||||
@@ -33,7 +33,7 @@ class TestRsaVerifier(unittest2.TestCase):
|
||||
PUBLIC_KEY_FILENAME = os.path.join(os.path.dirname(__file__),
|
||||
'data', 'privatekey.pub')
|
||||
PUBLIC_CERT_FILENAME = os.path.join(os.path.dirname(__file__),
|
||||
'data', 'public_cert.pem')
|
||||
'data', 'public_cert.pem')
|
||||
PRIVATE_KEY_FILENAME = os.path.join(os.path.dirname(__file__),
|
||||
'data', 'privatekey.pem')
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
"""Unit tests for oauth2client._pycrypto_crypt."""
|
||||
|
||||
import os
|
||||
|
||||
import unittest2
|
||||
|
||||
from oauth2client.crypt import PyCryptoSigner
|
||||
|
||||
@@ -34,38 +34,12 @@ from six.moves import http_client
|
||||
from six.moves import urllib
|
||||
import unittest2
|
||||
|
||||
from .http_mock import CacheMock
|
||||
from .http_mock import HttpMock
|
||||
from .http_mock import HttpMockSequence
|
||||
from oauth2client import GOOGLE_REVOKE_URI
|
||||
from oauth2client import GOOGLE_TOKEN_URI
|
||||
from oauth2client import GOOGLE_TOKEN_INFO_URI
|
||||
from oauth2client import client
|
||||
from oauth2client import GOOGLE_REVOKE_URI
|
||||
from oauth2client import GOOGLE_TOKEN_INFO_URI
|
||||
from oauth2client import GOOGLE_TOKEN_URI
|
||||
from oauth2client import util as oauth2client_util
|
||||
from oauth2client.client import AccessTokenCredentials
|
||||
from oauth2client.client import AccessTokenCredentialsError
|
||||
from oauth2client.client import HttpAccessTokenRefreshError
|
||||
from oauth2client.client import ADC_HELP_MSG
|
||||
from oauth2client.client import AssertionCredentials
|
||||
from oauth2client.client import AUTHORIZED_USER
|
||||
from oauth2client.client import Credentials
|
||||
from oauth2client.client import DEFAULT_ENV_NAME
|
||||
from oauth2client.client import DeviceFlowInfo
|
||||
from oauth2client.client import Error
|
||||
from oauth2client.client import ApplicationDefaultCredentialsError
|
||||
from oauth2client.client import FlowExchangeError
|
||||
from oauth2client.client import GoogleCredentials
|
||||
from oauth2client.client import GOOGLE_APPLICATION_CREDENTIALS
|
||||
from oauth2client.client import MemoryCache
|
||||
from oauth2client.client import NonAsciiHeaderError
|
||||
from oauth2client.client import OAuth2Credentials
|
||||
from oauth2client.client import OAuth2WebServerFlow
|
||||
from oauth2client.client import OOB_CALLBACK_URN
|
||||
from oauth2client.client import REFRESH_STATUS_CODES
|
||||
from oauth2client.client import SERVICE_ACCOUNT
|
||||
from oauth2client.client import Storage
|
||||
from oauth2client.client import TokenRevokeError
|
||||
from oauth2client.client import VerifyJwtTokenError
|
||||
from oauth2client._helpers import _to_bytes
|
||||
from oauth2client.client import _extract_id_token
|
||||
from oauth2client.client import _get_application_default_credential_from_file
|
||||
from oauth2client.client import _get_environment_variable_file
|
||||
@@ -76,15 +50,41 @@ from oauth2client.client import _raise_exception_for_missing_fields
|
||||
from oauth2client.client import _raise_exception_for_reading_json
|
||||
from oauth2client.client import _update_query_params
|
||||
from oauth2client.client import _WELL_KNOWN_CREDENTIALS_FILE
|
||||
from oauth2client.client import AccessTokenCredentials
|
||||
from oauth2client.client import AccessTokenCredentialsError
|
||||
from oauth2client.client import ADC_HELP_MSG
|
||||
from oauth2client.client import ApplicationDefaultCredentialsError
|
||||
from oauth2client.client import AssertionCredentials
|
||||
from oauth2client.client import AUTHORIZED_USER
|
||||
from oauth2client.client import Credentials
|
||||
from oauth2client.client import credentials_from_clientsecrets_and_code
|
||||
from oauth2client.client import credentials_from_code
|
||||
from oauth2client.client import DEFAULT_ENV_NAME
|
||||
from oauth2client.client import DeviceFlowInfo
|
||||
from oauth2client.client import Error
|
||||
from oauth2client.client import flow_from_clientsecrets
|
||||
from oauth2client.client import FlowExchangeError
|
||||
from oauth2client.client import GOOGLE_APPLICATION_CREDENTIALS
|
||||
from oauth2client.client import GoogleCredentials
|
||||
from oauth2client.client import HttpAccessTokenRefreshError
|
||||
from oauth2client.client import MemoryCache
|
||||
from oauth2client.client import NonAsciiHeaderError
|
||||
from oauth2client.client import OAuth2Credentials
|
||||
from oauth2client.client import OAuth2WebServerFlow
|
||||
from oauth2client.client import OOB_CALLBACK_URN
|
||||
from oauth2client.client import REFRESH_STATUS_CODES
|
||||
from oauth2client.client import save_to_well_known_file
|
||||
from oauth2client.client import SERVICE_ACCOUNT
|
||||
from oauth2client.client import Storage
|
||||
from oauth2client.client import TokenRevokeError
|
||||
from oauth2client.client import VerifyJwtTokenError
|
||||
from oauth2client.clientsecrets import _loadfile
|
||||
from oauth2client.clientsecrets import InvalidClientSecretsError
|
||||
from oauth2client.clientsecrets import TYPE_WEB
|
||||
from oauth2client.service_account import ServiceAccountCredentials
|
||||
from oauth2client._helpers import _to_bytes
|
||||
from .http_mock import CacheMock
|
||||
from .http_mock import HttpMock
|
||||
from .http_mock import HttpMockSequence
|
||||
|
||||
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
||||
|
||||
@@ -124,7 +124,7 @@ class CredentialsTests(unittest2.TestCase):
|
||||
def test_to_from_json(self):
|
||||
credentials = Credentials()
|
||||
json = credentials.to_json()
|
||||
restored = Credentials.new_from_json(json)
|
||||
Credentials.new_from_json(json)
|
||||
|
||||
def test_authorize_abstract(self):
|
||||
credentials = Credentials()
|
||||
@@ -457,7 +457,7 @@ class GoogleCredentialsTests(unittest2.TestCase):
|
||||
client._METADATA_FLAVOR_HEADER)
|
||||
else:
|
||||
self.assertEqual(
|
||||
http_client_module.HTTPConnection.mock_calls, [])
|
||||
http_client_module.HTTPConnection.mock_calls, [])
|
||||
self.assertEqual(connection.getresponse.mock_calls, [])
|
||||
# Remaining calls are not "getresponse"
|
||||
self.assertEqual(connection.method_calls, [])
|
||||
@@ -1863,8 +1863,7 @@ class OAuth2WebServerFlowTest(unittest2.TestCase):
|
||||
])
|
||||
|
||||
with self.assertRaises(FlowExchangeError):
|
||||
credentials = self.flow.step2_exchange(code='some random code',
|
||||
http=http)
|
||||
self.flow.step2_exchange(code='some random code', http=http)
|
||||
|
||||
def test_urlencoded_exchange_failure(self):
|
||||
http = HttpMockSequence([
|
||||
@@ -1873,8 +1872,7 @@ class OAuth2WebServerFlowTest(unittest2.TestCase):
|
||||
|
||||
with self.assertRaisesRegexp(FlowExchangeError,
|
||||
'invalid_request'):
|
||||
credentials = self.flow.step2_exchange(code='some random code',
|
||||
http=http)
|
||||
self.flow.step2_exchange(code='some random code', http=http)
|
||||
|
||||
def test_exchange_failure_with_json_error(self):
|
||||
# Some providers have 'error' attribute as a JSON object
|
||||
@@ -1890,8 +1888,7 @@ class OAuth2WebServerFlowTest(unittest2.TestCase):
|
||||
http = HttpMockSequence([({'status': '400'}, payload)])
|
||||
|
||||
with self.assertRaises(FlowExchangeError):
|
||||
credentials = self.flow.step2_exchange(code='some random code',
|
||||
http=http)
|
||||
self.flow.step2_exchange(code='some random code', http=http)
|
||||
|
||||
def _exchange_success_test_helper(self, code=None, device_flow_info=None):
|
||||
payload = (b'{'
|
||||
@@ -2040,9 +2037,8 @@ class OAuth2WebServerFlowTest(unittest2.TestCase):
|
||||
http = HttpMockSequence([({'status': '200'}, payload)])
|
||||
|
||||
code = {'error': 'thou shall not pass'}
|
||||
with self.assertRaisesRegexp(FlowExchangeError,
|
||||
'shall not pass'):
|
||||
credentials = self.flow.step2_exchange(code=code, http=http)
|
||||
with self.assertRaisesRegexp(FlowExchangeError, 'shall not pass'):
|
||||
self.flow.step2_exchange(code=code, http=http)
|
||||
|
||||
def test_exchange_id_token_fail(self):
|
||||
payload = (b'{'
|
||||
@@ -2153,7 +2149,8 @@ class FlowFromCachedClientsecrets(unittest2.TestCase):
|
||||
filename = object()
|
||||
cache = object()
|
||||
message = 'hi mom'
|
||||
expected = 'The client secrets were invalid: \n{0}\n{1}'.format('foobar', 'hi mom')
|
||||
expected = ('The client secrets were invalid: '
|
||||
'\n{0}\n{1}'.format('foobar', 'hi mom'))
|
||||
|
||||
flow_from_clientsecrets(filename, None, cache=cache, message=message)
|
||||
sys_exit.assert_called_once_with(expected)
|
||||
@@ -2190,9 +2187,8 @@ class CredentialsFromCodeTests(unittest2.TestCase):
|
||||
({'status': '200'}, payload.encode('utf-8')),
|
||||
])
|
||||
credentials = credentials_from_code(self.client_id, self.client_secret,
|
||||
self.scope, self.code,
|
||||
redirect_uri=self.redirect_uri,
|
||||
http=http)
|
||||
self.scope, self.code, http=http,
|
||||
redirect_uri=self.redirect_uri)
|
||||
self.assertEqual(credentials.access_token, token)
|
||||
self.assertNotEqual(None, credentials.token_expiry)
|
||||
self.assertEqual(set(['foo']), credentials.scopes)
|
||||
@@ -2203,11 +2199,9 @@ class CredentialsFromCodeTests(unittest2.TestCase):
|
||||
])
|
||||
|
||||
with self.assertRaises(FlowExchangeError):
|
||||
credentials = credentials_from_code(self.client_id,
|
||||
self.client_secret,
|
||||
self.scope, self.code,
|
||||
redirect_uri=self.redirect_uri,
|
||||
http=http)
|
||||
credentials_from_code(self.client_id, self.client_secret,
|
||||
self.scope, self.code, http=http,
|
||||
redirect_uri=self.redirect_uri)
|
||||
|
||||
def test_exchange_code_and_file_for_token(self):
|
||||
payload = (b'{'
|
||||
@@ -2241,7 +2235,7 @@ class CredentialsFromCodeTests(unittest2.TestCase):
|
||||
])
|
||||
|
||||
with self.assertRaises(FlowExchangeError):
|
||||
credentials = credentials_from_clientsecrets_and_code(
|
||||
credentials_from_clientsecrets_and_code(
|
||||
datafile('client_secrets.json'), self.scope,
|
||||
self.code, http=http)
|
||||
|
||||
|
||||
@@ -18,13 +18,14 @@ import errno
|
||||
from io import StringIO
|
||||
import os
|
||||
import tempfile
|
||||
|
||||
import unittest2
|
||||
|
||||
from oauth2client._helpers import _from_bytes
|
||||
from oauth2client import clientsecrets
|
||||
from oauth2client import GOOGLE_AUTH_URI
|
||||
from oauth2client import GOOGLE_REVOKE_URI
|
||||
from oauth2client import GOOGLE_TOKEN_URI
|
||||
from oauth2client import clientsecrets
|
||||
from oauth2client._helpers import _from_bytes
|
||||
|
||||
|
||||
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
||||
@@ -121,11 +122,11 @@ class Test__validate_clientsecrets(unittest2.TestCase):
|
||||
|
||||
def test_success_type_web(self):
|
||||
client_info = {
|
||||
'client_id': 'eye-dee',
|
||||
'client_secret': 'seekrit',
|
||||
'redirect_uris': None,
|
||||
'auth_uri': None,
|
||||
'token_uri': None,
|
||||
'client_id': 'eye-dee',
|
||||
'client_secret': 'seekrit',
|
||||
'redirect_uris': None,
|
||||
'auth_uri': None,
|
||||
'token_uri': None,
|
||||
}
|
||||
clientsecrets_dict = {
|
||||
clientsecrets.TYPE_WEB: client_info,
|
||||
@@ -135,11 +136,11 @@ class Test__validate_clientsecrets(unittest2.TestCase):
|
||||
|
||||
def test_success_type_installed(self):
|
||||
client_info = {
|
||||
'client_id': 'eye-dee',
|
||||
'client_secret': 'seekrit',
|
||||
'redirect_uris': None,
|
||||
'auth_uri': None,
|
||||
'token_uri': None,
|
||||
'client_id': 'eye-dee',
|
||||
'client_secret': 'seekrit',
|
||||
'redirect_uris': None,
|
||||
'auth_uri': None,
|
||||
'token_uri': None,
|
||||
}
|
||||
clientsecrets_dict = {
|
||||
clientsecrets.TYPE_INSTALLED: client_info,
|
||||
|
||||
@@ -14,13 +14,13 @@
|
||||
|
||||
import base64
|
||||
import os
|
||||
import unittest2
|
||||
|
||||
import mock
|
||||
import unittest2
|
||||
|
||||
from oauth2client import _helpers
|
||||
from oauth2client.client import HAS_OPENSSL
|
||||
from oauth2client import crypt
|
||||
from oauth2client.client import HAS_OPENSSL
|
||||
from oauth2client.service_account import ServiceAccountCredentials
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ class Test_pkcs12_key_as_pem(unittest2.TestCase):
|
||||
'some_account@example.com',
|
||||
filename,
|
||||
scopes='read+write')
|
||||
credentials._kwargs['sub'] ='joe@example.org'
|
||||
credentials._kwargs['sub'] = 'joe@example.org'
|
||||
return credentials
|
||||
|
||||
def _succeeds_helper(self, password=None):
|
||||
@@ -171,6 +171,7 @@ class Test__check_audience(unittest2.TestCase):
|
||||
with self.assertRaises(crypt.AppIdentityError):
|
||||
crypt._check_audience(payload_dict, audience2)
|
||||
|
||||
|
||||
class Test__verify_time_range(unittest2.TestCase):
|
||||
|
||||
def _exception_helper(self, payload_dict):
|
||||
|
||||
@@ -24,15 +24,16 @@ import os
|
||||
import pickle
|
||||
import stat
|
||||
import tempfile
|
||||
import unittest2
|
||||
|
||||
from .http_mock import HttpMockSequence
|
||||
import six
|
||||
from six.moves import http_client
|
||||
import unittest2
|
||||
|
||||
from oauth2client import file
|
||||
from oauth2client.client import AccessTokenCredentials
|
||||
from oauth2client.client import OAuth2Credentials
|
||||
from six.moves import http_client
|
||||
from .http_mock import HttpMockSequence
|
||||
|
||||
try:
|
||||
# Python2
|
||||
from future_builtins import oct
|
||||
|
||||
@@ -21,16 +21,16 @@ import time
|
||||
import mock
|
||||
import unittest2
|
||||
|
||||
from .http_mock import HttpMockSequence
|
||||
from oauth2client.client import Credentials
|
||||
from oauth2client.client import VerifyJwtTokenError
|
||||
from oauth2client.client import verify_id_token
|
||||
from oauth2client.client import HAS_OPENSSL
|
||||
from oauth2client.client import HAS_CRYPTO
|
||||
from oauth2client import crypt
|
||||
from oauth2client.client import Credentials
|
||||
from oauth2client.client import HAS_CRYPTO
|
||||
from oauth2client.client import HAS_OPENSSL
|
||||
from oauth2client.client import verify_id_token
|
||||
from oauth2client.client import VerifyJwtTokenError
|
||||
from oauth2client.file import Storage
|
||||
from oauth2client.service_account import _PASSWORD_DEFAULT
|
||||
from oauth2client.service_account import ServiceAccountCredentials
|
||||
from .http_mock import HttpMockSequence
|
||||
|
||||
|
||||
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
||||
@@ -147,15 +147,14 @@ class CryptTests(unittest2.TestCase):
|
||||
|
||||
def test_verify_id_token_with_certs_uri_fails(self):
|
||||
jwt = self._create_signed_jwt()
|
||||
test_email = 'some_audience_address@testing.gserviceaccount.com'
|
||||
|
||||
http = HttpMockSequence([
|
||||
({'status': '404'}, datafile('certs.json')),
|
||||
])
|
||||
|
||||
with self.assertRaises(VerifyJwtTokenError):
|
||||
verify_id_token(jwt,
|
||||
'some_audience_address@testing.gserviceaccount.com',
|
||||
http=http)
|
||||
verify_id_token(jwt, test_email, http=http)
|
||||
|
||||
def test_verify_id_token_bad_tokens(self):
|
||||
private_key = datafile('privatekey.' + self.format_)
|
||||
|
||||
@@ -20,20 +20,19 @@ Unit tests for service account credentials implemented using RSA.
|
||||
import datetime
|
||||
import json
|
||||
import os
|
||||
import rsa
|
||||
import tempfile
|
||||
|
||||
import httplib2
|
||||
import mock
|
||||
import rsa
|
||||
from six import BytesIO
|
||||
import unittest2
|
||||
|
||||
from .http_mock import HttpMockSequence
|
||||
from oauth2client import crypt
|
||||
from oauth2client.service_account import _JWTAccessCredentials
|
||||
from oauth2client.service_account import ServiceAccountCredentials
|
||||
from oauth2client.service_account import SERVICE_ACCOUNT
|
||||
|
||||
from six import BytesIO
|
||||
from oauth2client.service_account import ServiceAccountCredentials
|
||||
from .http_mock import HttpMockSequence
|
||||
|
||||
|
||||
def data_filename(filename):
|
||||
@@ -114,7 +113,7 @@ class ServiceAccountCredentialsTests(unittest2.TestCase):
|
||||
return_value=object())
|
||||
def test_from_json_keyfile_name_factory(self, signer_factory):
|
||||
client_id = 'id123'
|
||||
client_email= 'foo@bar.com'
|
||||
client_email = 'foo@bar.com'
|
||||
private_key_id = 'pkid456'
|
||||
private_key = 's3kr3tz'
|
||||
payload = {
|
||||
@@ -179,12 +178,14 @@ class ServiceAccountCredentialsTests(unittest2.TestCase):
|
||||
for creds in (creds_from_filename, creds_from_file_contents):
|
||||
self.assertIsInstance(creds, ServiceAccountCredentials)
|
||||
self.assertIsNone(creds.client_id)
|
||||
self.assertEqual(creds._service_account_email, service_account_email)
|
||||
self.assertEqual(creds._service_account_email,
|
||||
service_account_email)
|
||||
self.assertIsNone(creds._private_key_id)
|
||||
self.assertIsNone(creds._private_key_pkcs8_pem)
|
||||
self.assertEqual(creds._private_key_pkcs12, key_contents)
|
||||
if private_key_password is not None:
|
||||
self.assertEqual(creds._private_key_password, private_key_password)
|
||||
self.assertEqual(creds._private_key_password,
|
||||
private_key_password)
|
||||
self.assertEqual(creds._scopes, ' '.join(scopes))
|
||||
self.assertEqual(creds.token_uri, token_uri)
|
||||
self.assertEqual(creds.revoke_uri, revoke_uri)
|
||||
@@ -435,13 +436,13 @@ class JWTAccessCredentialsTests(unittest2.TestCase):
|
||||
utcnow.return_value = T1_DATE
|
||||
time.return_value = T1
|
||||
|
||||
token_info = self.jwt.get_access_token(additional_claims=
|
||||
{'aud': 'https://test2.url.com',
|
||||
'sub': 'dummy2@google.com'
|
||||
})
|
||||
token_info = self.jwt.get_access_token(
|
||||
additional_claims={'aud': 'https://test2.url.com',
|
||||
'sub': 'dummy2@google.com'
|
||||
})
|
||||
payload = crypt.verify_signed_jwt_with_certs(
|
||||
token_info.access_token,
|
||||
{'key' : datafile('public_cert.pem')},
|
||||
{'key': datafile('public_cert.pem')},
|
||||
audience='https://test2.url.com')
|
||||
expires_in = token_info.expires_in
|
||||
self.assertEqual(payload['iss'], self.service_account_email)
|
||||
@@ -449,13 +450,13 @@ class JWTAccessCredentialsTests(unittest2.TestCase):
|
||||
self.assertEqual(payload['iat'], T1)
|
||||
self.assertEqual(payload['exp'], T1_EXPIRY)
|
||||
self.assertEqual(expires_in, T1_EXPIRY - T1)
|
||||
|
||||
|
||||
def test_revoke(self):
|
||||
self.jwt.revoke(None)
|
||||
|
||||
|
||||
def test_create_scoped_required(self):
|
||||
self.assertTrue(self.jwt.create_scoped_required())
|
||||
|
||||
|
||||
def test_create_scoped(self):
|
||||
self.jwt._private_key_pkcs12 = ''
|
||||
self.jwt._private_key_password = ''
|
||||
@@ -464,7 +465,7 @@ class JWTAccessCredentialsTests(unittest2.TestCase):
|
||||
self.assertNotEqual(self.jwt, new_credentials)
|
||||
self.assertIsInstance(new_credentials, ServiceAccountCredentials)
|
||||
self.assertEqual('dummy_scope', new_credentials._scopes)
|
||||
|
||||
|
||||
@mock.patch('oauth2client.service_account._UTCNOW')
|
||||
@mock.patch('oauth2client.client._UTCNOW')
|
||||
@mock.patch('time.time')
|
||||
@@ -479,7 +480,7 @@ class JWTAccessCredentialsTests(unittest2.TestCase):
|
||||
bearer, token = headers[b'Authorization'].split()
|
||||
payload = crypt.verify_signed_jwt_with_certs(
|
||||
token,
|
||||
{'key': datafile('public_cert.pem')},
|
||||
{'key': datafile('public_cert.pem')},
|
||||
audience=self.url)
|
||||
self.assertEqual(payload['iss'], self.service_account_email)
|
||||
self.assertEqual(payload['sub'], self.service_account_email)
|
||||
|
||||
@@ -20,9 +20,9 @@ import mock
|
||||
from six.moves.urllib import request
|
||||
import unittest2
|
||||
|
||||
from oauth2client import tools
|
||||
from oauth2client.client import FlowExchangeError
|
||||
from oauth2client.client import OOB_CALLBACK_URN
|
||||
from oauth2client import tools
|
||||
|
||||
try:
|
||||
import argparse
|
||||
@@ -68,11 +68,10 @@ class TestRunFlow(unittest2.TestCase):
|
||||
self.server_flags = argparse.Namespace(
|
||||
noauth_local_webserver=False,
|
||||
logging_level='INFO',
|
||||
auth_host_port=[8080,],
|
||||
auth_host_port=[8080, ],
|
||||
auth_host_name='localhost')
|
||||
|
||||
@mock.patch.object(sys, 'argv',
|
||||
['ignored', '--noauth_local_webserver'])
|
||||
@mock.patch.object(sys, 'argv', ['ignored', '--noauth_local_webserver'])
|
||||
@mock.patch('oauth2client.tools.logging')
|
||||
@mock.patch('oauth2client.tools.input')
|
||||
def test_run_flow_no_webserver(self, input_mock, logging_mock):
|
||||
@@ -149,8 +148,7 @@ class TestRunFlow(unittest2.TestCase):
|
||||
|
||||
# Exchange returned an error code.
|
||||
with self.assertRaises(SystemExit):
|
||||
returned_credentials = tools.run_flow(
|
||||
self.flow, self.storage, flags=self.server_flags)
|
||||
tools.run_flow(self.flow, self.storage, flags=self.server_flags)
|
||||
|
||||
self.assertTrue(self.server.handle_request.called)
|
||||
|
||||
@@ -164,8 +162,7 @@ class TestRunFlow(unittest2.TestCase):
|
||||
|
||||
# No code found in response
|
||||
with self.assertRaises(SystemExit):
|
||||
returned_credentials = tools.run_flow(
|
||||
self.flow, self.storage, flags=self.server_flags)
|
||||
tools.run_flow(self.flow, self.storage, flags=self.server_flags)
|
||||
|
||||
self.assertTrue(self.server.handle_request.called)
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ from oauth2client import util
|
||||
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
||||
|
||||
|
||||
|
||||
class PositionalTests(unittest2.TestCase):
|
||||
|
||||
def test_usage(self):
|
||||
@@ -45,7 +44,6 @@ class PositionalTests(unittest2.TestCase):
|
||||
with self.assertRaises(TypeError):
|
||||
fn3(1, 2)
|
||||
|
||||
|
||||
@mock.patch('oauth2client.util.logger')
|
||||
def test_enforcement_warning(self, mock_logger):
|
||||
util.positional_parameters_enforcement = util.POSITIONAL_WARNING
|
||||
@@ -57,7 +55,6 @@ class PositionalTests(unittest2.TestCase):
|
||||
self.assertTrue(fn(1, 2))
|
||||
self.assertTrue(mock_logger.warning.called)
|
||||
|
||||
|
||||
@mock.patch('oauth2client.util.logger')
|
||||
def test_enforcement_ignore(self, mock_logger):
|
||||
util.positional_parameters_enforcement = util.POSITIONAL_IGNORE
|
||||
@@ -104,7 +101,6 @@ class StringToScopeTests(unittest2.TestCase):
|
||||
self.assertEqual(expected, util.string_to_scopes(case))
|
||||
|
||||
|
||||
|
||||
class AddQueryParameterTests(unittest2.TestCase):
|
||||
|
||||
def test__add_query_parameter(self):
|
||||
|
||||
21
tox.ini
21
tox.ini
@@ -154,3 +154,24 @@ commands =
|
||||
deps =
|
||||
pycrypto>=2.6
|
||||
passenv = {[testenv:system-tests]passenv}
|
||||
|
||||
[testenv:flake8]
|
||||
commands = flake8 --import-order-style google {posargs}
|
||||
deps =
|
||||
flake8-putty
|
||||
flake8-import-order
|
||||
|
||||
[flake8]
|
||||
exclude = .tox,.git,./*.egg,build,
|
||||
application-import-names = oauth2client
|
||||
putty-ignore =
|
||||
# E402 module level import not at top of file
|
||||
# These files have needed configurations defined before import
|
||||
docs/conf.py : E402
|
||||
tests/contrib/test_appengine.py : E402
|
||||
# Additionally, ignore E100 (imports in wrong order) for Django configuration
|
||||
tests/contrib/test_django_orm.py : E402,I100
|
||||
# E501 line too long
|
||||
# Ignore lines over 80 chars that include "http:" or "https:"
|
||||
/http:/ : E501
|
||||
/https:/ : E501
|
||||
|
||||
Reference in New Issue
Block a user