py.lib
2022-02-23
Parent:cab7fedf8432
py.lib/ldap_utils/ldap_passwd_changer.py
. Рефакторинг бессмысленный и беспощадный
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 -