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.
calculate-utils-3-ldap/pym/ldap/variables/helpers.py

140 lines
4.4 KiB

# -*- coding: utf-8 -*-
# Copyright 2016 Mir Calculate. http://www.calculate-linux.org
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import sys
from calculate.lib.datavars import (ReadonlyVariable, Variable,
VariableInterface, VariableError)
from calculate.lib.utils.common import genpassword
from calculate.ldap.tools import SlapPasswd
from calculate.lib.utils.tools import repeater
from calculate.lib.cl_ldap import LDAPConnect, LDAPConnectError, ldap
from calculate.lib.configparser import (ConfigParserLocked,
Error as ConfigParserError)
_ = lambda x: x
from calculate.lib.cl_lang import (setLocalTranslate, getLazyLocalTranslate)
setLocalTranslate('cl_ldap3', sys.modules[__name__])
__ = getLazyLocalTranslate(_)
class ServerEnvHelper(VariableInterface):
"""
Получение значений из env файла или fallback
"""
fallback_variable = ""
fallback_value = ""
service = ""
parameter = ""
def get(self):
cp_path = self.Get('server.cl_server_env_path')
cp = ConfigParserLocked(cp_path)
try:
with cp.lock_read() as cp:
value = cp.get(self.service, self.parameter,
fallback=None)
if value is None:
if self.fallback_variable:
return self.Get(self.fallback_variable)
else:
return self.fallback_value
else:
return value.encode('utf-8')
except ConfigParserError:
raise VariableError(_("Failed to remove server parameters"))
class LdapMaxHelper(VariableInterface):
"""
Получение максимального значение из среди атрибутов
"""
type = "int"
base_dn = ""
search_filter = ""
attr = ""
def get_max(self):
ldap_connect = self.Get('ldap.cl_ldap_connect')
if ldap_connect:
base_dn = self._value_formatter.format(self.base_dn, self.Get)
try:
return max(int(x) for x in ldap_connect.ldap_simple_search(
base_dn, self.search_filter, self.attr) if x.isdigit())
# max(empty_list)
except ValueError:
return None
else:
return None
def get(self):
return str(self.get_max() or "")
class LdapSearchHelper(VariableInterface):
"""
Проверка свободен ли указанный идентификатор
"""
base_dn = ""
search_filter = "uid={value}"
def value_get(self, value):
def get_wrapper(val):
if val == "value":
return value
else:
return self.Get(val)
return get_wrapper
def check_name(self, value):
ldap_connect = self.Get('ldap.cl_ldap_connect')
if ldap_connect:
base_dn = self._value_formatter.format(self.base_dn,
self.value_get(value))
search_filter = self._value_formatter.format(self.search_filter,
self.value_get(value))
print "DEBUG Search:", base_dn, search_filter
return any(ldap_connect.ldap_search(
base_dn, ldap.SCOPE_ONELEVEL, search_filter))
else:
return None
class HashHelper(VariableInterface):
"""
Хэш пароля для LDAP
"""
source = ""
hash_var = "ldap.ld_encrypt"
def get(self):
value = self.Get(self.source)
if value:
return SlapPasswd(self.Get(self.hash_var)).get_hash(value)
else:
return "crypt{xxx}"
class RandomPasswordHelper(VariableInterface):
"""
Генератор пароля
"""
password_len = 9
def get(self):
return genpassword(self.password_len).strip()