| # Copyright 2020 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. | |
| from recipe_engine import recipe_api | |
| class KMSApi(recipe_api.RecipeApi): | |
| """Provides KMS support for recipe secrets.""" | |
| def get_secret(self, input_file, secret_path): | |
| """Decrypts the encrypted secret. | |
| Args: | |
| input_file (str): encrypted file of the secret. | |
| secret_path (Path): path of decrypted secret. | |
| """ | |
| cloudkms_dir = self.m.path['start_dir'].join('cloudkms') | |
| cloudkms_package = 'infra/tools/luci/cloudkms/${platform}' | |
| self.m.cipd.ensure( | |
| cloudkms_dir, | |
| self.m.cipd.EnsureFile().add_package(cloudkms_package, 'latest') | |
| ) | |
| encrypt_file = self.m.path['cleanup'].join(input_file) | |
| self.m.gsutil.download('flutter_configs', input_file, encrypt_file) | |
| cloudkms = cloudkms_dir.join( | |
| 'cloudkms.exe' if self.m.platform.name == 'win' else 'cloudkms' | |
| ) | |
| self.m.step( | |
| 'cloudkms get key', [ | |
| cloudkms, 'decrypt', '-input', encrypt_file, '-output', secret_path, | |
| 'projects/flutter-infra/locations/global' | |
| '/keyRings/luci/cryptoKeys/flutter-infra' | |
| ] | |
| ) | |
| def decrypt_secrets(self, env, secrets): | |
| """Decrypts the secrets. | |
| This method decrypts files stored in GCS using kms certificates and sets | |
| environment variables pointing to the location of the decrypted file. You | |
| have to be careful of not printing the content of the decrypted file or | |
| adding the content of the decrypted file as an environment variable as it | |
| will print in the logs. | |
| Args: | |
| env(dict): Current environment variables. | |
| secrets(dict): The key is the n. me of the env variable referencing the | |
| decrypted file and the value is the path to the encrypted file in gcs. | |
| """ | |
| for k, v in secrets.items(): | |
| secret_path = self.m.path['cleanup'].join(k) | |
| self.m.kms.get_secret(v, secret_path) | |
| env[k] = secret_path |