| Index: third_party/oauth2client/multistore_file.py
|
| diff --git a/third_party/oauth2client/multistore_file.py b/third_party/oauth2client/multistore_file.py
|
| index ea89027f236d047851f0183464e73b1ea68de4c0..5008c00ee0324e83ec4025640825454c23126d89 100644
|
| --- a/third_party/oauth2client/multistore_file.py
|
| +++ b/third_party/oauth2client/multistore_file.py
|
| @@ -1,4 +1,4 @@
|
| -# Copyright 2011 Google Inc.
|
| +# Copyright 2014 Google Inc. All rights reserved.
|
| #
|
| # Licensed under the Apache License, Version 2.0 (the "License");
|
| # you may not use this file except in compliance with the License.
|
| @@ -19,39 +19,41 @@ credentials can be stored in one file. That file supports locking
|
| both in a single process and across processes.
|
|
|
| The credential themselves are keyed off of:
|
| +
|
| * client_id
|
| * user_agent
|
| * scope
|
|
|
| -The format of the stored data is like so:
|
| -{
|
| - 'file_version': 1,
|
| - 'data': [
|
| - {
|
| - 'key': {
|
| - 'clientId': '<client id>',
|
| - 'userAgent': '<user agent>',
|
| - 'scope': '<scope>'
|
| - },
|
| - 'credential': {
|
| - # JSON serialized Credentials.
|
| +The format of the stored data is like so::
|
| +
|
| + {
|
| + 'file_version': 1,
|
| + 'data': [
|
| + {
|
| + 'key': {
|
| + 'clientId': '<client id>',
|
| + 'userAgent': '<user agent>',
|
| + 'scope': '<scope>'
|
| + },
|
| + 'credential': {
|
| + # JSON serialized Credentials.
|
| + }
|
| }
|
| - }
|
| - ]
|
| -}
|
| + ]
|
| + }
|
| +
|
| """
|
|
|
| __author__ = 'jbeda@google.com (Joe Beda)'
|
|
|
| -import base64
|
| import errno
|
| +import json
|
| import logging
|
| import os
|
| import threading
|
|
|
| -from anyjson import simplejson
|
| -from .client import Storage as BaseStorage
|
| from .client import Credentials
|
| +from .client import Storage as BaseStorage
|
| from . import util
|
| from locked_file import LockedFile
|
|
|
| @@ -64,12 +66,10 @@ _multistores_lock = threading.Lock()
|
|
|
| class Error(Exception):
|
| """Base error for this module."""
|
| - pass
|
|
|
|
|
| class NewerCredentialStoreError(Error):
|
| - """The credential store is a newer version that supported."""
|
| - pass
|
| + """The credential store is a newer version than supported."""
|
|
|
|
|
| @util.positional(4)
|
| @@ -193,7 +193,7 @@ class _MultiStore(object):
|
|
|
| This will create the file if necessary.
|
| """
|
| - self._file = LockedFile(filename, 'r+b', 'rb')
|
| + self._file = LockedFile(filename, 'r+', 'r')
|
| self._thread_lock = threading.Lock()
|
| self._read_only = False
|
| self._warn_on_readonly = warn_on_readonly
|
| @@ -271,7 +271,7 @@ class _MultiStore(object):
|
| simple version of "touch" to ensure the file has been created.
|
| """
|
| if not os.path.exists(self._file.filename()):
|
| - old_umask = os.umask(0177)
|
| + old_umask = os.umask(0o177)
|
| try:
|
| open(self._file.filename(), 'a+b').close()
|
| finally:
|
| @@ -280,13 +280,23 @@ class _MultiStore(object):
|
| def _lock(self):
|
| """Lock the entire multistore."""
|
| self._thread_lock.acquire()
|
| - self._file.open_and_lock()
|
| + try:
|
| + self._file.open_and_lock()
|
| + except IOError as e:
|
| + if e.errno == errno.ENOSYS:
|
| + logger.warn('File system does not support locking the credentials '
|
| + 'file.')
|
| + elif e.errno == errno.ENOLCK:
|
| + logger.warn('File system is out of resources for writing the '
|
| + 'credentials file (is your disk full?).')
|
| + else:
|
| + raise
|
| if not self._file.is_locked():
|
| self._read_only = True
|
| if self._warn_on_readonly:
|
| logger.warn('The credentials file (%s) is not writable. Opening in '
|
| 'read-only mode. Any refreshed credentials will only be '
|
| - 'valid for this run.' % self._file.filename())
|
| + 'valid for this run.', self._file.filename())
|
| if os.path.getsize(self._file.filename()) == 0:
|
| logger.debug('Initializing empty multistore file')
|
| # The multistore is empty so write out an empty file.
|
| @@ -315,7 +325,7 @@ class _MultiStore(object):
|
| """
|
| assert self._thread_lock.locked()
|
| self._file.file_handle().seek(0)
|
| - return simplejson.load(self._file.file_handle())
|
| + return json.load(self._file.file_handle())
|
|
|
| def _locked_json_write(self, data):
|
| """Write a JSON serializable data structure to the multistore.
|
| @@ -329,7 +339,7 @@ class _MultiStore(object):
|
| if self._read_only:
|
| return
|
| self._file.file_handle().seek(0)
|
| - simplejson.dump(data, self._file.file_handle(), sort_keys=True, indent=2)
|
| + json.dump(data, self._file.file_handle(), sort_keys=True, indent=2, separators=(',', ': '))
|
| self._file.file_handle().truncate()
|
|
|
| def _refresh_data_cache(self):
|
| @@ -387,7 +397,7 @@ class _MultiStore(object):
|
| raw_key = cred_entry['key']
|
| key = util.dict_to_tuple_key(raw_key)
|
| credential = None
|
| - credential = Credentials.new_from_json(simplejson.dumps(cred_entry['credential']))
|
| + credential = Credentials.new_from_json(json.dumps(cred_entry['credential']))
|
| return (key, credential)
|
|
|
| def _write(self):
|
| @@ -400,7 +410,7 @@ class _MultiStore(object):
|
| raw_data['data'] = raw_creds
|
| for (cred_key, cred) in self._data.items():
|
| raw_key = dict(cred_key)
|
| - raw_cred = simplejson.loads(cred.to_json())
|
| + raw_cred = json.loads(cred.to_json())
|
| raw_creds.append({'key': raw_key, 'credential': raw_cred})
|
| self._locked_json_write(raw_data)
|
|
|
| @@ -462,4 +472,4 @@ class _MultiStore(object):
|
| Returns:
|
| A Storage object that can be used to get/set this cred
|
| """
|
| - return self._Storage(self, key)
|
| + return self._Storage(self, key)
|
|
|