# Copyright (C) 2020 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import subprocess import gnupg ENCRYPTED_KEYS = [ "accessToken", "apiUrl", "caCert", "cert", "htpasswd", "key", "password", "secret", ] def encrypt(pgp_identifier, config_path): """Encrypt the config file using sops and a PGP key. Arguments: pgp_identifier {string} -- A unique identifier of the PGP key to be used. This can be the fingerprint, keyid or part of the uid (e.g. the email address) config_path {string} -- The path to the config file to be encrypted Raises: ValueError: Error, if no (unique) PGP key could be found """ gpg = gnupg.GPG() gpg_keys = gpg.list_keys() selected_keys = list( filter( lambda k: pgp_identifier in k["fingerprint"] or pgp_identifier in k["keyid"] or len([v for v in k["uids"] if pgp_identifier in v]) > 0, gpg_keys, ) ) if not selected_keys: raise ValueError("PGP key not found.") if len(selected_keys) > 1: raise ValueError("Identifier of PGP not unique.") command = [ "sops", "--encrypt", "--in-place", "--encrypted-regex", f"({'|'.join(ENCRYPTED_KEYS)})", "--pgp", selected_keys[0]["fingerprint"], config_path, ] subprocess.check_output(command)