import cherrypy import yaml import os from jinja2 import Environment, FileSystemLoader from cryptography.hazmat.primitives import serialization from .crypto import generate_and_save_keypair, load_keypair, PRIVATE_KEY_PATH, PUBLIC_KEY_PATH env = Environment(loader=FileSystemLoader('templates')) class Disco(object): @cherrypy.expose @cherrypy.tools.json_out() def index(self): if not os.path.exists(PRIVATE_KEY_PATH): generate_and_save_keypair(PRIVATE_KEY_PATH, PUBLIC_KEY_PATH) _, public_key = load_keypair(PRIVATE_KEY_PATH, PUBLIC_KEY_PATH) pem_bytes = public_key.public_bytes( encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo, ) pem_string = pem_bytes.decode('utf-8') baseurl = cherrypy.request.base tmpl = env.get_template('discovery.yaml') yamldoc = yaml.safe_load( tmpl.render(endpoint=baseurl + '/ocm', public_key_id=baseurl + '/ocm#signature', public_key_pem=pem_string)) return yamldoc