blob: b0e14aabbd0a1c1d8474811d67d711f89b4cf1fc [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.mcf;
import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.solr.SolrTestCaseJ4;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
public class ManifoldCFSearchComponentTest extends SolrTestCaseJ4 {
static MockMCFAuthorityService service;
@BeforeClass
public static void beforeClass() throws Exception {
initCore("solrconfig-auth.xml","schema-auth.xml");
service = new MockMCFAuthorityService();
service.start();
// | share | document
// |--------------|--------------
// | allow | deny | allow | deny
// ------------+-------+------+-------+------
// da12 | | | 1, 2 |
// ------------+-------+------+-------+------
// da13-dd3 | | | 1,3 | 3
// ------------+-------+------+-------+------
// sa123-sd13 | 1,2,3 | 1, 3 | |
// ------------+-------+------+-------+------
// sa3-sd1-da23| 3 | 1 | 2,3 |
// ------------+-------+------+-------+------
// notoken | | | |
// ------------+-------+------+-------+------
//
assertU(adoc("id", "da12", "allow_token_document", "token1", "allow_token_document", "token2"));
assertU(adoc("id", "da13-dd3", "allow_token_document", "token1", "allow_token_document", "token3", "deny_token_document", "token3"));
assertU(adoc("id", "sa123-sd13", "allow_token_share", "token1", "allow_token_share", "token2", "allow_token_share", "token3", "deny_token_share", "token1", "deny_token_share", "token3"));
assertU(adoc("id", "sa3-sd1-da23", "allow_token_document", "token2", "allow_token_document", "token3", "allow_token_share", "token3", "deny_token_share", "token1"));
assertU(adoc("id", "notoken"));
assertU(commit());
}
@AfterClass
public static void afterClass() throws Exception {
service.stop();
}
@Test
public void testParameters() throws Exception {
ManifoldCFSearchComponent mcfFilter = (ManifoldCFSearchComponent)h.getCore().getSearchComponent("mcf-param");
assertEquals("http://localhost:8345/mcf-as", mcfFilter.authorityBaseURL);
assertEquals(3000, mcfFilter.socketTimeOut);
assertEquals("aap-document", mcfFilter.fieldAllowDocument);
assertEquals("dap-document", mcfFilter.fieldDenyDocument);
assertEquals("aap-share", mcfFilter.fieldAllowShare);
assertEquals("dap-share", mcfFilter.fieldDenyShare);
}
@Test
public void testNullUsers() throws Exception {
assertQ(req("qt", "/mcf", "q", "*:*", "fl", "id"),
"//*[@numFound='1']",
"//result/doc[1]/str[@name='id'][.='notoken']");
assertQ(req("qt", "/mcf", "q", "*:*", "fl", "id", "AuthenticatedUserName", "anonymous"),
"//*[@numFound='1']",
"//result/doc[1]/str[@name='id'][.='notoken']");
}
// da12
// da13-dd3
// sa123-sd13
// sa3-sd1-da23
// notoken
@Test
public void testAuthUsers() throws Exception {
assertQ(req("qt", "/mcf", "q", "*:*", "fl", "id", "AuthenticatedUserName", "user1"),
"//*[@numFound='3']",
"//result/doc[1]/str[@name='id'][.='da12']",
"//result/doc[2]/str[@name='id'][.='da13-dd3']",
"//result/doc[3]/str[@name='id'][.='notoken']");
assertQ(req("qt", "/mcf", "q", "*:*", "fl", "id", "AuthenticatedUserName", "user2"),
"//*[@numFound='3']",
"//result/doc[1]/str[@name='id'][.='da12']",
"//result/doc[2]/str[@name='id'][.='da13-dd3']",
"//result/doc[3]/str[@name='id'][.='notoken']");
assertQ(req("qt", "/mcf", "q", "*:*", "fl", "id", "AuthenticatedUserName", "user3"),
"//*[@numFound='2']",
"//result/doc[1]/str[@name='id'][.='da12']",
"//result/doc[2]/str[@name='id'][.='notoken']");
}
// da12
// da13-dd3
// sa123-sd13
// sa3-sd1-da23
// notoken
@Test
public void testUserTokens() throws Exception {
assertQ(req("qt", "/mcf", "q", "*:*", "fl", "id", "UserTokens", "token1"),
"//*[@numFound='3']",
"//result/doc[1]/str[@name='id'][.='da12']",
"//result/doc[2]/str[@name='id'][.='da13-dd3']",
"//result/doc[3]/str[@name='id'][.='notoken']");
assertQ(req("qt", "/mcf", "q", "*:*", "fl", "id", "UserTokens", "token2"),
"//*[@numFound='3']",
"//result/doc[1]/str[@name='id'][.='da12']",
"//result/doc[2]/str[@name='id'][.='sa123-sd13']",
"//result/doc[3]/str[@name='id'][.='notoken']");
assertQ(req("qt", "/mcf", "q", "*:*", "fl", "id", "UserTokens", "token3"),
"//*[@numFound='2']",
"//result/doc[1]/str[@name='id'][.='sa3-sd1-da23']",
"//result/doc[2]/str[@name='id'][.='notoken']");
assertQ(req("qt", "/mcf", "q", "*:*", "fl", "id", "UserTokens", "token2", "UserTokens", "token3"),
"//*[@numFound='3']",
"//result/doc[1]/str[@name='id'][.='da12']",
"//result/doc[2]/str[@name='id'][.='sa3-sd1-da23']",
"//result/doc[3]/str[@name='id'][.='notoken']");
}
static class MockMCFAuthorityService {
Server server;
public MockMCFAuthorityService() {
server = new Server(8345);
ContextHandlerCollection contexts = new ContextHandlerCollection();
server.setHandler(contexts);
ServletContextHandler asContext = new ServletContextHandler(contexts,"/mcf-authority-service",ServletContextHandler.SESSIONS);
asContext.addServlet(new ServletHolder(new UserACLServlet()), "/UserACLs");
contexts.addHandler(asContext);
}
public void start() throws Exception {
server.start();
}
public void stop() throws Exception {
server.stop();
}
// username | tokens rewarded
// ---------+-------------------------------
// null | (no tokens)
// user1 | token1
// user2 | token1, token2
// user3 | token1, token2, token3
public static class UserACLServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse res)
throws IOException {
String user = req.getParameter("username");
res.setStatus(HttpServletResponse.SC_OK);
if(user.equals("user1") || user.equals("user2") || user.equals("user3"))
res.getWriter().printf("TOKEN:token1\n");
if(user.equals("user2") || user.equals("user3"))
res.getWriter().printf("TOKEN:token2\n");
if(user.equals("user3"))
res.getWriter().printf("TOKEN:token3\n");
}
}
}
}