/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package models; /** * * @author Administrateur */ import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.AuthenticationException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.BasicAttribute; import javax.naming.directory.BasicAttributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import play.*; public class Ldap { /** * @param args */ Hashtable<String, String> ldapEnv = new Hashtable<String, String>(); String ldap_account; public static int USER_NOTEXIST =1; public static int ADDRESSES_MATCHE =2; public static int ADDRESSES_NOTMATCHE = 3; public static void listerAttributs(Attributes atts) { try { for (NamingEnumeration e = atts.getAll(); e.hasMore();) { Attribute a = (Attribute) e.next(); System.out.println(a.getID() + ":"); Enumeration values = a.getAll(); while (values.hasMoreElements()) { System.out.println("valeur : " + values.nextElement().toString()); } } } catch (javax.naming.NamingException e) { System.out.println(e.getMessage()); } } public void addUser(Hashtable ldapEnv, String mail, String givenName, String sn, String cn, String userPassword) { Attributes attributes = new BasicAttributes(true); attributes.put(new BasicAttribute("mail", mail)); attributes.put(new BasicAttribute("objectClass", "inetOrgPerson")); // attributes.put(new BasicAttribute("objectClass","simpleSecurityObject")); attributes.put(new BasicAttribute("givenName", givenName)); attributes.put(new BasicAttribute("sn", sn)); attributes.put(new BasicAttribute("cn", cn)); attributes.put(new BasicAttribute("userPassword", userPassword)); DirContext ldapContext = null; try { ldapContext = new InitialDirContext(ldapEnv); // MonObjet objet = new MonObjet("valeur1","valeur2"); ldapContext.bind("cn=" + cn + "," + Play.configuration.getProperty("ldap.dn"), null, attributes); ldapContext.close(); } catch (Exception e) { System.err.println("Erreur lors de l'acces au serveur LDAP " + e); e.printStackTrace(); } System.out.println("fin des traitements"); } public void deleteUser(Hashtable ldapEnv, String account) { DirContext ldapContext = null; try { ldapContext = new InitialDirContext(ldapEnv); ldapContext.unbind(account); ldapContext.close(); } catch (NamingException e) { System.err.println("Erreur lors de l'acces au serveur LDAP" + e); e.printStackTrace(); } System.out.println("fin des traitements"); } public void SetEnv(String ldap_server, String ldap_account, String ldap_password) { ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); ldapEnv.put(Context.PROVIDER_URL, "ldap://" + ldap_server); // localhost:389 ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // simple, none, list of SASL mechanisms ldapEnv.put(Context.SECURITY_PRINCIPAL, ldap_account); // cn=admin,dc=placeoweb ldapEnv.put(Context.SECURITY_CREDENTIALS, ldap_password); // motdepasse this.ldap_account = ldap_account; } public Hashtable<String, String> getLdapEnv() { return ldapEnv; } public Attributes getUserInfo(Hashtable ldapEnv, String login) { try { DirContext ldapContext = null; ldapContext = new InitialDirContext(ldapEnv); System.out.println("LDAP : Bind Ok = "); // Recherche en profondeur // http://www.dil.univ-mrs.fr/~massat/ens/jee/ldap.html SearchControls controle = new SearchControls(); controle.setSearchScope(SearchControls.SUBTREE_SCOPE); // String critere = "(|(sn=premier)(sn=deux*))"; // String critere = "(cn = *)"; // ne trouve rien String critere = "(cn=" + login + ")"; // ok ldapsearch -x -h localhost -b 'dc=placeoweb' '(cn=*)' // DirContext ictx = new InitialDirContext(ldapEnv); // NamingEnumeration<SearchResult> e = ldapContext.search("ou=monorganisationunit,dc=placeoweb", critere, controle); NamingEnumeration<SearchResult> e = ldapContext.search(Play.configuration.getProperty("ldap.dn"), critere, controle); while (e.hasMore()) { SearchResult r = e.next(); System.out.println("name: " + r.getName()); System.out.println("object: " + r.getClassName()); System.out.println("getAttributes: " + r.getAttributes()); //System.out.println("bigsiri: " + r.getAttributes().get("userPassword").getID()); //listerAttributs(r.getAttributes()); return r.getAttributes(); } } catch (AuthenticationException error) { return null; } catch (NamingException ex) { Logger.getLogger(Ldap.class.getName()).log(Level.SEVERE, null, ex); } return null; } public static HashMap<String, String> getConnectedUserInfos(String username){ HashMap<String, String> infos=new HashMap<String, String>(); if(username.equals("admin")){ return null; } Ldap adminConnection = new Ldap(); adminConnection.SetEnv(Play.configuration.getProperty("ldap.host"),Play.configuration.getProperty("ldap.admin.dn"), Play.configuration.getProperty("ldap.admin.password")); Attributes r=adminConnection.getUserInfo(adminConnection.getLdapEnv(),username); try{ NamingEnumeration e=r.getAll(); while(e.hasMore()){ javax.naming.directory.Attribute a=(javax.naming.directory.Attribute)e.next(); String attributeName=a.getID(); String attributeValue=""; Enumeration values = a.getAll(); while(values.hasMoreElements()){ attributeValue = values.nextElement().toString(); } if(attributeName.equals("mail")) { infos.put("mail", attributeValue); } else if(attributeName.equals("givenName")) { infos.put("firstName", attributeValue); } else if(attributeName.equals("sn")) { infos.put("lastName", attributeValue); } } }catch(javax.naming.NamingException e) { System.out.println(e.getMessage()); return null; } return infos; } public static int verifyMaliciousPassword(String login, String mail){ String mailAdresse = ""; Ldap adminConnection = new Ldap(); adminConnection.SetEnv(Play.configuration.getProperty("ldap.host"),Play.configuration.getProperty("ldap.admin.dn"), Play.configuration.getProperty("ldap.admin.password")); Attributes f=adminConnection.getUserInfo(adminConnection.getLdapEnv(),login); try{ NamingEnumeration e=f.getAll(); while(e.hasMore()){ javax.naming.directory.Attribute a=(javax.naming.directory.Attribute)e.next(); String attributeName=a.getID(); String attributeValue=""; Enumeration values = a.getAll(); while(values.hasMoreElements()){ attributeValue = values.nextElement().toString(); } if(attributeName.equals("mail")) { mailAdresse = attributeValue; } } }catch(javax.naming.NamingException e) { System.out.println(e.getMessage()); return 0; }finally{ if(mailAdresse.equals("")){ return Ldap.USER_NOTEXIST; } else if(mailAdresse.equals(mail)) { return Ldap.ADDRESSES_MATCHE; } else { return Ldap.ADDRESSES_NOTMATCHE; } } } public void modifyPassword(Hashtable ldapEnv, String password) { try { DirContext ldapContext = null; ldapContext = new InitialDirContext(ldapEnv); Attributes attributes = new BasicAttributes(true); Attribute attribut = new BasicAttribute("userPassword"); attribut.add(password); attributes.put(attribut); ldapContext.modifyAttributes(this.ldap_account, DirContext.REPLACE_ATTRIBUTE, attributes); ldapContext.close(); } catch (NamingException ex) { Logger.getLogger(Ldap.class.getName()).log(Level.SEVERE, null, ex); } } public void modifyAttribute(Hashtable ldapEnv, String login, String attributeName, String value) { try { DirContext ldapContext = null; ldapContext = new InitialDirContext(ldapEnv); Attributes attributes = new BasicAttributes(true); Attribute attribut = new BasicAttribute(attributeName); attribut.add(value); attributes.put(attribut); ldapContext.modifyAttributes("cn=" + login + "," + Play.configuration.getProperty("ldap.dn"), DirContext.REPLACE_ATTRIBUTE, attributes); ldapContext.close(); } catch (NamingException ex) { Logger.getLogger(Ldap.class.getName()).log(Level.SEVERE, null, ex); } } public Attributes getGroupInfo(Hashtable<String, String> ldapEnv, String groupName) { try { DirContext ldapContext = null; ldapContext = new InitialDirContext(ldapEnv); System.out.println("LDAP : Bind Ok = "); SearchControls controle = new SearchControls(); controle.setSearchScope(SearchControls.SUBTREE_SCOPE); String critere = "(cn=" + groupName + ")"; NamingEnumeration<SearchResult> e = ldapContext.search(Play.configuration.getProperty("ldap.dn"), critere, controle); while (e.hasMore()) { SearchResult r = e.next(); System.out.println("name: " + r.getName()); System.out.println("object: " + r.getClassName()); System.out.println("getAttributes: " + r.getAttributes()); return r.getAttributes(); } } catch (AuthenticationException error) { return null; } catch (NamingException ex) { Logger.getLogger(Ldap.class.getName()).log(Level.SEVERE, null, ex); } return null; } void addGroup(Hashtable<String, String> ldapEnv, String cn, ArrayList members, String owner) { Attributes attributes = new BasicAttributes(true); attributes.put(new BasicAttribute("objectClass", "groupOfNames")); attributes.put(new BasicAttribute("cn", cn)); attributes.put(new BasicAttribute("owner", "cn=" + owner + "," + Play.configuration.getProperty("ldap.dn"))); Iterator memberIterator = members.iterator(); BasicAttribute membersAttribute = new BasicAttribute("member", "cn="+owner+","+Play.configuration.getProperty("ldap.dn")); while(memberIterator.hasNext()){ String specificMember = "cn="+memberIterator.next()+","+Play.configuration.getProperty("ldap.dn"); if(!membersAttribute.contains(specificMember)) membersAttribute.add(specificMember); } attributes.put(membersAttribute); DirContext ldapContext = null; try { ldapContext = new InitialDirContext(ldapEnv); ldapContext.bind("cn=" + cn + "," + Play.configuration.getProperty("ldap.dn"), null, attributes); ldapContext.close(); } catch (Exception e) { System.err.println("Erreur lors de l'acces au serveur LDAP " + e); e.printStackTrace(); } System.out.println("fin des traitements"); } void addSpecificMember(Hashtable ldapEnv, String cn, ArrayList members, String specificMemberLogin) { try { DirContext ldapContext = null; ldapContext = new InitialDirContext(ldapEnv); Attributes attributes = new BasicAttributes(true); String specificMember = "cn="+specificMemberLogin+","+Play.configuration.getProperty("ldap.dn"); //We check that the member hasn't already been added in the group if(!members.contains(specificMember)) members.add(specificMember); else System.out.println("Error: "+ specificMemberLogin + " already exists in this group."); BasicAttribute membersAttribute = new BasicAttribute("member"); for(int i = 0; i < members.size(); i++) { membersAttribute.add(members.get(i)); } attributes.put(membersAttribute); ldapContext.modifyAttributes("cn=" + cn + "," + Play.configuration.getProperty("ldap.dn"), DirContext.REPLACE_ATTRIBUTE, attributes); ldapContext.close(); } catch (NamingException ex) { Logger.getLogger(Ldap.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("fin des traitements"); } void removeSpecificMember(Hashtable ldapEnv, String cn, ArrayList members, String specificMemberLogin) { try { DirContext ldapContext = null; ldapContext = new InitialDirContext(ldapEnv); Attributes attributes = new BasicAttributes(true); BasicAttribute membersAttribute = new BasicAttribute("member"); String memberLoginToRemove = "cn="+specificMemberLogin+","+Play.configuration.getProperty("ldap.dn"); //Looking for the member's name in the list for(int i = 0; i < members.size(); i++) { if(memberLoginToRemove.equals(members.get(i))) members.remove(i); } //We rebuild a member attribute with the remaining members after the delete for(int i = 0; i < members.size(); i++) { membersAttribute.add(members.get(i)); } attributes.put(membersAttribute); ldapContext.modifyAttributes("cn=" + cn + "," + Play.configuration.getProperty("ldap.dn"), DirContext.REPLACE_ATTRIBUTE, attributes); ldapContext.close(); } catch (NamingException ex) { Logger.getLogger(Ldap.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("fin des traitements"); } public void deleteGroup(Hashtable ldapEnv, String cn) { DirContext ldapContext = null; try { ldapContext = new InitialDirContext(ldapEnv); ldapContext.unbind(cn); ldapContext.close(); } catch (NamingException e) { System.err.println("Erreur lors de l'acces au serveur LDAP" + e); e.printStackTrace(); } System.out.println("fin des traitements"); } }