deskflow/scripts/lib/certificate.py

41 lines
1.3 KiB
Python
Raw Normal View History

import os, base64
temp_path = "tmp/certificate"
class Certificate:
"""
Installs a certificate from a base64 string, and returns the path to the certificate.
Once the context is exited, the certificate is removed from the filesystem.
Example usage:
with Certificate(base64) as cert_path:
print(f"Certificate path: {cert_path}")
"""
def __init__(self, base64, file_ext):
self.base64 = base64
self.temp_filename = f"{temp_path}.{file_ext}"
def __enter__(self):
print(f"Decoding certificate to temporary path: {self.temp_filename}")
try:
cert_bytes = base64.b64decode(self.base64)
except Exception as e:
raise ValueError("Failed to decode certificate base64") from e
os.makedirs(os.path.dirname(self.temp_filename), exist_ok=True)
with open(self.temp_filename, "wb") as cert_file:
cert_file.write(cert_bytes)
return self.temp_filename
def __exit__(self, _exc_type, _exc_value, _traceback):
# not strictly necessary for ci, but when run on a dev machine, it reduces the risk
# that private keys are left on the filesystem
print(f"Removing temporary certificate file: {self.temp_filename}")
os.remove(self.temp_filename)
# propagate exceptions
return False