| Index: third_party/oauth2client/file.py
|
| diff --git a/third_party/oauth2client/file.py b/third_party/oauth2client/file.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d71e8883dafeae8a2a6030415ad069dfd3f7c8f7
|
| --- /dev/null
|
| +++ b/third_party/oauth2client/file.py
|
| @@ -0,0 +1,99 @@
|
| +# Copyright (C) 2010 Google Inc.
|
| +#
|
| +# Licensed under the Apache License, Version 2.0 (the "License");
|
| +# you may not use this file except in compliance with the License.
|
| +# You may obtain a copy of the License at
|
| +#
|
| +# http://www.apache.org/licenses/LICENSE-2.0
|
| +#
|
| +# Unless required by applicable law or agreed to in writing, software
|
| +# distributed under the License is distributed on an "AS IS" BASIS,
|
| +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +# See the License for the specific language governing permissions and
|
| +# limitations under the License.
|
| +
|
| +"""Utilities for OAuth.
|
| +
|
| +Utilities for making it easier to work with OAuth 2.0
|
| +credentials.
|
| +"""
|
| +
|
| +__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
| +
|
| +import os
|
| +import stat
|
| +import threading
|
| +
|
| +from anyjson import simplejson
|
| +from client import Storage as BaseStorage
|
| +from client import Credentials
|
| +
|
| +
|
| +class Storage(BaseStorage):
|
| + """Store and retrieve a single credential to and from a file."""
|
| +
|
| + def __init__(self, filename):
|
| + self._filename = filename
|
| + self._lock = threading.Lock()
|
| +
|
| + def acquire_lock(self):
|
| + """Acquires any lock necessary to access this Storage.
|
| +
|
| + This lock is not reentrant."""
|
| + self._lock.acquire()
|
| +
|
| + def release_lock(self):
|
| + """Release the Storage lock.
|
| +
|
| + Trying to release a lock that isn't held will result in a
|
| + RuntimeError.
|
| + """
|
| + self._lock.release()
|
| +
|
| + def locked_get(self):
|
| + """Retrieve Credential from file.
|
| +
|
| + Returns:
|
| + oauth2client.client.Credentials
|
| + """
|
| + credentials = None
|
| + try:
|
| + f = open(self._filename, 'rb')
|
| + content = f.read()
|
| + f.close()
|
| + except IOError:
|
| + return credentials
|
| +
|
| + try:
|
| + credentials = Credentials.new_from_json(content)
|
| + credentials.set_store(self)
|
| + except ValueError:
|
| + pass
|
| +
|
| + return credentials
|
| +
|
| + def _create_file_if_needed(self):
|
| + """Create an empty file if necessary.
|
| +
|
| + This method will not initialize the file. Instead it implements a
|
| + simple version of "touch" to ensure the file has been created.
|
| + """
|
| + if not os.path.exists(self._filename):
|
| + old_umask = os.umask(0177)
|
| + try:
|
| + open(self._filename, 'a+b').close()
|
| + finally:
|
| + os.umask(old_umask)
|
| +
|
| +
|
| + def locked_put(self, credentials):
|
| + """Write Credentials to file.
|
| +
|
| + Args:
|
| + credentials: Credentials, the credentials to store.
|
| + """
|
| +
|
| + self._create_file_if_needed()
|
| + f = open(self._filename, 'wb')
|
| + f.write(credentials.to_json())
|
| + f.close()
|
|
|