Skip to content

Commit fb88b02

Browse files
authored
SOLR-15073: Fix ClassCastException in SystemInfoHandler.getSecurityInfo (#2210)
1 parent 0a1a3f4 commit fb88b02

File tree

3 files changed

+94
-1
lines changed

3 files changed

+94
-1
lines changed

solr/CHANGES.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,8 @@ Bug Fixes
364364

365365
* SOLR-15070: Suggester requests made with SolrJ can now use XMLResponseParser (Jason Gerlowski)
366366

367+
* SOLR-15073: Fix ClassCastException in SystemInfoHandler.getSecurityInfo. (Nikolay Ivanov, Christine Poerschke)
368+
367369
Other Changes
368370
---------------------
369371

solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,14 @@ public static SimpleOrderedMap<Object> getJvmInfo()
323323
* Get Security Info
324324
*/
325325
public SimpleOrderedMap<Object> getSecurityInfo(SolrQueryRequest req)
326+
{
327+
return getSecurityInfo(cc, req);
328+
}
329+
330+
/**
331+
* Get Security Info
332+
*/
333+
public static SimpleOrderedMap<Object> getSecurityInfo(CoreContainer cc, SolrQueryRequest req)
326334
{
327335
SimpleOrderedMap<Object> info = new SimpleOrderedMap<>();
328336

@@ -344,7 +352,7 @@ public SimpleOrderedMap<Object> getSecurityInfo(SolrQueryRequest req)
344352
// Mapped roles for this principal
345353
@SuppressWarnings("resource")
346354
AuthorizationPlugin auth = cc==null? null: cc.getAuthorizationPlugin();
347-
if (auth != null) {
355+
if (auth instanceof RuleBasedAuthorizationPluginBase) {
348356
RuleBasedAuthorizationPluginBase rbap = (RuleBasedAuthorizationPluginBase) auth;
349357
Set<String> roles = rbap.getUserRoles(req.getUserPrincipal());
350358
info.add("roles", roles);

solr/core/src/test/org/apache/solr/handler/admin/SystemInfoHandlerTest.java

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,27 @@
1818

1919
import java.lang.management.ManagementFactory;
2020
import java.lang.management.OperatingSystemMXBean;
21+
import java.security.Principal;
2122
import java.util.Arrays;
23+
import java.util.Collections;
2224

2325
import com.codahale.metrics.Gauge;
2426
import org.apache.solr.SolrTestCase;
27+
import org.apache.solr.SolrTestCaseJ4;
2528
import org.apache.solr.common.util.SimpleOrderedMap;
29+
import org.apache.solr.core.CoreContainer;
30+
import org.apache.solr.request.SolrQueryRequest;
31+
import org.apache.solr.request.SolrQueryRequestBase;
32+
import org.apache.solr.security.AuthenticationPlugin;
33+
import org.apache.solr.security.AuthorizationPlugin;
34+
import org.apache.solr.security.JWTPrincipal;
35+
import org.apache.solr.security.MockAuthenticationPlugin;
36+
import org.apache.solr.security.MockAuthorizationPlugin;
37+
import org.apache.solr.security.RuleBasedAuthorizationPlugin;
38+
import org.apache.solr.security.RuleBasedAuthorizationPluginBase;
2639
import org.apache.solr.util.stats.MetricUtils;
40+
import org.mockito.ArgumentMatchers;
41+
import org.mockito.Mockito;
2742

2843

2944
public class SystemInfoHandlerTest extends SolrTestCase {
@@ -50,4 +65,72 @@ public void testMagickGetter() throws Exception {
5065
}
5166
}
5267

68+
private static final String userName = "foobar";
69+
70+
public void testGetSecurityInfoAuthorizationPlugin() throws Exception {
71+
final AuthorizationPlugin authorizationPlugin = new MockAuthorizationPlugin();
72+
doTestGetSecurityInfo(authorizationPlugin);
73+
}
74+
75+
public void testGetSecurityInfoRuleBasedAuthorizationPlugin() throws Exception {
76+
SolrTestCaseJ4.assumeWorkingMockito();
77+
final RuleBasedAuthorizationPluginBase ruleBasedAuthorizationPlugin = Mockito.mock(RuleBasedAuthorizationPlugin.class);
78+
Mockito.doReturn(Collections.EMPTY_SET).when(ruleBasedAuthorizationPlugin).getUserRoles(ArgumentMatchers.any(Principal.class));
79+
doTestGetSecurityInfo(ruleBasedAuthorizationPlugin);
80+
}
81+
82+
private static void doTestGetSecurityInfo(AuthorizationPlugin authorizationPlugin) throws Exception {
83+
final AuthenticationPlugin authenticationPlugin = new MockAuthenticationPlugin() {
84+
@Override
85+
public String getName() {
86+
return "mock authentication plugin name";
87+
}
88+
};
89+
doTestGetSecurityInfo(null, null);
90+
doTestGetSecurityInfo(authenticationPlugin, null);
91+
doTestGetSecurityInfo(null, authorizationPlugin);
92+
doTestGetSecurityInfo(authenticationPlugin, authorizationPlugin);
93+
}
94+
95+
private static void doTestGetSecurityInfo(AuthenticationPlugin authenticationPlugin, AuthorizationPlugin authorizationPlugin) throws Exception {
96+
97+
SolrTestCaseJ4.assumeWorkingMockito();
98+
99+
final CoreContainer cc = Mockito.mock(CoreContainer.class);
100+
{
101+
Mockito.doReturn(authenticationPlugin).when(cc).getAuthenticationPlugin();
102+
Mockito.doReturn(authorizationPlugin).when(cc).getAuthorizationPlugin();
103+
}
104+
105+
final SolrQueryRequest req = Mockito.mock(SolrQueryRequestBase.class);
106+
{
107+
final Principal principal = Mockito.mock(JWTPrincipal.class);
108+
Mockito.doReturn(userName).when(principal).getName();
109+
Mockito.doReturn(principal).when(req).getUserPrincipal();
110+
}
111+
112+
final SimpleOrderedMap<Object> si = SystemInfoHandler.getSecurityInfo(cc, req);
113+
114+
if (authenticationPlugin != null) {
115+
assertEquals(authenticationPlugin.getName(), si.remove("authenticationPlugin"));
116+
} else {
117+
assertNull(si.remove("authenticationPlugin"));
118+
}
119+
120+
if (authorizationPlugin != null) {
121+
assertEquals(authorizationPlugin.getClass().getName(), si.remove("authorizationPlugin"));
122+
if (authorizationPlugin instanceof RuleBasedAuthorizationPluginBase) {
123+
assertNotNull(si.remove("roles"));
124+
} else {
125+
assertNull(si.remove("roles"));
126+
}
127+
} else {
128+
assertNull(si.remove("authorizationPlugin"));
129+
}
130+
131+
assertEquals(userName, si.remove("username"));
132+
133+
assertEquals("Unexpected additional info: " + si, 0, si.size());
134+
}
135+
53136
}

0 commit comments

Comments
 (0)