Skip to content

Commit 940da61

Browse files
committed
Fix JNDI failures
1 parent cd83a8c commit 940da61

File tree

5 files changed

+40
-19
lines changed

5 files changed

+40
-19
lines changed

log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,9 @@ public String lookup(final LogEvent event, String var) {
136136
if (lookup instanceof LoggerContextAware) {
137137
((LoggerContextAware) lookup).setLoggerContext(loggerContext.get());
138138
}
139-
value = event == null ? lookup.lookup(name) : lookup.lookup(event, name);
139+
if (lookup != null) {
140+
value = event == null ? lookup.lookup(name) : lookup.lookup(event, name);
141+
}
140142
}
141143

142144
if (value != null) {

log4j-jndi-test/src/test/java/org/apache/logging/log4j/jndi/lookup/JndiDisabledLookupTest.java

+16-5
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,30 @@
1616
*/
1717
package org.apache.logging.log4j.jndi.lookup;
1818

19-
import static org.junit.jupiter.api.Assertions.assertThrows;
19+
import static org.assertj.core.api.Assertions.assertThat;
2020

21-
import org.junit.Test;
21+
import org.apache.logging.log4j.Level;
22+
import org.apache.logging.log4j.status.StatusLogger;
23+
import org.junit.jupiter.api.Test;
24+
import org.junitpioneer.jupiter.SetSystemProperty;
2225

2326
/**
2427
* JndiDisabledLookupTest
2528
*
2629
* Verifies the Lookups are disabled without the log4j2.enableJndiLookup property set to true.
2730
*/
28-
public class JndiDisabledLookupTest {
31+
@SetSystemProperty(key = "log4j2.status.entries", value = "10")
32+
@SetSystemProperty(key = "log4j2.StatusLogger.level", value = "WARN")
33+
class JndiDisabledLookupTest {
2934

3035
@Test
31-
public void testLookup() {
32-
assertThrows(IllegalStateException.class, JndiLookup::new);
36+
void testLookup() {
37+
assertThat(JndiLookup.createLookup()).isNull();
38+
assertThat(StatusLogger.getLogger().getStatusData()).anySatisfy(data -> {
39+
assertThat(data.getLevel()).isEqualTo(Level.ERROR);
40+
assertThat(data.getMessage().getFormattedMessage())
41+
.isEqualTo(
42+
"Ignoring request to use JNDI lookup. JNDI must be enabled by setting log4j.enableJndiLookup=true");
43+
});
3344
}
3445
}

log4j-jndi-test/src/test/java/org/apache/logging/log4j/jndi/lookup/JndiLookupTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ private Map<String, Object> createBindings() {
6060

6161
@Test
6262
public void testLookup() {
63-
final StrLookup lookup = new JndiLookup();
63+
final StrLookup lookup = JndiLookup.createLookup();
6464

6565
String contextName = lookup.lookup(TEST_CONTEXT_RESOURCE_NAME);
6666
assertEquals(TEST_CONTEXT_NAME, contextName);
@@ -75,7 +75,7 @@ public void testLookup() {
7575
@Test
7676
public void testNonStringLookup() throws Exception {
7777
// LOG4J2-1310
78-
final StrLookup lookup = new JndiLookup();
78+
final StrLookup lookup = JndiLookup.createLookup();
7979
final String integralValue = lookup.lookup(TEST_INTEGRAL_NAME);
8080
assertEquals(String.valueOf(TEST_INTEGRAL_VALUE), integralValue);
8181
final String collectionValue = lookup.lookup(TEST_STRINGS_NAME);

log4j-jndi-test/src/test/java/org/apache/logging/log4j/jndi/lookup/JndiRestrictedLookupTest.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public void testBadUriLookup() throws Exception {
6464
final int port = embeddedLdapRule.embeddedServerPort();
6565
final Context context = embeddedLdapRule.context();
6666
context.bind("cn=" + RESOURCE + "," + DOMAIN_DSN, new Fruit("Test Message"));
67-
final StrLookup lookup = new JndiLookup();
67+
final StrLookup lookup = JndiLookup.createLookup();
6868
final String result = lookup.lookup(
6969
LDAP_URL + port + "/" + "cn=" + RESOURCE + "," + DOMAIN_DSN + "?Type=A Type&Name=1100110&Char=!");
7070
if (result != null) {
@@ -78,7 +78,7 @@ public void testReferenceLookup() throws Exception {
7878
final int port = embeddedLdapRule.embeddedServerPort();
7979
final Context context = embeddedLdapRule.context();
8080
context.bind("cn=" + RESOURCE + "," + DOMAIN_DSN, new Fruit("Test Message"));
81-
final StrLookup lookup = new JndiLookup();
81+
final StrLookup lookup = JndiLookup.createLookup();
8282
final String result = lookup.lookup(LDAP_URL + port + "/" + "cn=" + RESOURCE + "," + DOMAIN_DSN);
8383
if (result != null) {
8484
fail("Lookup returned an object");
@@ -91,7 +91,7 @@ public void testSerializableLookup() throws Exception {
9191
final int port = embeddedLdapRule.embeddedServerPort();
9292
final Context context = embeddedLdapRule.context();
9393
context.bind("cn=" + TEST_STRING + "," + DOMAIN_DSN, "Test Message");
94-
final StrLookup lookup = new JndiLookup();
94+
final StrLookup lookup = JndiLookup.createLookup();
9595
final String result = lookup.lookup(LDAP_URL + port + "/" + "cn=" + TEST_STRING + "," + DOMAIN_DSN);
9696
if (result != null) {
9797
fail("LDAP is enabled");
@@ -104,7 +104,7 @@ public void testBadSerializableLookup() throws Exception {
104104
final int port = embeddedLdapRule.embeddedServerPort();
105105
final Context context = embeddedLdapRule.context();
106106
context.bind("cn=" + TEST_MESSAGE + "," + DOMAIN_DSN, new SerializableMessage("Test Message"));
107-
final StrLookup lookup = new JndiLookup();
107+
final StrLookup lookup = JndiLookup.createLookup();
108108
final String result = lookup.lookup(LDAP_URL + port + "/" + "cn=" + TEST_MESSAGE + "," + DOMAIN_DSN);
109109
if (result != null) {
110110
fail("Lookup returned an object");
@@ -113,7 +113,7 @@ public void testBadSerializableLookup() throws Exception {
113113

114114
@Test
115115
public void testDnsLookup() throws Exception {
116-
final StrLookup lookup = new JndiLookup();
116+
final StrLookup lookup = JndiLookup.createLookup();
117117
final String result = lookup.lookup("dns:/" + DOMAIN);
118118
if (result != null) {
119119
fail("No DNS data returned");

log4j-jndi/src/main/java/org/apache/logging/log4j/jndi/lookup/JndiLookup.java

+14-6
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
import org.apache.logging.log4j.core.LogEvent;
2525
import org.apache.logging.log4j.core.lookup.AbstractLookup;
2626
import org.apache.logging.log4j.core.lookup.Lookup;
27+
import org.apache.logging.log4j.core.lookup.StrLookup;
2728
import org.apache.logging.log4j.jndi.JndiManager;
29+
import org.apache.logging.log4j.plugins.Factory;
2830
import org.apache.logging.log4j.plugins.Plugin;
2931
import org.apache.logging.log4j.status.StatusLogger;
3032

@@ -33,22 +35,28 @@
3335
*/
3436
@Lookup
3537
@Plugin("jndi")
36-
public class JndiLookup extends AbstractLookup {
38+
public final class JndiLookup extends AbstractLookup {
3739

3840
private static final Logger LOGGER = StatusLogger.getLogger();
3941
private static final Marker LOOKUP = MarkerManager.getMarker("LOOKUP");
4042

4143
/** JNDI resource path prefix used in a J2EE container */
4244
static final String CONTAINER_JNDI_RESOURCE_PATH_PREFIX = "java:comp/env/";
4345

44-
private final boolean disabled;
46+
@Factory
47+
public static StrLookup createLookup() {
48+
if (JndiManager.isJndiLookupEnabled()) {
49+
return new JndiLookup();
50+
}
51+
LOGGER.error(
52+
"Ignoring request to use JNDI lookup. JNDI must be enabled by setting log4j.enableJndiLookup=true");
53+
return null;
54+
}
4555

4656
/**
4757
* Constructs a new instance.
4858
*/
49-
public JndiLookup() {
50-
this.disabled = !JndiManager.isJndiLookupEnabled();
51-
}
59+
private JndiLookup() {}
5260

5361
/**
5462
* Looks up the value of the JNDI resource.
@@ -59,7 +67,7 @@ public JndiLookup() {
5967
*/
6068
@Override
6169
public String lookup(final LogEvent event, final String key) {
62-
if (disabled || key == null) {
70+
if (key == null) {
6371
return null;
6472
}
6573
final String jndiName = convertJndiName(key);

0 commit comments

Comments
 (0)