LdapUserIDProvider.java 4.87 KB
Newer Older
Matt Tucker's avatar
Matt Tucker committed
1 2 3 4 5
/**
 * $RCSfile$
 * $Revision$
 * $Date$
 *
Matt Tucker's avatar
Matt Tucker committed
6
 * Copyright (C) 2004 Jive Software. All rights reserved.
Matt Tucker's avatar
Matt Tucker committed
7
 *
Matt Tucker's avatar
Matt Tucker committed
8 9
 * This software is published under the terms of the GNU Public License (GPL),
 * a copy of which is included in this distribution.
Matt Tucker's avatar
Matt Tucker committed
10
 */
Matt Tucker's avatar
Matt Tucker committed
11

Matt Tucker's avatar
Matt Tucker committed
12 13 14 15 16
package org.jivesoftware.messenger.ldap;

import org.jivesoftware.util.Log;
import org.jivesoftware.util.LongList;

17 18
import javax.naming.*;
import javax.naming.directory.*;
Matt Tucker's avatar
Matt Tucker committed
19 20

/**
21
 * LDAP implementation of the UserIDProvider interface.
Matt Tucker's avatar
Matt Tucker committed
22
 *
23
 * @author Matt Tucker
Matt Tucker's avatar
Matt Tucker committed
24
 */
25
public class LdapUserIDProvider {
Matt Tucker's avatar
Matt Tucker committed
26

Matt Tucker's avatar
Matt Tucker committed
27 28 29 30 31 32 33 34
    private LdapManager manager;

    public LdapUserIDProvider() {
        manager = LdapManager.getInstance();
    }

    public int getUserCount() {
        int count = 0;
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
        // Note: the performance of this check may suffer badly for very large
        // numbers of users since we manually iterate through results to get
        // a count.
        DirContext ctx = null;
        try {
            ctx = manager.getContext();
            // Search for the dn based on the username.
            SearchControls constraints = new SearchControls();
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
            constraints.setReturningAttributes(new String[]{manager.getUsernameField()});
            String filter = "(" + manager.getUsernameField() + " + =*)";
            NamingEnumeration answer = ctx.search("", filter, constraints);
            while (answer.hasMoreElements()) {
                count++;
                answer.nextElement();
Matt Tucker's avatar
Matt Tucker committed
50 51
            }
        }
52 53 54 55 56 57
        catch (Exception e) {
            Log.error(e);
        }
        finally {
            try { if (ctx != null) { ctx.close(); } }
            catch (Exception e) { Log.error(e); }
Matt Tucker's avatar
Matt Tucker committed
58 59 60 61 62 63
        }
        return count;
    }

    public LongList getUserIDs() {
        LongList users = new LongList(500);
Matt Tucker's avatar
Matt Tucker committed
64
        // Otherwise, in LDAP-only mode.
Matt Tucker's avatar
Matt Tucker committed
65 66 67 68 69 70
        DirContext ctx = null;
        try {
            ctx = manager.getContext();
            // Search for the dn based on the username.
            SearchControls constraints = new SearchControls();
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
71 72
            constraints.setReturningAttributes(new String[]{manager.getUsernameField()});
            String filter = "(" + manager.getUsernameField() + " + =*)";
Matt Tucker's avatar
Matt Tucker committed
73 74 75 76 77 78 79 80 81 82 83
            NamingEnumeration answer = ctx.search("", filter, constraints);

            while (answer.hasMoreElements()) {
                // Get the next userID.
                users.add(Long.parseLong((String)(((SearchResult)answer.next()).getAttributes().get("jiveUserID")).get()));
            }
        }
        catch (Exception e) {
            Log.error(e);
        }
        finally {
Matt Tucker's avatar
Matt Tucker committed
84 85
            try { if (ctx != null) { ctx.close(); } }
            catch (Exception e) { Log.error(e); }
Matt Tucker's avatar
Matt Tucker committed
86 87 88 89 90 91 92 93 94 95 96 97
        }
        return users;
    }

    public LongList getUserIDs(int startIndex, int numResults) {
        LongList users = new LongList();
        DirContext ctx = null;
        try {
            ctx = manager.getContext();
            // Search for the dn based on the username.
            SearchControls constraints = new SearchControls();
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
98 99
            constraints.setReturningAttributes(new String[]{manager.getUsernameField()});
            String filter = "(" + manager.getUsernameField() + " + =*)";
Matt Tucker's avatar
Matt Tucker committed
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
            NamingEnumeration answer = ctx.search("", filter, constraints);
            for (int i = 0; i < startIndex; i++) {
                answer.next();
            }
            // Now read in desired number of results (or stop if we run out of results).
            for (int i = 0; i < numResults; i++) {
                if (answer.hasMoreElements()) {
                    // Get the next userID.
                    users.add(Long.parseLong((String)(((SearchResult)answer.next()).getAttributes().get("jiveUserID")).get()));
                }
                else {
                    break;
                }
            }
        }
        catch (Exception e) {
            Log.error(e);
        }
        finally {
Matt Tucker's avatar
Matt Tucker committed
119 120
            try { if (ctx != null) { ctx.close(); } }
            catch (Exception e) { Log.error(e); }
Matt Tucker's avatar
Matt Tucker committed
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
        }
        return users;
    }

    /**
     * Helper function to retrieve username from userDN.
     *
     * @param userDN
     * @return username
     * @throws NamingException
     */
    private String getUsernameFromUserDN(String userDN) throws NamingException {
        DirContext ctx = null;
        try {
            ctx = manager.getContext();
            // Load record.
            String[] attributes = new String[]{manager.getUsernameField()};
            Attributes attrs = ctx.getAttributes(userDN, attributes);
            return (String)attrs.get(manager.getUsernameField()).get();
        }
        finally {
Matt Tucker's avatar
Matt Tucker committed
142 143
            try { if (ctx != null) { ctx.close(); } }
            catch (Exception e) { Log.error(e); }
Matt Tucker's avatar
Matt Tucker committed
144 145
        }
    }
Matt Tucker's avatar
Matt Tucker committed
146
}