summaryrefslogtreecommitdiffstats
path: root/base/server/python/pki/server/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'base/server/python/pki/server/__init__.py')
-rw-r--r--base/server/python/pki/server/__init__.py115
1 files changed, 112 insertions, 3 deletions
diff --git a/base/server/python/pki/server/__init__.py b/base/server/python/pki/server/__init__.py
index 9777d221f..d00446567 100644
--- a/base/server/python/pki/server/__init__.py
+++ b/base/server/python/pki/server/__init__.py
@@ -20,7 +20,11 @@
#
from lxml import etree
+import getpass
import grp
+import io
+import ldap
+import operator
import os
import pwd
import re
@@ -31,7 +35,7 @@ import pki
INSTANCE_BASE_DIR = '/var/lib/pki'
REGISTRY_DIR = '/etc/sysconfig/pki'
SUBSYSTEM_TYPES = ['ca', 'kra', 'ocsp', 'tks', 'tps']
-
+SUBSYSTEM_CLASSES = {}
class PKIServer(object):
@@ -65,6 +69,7 @@ class PKISubsystem(object):
self.base_dir = instance.base_dir
self.conf_dir = os.path.join(self.base_dir, 'conf')
+ self.cs_conf = os.path.join(self.conf_dir, 'CS.cfg')
self.context_xml_template = os.path.join(
pki.SHARE_DIR, self.name, 'conf', 'Catalina', 'localhost', self.name + '.xml')
@@ -72,9 +77,62 @@ class PKISubsystem(object):
self.context_xml = os.path.join(
instance.conf_dir, 'Catalina', 'localhost', self.name + '.xml')
+ self.config = {}
+ self.type = None
+ self.prefix = None
+
# custom subsystem location
self.doc_base = os.path.join(self.base_dir, 'webapps', self.name)
+ def load(self):
+ self.config.clear()
+
+ lines = open(self.cs_conf).read().splitlines()
+
+ for line in lines:
+ parts = line.split('=', 1)
+ name = parts[0]
+ value = parts[1]
+ self.config[name] = value
+
+ self.type = self.config['cs.type']
+ self.prefix = self.type.lower()
+
+ def find_subsystem_certs(self):
+ certs = []
+
+ cert_ids = self.config['%s.cert.list' % self.name].split(',')
+ for cert_id in cert_ids:
+ cert = self.create_subsystem_cert_object(cert_id)
+ certs.append(cert)
+
+ return certs
+
+ def get_subsystem_cert(self, cert_id):
+ return self.create_subsystem_cert_object(cert_id)
+
+ def create_subsystem_cert_object(self, cert_id):
+ cert = {}
+ cert['id'] = cert_id
+ cert['nickname'] = self.config.get('%s.%s.nickname' % (self.name, cert_id), None)
+ cert['token'] = self.config.get('%s.%s.tokenname' % (self.name, cert_id), None)
+ cert['data'] = self.config.get('%s.%s.cert' % (self.name, cert_id), None)
+ cert['request'] = self.config.get('%s.%s.certreq' % (self.name, cert_id), None)
+ return cert
+
+ def update_subsystem_cert(self, cert):
+ cert_id = cert['id']
+ self.config['%s.%s.nickname' % (self.name, cert_id)] = cert.get('nickname', None)
+ self.config['%s.%s.tokenname' % (self.name, cert_id)] = cert.get('token', None)
+ self.config['%s.%s.cert' % (self.name, cert_id)] = cert.get('data', None)
+ self.config['%s.%s.certreq' % (self.name, cert_id)] = cert.get('request', None)
+
+ def save(self):
+ sorted_config = sorted(self.config.items(), key=operator.itemgetter(0))
+ with io.open(self.cs_conf, 'wb') as f:
+ for (key, value) in sorted_config:
+ f.write('%s=%s\n' % (key, value))
+
def is_valid(self):
return os.path.exists(self.conf_dir)
@@ -102,6 +160,21 @@ class PKISubsystem(object):
def disable(self):
self.instance.undeploy(self.name)
+ def open_database(self, name='internaldb'):
+
+ hostname = self.config['%s.ldapconn.host' % name]
+ port = self.config['%s.ldapconn.port' % name]
+ bind_dn = self.config['%s.ldapauth.bindDN' % name]
+
+ # TODO: add support for other authentication
+ # mechanisms (e.g. client cert authentication, LDAPI)
+ bind_password = self.instance.get_password(name)
+
+ con = ldap.initialize('ldap://%s:%s' % (hostname, port))
+ con.simple_bind_s(bind_dn, bind_password)
+
+ return con
+
def __repr__(self):
return str(self.instance) + '/' + self.name
@@ -119,6 +192,9 @@ class PKIInstance(object):
self.base_dir = os.path.join(pki.BASE_DIR, name)
self.conf_dir = os.path.join(self.base_dir, 'conf')
+ self.password_conf = os.path.join(self.conf_dir, 'password.conf')
+
+ self.nssdb_dir = os.path.join(self.base_dir, 'alias')
self.lib_dir = os.path.join(self.base_dir, 'lib')
self.registry_dir = os.path.join(pki.server.REGISTRY_DIR, 'tomcat', self.name)
@@ -132,6 +208,8 @@ class PKIInstance(object):
self.uid = None
self.gid = None
+ self.passwords = {}
+
self.subsystems = []
def is_valid(self):
@@ -153,6 +231,7 @@ class PKIInstance(object):
return rc == 0
def load(self):
+ # load UID and GID
with open(self.registry_file, 'r') as registry:
lines = registry.readlines()
@@ -168,11 +247,41 @@ class PKIInstance(object):
self.group = m.group(1)
self.gid = grp.getgrnam(self.group).gr_gid
+ # load passwords
+ self.passwords.clear()
+ lines = open(self.password_conf).read().splitlines()
+
+ for line in lines:
+ parts = line.split('=', 1)
+ name = parts[0]
+ value = parts[1]
+ self.passwords[name] = value
+
+ # load subsystems
for subsystem_name in os.listdir(self.registry_dir):
- if subsystem_name in pki.server.SUBSYSTEM_TYPES:
- subsystem = PKISubsystem(self, subsystem_name)
+ if subsystem_name in SUBSYSTEM_TYPES:
+ if subsystem_name in SUBSYSTEM_CLASSES:
+ subsystem = SUBSYSTEM_CLASSES[subsystem_name](self)
+ else:
+ subsystem = PKISubsystem(self, subsystem_name)
+ subsystem.load()
self.subsystems.append(subsystem)
+ def get_password(self, name):
+ if name in self.passwords:
+ return self.passwords[name]
+
+ password = getpass.getpass(prompt='Enter password for %s: ' % name)
+ self.passwords[name] = password
+
+ return password
+
+ def get_subsystem(self, name):
+ for subsystem in self.subsystems:
+ if name == subsystem.name:
+ return subsystem
+ return None
+
def is_deployed(self, webapp_name):
context_xml = os.path.join(
self.conf_dir, 'Catalina', 'localhost', webapp_name + '.xml')