88 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # Copyright 2013 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.
 | |
| 
 | |
| require 'json'
 | |
| require 'signet/oauth_2/client'
 | |
| 
 | |
| module Google
 | |
|   class APIClient
 | |
|     ##
 | |
|     # Represents cached OAuth 2 tokens stored on local disk in a
 | |
|     # JSON serialized file. Meant to resemble the serialized format
 | |
|     # http://google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.file.Storage-class.html
 | |
|     #
 | |
|     class FileStorage
 | |
|       # @return [String] Path to the credentials file.
 | |
|       attr_accessor :path
 | |
| 
 | |
|       # @return [Signet::OAuth2::Client] Path to the credentials file.
 | |
|       attr_reader :authorization
 | |
| 
 | |
|       ##
 | |
|       # Initializes the FileStorage object.
 | |
|       #
 | |
|       # @param [String] path
 | |
|       #    Path to the credentials file.
 | |
|       def initialize(path)
 | |
|         @path = path
 | |
|         self.load_credentials
 | |
|       end
 | |
| 
 | |
|       ##
 | |
|       # Attempt to read in credentials from the specified file.
 | |
|       def load_credentials
 | |
|         if File.exists? self.path
 | |
|           File.open(self.path, 'r') do |file|
 | |
|             cached_credentials = JSON.load(file)
 | |
|             @authorization = Signet::OAuth2::Client.new(cached_credentials)
 | |
|             @authorization.issued_at = Time.at(cached_credentials['issued_at'])
 | |
|             if @authorization.expired?
 | |
|               @authorization.fetch_access_token!
 | |
|               self.write_credentials
 | |
|             end
 | |
|           end
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       ##
 | |
|       # Write the credentials to the specified file.
 | |
|       #
 | |
|       # @param [Signet::OAuth2::Client] authorization
 | |
|       #    Optional authorization instance. If not provided, the authorization
 | |
|       #    already associated with this instance will be written.
 | |
|       def write_credentials(authorization=nil)
 | |
|         @authorization = authorization unless authorization.nil?
 | |
| 
 | |
|         unless @authorization.refresh_token.nil?
 | |
|           hash = {}
 | |
|           %w'access_token
 | |
|            authorization_uri
 | |
|            client_id
 | |
|            client_secret
 | |
|            expires_in
 | |
|            refresh_token
 | |
|            token_credential_uri'.each do |var|
 | |
|             hash[var] = @authorization.instance_variable_get("@#{var}")
 | |
|           end
 | |
|           hash['issued_at'] = @authorization.issued_at.to_i
 | |
| 
 | |
|           File.open(self.path, 'w', 0600) do |file|
 | |
|             file.write(hash.to_json)
 | |
|           end
 | |
|         end
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 |