You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.5 KiB
55 lines
1.5 KiB
import os
|
|
import subprocess
|
|
from typing import List
|
|
|
|
from zope import component
|
|
from zope.interface import implementer
|
|
|
|
from ceo_common.interfaces import IKerberosService, IConfig
|
|
|
|
|
|
@implementer(IKerberosService)
|
|
class KerberosService:
|
|
def __init__(
|
|
self,
|
|
admin_principal: str,
|
|
):
|
|
cfg = component.getUtility(IConfig)
|
|
|
|
self.admin_principal = admin_principal
|
|
self.realm = cfg.get('ldap_sasl_realm')
|
|
# We don't need a credentials cache because the client forwards
|
|
# their credentials to us
|
|
os.environ['KRB5CCNAME'] = 'FILE:/dev/null'
|
|
|
|
def _run(self, args: List[str]):
|
|
subprocess.run(args, check=True)
|
|
|
|
def addprinc(self, principal: str, password: str):
|
|
self._run([
|
|
'kadmin', '-k', '-p', self.admin_principal, 'addprinc',
|
|
'-pw', password,
|
|
'-policy', 'default',
|
|
'+needchange',
|
|
'+requires_preauth',
|
|
principal
|
|
])
|
|
|
|
def delprinc(self, principal: str):
|
|
self._run([
|
|
'kadmin', '-k', '-p', self.admin_principal, 'delprinc',
|
|
'-force',
|
|
principal
|
|
])
|
|
|
|
def change_password(self, principal: str, password: str):
|
|
self._run([
|
|
'kadmin', '-k', '-p', self.admin_principal, 'cpw',
|
|
'-pw', password,
|
|
principal
|
|
])
|
|
self._run([
|
|
'kadmin', '-k', '-p', self.admin_principal, 'modprinc',
|
|
'+needchange',
|
|
principal
|
|
])
|
|
|