Changeset 181
- Timestamp:
- 02/22/08 23:46:20 (11 months ago)
- Files:
-
- trunk/jsmtpd/.classpath (modified) (1 diff)
- trunk/jsmtpd/CHANGELOG (modified) (1 diff)
- trunk/jsmtpd/INSTALL (modified) (2 diffs)
- trunk/jsmtpd/README (modified) (2 diffs)
- trunk/jsmtpd/TODO (deleted)
- trunk/jsmtpd/build.xml (modified) (5 diffs)
- trunk/jsmtpd/lib/crypt.jar (deleted)
- trunk/jsmtpd/lib/xercesImpl.jar (deleted)
- trunk/jsmtpd/lib/xmlParserAPIs.jar (deleted)
- trunk/jsmtpd/src/org/jsmtpd/plugins/smtpExtension/LdapAuthenticator.java (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/jsmtpd/.classpath
r174 r181 5 5 <classpathentry kind="lib" path="etc"/> 6 6 <classpathentry kind="lib" path="lib/dnsjava-1.6.5.jar"/> 7 <classpathentry kind="lib" path="lib/xercesImpl.jar"/>8 <classpathentry kind="lib" path="lib/xmlParserAPIs.jar"/>9 <classpathentry kind="lib" path="lib/crypt.jar"/>10 7 <classpathentry kind="lib" path="lib/commons-logging.jar"/> 11 8 <classpathentry kind="lib" path="lib/log4j-1.2.9.jar"/> trunk/jsmtpd/CHANGELOG
r174 r181 1 1 Version 0.x 2 Removed old libs 3 Refact auth ldap plugin 2 4 Added ssl socket receiver 3 5 Ldap auth fix trunk/jsmtpd/INSTALL
r100 r181 10 10 The other interesting configuration file is 11 11 etc/jsmtpd-plugin-config.xml. Take a look at the manual 12 ( in the doc/ folder) for advanced configuration.12 (http://www.jsmtpd.org) for advanced configuration. 13 13 14 14 … … 17 17 18 18 19 You'll find the sources of the jsmtpd under the src directory.trunk/jsmtpd/README
r3 r181 1 1 2 Jsmtpd, http s://sourceforge.net/projects/jsmtpd/3 Copyright (C) 2005 Jean-Fran รงois POUX, jf.poux@laposte.net2 Jsmtpd, http://www.jsmtpd.org 3 Copyright (C) 2005 Jean-Francois POUX, jf.poux@laposte.net 4 4 5 6 sources: http://svn.jsmtpd.org 7 trac: http://dev.jstmpd.org 8 builds: http://autobuild.jsmtpd.org 5 9 6 10 Jsmtpd is a flexible SMTP (email) server, written in java. … … 42 46 requests, mainly to find mail exchangers. 43 47 44 You are encouraged to send feedback/comments to improve Jsmtpd at45 jf.poux@laposte.net46 47 48 48 49 49 Mini Howto trunk/jsmtpd/build.xml
r169 r181 128 128 <mkdir dir="${release.dir}/mailboxes/"/> 129 129 <mkdir dir="${release.dir}/lib/"/> 130 <mkdir dir="${release.dir}/src/"/>131 <copy todir="${release.dir}/src/">132 <fileset dir="src/"/>133 </copy>134 130 <copy file="build.xml" tofile="${release.dir}/build.xml"/> 135 131 <copy file="CHANGELOG" tofile="${release.dir}/CHANGELOG"/> … … 138 134 <copy file="LICENCE" tofile="${release.dir}/LICENCE"/> 139 135 <copy file="README" tofile="${release.dir}/README"/> 140 <copy file="TODO" tofile="${release.dir}/TODO"/>141 136 <copy todir="${release.dir}/lib/"> 142 137 <fileset dir="lib/"/> … … 151 146 <copy file="addcp.bat" tofile="${release.dir}/addcp.bat"/> 152 147 <copy file="jsmtpd.sh" tofile="${release.dir}/jsmtpd.sh"/> 148 <chmod file="${release.dir}/jsmtpd.sh" perm="700"/> 153 149 </target> 154 150 155 <target name="doc ">151 <target name="doc-src"> 156 152 <mkdir dir="${release.dir}/doc/Javadoc"/> 157 153 <javadoc packagenames="org.jsmtpd.core.*,org.jsmtpd.plugins.*,org.jsmtpd.*" … … 171 167 <fileset dir="doc/"/> 172 168 </copy> 169 <mkdir dir="${release.dir}/src/"/> 170 <copy todir="${release.dir}/src/"> 171 <fileset dir="src/"/> 172 </copy> 173 173 </target> 174 174 … … 180 180 181 181 <target name="buildFullRelease" 182 depends="cleanAll,cleanRelease,jsmtpd-core-jar,jsmtpd-basicplugins-jar,baseRelease,jsmtpd-clamav,jsmtpd-SA,jsmtpd-IPFIlters,jsmtpd-snippet ,doc">182 depends="cleanAll,cleanRelease,jsmtpd-core-jar,jsmtpd-basicplugins-jar,baseRelease,jsmtpd-clamav,jsmtpd-SA,jsmtpd-IPFIlters,jsmtpd-snippet"> 183 183 </target> 184 184 trunk/jsmtpd/src/org/jsmtpd/plugins/smtpExtension/LdapAuthenticator.java
r161 r181 21 21 package org.jsmtpd.plugins.smtpExtension; 22 22 23 import java.io.UnsupportedEncodingException;24 import java.security.MessageDigest;25 import java.security.NoSuchAlgorithmException;26 23 import java.util.Hashtable; 27 28 24 import javax.naming.Context; 29 25 import javax.naming.InitialContext; 30 26 import javax.naming.NamingEnumeration; 31 27 import javax.naming.NamingException; 32 import javax.naming.directory.Attribute;33 import javax.naming.directory.Attributes;34 28 import javax.naming.directory.DirContext; 35 29 import javax.naming.directory.SearchControls; 36 30 import javax.naming.directory.SearchResult; 37 38 31 import org.apache.commons.logging.Log; 39 32 import org.apache.commons.logging.LogFactory; 40 33 import org.jsmtpd.core.common.PluginInitException; 41 import org.vps.crypt.Crypt;42 43 import sun.misc.BASE64Encoder;44 34 /** 45 35 * 1/04/06 : Change to query primary mail by fixed attribute, not by uid (for multiple domains and outgoing) … … 56 46 // How to query the user db 57 47 private String ldapUserProvider; 58 private String ldapUserPassword;48 59 49 /** 60 50 * By default, will use uid attribute (posix/shadow account schema), in this case login = uid … … 63 53 */ 64 54 private String ldapUserLogin="uid"; 65 private MessageDigest md;66 55 67 pr otected boolean performAuth(String login, byte[] password){56 private String searchUserDn (String login){ 68 57 Hashtable<String,String> environnement; 69 58 environnement = new Hashtable<String,String>(); … … 79 68 while (namingEnumeration.hasMore()) { 80 69 SearchResult result = namingEnumeration.next(); 81 Attributes attributes = result.getAttributes(); 82 Attribute ldapAttrPass = attributes.get(ldapUserPassword); 83 String ldapPass = new String((byte[])ldapAttrPass.get(), "UTF8"); 84 if (ldapPass==null) 85 return false; 86 87 if (ldapPass.startsWith("{md5}")||ldapPass.startsWith("{MD5}")) { 88 String pwd=ldapPass.substring(5); 89 byte[] bytePass = md.digest(password); 90 BASE64Encoder b = new BASE64Encoder(); 91 String inputPass = b.encode(bytePass); 92 if (pwd.equals(inputPass)) { 93 log.debug("user "+login+" authenticated (md5 password)"); 94 return true; 95 } else { 96 log.debug("user "+login+" authentication failed (md5 password)"); 97 return false; 98 } 99 } 100 101 if (ldapPass.startsWith("{crypt}")||ldapPass.startsWith("{CRYPT}")) { 102 String full = ldapPass.substring(7); 103 String salt = full.substring(0,2); 104 String rv = Crypt.crypt(salt.getBytes(),password); 105 106 if (rv.equals(full)) { 107 log.debug("user "+login+" authenticated (crypt password)"); 108 return true; 109 } else { 110 log.debug("user "+login+" authentication failed (crypt password)"); 111 return false; 112 } 113 } 114 115 log.error("I don't know how to handle encryption for user "+login+" in ldap entry"); 70 return (result.getNameInNamespace()); 116 71 } 117 72 } catch (NamingException e) { 118 log.error("Can't query server for aliases",e); 119 } catch (UnsupportedEncodingException e) { 120 log.error("Can't convert enc password",e); 73 log.error("Can't query server for user dn: "+login,e); 121 74 } 122 123 return false; 75 return null; 76 } 77 78 private boolean bindAs (String dn, byte[] password) { 79 Hashtable<String,Object> environnement; 80 environnement = new Hashtable<String,Object>(); 81 environnement.put(Context.SECURITY_PRINCIPAL,dn); 82 environnement.put(Context.SECURITY_CREDENTIALS,password); 83 InitialContext initialContext; 84 try { 85 initialContext = new InitialContext(environnement); 86 DirContext ctx = (DirContext) initialContext.lookup(ldapUrl); 87 ctx.close(); 88 return true; 89 } catch (NamingException e) { 90 log.error("Unable to bind user "+dn,e); 91 return false; 92 } 93 } 94 95 protected boolean performAuth(String login, byte[] password) { 96 String userDn = searchUserDn(login); 97 return bindAs (userDn, password); 124 98 } 125 99 … … 128 102 } 129 103 130 public void initPlugin() throws PluginInitException { 131 try { 132 md= MessageDigest.getInstance("md5"); 133 } catch (NoSuchAlgorithmException e) { 134 throw new PluginInitException("No md5 available"); 135 } 136 } 104 public void initPlugin() throws PluginInitException {} 137 105 138 public void shutdownPlugin() { 139 } 106 public void shutdownPlugin() {} 140 107 141 108 public void setLdapUrl(String ldapUrl) { … … 145 112 public void setLdapUserLogin(String ldapUserLogin) { 146 113 this.ldapUserLogin = ldapUserLogin; 147 }148 149 public void setLdapUserPassword(String ldapUserPassword) {150 this.ldapUserPassword = ldapUserPassword;151 114 } 152 115
