Home | History | Annotate | Download | only in google_apis
      1 #!/usr/bin/env python
      2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 """Python API for retrieving API keys.
      7 
      8 Note that this does not have the exact same semantics as the C++ API
      9 in google_api_keys.h, since it does not have access to gyp variables
     10 or preprocessor defines.
     11 """
     12 
     13 import os
     14 import re
     15 import sys
     16 
     17 
     18 # The token returned when an API key is unset.
     19 DUMMY_TOKEN = 'dummytoken'
     20 
     21 
     22 def _GetTokenFromOfficialFile(token_name):
     23   """Parses the token from the official file if it exists, else returns None."""
     24   official_path = os.path.join(os.path.dirname(__file__),
     25                                'internal/google_chrome_api_keys.h')
     26   if not os.path.isfile(official_path):
     27     return None
     28 
     29   line_regexp = '^#define\s*%s\s*"([^"]+)"' % token_name
     30   line_pattern = re.compile(line_regexp)
     31   def ParseLine(current_line):
     32     result = line_pattern.match(current_line)
     33     if result:
     34       return result.group(1)
     35     else:
     36       return None
     37 
     38   with open(official_path) as f:
     39     current_line = ''
     40     for line in f:
     41       if line.endswith('\\\n'):
     42         current_line += line[:-2]
     43       else:
     44         # Last line in multi-line #define, or a line that is not a
     45         # continuation line.
     46         current_line += line
     47         token = ParseLine(current_line)
     48         if token:
     49           if current_line.count('"') != 2:
     50             raise Exception(
     51               'Embedded quotes and multi-line strings are not supported.')
     52           return token
     53         current_line = ''
     54     return None
     55 
     56 
     57 def _GetToken(token_name):
     58   """Returns the API token with the given name, or DUMMY_TOKEN by default."""
     59   if token_name in os.environ:
     60     return os.environ[token_name]
     61   token = _GetTokenFromOfficialFile(token_name)
     62   if token:
     63     return token
     64   else:
     65     return DUMMY_TOKEN
     66 
     67 
     68 def GetAPIKey():
     69   """Returns the simple API key."""
     70   return _GetToken('GOOGLE_API_KEY')
     71 
     72 
     73 def GetClientID(client_name):
     74   """Returns the OAuth 2.0 client ID for the client of the given name."""
     75   return _GetToken('GOOGLE_CLIENT_ID_%s' % client_name)
     76 
     77 
     78 def GetClientSecret(client_name):
     79   """Returns the OAuth 2.0 client secret for the client of the given name."""
     80   return _GetToken('GOOGLE_CLIENT_SECRET_%s' % client_name)
     81 
     82 
     83 if __name__ == "__main__":
     84   print 'GOOGLE_API_KEY=%s' % GetAPIKey()
     85   print 'GOOGLE_CLIENT_ID_MAIN=%s' % GetClientID('MAIN')
     86   print 'GOOGLE_CLIENT_SECRET_MAIN=%s' % GetClientSecret('MAIN')
     87   print 'GOOGLE_CLIENT_ID_CLOUD_PRINT=%s' % GetClientID('CLOUD_PRINT')
     88   print 'GOOGLE_CLIENT_SECRET_CLOUD_PRINT=%s' % GetClientSecret('CLOUD_PRINT')
     89   print 'GOOGLE_CLIENT_ID_REMOTING=%s' % GetClientID('REMOTING')
     90   print 'GOOGLE_CLIENT_SECRET_REMOTING=%s' % GetClientSecret('REMOTING')
     91   print 'GOOGLE_CLIENT_ID_REMOTING_HOST=%s' % GetClientID('REMOTING_HOST')
     92   print 'GOOGLE_CLIENT_SECRET_REMOTING_HOST=%s' % GetClientSecret(
     93       'REMOTING_HOST')
     94   print 'GOOGLE_CLIENT_ID_REMOTING_IDENTITY_API=%s' %GetClientID(
     95       'REMOTING_IDENTITY_API')
     96