py.lib

Yohn Y. 2022-02-23 Parent:cab7fedf8432

23:1668cc57225b Go to Latest

py.lib/ldap_utils/ldap_passwd_changer.py

. Рефакторинг бессмысленный и беспощадный

History
     1.1 --- a/ldap_utils/ldap_passwd_changer.py	Sat Nov 27 12:29:59 2021 +0300
     1.2 +++ b/ldap_utils/ldap_passwd_changer.py	Wed Feb 23 19:27:33 2022 +0300
     1.3 @@ -9,41 +9,52 @@
     1.4  from secrets import token_urlsafe
     1.5  import string
     1.6  
     1.7 +
     1.8  class LdapError(Exception):
     1.9      @staticmethod
    1.10 -    def errFmt(e):
    1.11 -        _buf = ' '.join(str(e).split())            # всё в одну строку с одним пробелом
    1.12 -                                                   # между словами
    1.13 +    def err_fmt(e):
    1.14 +        _buf = ' '.join(str(e).split())  # всё в одну строку с одним пробелом
    1.15 +        # между словами
    1.16          return "%s(%s)" % (type(e).__name__, _buf)
    1.17 -        
    1.18 -class LdapServerError(LdapError): pass
    1.19 -class LdapPassGenError(LdapError): pass
    1.20 -class LdapNotFound(LdapError): pass
    1.21 +
    1.22 +
    1.23 +class LdapServerError(LdapError):
    1.24 +    pass
    1.25 +
    1.26 +
    1.27 +class LdapPassGenError(LdapError):
    1.28 +    pass
    1.29 +
    1.30 +
    1.31 +class LdapNotFound(LdapError):
    1.32 +    pass
    1.33  
    1.34  
    1.35  class LdapPasswdChanger(object):
    1.36 -    def __init__(self, ldap_server_uri, ldap_user, ldap_passwd, ldap_baseDN, ldap_timeout=120, ldap_reconnect=5, passwd_len=25):
    1.37 +    def __init__(self, ldap_server_uri, ldap_user, ldap_passwd, ldap_base_dn, ldap_timeout=120, ldap_reconnect=5,
    1.38 +                 passwd_len=25):
    1.39          self.ldap_server_uri = ldap_server_uri  # URI к серверу: ldaps://server_name:port_number
    1.40 -        self.ldap_user = ldap_user              # Пользователь, имеющий право сброса паролей
    1.41 -        self.ldap_passwd = ldap_passwd          # Пароль к тому пользователю
    1.42 -        self.ldap_baseDN = ldap_baseDN
    1.43 -        self.ldap_timeout = ldap_timeout        # Таймаут операций с сервером
    1.44 -        self.passwd_len = passwd_len            # Желаемая длинна пароля
    1.45 -        self.ldap_reconnect = ldap_reconnect    # Количество попыток переподключения к серверу
    1.46 +        self.ldap_user = ldap_user  # Пользователь, имеющий право сброса паролей
    1.47 +        self.ldap_passwd = ldap_passwd  # Пароль к тому пользователю
    1.48 +        self.ldap_base_dn = ldap_base_dn
    1.49 +        self.ldap_timeout = ldap_timeout  # Таймаут операций с сервером
    1.50 +        self.passwd_len = passwd_len  # Желаемая длинна пароля
    1.51 +        self.ldap_reconnect = ldap_reconnect  # Количество попыток переподключения к серверу
    1.52  
    1.53          # Заготовка под пароли
    1.54          self._set_punct = set(string.punctuation)
    1.55          self._set_uper = set(string.ascii_uppercase)
    1.56          self._set_lower = set(string.ascii_lowercase)
    1.57  
    1.58 -    def getPasswd(self):
    1.59 +    def get_passwd(self):
    1.60          _cnt = 0
    1.61          while True:
    1.62              res = token_urlsafe(self.passwd_len)
    1.63              _res_set = set(res)
    1.64 -            if ((_res_set & self._set_punct)
    1.65 -                and (_res_set & self._set_uper)
    1.66 -                and (_res_set & self._set_lower)
    1.67 +            if (
    1.68 +                    (_res_set & self._set_punct)
    1.69 +                    and (_res_set & self._set_uper)
    1.70 +                    and (_res_set & self._set_lower)
    1.71              ):
    1.72                  return res
    1.73  
    1.74 @@ -51,61 +62,57 @@
    1.75              if _cnt > 60:
    1.76                  raise LdapPassGenError('Не удалось сгенерировать пароль')
    1.77  
    1.78 -
    1.79 -    def changePass(self, login):
    1.80 +    def change_passwd(self, login):
    1.81          _reconnects = self.ldap_reconnect
    1.82          if _reconnects is None or _reconnects < 1:
    1.83              _reconnects = 1
    1.84  
    1.85 -        ldapConn = None
    1.86          while True:
    1.87              _reconnects -= 1
    1.88              try:
    1.89 -                ldapSrv = Server(self.ldap_server_uri, connect_timeout=self.ldap_timeout)
    1.90 -                ldapConn = Connection(ldapSrv, authentication=SIMPLE,
    1.91 -                                      user=self.ldap_user, password=self.ldap_passwd,
    1.92 -                                      check_names=True,
    1.93 -                                      auto_referrals=False, raise_exceptions=True, auto_range=True,
    1.94 -                                      )
    1.95 -                ldapConn.open()
    1.96 -                if not ldapConn.bind():
    1.97 +                ldap_srv = Server(self.ldap_server_uri, connect_timeout=self.ldap_timeout)
    1.98 +                ldap_conn = Connection(ldap_srv, authentication=SIMPLE,
    1.99 +                                       user=self.ldap_user, password=self.ldap_passwd,
   1.100 +                                       check_names=True,
   1.101 +                                       auto_referrals=False, raise_exceptions=True, auto_range=True,
   1.102 +                                       )
   1.103 +                ldap_conn.open()
   1.104 +                if not ldap_conn.bind():
   1.105                      continue
   1.106  
   1.107                  break
   1.108 +
   1.109              except LDAPException as e:
   1.110                  if not _reconnects > 0:
   1.111 -                    raise LdapServerError('Ошибка подключения к серверу: %s' % LdapServerError.errFmt(e))
   1.112 +                    raise LdapServerError(f'Ошибка подключения к серверу: {LdapServerError.err_fmt(e)}')
   1.113  
   1.114 -        filter = '(sAMAccountName=%s)' % login
   1.115 +        filter = f'(sAMAccountName={login})'
   1.116          try:
   1.117 -            if not ldapConn.search(self.ldap_baseDN, filter):
   1.118 -                raise LdapServerError('Сервер вернул статус ощибки: %(desc)s(%(code)s) - %(msg)s' % {
   1.119 -                    'desc': ldapConn.result['description'],
   1.120 -                    'code': ldapConn.result['result'],
   1.121 -                    'msg': ldapConn.result['message'],
   1.122 -                    })
   1.123 +            if not ldap_conn.search(self.ldap_base_dn, filter):
   1.124 +                raise LdapServerError('Сервер вернул статус ошибки: %(desc)s(%(code)s) - %(msg)s' % {
   1.125 +                    'desc': ldap_conn.result['description'],
   1.126 +                    'code': ldap_conn.result['result'],
   1.127 +                    'msg': ldap_conn.result['message'],
   1.128 +                })
   1.129 +
   1.130          except LDAPException as e:
   1.131 -            raise LdapServerError('Ошибка при поиска УЗ в ldap: %s' % LdapServerError.errFmt(e))
   1.132 +            raise LdapServerError(f'Ошибка при поиска УЗ в ldap: {LdapServerError.err_fmt(e)}')
   1.133  
   1.134 -        if not len(ldapConn.entries) > 0:
   1.135 -            raise LdapNotFound('Не найдена учётная запись: %s' % login)
   1.136 -        elif len(ldapConn.entries) != 1:
   1.137 -            raise LdapError('Наёдено более одной УЗ по заданному имени %s: %s - %s' %(
   1.138 -                login,
   1.139 -                len(ldapConn.entries),
   1.140 -                '; '.join([i.entry_dn for i in ldapConn.entries[:10]])
   1.141 -            ))
   1.142 +        if not len(ldap_conn.entries) > 0:
   1.143 +            raise LdapNotFound(f'Не найдена учётная запись: {login}')
   1.144 +
   1.145 +        elif len(ldap_conn.entries) != 1:
   1.146 +            _found_names = '; '.join([i.entry_dn for i in ldap_conn.entries[:10]])
   1.147  
   1.148 -        login_dn = ldapConn.entries[0].entry_dn
   1.149 -        new_passwd = self.getPasswd()
   1.150 +            raise LdapError(f'Найдено более одной УЗ по заданному имени {login}: {len(ldap_conn.entries)} '
   1.151 +                            f'- {_found_names}')
   1.152 +
   1.153 +        login_dn = ldap_conn.entries[0].entry_dn
   1.154 +        new_passwd = self.get_passwd()
   1.155          try:
   1.156 -            ldapConn.extend.microsoft.modify_password(login_dn, new_password=new_passwd, old_password=None)
   1.157 +            ldap_conn.extend.microsoft.modify_password(login_dn, new_password=new_passwd, old_password=None)
   1.158 +
   1.159          except LDAPException as e:
   1.160 -            raise LdapServerError('Ошибка при смене пароля на УЗ: %s' % LdapServerError.errFmt(e))
   1.161 +            raise LdapServerError('Ошибка при смене пароля на УЗ: %s' % LdapServerError.err_fmt(e))
   1.162  
   1.163          return new_passwd
   1.164 -
   1.165 -    
   1.166 -    
   1.167 -    
   1.168 -