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.
140 lines
4.4 KiB
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()
|