/******************************************************************************* * Copyright (c) 2012 Dmitry Tikhomirov. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * Dmitry Tikhomirov - initial API and implementation ******************************************************************************/ package org.opensheet.server.dao.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.Hashtable; import java.util.List; import java.util.Map; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import org.opensheet.server.dao.ImportUserFromExternalSource; import org.opensheet.server.dao.UserDAO; import org.opensheet.server.utils.Parser; import org.opensheet.shared.model.Authmethod; import org.opensheet.shared.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @Repository public class ImportUserFromExternalSourceImpl implements ImportUserFromExternalSource{ @Autowired private UserDAO userDAO; private Authmethod authmethod; private static DirContext dctx; private List<User> users; @Override public List<User> get(Authmethod authmethod) { this.authmethod = authmethod; if(authmethod.getType().equals("ad")){ return doAD(); } return null; } private List<User> compareUsersOpensheetToAD(List<User> usersFromAD){ List<User> usersDiff = new ArrayList<User>(); Map<String,User> usersFromOpensheet = new HashMap<String,User>(); for(User u: userDAO.listUser("any")) usersFromOpensheet.put(u.getLogin().toLowerCase(),u); for(User u: usersFromAD){ if(!usersFromOpensheet.containsKey(u.getLogin().toLowerCase())){ usersDiff.add(u); } } return usersDiff; } private List<User> doAD(){ users = new ArrayList<User>(); Map<String,String> authData = Parser.parseAuthmethodAdData(authmethod); String bindUser = authData.get("binduser"); String domain = authData.get("domain"); String Bindpasswd = authData.get("bindpasswd"); String ldapUrl = authData.get("url"); String baseCn = authData.get("basecn"); String sp = "com.sun.jndi.ldap.LdapCtxFactory"; Hashtable<String,String> env = new Hashtable<String,String>(); env.put(Context.INITIAL_CONTEXT_FACTORY,sp); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL,bindUser + "@" + domain); env.put(Context.SECURITY_CREDENTIALS, Bindpasswd); env.put(Context.PROVIDER_URL, ldapUrl); try{ dctx = new InitialDirContext(env); SearchControls sc = new SearchControls(); String[] attributeFilter = {"cn","mail","sn","givenName"}; sc.setReturningAttributes(attributeFilter); sc.setSearchScope(SearchControls.SUBTREE_SCOPE); String filter = "(&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; NamingEnumeration<SearchResult> results = dctx.search(baseCn, filter, sc); while (results.hasMore()) { String sn = "",cn= "",mail= "",givenName = ""; SearchResult sr = (SearchResult) results.next(); Attributes attrs = sr.getAttributes(); Attribute attr = attrs.get("cn"); cn = (String) attr.get(); attr = attrs.get("givenName"); if(attr != null) givenName = (String) attr.get(); attr = attrs.get("sn"); if(attr != null) sn = (String) attr.get(); attr = attrs.get("mail"); if(attr != null) mail = (String) attr.get(); User user = new User(); user.setFirstName(givenName); user.setSecondName(sn); user.setLogin(cn.toLowerCase()); user.setEmail(mail); user.setAuthmethod(authmethod.getId()); users.add(user); } dctx.close(); } catch(Exception e){ e.getStackTrace(); } return compareUsersOpensheetToAD(users); } }