diff --git a/core/src/main/java/hudson/security/LDAPSecurityRealm.java b/core/src/main/java/hudson/security/LDAPSecurityRealm.java index e76f43c..fbe5188 100644 --- a/core/src/main/java/hudson/security/LDAPSecurityRealm.java +++ b/core/src/main/java/hudson/security/LDAPSecurityRealm.java @@ -54,6 +54,7 @@ import org.acegisecurity.userdetails.UsernameNotFoundException; import org.acegisecurity.userdetails.ldap.LdapUserDetails; import org.acegisecurity.userdetails.ldap.LdapUserDetailsImpl; import org.apache.commons.collections.map.LRUMap; +import org.apache.commons.io.input.AutoCloseInputStream; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.QueryParameter; import org.springframework.dao.DataAccessException; @@ -66,6 +67,9 @@ import javax.naming.directory.Attributes; import javax.naming.directory.BasicAttributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; @@ -349,7 +353,15 @@ public class LDAPSecurityRealm extends AbstractPasswordBasedSecurityRealm { binding.setVariable("instance", this); BeanBuilder builder = new BeanBuilder(); - builder.parse(Jenkins.getInstance().servletContext.getResourceAsStream("/WEB-INF/security/LDAPBindSecurityRealm.groovy"),binding); + String fileName = "LDAPBindSecurityRealm.groovy"; + try { + File override = new File(Jenkins.getInstance().getRootDir(), fileName); + builder.parse( + override.exists() ? new AutoCloseInputStream(new FileInputStream(override)) : + Jenkins.getInstance().servletContext.getResourceAsStream("/WEB-INF/security/"+ fileName),binding); + } catch (FileNotFoundException e) { + throw new Error("Failed to load "+fileName,e); + } WebApplicationContext appContext = builder.createApplicationContext(); ldapTemplate = new LdapTemplate(findBean(InitialDirContextFactory.class, appContext));