Search in sources :

Example 11 with FilterNode

use of net.sourceforge.myvd.types.FilterNode in project OpenUnison by TremoloSecurity.

the class MongoInsert method search.

public void search(SearchInterceptorChain chain, DistinguishedName base, Int scope, Filter filter, ArrayList<Attribute> attributes, Bool typesOnly, Results results, LDAPSearchConstraints constraints) throws LDAPException {
    boolean addBase = false;
    boolean addCollection = false;
    boolean oneEntry = false;
    boolean listCollections = false;
    boolean searchUsers = false;
    Bson mongoFilter = null;
    Filter filterToUser = null;
    try {
        filterToUser = new Filter((FilterNode) filter.getRoot().clone());
    } catch (CloneNotSupportedException e) {
    }
    String localBase = this.getLocalBase(base.getDN().toString());
    String collectionName = this.getCollection(localBase);
    Attribute rdn = null;
    if (!localBase.isEmpty()) {
        rdn = this.getRDN(localBase);
    }
    if (scope.getValue() == 0) {
        if (localBase.isEmpty()) {
            addBase = true;
        } else if (rdn == null) {
            addCollection = true;
        } else {
            oneEntry = true;
        }
    } else if (scope.getValue() == 1) {
        addBase = false;
        if (localBase.isEmpty()) {
            listCollections = true;
        } else {
            searchUsers = true;
        }
    } else {
        // scope == 2
        addBase = true;
        if (localBase.isEmpty()) {
            listCollections = true;
        }
        searchUsers = true;
    }
    // create results
    ArrayList<Entry> res = new ArrayList<Entry>();
    StringBuffer b = new StringBuffer();
    if (addBase) {
        this.addToEntry(new Entry(EntryUtil.createBaseEntry(new DN(this.nameSpace.getBase().getDN().toString()))), filter, res);
    }
    if (listCollections) {
        for (String ou : mongo.getDatabase(this.database).listCollectionNames()) {
            b.setLength(0);
            b.append("ou=").append(ou).append(",").append(this.nameSpace.getBase().getDN().toString());
            this.addToEntry(new Entry(EntryUtil.createBaseEntry(new DN(b.toString()))), filter, res);
        }
    }
    if (addCollection) {
        boolean found = false;
        for (String ou : mongo.getDatabase(this.database).listCollectionNames()) {
            if (ou.equalsIgnoreCase(collectionName)) {
                b.setLength(0);
                b.append("ou=").append(ou).append(",").append(this.nameSpace.getBase().getDN().toString());
                this.addToEntry(new Entry(EntryUtil.createBaseEntry(new DN(b.toString()))), filter, res);
                found = true;
            }
        }
        if (!found) {
            throw new LDAPException("Could not find object", LDAPException.NO_SUCH_OBJECT, LDAPException.resultCodeToString(LDAPException.NO_SUCH_OBJECT));
        }
    }
    if (oneEntry) {
        boolean found = false;
        for (String ou : mongo.getDatabase(this.database).listCollectionNames()) {
            if (ou.equalsIgnoreCase(collectionName)) {
                found = true;
            }
        }
        if (!found) {
            throw new LDAPException("Could not find object", LDAPException.NO_SUCH_OBJECT, LDAPException.resultCodeToString(LDAPException.NO_SUCH_OBJECT));
        }
        // first see if we get results with the filter
        ArrayList<FilterNode> children = new ArrayList<FilterNode>();
        children.add(new FilterNode(FilterType.EQUALS, rdn.getAttribute().getName(), rdn.getAttribute().getStringValue()));
        children.add(filterToUser.getRoot());
        FilterNode and = new FilterNode(FilterType.AND, children);
        mongoFilter = this.convertFilterToMongo(and);
        FindIterable<Document> searchRes = mongo.getDatabase(this.database).getCollection(collectionName).find(mongoFilter);
        if (searchRes == null) {
            // nothing, need to know if the object exists or if its just the filter that didn't match
            searchRes = mongo.getDatabase(this.database).getCollection(collectionName).find(eq(rdn.getAttribute().getName(), rdn.getAttribute().getStringValue()));
            if (searchRes == null) {
                throw new LDAPException("Could not find object", LDAPException.NO_SUCH_OBJECT, LDAPException.resultCodeToString(LDAPException.NO_SUCH_OBJECT));
            }
        } else {
            Document doc = searchRes.first();
            if (doc == null) {
                // nothing, need to know if the object exists or if its just the filter that didn't match
                searchRes = mongo.getDatabase(this.database).getCollection(collectionName).find(eq(rdn.getAttribute().getName(), rdn.getAttribute().getStringValue()));
                if (searchRes.first() == null) {
                    throw new LDAPException("Could not find object", LDAPException.NO_SUCH_OBJECT, LDAPException.resultCodeToString(LDAPException.NO_SUCH_OBJECT));
                }
            } else {
                res.add(createEntry(doc, collectionName));
            }
        }
    }
    if (searchUsers) {
        mongoFilter = this.convertFilterToMongo(filter.getRoot());
        if (collectionName != null) {
            boolean found = false;
            for (String ou : mongo.getDatabase(this.database).listCollectionNames()) {
                if (ou.equalsIgnoreCase(collectionName)) {
                    found = true;
                }
            }
            if (!found) {
                throw new LDAPException("Could not find object", LDAPException.NO_SUCH_OBJECT, LDAPException.resultCodeToString(LDAPException.NO_SUCH_OBJECT));
            }
            FindIterable<Document> searchRes = mongo.getDatabase(this.database).getCollection(collectionName).find(mongoFilter);
            for (Document doc : searchRes) {
                res.add(createEntry(doc, collectionName));
            }
        } else {
            for (String ou : mongo.getDatabase(this.database).listCollectionNames()) {
                FindIterable<Document> searchRes = mongo.getDatabase(this.database).getCollection(ou).find(mongoFilter);
                for (Document doc : searchRes) {
                    res.add(createEntry(doc, ou));
                }
            }
        }
    }
    chain.addResult(results, new IteratorEntrySet(res.iterator()), base, scope, filterToUser, attributes, typesOnly, constraints);
}
Also used : LDAPAttribute(com.novell.ldap.LDAPAttribute) Attribute(net.sourceforge.myvd.types.Attribute) FilterNode(net.sourceforge.myvd.types.FilterNode) ArrayList(java.util.ArrayList) DN(com.novell.ldap.util.DN) Document(org.bson.Document) Bson(org.bson.conversions.Bson) IteratorEntrySet(net.sourceforge.myvd.util.IteratorEntrySet) Entry(net.sourceforge.myvd.types.Entry) LDAPEntry(com.novell.ldap.LDAPEntry) LDAPException(com.novell.ldap.LDAPException) Filter(net.sourceforge.myvd.types.Filter)

Aggregations

FilterNode (net.sourceforge.myvd.types.FilterNode)11 ArrayList (java.util.ArrayList)10 Filter (net.sourceforge.myvd.types.Filter)6 LDAPException (com.novell.ldap.LDAPException)4 Entry (net.sourceforge.myvd.types.Entry)3 FilterType (net.sourceforge.myvd.types.FilterType)3 Item (com.amazonaws.services.simpledb.model.Item)2 LDAPAttribute (com.novell.ldap.LDAPAttribute)2 RDN (com.novell.ldap.util.RDN)2 HashMap (java.util.HashMap)2 Iterator (java.util.Iterator)2 Attribute (net.sourceforge.myvd.types.Attribute)2 LDAPEntry (com.novell.ldap.LDAPEntry)1 DN (com.novell.ldap.util.DN)1 Attribute (com.tremolosecurity.saml.Attribute)1 IteratorEntrySet (net.sourceforge.myvd.util.IteratorEntrySet)1 Document (org.bson.Document)1 Bson (org.bson.conversions.Bson)1