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
8Note that this does not have the exact same semantics as the C++ API
9in google_api_keys.h, since it does not have access to gyp variables
10or preprocessor defines.
11"""
12
13import os
14import re
15import sys
16
17
18# The token returned when an API key is unset.
19DUMMY_TOKEN = 'dummytoken'
20
21
22def _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
57def _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
68def GetAPIKey():
69  """Returns the simple API key."""
70  return _GetToken('GOOGLE_API_KEY')
71
72
73def 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
78def 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
83if __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