15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Python API for retrieving API keys.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochNote that this does not have the exact same semantics as the C++ API
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochin google_api_keys.h, since it does not have access to gyp variables
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochor preprocessor defines.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import re
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# The token returned when an API key is unset.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DUMMY_TOKEN = 'dummytoken'
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def _GetTokenFromOfficialFile(token_name):
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Parses the token from the official file if it exists, else returns None."""
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  official_path = os.path.join(os.path.dirname(__file__),
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               'internal/google_chrome_api_keys.h')
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if not os.path.isfile(official_path):
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  line_regexp = '^#define\s*%s\s*"([^"]+)"' % token_name
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  line_pattern = re.compile(line_regexp)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ParseLine(current_line):
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = line_pattern.match(current_line)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if result:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return result.group(1)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return None
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  with open(official_path) as f:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_line = ''
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for line in f:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if line.endswith('\\\n'):
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        current_line += line[:-2]
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # Last line in multi-line #define, or a line that is not a
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # continuation line.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        current_line += line
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        token = ParseLine(current_line)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if token:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if current_line.count('"') != 2:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            raise Exception(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              'Embedded quotes and multi-line strings are not supported.')
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return token
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        current_line = ''
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def _GetToken(token_name):
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Returns the API token with the given name, or DUMMY_TOKEN by default."""
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if token_name in os.environ:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return os.environ[token_name]
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  token = _GetTokenFromOfficialFile(token_name)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if token:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return token
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return DUMMY_TOKEN
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def GetAPIKey():
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Returns the simple API key."""
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return _GetToken('GOOGLE_API_KEY')
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def GetClientID(client_name):
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Returns the OAuth 2.0 client ID for the client of the given name."""
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return _GetToken('GOOGLE_CLIENT_ID_%s' % client_name)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def GetClientSecret(client_name):
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Returns the OAuth 2.0 client secret for the client of the given name."""
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return _GetToken('GOOGLE_CLIENT_SECRET_%s' % client_name)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == "__main__":
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print 'GOOGLE_API_KEY=%s' % GetAPIKey()
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print 'GOOGLE_CLIENT_ID_MAIN=%s' % GetClientID('MAIN')
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print 'GOOGLE_CLIENT_SECRET_MAIN=%s' % GetClientSecret('MAIN')
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print 'GOOGLE_CLIENT_ID_CLOUD_PRINT=%s' % GetClientID('CLOUD_PRINT')
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print 'GOOGLE_CLIENT_SECRET_CLOUD_PRINT=%s' % GetClientSecret('CLOUD_PRINT')
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print 'GOOGLE_CLIENT_ID_REMOTING=%s' % GetClientID('REMOTING')
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print 'GOOGLE_CLIENT_SECRET_REMOTING=%s' % GetClientSecret('REMOTING')
91