def _search(self, search_on='cn', query='', attrs=None, limit=10):
        context = self.context
        if attrs is None:
            attrs = ['uid', 'cn', 'mail']
        # connect to the LDAP server
        portal_properties = getToolByName(context, 'portal_properties')
        props = getattr(portal_properties, 'portlet_contact_properties')

        if props.ldap_search_recursive:
            SCOPE = ldap.SCOPE_SUBTREE
        else:
            SCOPE = ldap.SCOPE_ONELEVEL

        server = LdapServer(props.ldap_server_host,
                            props.ldap_server_port,
                            props.ldap_bind_dn,
                            props.ldap_bind_password,
                            props.ldap_search_base,
                            SCOPE)
        server.connect()

        # search contacts
        results = []

        if server.is_connected():
            results = server.search(search_on, query, attrs=attrs)[:int(limit)]
            # close connection
            server.close()

        return results
def _setPhoto_ldap(context, uid, photo):
    portal_properties = getToolByName(context, 'portal_properties')
    props = portal_properties.portlet_contact_properties

    if props.ldap_search_recursive:
        SCOPE = ldap.SCOPE_SUBTREE
    else:
        SCOPE = ldap.SCOPE_ONELEVEL

    server = LdapServer(props.ldap_server_host,
                        props.ldap_server_port,
                        props.ldap_bind_dn,
                        props.ldap_bind_password,
                        props.ldap_search_base,
                        SCOPE)
    server.connect()
    entries = server.search('uid', uid, attrs=['jpegPhoto'])

    contact = entries[0]['datas']
    old_photo = contact.get('jpegPhoto')
    if old_photo:
        old_photo = old_photo[0]
    else:
        old_photo = ''
    old = {'jpegPhoto': old_photo}
    new = {'jpegPhoto': photo}

    ldif = modlist.modifyModlist(old, new)
    server.l.modify_s(entries[0]['path'], ldif)
    server.close()