in src/main/java/org/apache/solr/mcf/ManifoldCFQParserPlugin.java [144:269]
public Query parse() throws ParseException
{
SolrParams params = req.getParams();
List<String> userAccessTokens;
// Map from domain to user
Map<String,String> domainMap = new HashMap<String,String>();
// Get the authenticated user name from the parameters
String authenticatedUserName = params.get(AUTHENTICATED_USER_NAME);
if (authenticatedUserName != null)
{
String authenticatedUserDomain = params.get(AUTHENTICATED_USER_DOMAIN);
if (authenticatedUserDomain == null)
authenticatedUserDomain = "";
domainMap.put(authenticatedUserDomain, authenticatedUserName);
}
else
{
// Look for user names/domains using the prefix
int i = 0;
while (true)
{
String userName = params.get(AUTHENTICATED_USER_NAME_PREFIX+i);
String domain = params.get(AUTHENTICATED_USER_DOMAIN_PREFIX+i);
if (userName == null)
break;
if (domain == null)
domain = "";
domainMap.put(domain,userName);
i++;
}
}
// If this parameter is empty or does not exist, we have to presume this is a guest, and treat them accordingly
if (domainMap.size() == 0)
{
// No authenticated user name.
// mod_authz_annotate may be in use upstream, so look for tokens from it.
userAccessTokens = new ArrayList<String>();
String[] passedTokens = params.getParams(USER_TOKENS);
if (passedTokens == null)
{
// Only return 'public' documents (those with no security tokens at all)
LOG.info("Default no-user response (open documents only)");
}
else
{
// Only return 'public' documents (those with no security tokens at all)
LOG.info("Group tokens received from caller");
userAccessTokens.addAll(Arrays.asList(passedTokens));
}
}
else
{
if(LOG.isInfoEnabled()){
StringBuilder sb = new StringBuilder("[");
boolean first = true;
for (String domain : domainMap.keySet())
{
if (!first)
sb.append(",");
else
first = false;
sb.append(domain).append(":").append(domainMap.get(domain));
}
sb.append("]");
LOG.info("Trying to match docs for user '"+sb.toString()+"'");
}
// Valid authenticated user name. Look up access tokens for the user.
// Check the configuration arguments for validity
if (authorityBaseURL == null)
{
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error initializing ManifoldCFSecurityFilter component: 'AuthorityServiceBaseURL' init parameter required");
}
try
{
userAccessTokens = getAccessTokens(domainMap);
}
catch (IOException e)
{
LOG.error("IO exception communicating with MCF authority service: "+e.getMessage(),e);
throw new ParseException("IO exception communicating with MCF authority service: "+e.getMessage());
}
}
BooleanQuery bq = new BooleanQuery();
//bf.setMaxClauseCount(100000);
Query allowShareOpen = new TermQuery(new Term(fieldAllowShare,NOSECURITY_TOKEN));
Query denyShareOpen = new TermQuery(new Term(fieldDenyShare,NOSECURITY_TOKEN));
Query allowParentOpen = new TermQuery(new Term(fieldAllowParent,NOSECURITY_TOKEN));
Query denyParentOpen = new TermQuery(new Term(fieldDenyParent,NOSECURITY_TOKEN));
Query allowDocumentOpen = new TermQuery(new Term(fieldAllowDocument,NOSECURITY_TOKEN));
Query denyDocumentOpen = new TermQuery(new Term(fieldDenyDocument,NOSECURITY_TOKEN));
if (userAccessTokens.size() == 0)
{
// Only open documents can be included.
// That query is:
// (fieldAllowShare is empty AND fieldDenyShare is empty AND fieldAllowDocument is empty AND fieldDenyDocument is empty)
// We're trying to map to: -(fieldAllowShare:*) , which should be pretty efficient in Solr because it is negated. If this turns out not to be so, then we should
// have the SolrConnector inject a special token into these fields when they otherwise would be empty, and we can trivially match on that token.
bq.add(allowShareOpen,BooleanClause.Occur.MUST);
bq.add(denyShareOpen,BooleanClause.Occur.MUST);
bq.add(allowParentOpen,BooleanClause.Occur.MUST);
bq.add(denyParentOpen,BooleanClause.Occur.MUST);
bq.add(allowDocumentOpen,BooleanClause.Occur.MUST);
bq.add(denyDocumentOpen,BooleanClause.Occur.MUST);
}
else
{
// Extend the query appropriately for each user access token.
bq.add(calculateCompleteSubquery(fieldAllowShare,fieldDenyShare,allowShareOpen,denyShareOpen,userAccessTokens),
BooleanClause.Occur.MUST);
bq.add(calculateCompleteSubquery(fieldAllowParent,fieldDenyParent,allowParentOpen,denyParentOpen,userAccessTokens),
BooleanClause.Occur.MUST);
bq.add(calculateCompleteSubquery(fieldAllowDocument,fieldDenyDocument,allowDocumentOpen,denyDocumentOpen,userAccessTokens),
BooleanClause.Occur.MUST);
}
return new ConstantScoreQuery(bq);
}