mirror of https://github.com/tp4a/teleport
pull/130/head
parent
f775cdb4f6
commit
5c94a847c0
|
@ -0,0 +1,86 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import ldap3
|
||||||
|
from app.base.logger import *
|
||||||
|
from app.const import *
|
||||||
|
|
||||||
|
|
||||||
|
class Ldap(object):
|
||||||
|
def __init__(self, ldap_host, ldap_port, base_dn, domain):
|
||||||
|
self._server = ldap3.Server(ldap_host, ldap_port, connect_timeout=5, use_ssl=False)
|
||||||
|
self._base_dn = base_dn
|
||||||
|
self._domain = domain
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _parse_attr_map(self, attr_map):
|
||||||
|
attrs_ldap = []
|
||||||
|
attrs_tp = []
|
||||||
|
|
||||||
|
lines = attr_map.split('\n')
|
||||||
|
for line in lines:
|
||||||
|
x = line.split('=')
|
||||||
|
if len(x) != 2:
|
||||||
|
return None, None, line
|
||||||
|
y = x[0].strip().split('.')
|
||||||
|
if len(y) != 2 or 'tp' != y[0]:
|
||||||
|
return None, None, line
|
||||||
|
tp_attr = y[1]
|
||||||
|
ldap_attr = x[1].strip()
|
||||||
|
if len(tp_attr) == 0 or len(ldap_attr) == 0:
|
||||||
|
return None, None, line
|
||||||
|
attrs_ldap.append(ldap_attr)
|
||||||
|
attrs_tp.append(tp_attr)
|
||||||
|
|
||||||
|
return attrs_ldap, attrs_tp, ''
|
||||||
|
|
||||||
|
def list_users(self, admin, password, filter, attr_map, size_limit=0):
|
||||||
|
attrs_ldap, attrs_tp, msg = self._parse_attr_map(attr_map)
|
||||||
|
if attrs_ldap is None:
|
||||||
|
return TPE_PARAM, None, '属性映射格式错误: {}'.format(msg)
|
||||||
|
|
||||||
|
user = '{}@{}'.format(admin, self._domain)
|
||||||
|
conn = ldap3.Connection(self._server, user=user, password=password, check_names=True, lazy=False, raise_exceptions=False)
|
||||||
|
try:
|
||||||
|
conn.open()
|
||||||
|
except Exception as e:
|
||||||
|
log.e(str(e))
|
||||||
|
return TPE_FAILED, None, '无法连接到LDAP服务器'
|
||||||
|
|
||||||
|
conn.bind()
|
||||||
|
if not ('result' in conn.result and 0 == conn.result['result'] and 'description' in conn.result and 'success' == conn.result['description']):
|
||||||
|
return TPE_FAILED, None, 'LDAP管理员认证失败'
|
||||||
|
|
||||||
|
ret = conn.search(
|
||||||
|
search_base=self._base_dn,
|
||||||
|
size_limit=size_limit,
|
||||||
|
|
||||||
|
# search_filter='(&(sAMAccountName={}*)(&(objectClass=person)))'.format(username),
|
||||||
|
search_filter=filter, # (&(objectClass=person))
|
||||||
|
search_scope=ldap3.SUBTREE,
|
||||||
|
|
||||||
|
# attributes=['cn', 'mail', 'sAMAccountName', 'objectGUID']
|
||||||
|
# attributes=['*']
|
||||||
|
attributes=attrs_ldap
|
||||||
|
)
|
||||||
|
|
||||||
|
result = []
|
||||||
|
|
||||||
|
# print(self.conn.entries[0].entry_to_json)
|
||||||
|
|
||||||
|
if ret:
|
||||||
|
for u in conn.response:
|
||||||
|
# if u['attributes']['cn'].lower() in ['guest', 'krbtgt']:
|
||||||
|
# continue
|
||||||
|
# print(u)
|
||||||
|
# print(u['attributes']['cn'])
|
||||||
|
# result.append(u['attributes'])
|
||||||
|
a = {}
|
||||||
|
for i in range(0, len(attrs_ldap)):
|
||||||
|
a[attrs_tp[i]] = u['attributes'][attrs_ldap[i]]
|
||||||
|
result.append(a)
|
||||||
|
|
||||||
|
return TPE_OK, result, ''
|
||||||
|
|
||||||
|
def valid_user(self, user_dn, password):
|
||||||
|
return False
|
||||||
|
|
Loading…
Reference in New Issue