Untitled

 avatar
unknown
plain_text
a year ago
2.5 kB
15
Indexable
    all_users = []
    ldap_user_ids = set()

    # 1️⃣ Bulk fetch LDAP users
    ldap_plugin = acl_users.get('pasldap')
    if ldap_plugin:
        conn = ldap_plugin._getConnection()
        base_dn = ldap_plugin.getProperty('users_base')
        search_filter = "(objectClass=person)"  # adjust to your LDAP filter
        attrs = ['cn', 'mail', 'distinguishedName', 'sAMAccountName']

        try:
            result = conn.search_s(base_dn, ldap.SCOPE_SUBTREE, search_filter, attrs)
        except ldap.LDAPError:
            result = []

        # 2️⃣ Fetch portal_memberdata properties for all LDAP users
        memberdata_tool = portal.portal_memberdata
        for dn, entry in result:
            if not entry:
                continue
            user_id = entry.get('sAMAccountName', [b''])[0].decode()
            if not user_id:
                continue
            ldap_user_ids.add(user_id)

            # Fetch cargo/telefono from portal_memberdata (ZODB)
            cargo = memberdata_tool.getProperty(user_id, 'cargo', '')
            telefono = memberdata_tool.getProperty(user_id, 'telefono', '')

            all_users.append({
                'id': user_id,
                'fullname': entry.get('cn', [b''])[0].decode(),
                'email': entry.get('mail', [b''])[0].decode(),
                'area': parse_area(entry.get('distinguishedName', [b''])[0].decode()),
                'cargo': cargo,
                'telefono': telefono,
                'pluginid': 'pasldap',
                'portrait': f'/++api++/portrait/{user_id}',
            })

    # 3️⃣ Merge local source_users not in LDAP
    local_plugin = acl_users.get('source_users')
    if local_plugin:
        local_users = local_plugin.enumerateUsers(id=None, exact_match=False)
        for user in local_users:
            user_id = user.get('id')
            if user_id in ldap_user_ids:
                continue  # skip users already in LDAP
            all_users.append({
                'id': user_id,
                'fullname': user.get('fullname', ''),
                'email': user.get('email', ''),
                'area': user.get('area', ''),
                'cargo': user.get('cargo', ''),
                'telefono': user.get('telefono', ''),
                'pluginid': 'source_users',
                'portrait': f'/++api++/portrait/{user_id}',
            })

    return all_users
Editor is loading...
Leave a Comment