#!/usr/bin/env python3 # -*- coding: utf-8 -*- import cmd import hashlib import json import os import os.path import shutil import sqlite3 import tempfile from certificate_requests import * from paths import * __doc__= """ Define classes """ class CALookup(object): """ Proxy to interact with the database, get CA as element or as list """ def __init__(self, ssh_ca_dir, ssl_ca_dir): """ The connection attribute is setted by the CAManager instance when used """ self.conn = None self.ssh_ca_dir = ssh_ca_dir self.ssl_ca_dir = ssl_ca_dir def __iter__(self): c = self.conn.cursor() c.execute("""SELECT id, name, type FROM cas""") return iter(c.fetchall()) def __delitem__(self, ca_id): """ Delete a specific certification authority from the database """ c = self.conn.cursor() c.execute("""DELETE FROM cas WHERE id = ?""", (ca_id, )) def __getitem__(self, ca_id): """ Get a specific certification authority from the database """ c = self.conn.cursor() c.execute("""SELECT name, type FROM cas WHERE id = ?""", (ca_id, )) result = c.fetchone() if not result: raise ValueError('Unknown CA "%s"' % ca_id) ca_name, ca_type = result if ca_type.lower() == 'ssh': return SSHAuthority(ca_id, ca_name, self.ssh_ca_dir) elif ca_type.lower() == 'ssl': return SSLAuthority(ca_id, ca_name, self.ssl_ca_dir) def __setitem__(self, ca_id, ca_value): """ Create a new certification authority, insert it into the database """ ca_name, ca_type = ca_value authority = None if ca_type == 'ssh': authority = SSHAuthority(ca_id, ca_name, self.ssh_ca_dir) elif ca_type == 'ssl': authority = SSLAuthority(ca_id, ca_name, self.ssl_ca_dir) else: raise ValueError('CA type is not supported') authority.generate() c = self.conn.cursor() c.execute("""INSERT INTO cas VALUES (?, ?, ?)""", (ca_id, ca_name, ca_type.lower())) self.conn.commit() class RequestLookup(object): """ Proxy to interact with the requests """ def __init__(self): self.request_dir = REQUESTS_PATH self.output_dir = OUTPUT_PATH def __iter__(self): """ Iterate over all certificate request in REQUEST_PATH """ req_objs = [] for request_id in os.listdir(self.request_dir): """ request_id is formatted as uuid """ with RequestLoader(request_id) as request: req_objs.append(request) return iter(req_objs) def __delitem__(self, request_id): """ Delete a specific certificate request """ os.unlink(os.path.join(self.request_dir, request_id)) def __getitem__(self, request_id): """ Get a specific certificate request """ request_path = os.path.join(self.request_dir, request_id) @property def ssh(self): pass @property def ssl(self): pass