# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""**[DEPRECATED]** API for generating OAuth2 access tokens from service account
keys predeployed to Chrome Ops bots via Puppet.

Depends on 'luci-auth' being in PATH.

This module exists only to support Buildbot code. On LUCI use default account
exposed through 'recipe_engine/service_account' module.
"""

from recipe_engine import recipe_api


class PuppetServiceAccountApi(recipe_api.RecipeApi):
  @property
  def keys_path(self):
    """Path to a directory where ChromeOps Puppet drops service account keys."""
    if self.m.platform.is_win:
      return 'C:\\creds\\service_accounts'
    return '/creds/service_accounts'

  def get(self, account):
    """Returns a recipe_module.service_account.ServiceAccount for the account.

    Assumes a service account key for the given account is available at
    self.keys_path.

    Args:
      account: a name of the service account, as defined in Puppet config.
    Returns
      A recipe_module.service_account.ServiceAccount instance.
    """
    return self.m.service_account.from_credentials_json(
        self.get_key_path(account))

  def get_key_path(self, account):
    """Path to a particular JSON key (as str)."""
    return self.m.path.join(self.keys_path, 'service-account-%s.json' % account)

  def get_access_token(self, account, scopes=None):
    """Returns an access token for a service account.

    Token's lifetime is guaranteed to be at least 3 minutes and at most 45.

    Args:
      account: a name of the service account, as defined in Puppet config.
      scopes: list of OAuth scopes for new token, default is [userinfo.email].
    """
    return self.m.service_account.from_credentials_json(
        self.get_key_path(account)).get_access_token(scopes)
